first herc beetle implementation
This commit is contained in:
1 parent
14a1dfda1e
commit
8cabdb33bf
52 files changed
+2102
-411
No files matched your search
@@ -150,7 +150,7 @@ public final class AntarchySettings {
|
||||
private static int basiliskSpawnMaxLightLevel = 5;
|
||||
private static double basiliskHealth = 150.0D;
|
||||
private static double basiliskAttackDamage = 36.0D;
|
||||
private static double basiliskMovementSpeed = 0.30D;
|
||||
private static double basiliskMovementSpeed = 0.225D;
|
||||
private static double basiliskArmor = 6.0D;
|
||||
private static double basiliskKnockbackResistance = 0.5D;
|
||||
private static double basiliskFollowRange = 28.0D;
|
||||
@@ -470,6 +470,9 @@ public final class AntarchySettings {
|
||||
private static double cheepHealth = 8.0D;
|
||||
private static double cheepAttackDamage = 3.0D;
|
||||
private static double dorrieHealth = 60.0D;
|
||||
private static double herculesBeetleHealth = 500.0D;
|
||||
private static double herculesBeetleAttackDamage = 30.0D;
|
||||
private static double herculesBeetleChargeDamage = 40.0D;
|
||||
|
||||
private AntarchySettings() {
|
||||
}
|
||||
@@ -2398,5 +2401,11 @@ public final class AntarchySettings {
|
||||
public static double cheepAttackDamage() { return cheepAttackDamage; }
|
||||
public static void setCheepAttackDamage(double v) { cheepAttackDamage = v; }
|
||||
public static double dorrieHealth() { return dorrieHealth; }
|
||||
public static double herculesBeetleHealth() { return herculesBeetleHealth; }
|
||||
public static void setHerculesBeetleHealth(double v) { herculesBeetleHealth = v; }
|
||||
public static double herculesBeetleAttackDamage() { return herculesBeetleAttackDamage; }
|
||||
public static void setHerculesBeetleAttackDamage(double v) { herculesBeetleAttackDamage = v; }
|
||||
public static double herculesBeetleChargeDamage() { return herculesBeetleChargeDamage; }
|
||||
public static void setHerculesBeetleChargeDamage(double v) { herculesBeetleChargeDamage = v; }
|
||||
public static void setDorrieHealth(double v) { dorrieHealth = v; }
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.craisinlord.antarchy.content.entity.BomberEntity;
|
||||
import com.craisinlord.antarchy.content.entity.ButterflyEntity;
|
||||
import com.craisinlord.antarchy.content.entity.CaterpillarEntity;
|
||||
import com.craisinlord.antarchy.content.entity.EasterBunnyEntity;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.entity.HushProjectileEntity;
|
||||
import com.craisinlord.antarchy.content.entity.StinkBugEntity;
|
||||
import com.craisinlord.antarchy.content.entity.WaterBombEntity;
|
||||
@@ -96,6 +97,8 @@ public final class AntarchyObjects {
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<EntityType<com.craisinlord.antarchy.content.entity.DorrieEntity>> DORRIE = (Supplier<EntityType<com.craisinlord.antarchy.content.entity.DorrieEntity>>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<EntityType<HerculesBeetleEntity>> HERCULES_BEETLE = (Supplier<EntityType<HerculesBeetleEntity>>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<net.minecraft.world.item.Item> CHEEP_ITEM = (Supplier<net.minecraft.world.item.Item>) UNBOUND;
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<Block> DUPLICATOR_LOG = (Supplier<Block>) UNBOUND;
|
||||
@@ -433,6 +436,10 @@ public final class AntarchyObjects {
|
||||
OCTOPUS_BOMB = supplier;
|
||||
}
|
||||
|
||||
public static void setHerculesBeetle(Supplier<EntityType<HerculesBeetleEntity>> supplier) {
|
||||
HERCULES_BEETLE = supplier;
|
||||
}
|
||||
|
||||
public static BlockBehaviour.Properties shellstoneProperties() {
|
||||
return BlockBehaviour.Properties.ofFullCopy(Blocks.STONE).requiresCorrectToolForDrops();
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ public final class AntarchyTags {
|
||||
public static final TagKey<Block> MOLEVORE_SEE_THROUGH_BLOCKS = TagKey.create(Registries.BLOCK, id("molevore_see_through_blocks"));
|
||||
public static final TagKey<Block> TERMITE_FOODS = TagKey.create(Registries.BLOCK, id("termite_foods"));
|
||||
public static final TagKey<Block> UMBRAL_MOSS_REPLACEABLE = TagKey.create(Registries.BLOCK, id("umbral_moss_replaceable"));
|
||||
public static final TagKey<Block> HERCULES_BEETLE_CHARGE_IMMUNE_BLOCKS = TagKey.create(Registries.BLOCK, id("hercules_beetle_charge_immune_blocks"));
|
||||
|
||||
private Blocks() {
|
||||
}
|
||||
@@ -88,6 +89,7 @@ public final class AntarchyTags {
|
||||
public static final TagKey<Item> CATERPILLAR_FOODS = TagKey.create(Registries.ITEM, id("caterpillar_foods"));
|
||||
public static final TagKey<Item> BUTTERFLY_BREEDING_FOODS = TagKey.create(Registries.ITEM, id("butterfly_breeding_foods"));
|
||||
public static final TagKey<Item> REVERIE_DUPLICATION_ITEMS = TagKey.create(Registries.ITEM, id("reverie_duplication_items"));
|
||||
public static final TagKey<Item> HERCULES_BEETLE_FOOD = TagKey.create(Registries.ITEM, id("hercules_beetle_food"));
|
||||
|
||||
private Items() {
|
||||
}
|
||||
|
||||
@@ -104,6 +104,19 @@ public final class StinkyBehavior {
|
||||
applyNearbyNausea(entity, STINK_BUG_AURA_RADIUS, STINK_BUG_BURST_NAUSEA_DURATION_TICKS);
|
||||
}
|
||||
|
||||
public static void applyBurstStinkyEffect(LivingEntity source, double radius, int durationTicks) {
|
||||
if (source.level().isClientSide()) {
|
||||
return;
|
||||
}
|
||||
for (LivingEntity entity : source.level().getEntitiesOfClass(
|
||||
LivingEntity.class,
|
||||
source.getBoundingBox().inflate(radius),
|
||||
e -> e.isAlive() && e != source
|
||||
)) {
|
||||
entity.addEffect(new MobEffectInstance(AntarchyObjects.STINKY_EFFECT.get(), durationTicks, 0, false, true, true));
|
||||
}
|
||||
}
|
||||
|
||||
public static void applyNearbyNausea(LivingEntity source, double radius, int durationTicks) {
|
||||
if (source.level().isClientSide()) {
|
||||
return;
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package com.craisinlord.antarchy.content.client;
|
||||
|
||||
public final class HerculesBeetleImpactShakeClientState {
|
||||
private static int shakeTicks;
|
||||
|
||||
private HerculesBeetleImpactShakeClientState() {
|
||||
}
|
||||
|
||||
public static void trigger(int ticks) {
|
||||
shakeTicks = Math.max(shakeTicks, Math.max(0, ticks));
|
||||
}
|
||||
|
||||
public static void tick() {
|
||||
if (shakeTicks > 0) {
|
||||
shakeTicks--;
|
||||
}
|
||||
}
|
||||
|
||||
public static int getTicks() {
|
||||
return shakeTicks;
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
shakeTicks = 0;
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.craisinlord.antarchy.content.client.model;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import software.bernie.geckolib.model.GeoModel;
|
||||
|
||||
public class HerculesBeetleModel extends GeoModel<HerculesBeetleEntity> {
|
||||
private static final ResourceLocation TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle.png");
|
||||
private static final ResourceLocation TEXTURE_SADDLED =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/hercules_beetle/hercules_beetle_saddle.png");
|
||||
|
||||
@Override
|
||||
public ResourceLocation getModelResource(HerculesBeetleEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/hercules_beetle.geo.json");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getTextureResource(HerculesBeetleEntity animatable) {
|
||||
return animatable.hasSaddle() ? TEXTURE_SADDLED : TEXTURE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getAnimationResource(HerculesBeetleEntity animatable) {
|
||||
return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/hercules_beetle.animation.json");
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package com.craisinlord.antarchy.content.client.renderer;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.model.HerculesBeetleModel;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererProvider;
|
||||
import software.bernie.geckolib.renderer.GeoEntityRenderer;
|
||||
|
||||
public class HerculesBeetleRenderer extends GeoEntityRenderer<HerculesBeetleEntity> {
|
||||
public HerculesBeetleRenderer(EntityRendererProvider.Context context) {
|
||||
super(context, new HerculesBeetleModel());
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.client.screen;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.menu.DorrieMenu;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
|
||||
import net.minecraft.network.chat.Component;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
|
||||
public class DorrieScreen extends AbstractContainerScreen<DorrieMenu> {
|
||||
// A 176 × 130 texture: saddle slot area at top, player inventory below.
|
||||
// Art file: assets/antarchy/textures/gui/container/dorrie.png
|
||||
private static final ResourceLocation TEXTURE =
|
||||
ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/gui/container/dorrie.png");
|
||||
|
||||
public static final int TEXTURE_WIDTH = 176;
|
||||
public static final int TEXTURE_HEIGHT = 130;
|
||||
|
||||
public DorrieScreen(DorrieMenu menu, Inventory playerInventory, Component title) {
|
||||
super(menu, playerInventory, title);
|
||||
this.imageWidth = TEXTURE_WIDTH;
|
||||
this.imageHeight = TEXTURE_HEIGHT;
|
||||
this.inventoryLabelY = this.imageHeight - 94;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) {
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
guiGraphics.blit(TEXTURE, this.leftPos, this.topPos, 0, 0, this.imageWidth, this.imageHeight);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) {
|
||||
this.renderBackground(guiGraphics, mouseX, mouseY, partialTick);
|
||||
super.render(guiGraphics, mouseX, mouseY, partialTick);
|
||||
this.renderTooltip(guiGraphics, mouseX, mouseY);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
package com.craisinlord.antarchy.content.entity;
|
||||
|
||||
import com.craisinlord.antarchy.content.AntarchyObjects;
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.item.CheepOnAStickItem;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.network.syncher.EntityDataAccessor;
|
||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||
import net.minecraft.network.syncher.SynchedEntityData;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.sounds.SoundEvent;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
@@ -31,8 +32,6 @@ import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomSwimmingGoal;
|
||||
import net.minecraft.world.entity.ai.goal.TryFindWaterGoal;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import net.minecraft.world.entity.ai.navigation.PathNavigation;
|
||||
import net.minecraft.world.entity.ai.navigation.WaterBoundPathNavigation;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
@@ -40,7 +39,6 @@ import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.Level;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import software.bernie.geckolib.animatable.GeoEntity;
|
||||
@@ -54,6 +52,7 @@ import software.bernie.geckolib.util.GeckoLibUtil;
|
||||
|
||||
public class DorrieEntity extends Animal implements GeoEntity {
|
||||
private static final ResourceLocation CHEEP_ITEM_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "cheep");
|
||||
|
||||
private static final EntityDataAccessor<Boolean> HAS_SADDLE =
|
||||
SynchedEntityData.defineId(DorrieEntity.class, EntityDataSerializers.BOOLEAN);
|
||||
private static final EntityDataAccessor<Boolean> TAMED =
|
||||
@@ -62,8 +61,8 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
SynchedEntityData.defineId(DorrieEntity.class, EntityDataSerializers.INT);
|
||||
|
||||
private static final int MAX_CHARGE_TICKS = 40;
|
||||
private static final float BASE_SPEED = 0.6F;
|
||||
private static final float BOOSTED_SPEED = 1.3F;
|
||||
private static final float WATER_RIDE_SPEED = 1.26F;
|
||||
private static final float LAND_BEACH_SPEED = 0.04F;
|
||||
|
||||
private static final RawAnimation IDLE_ANIM = RawAnimation.begin().thenLoop("idle");
|
||||
private static final RawAnimation SWIM_ANIM = RawAnimation.begin().thenLoop("swim");
|
||||
@@ -73,16 +72,21 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
|
||||
private static final int RIDES_TO_TAME = 4;
|
||||
private static final int BUCK_DELAY_TICKS = 60;
|
||||
|
||||
private int chargeTicks = 0;
|
||||
private boolean isCharging = false;
|
||||
private boolean isLeaping = false;
|
||||
private boolean wasInAir = false;
|
||||
private int landAnimTicks = 0;
|
||||
private boolean isPressingJump = false;
|
||||
private int rideAttempts = 0;
|
||||
private int buckTimer = 0;
|
||||
private int swimForwardTicks = 0;
|
||||
|
||||
public DorrieEntity(EntityType<? extends DorrieEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, BASE_SPEED, 1.0F, true);
|
||||
this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 1.0F, true);
|
||||
this.lookControl = new SmoothSwimmingLookControl(this, 10);
|
||||
}
|
||||
|
||||
@@ -113,12 +117,11 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Mob.createMobAttributes()
|
||||
.add(Attributes.MAX_HEALTH, AntarchySettings.dorrieHealth())
|
||||
.add(Attributes.MOVEMENT_SPEED, BASE_SPEED)
|
||||
.add(Attributes.MOVEMENT_SPEED, 1.0D)
|
||||
.add(Attributes.FOLLOW_RANGE, 16.0D)
|
||||
.add(Attributes.ATTACK_DAMAGE, 4.0D);
|
||||
}
|
||||
|
||||
|
||||
public boolean hasSaddle() {
|
||||
return this.entityData.get(HAS_SADDLE);
|
||||
}
|
||||
@@ -143,12 +146,12 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
this.entityData.set(JUMP_CHARGE, charge);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void addAdditionalSaveData(CompoundTag tag) {
|
||||
super.addAdditionalSaveData(tag);
|
||||
tag.putBoolean("Tamed", this.isTamed());
|
||||
tag.putBoolean("HasSaddle", this.hasSaddle());
|
||||
tag.putInt("RideAttempts", this.rideAttempts);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,28 +159,20 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
super.readAdditionalSaveData(tag);
|
||||
this.setTamed(tag.getBoolean("Tamed"));
|
||||
this.setSaddle(tag.getBoolean("HasSaddle"));
|
||||
this.rideAttempts = tag.getInt("RideAttempts");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public InteractionResult mobInteract(Player player, InteractionHand hand) {
|
||||
ItemStack stack = player.getItemInHand(hand);
|
||||
|
||||
if (!this.isTamed()) {
|
||||
if (!this.level().isClientSide && this.isCheepItem(stack)) {
|
||||
if (!player.getAbilities().instabuild) stack.shrink(1);
|
||||
if (this.random.nextInt(3) == 0) {
|
||||
this.setTamed(true);
|
||||
this.playSound(SoundEvents.HORSE_BREATHE, 0.5F, 1.0F);
|
||||
} else {
|
||||
this.playSound(SoundEvents.DOLPHIN_HURT, 0.5F, 1.0F);
|
||||
}
|
||||
return InteractionResult.sidedSuccess(this.level().isClientSide);
|
||||
if (!this.level().isClientSide) {
|
||||
player.startRiding(this);
|
||||
}
|
||||
return super.mobInteract(player, hand);
|
||||
return InteractionResult.sidedSuccess(this.level().isClientSide);
|
||||
}
|
||||
|
||||
// Remove saddle with empty hand
|
||||
if (this.hasSaddle() && stack.isEmpty() && !player.isPassengerOfSameVehicle(this)) {
|
||||
if (!this.level().isClientSide) {
|
||||
this.setSaddle(false);
|
||||
@@ -187,99 +182,112 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
return InteractionResult.sidedSuccess(this.level().isClientSide);
|
||||
}
|
||||
|
||||
// Apply saddle
|
||||
if (!this.hasSaddle() && stack.is(Items.SADDLE)) {
|
||||
if (!this.level().isClientSide) {
|
||||
this.setSaddle(true);
|
||||
if (!player.getAbilities().instabuild) stack.shrink(1);
|
||||
if (!player.getAbilities().instabuild) {
|
||||
stack.shrink(1);
|
||||
}
|
||||
this.playSound(SoundEvents.HORSE_SADDLE, 1.0F, 1.0F);
|
||||
}
|
||||
return InteractionResult.sidedSuccess(this.level().isClientSide);
|
||||
}
|
||||
|
||||
// Mount
|
||||
if (this.hasSaddle() && !player.isPassengerOfSameVehicle(this)) {
|
||||
if (!this.level().isClientSide) player.startRiding(this);
|
||||
if (!this.level().isClientSide) {
|
||||
player.startRiding(this);
|
||||
}
|
||||
return InteractionResult.sidedSuccess(this.level().isClientSide);
|
||||
}
|
||||
|
||||
return super.mobInteract(player, hand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFood(ItemStack stack) {
|
||||
return this.isCheepItem(stack);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public LivingEntity getControllingPassenger() {
|
||||
if (!this.isTamed() || !this.hasSaddle()) return null;
|
||||
if (!this.isTamed() || !this.hasSaddle()) {
|
||||
return null;
|
||||
}
|
||||
Entity passenger = this.getFirstPassenger();
|
||||
if (passenger instanceof Player player) return player;
|
||||
if (passenger instanceof Player player) {
|
||||
return player;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean riderHasCheepStick(Player player) {
|
||||
return player.getMainHandItem().getItem() instanceof CheepOnAStickItem
|
||||
|| player.getOffhandItem().getItem() instanceof CheepOnAStickItem;
|
||||
}
|
||||
|
||||
private ItemStack getCheepStick(Player player) {
|
||||
if (player.getMainHandItem().getItem() instanceof CheepOnAStickItem) return player.getMainHandItem();
|
||||
if (player.getOffhandItem().getItem() instanceof CheepOnAStickItem) return player.getOffhandItem();
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Vec3 getRiddenInput(Player player, Vec3 travelVector) {
|
||||
if (!riderHasCheepStick(player)) return Vec3.ZERO;
|
||||
float forward = player.zza > 0 ? player.zza : player.zza / 4.0F;
|
||||
float forward = player.zza;
|
||||
float strafe = player.xxa * 0.5F;
|
||||
return new Vec3(strafe, travelVector.y, forward);
|
||||
return new Vec3(strafe, 0, forward);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getRiddenSpeed(Player player) {
|
||||
float speed = BASE_SPEED;
|
||||
if (riderHasCheepStick(player)) {
|
||||
speed = BOOSTED_SPEED;
|
||||
if (!this.level().isClientSide) {
|
||||
ItemStack stick = getCheepStick(player);
|
||||
if (!stick.isEmpty() && this.tickCount % 10 == 0) {
|
||||
stick.hurtAndBreak(1, player,
|
||||
player.getMainHandItem().getItem() instanceof CheepOnAStickItem
|
||||
? net.minecraft.world.entity.EquipmentSlot.MAINHAND
|
||||
: net.minecraft.world.entity.EquipmentSlot.OFFHAND);
|
||||
}
|
||||
}
|
||||
}
|
||||
float speed = (this.isInWater() || this.isInLava())
|
||||
? WATER_RIDE_SPEED * (1.0F + Math.min(this.swimForwardTicks, 60) * 0.025F)
|
||||
: LAND_BEACH_SPEED;
|
||||
return (float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * speed;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
super.tick();
|
||||
|
||||
if (!this.level().isClientSide) {
|
||||
LivingEntity passenger = this.getControllingPassenger();
|
||||
|
||||
if (passenger != null && isPressingJump) {
|
||||
Vec3 mov = this.getDeltaMovement();
|
||||
double boost = this.isInWater() ? 0.1D : 0.04D;
|
||||
this.setDeltaMovement(mov.x, Math.min(mov.y + boost, 0.5D), mov.z);
|
||||
this.hasImpulse = true;
|
||||
}
|
||||
|
||||
if (passenger instanceof Player && isCharging) {
|
||||
chargeTicks = Math.min(chargeTicks + 1, MAX_CHARGE_TICKS);
|
||||
setJumpCharge((int) ((chargeTicks / (float) MAX_CHARGE_TICKS) * 100));
|
||||
if (this.getControllingPassenger() instanceof Player player) {
|
||||
this.setYRot(player.getYRot());
|
||||
this.yRotO = this.getYRot();
|
||||
this.yBodyRot = this.getYRot();
|
||||
this.yHeadRot = this.getYRot();
|
||||
if (this.isInWater() || this.isInLava()) {
|
||||
if (player.zza > 0.05F) {
|
||||
this.swimForwardTicks = Math.min(this.swimForwardTicks + 1, 60);
|
||||
} else {
|
||||
this.swimForwardTicks = Math.max(this.swimForwardTicks - 2, 0);
|
||||
}
|
||||
} else {
|
||||
this.swimForwardTicks = 0;
|
||||
}
|
||||
} else {
|
||||
this.swimForwardTicks = 0;
|
||||
}
|
||||
|
||||
if (landAnimTicks > 0) landAnimTicks--;
|
||||
if (!this.level().isClientSide && !this.isTamed() && this.getFirstPassenger() instanceof Player rider) {
|
||||
buckTimer++;
|
||||
if (buckTimer >= BUCK_DELAY_TICKS) {
|
||||
rider.stopRiding();
|
||||
buckTimer = 0;
|
||||
rideAttempts++;
|
||||
if (rideAttempts >= RIDES_TO_TAME) {
|
||||
this.setTamed(true);
|
||||
this.playSound(SoundEvents.HORSE_BREATHE, 0.8F, 1.0F);
|
||||
} else {
|
||||
this.playSound(SoundEvents.HORSE_ANGRY, 0.8F, 1.0F);
|
||||
}
|
||||
}
|
||||
} else if (!this.isTamed() && this.getFirstPassenger() == null) {
|
||||
buckTimer = 0;
|
||||
}
|
||||
|
||||
if (!this.level().isClientSide && this.getControllingPassenger() instanceof Player && isCharging) {
|
||||
chargeTicks = Math.min(chargeTicks + 1, MAX_CHARGE_TICKS);
|
||||
setJumpCharge((int) ((chargeTicks / (float) MAX_CHARGE_TICKS) * 100));
|
||||
}
|
||||
|
||||
// Surface buoyancy: when in water and not mid-leap, push toward the waterline.
|
||||
// Stronger upward force when fully submerged, gentle when at the surface so
|
||||
// Dorrie glides on top rather than diving or bouncing.
|
||||
if (this.isInWater() && !isLeaping) {
|
||||
Vec3 mov = this.getDeltaMovement();
|
||||
double push = this.isUnderWater() ? 0.07D : 0.015D;
|
||||
double cappedY = this.isUnderWater() ? 0.3D : 0.05D;
|
||||
this.setDeltaMovement(mov.x, Math.min(mov.y + push, cappedY), mov.z);
|
||||
}
|
||||
|
||||
if (landAnimTicks > 0) {
|
||||
landAnimTicks--;
|
||||
}
|
||||
|
||||
boolean inAirNow = !this.onGround() && !this.isInWater() && !this.isInLava();
|
||||
if (wasInAir && !inAirNow && isLeaping) {
|
||||
@@ -289,32 +297,29 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
wasInAir = inAirNow;
|
||||
}
|
||||
|
||||
public void setPressingJump(boolean pressing) {}
|
||||
|
||||
/** Called when the rider presses/releases space (up movement). */
|
||||
public void setPressingJump(boolean pressing) {
|
||||
this.isPressingJump = pressing;
|
||||
}
|
||||
|
||||
/** Called when the rider presses left-control (charge start). */
|
||||
public void startJumpCharge() {
|
||||
if (!this.level().isClientSide) {
|
||||
isCharging = true;
|
||||
}
|
||||
}
|
||||
|
||||
/** Called when the rider releases left-control (charge release). */
|
||||
public void releaseJump() {
|
||||
if (!this.level().isClientSide && isCharging) {
|
||||
float power = chargeTicks / (float) MAX_CHARGE_TICKS;
|
||||
if (power > 0.05F) {
|
||||
double horizontal = 0.8D + power * 1.4D;
|
||||
double vertical = 0.4D + power * 0.8D;
|
||||
Vec3 look = this.getLookAngle();
|
||||
Vec3 current = this.getDeltaMovement();
|
||||
// Add to existing momentum — no direction snap. The rider already has
|
||||
// forward speed, so the jump just launches them upward and slightly
|
||||
// accelerates in the direction they're already facing.
|
||||
double forwardAdd = power * 0.5D;
|
||||
double vertical = 0.55D + power * 0.9D;
|
||||
this.setDeltaMovement(
|
||||
look.x * horizontal * 0.7D + current.x * 0.3D,
|
||||
current.x + look.x * forwardAdd,
|
||||
vertical,
|
||||
look.z * horizontal * 0.7D + current.z * 0.3D
|
||||
current.z + look.z * forwardAdd
|
||||
);
|
||||
this.hasImpulse = true;
|
||||
isLeaping = true;
|
||||
@@ -325,14 +330,14 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void positionRider(Entity passenger, MoveFunction moveFunction) {
|
||||
if (this.hasPassenger(passenger)) {
|
||||
Vec3 forward = this.getLookAngle().multiply(1.0D, 0.0D, 1.0D);
|
||||
moveFunction.accept(passenger,
|
||||
this.getX(),
|
||||
this.getY() + this.getPassengersRidingOffset() + passenger.getBbHeight() * 0.5D,
|
||||
this.getZ());
|
||||
this.getX() - forward.x * 0.25D,
|
||||
this.getY() + 0.5D,
|
||||
this.getZ() - forward.z * 0.25D);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,7 +345,6 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
return 0.6D;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void dropEquipment() {
|
||||
super.dropEquipment();
|
||||
@@ -349,14 +353,12 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public DorrieEntity getBreedOffspring(ServerLevel level, AgeableMob mob) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean canBeLeashed() {
|
||||
return true;
|
||||
@@ -382,14 +384,15 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
return SoundEvents.DOLPHIN_SWIM;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
|
||||
controllers.add(new AnimationController<>(this, "main_controller", 2, this::mainAnimController));
|
||||
}
|
||||
|
||||
private PlayState mainAnimController(AnimationState<DorrieEntity> state) {
|
||||
if (landAnimTicks > 0) return state.setAndContinue(JUMP_LAND_ANIM);
|
||||
if (landAnimTicks > 0) {
|
||||
return state.setAndContinue(JUMP_LAND_ANIM);
|
||||
}
|
||||
if (isLeaping) {
|
||||
return state.setAndContinue(wasInAir ? JUMP_LOOP_ANIM : JUMP_START_ANIM);
|
||||
}
|
||||
@@ -401,12 +404,17 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
return this.geoCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFood(ItemStack stack) {
|
||||
return this.isCheepItem(stack);
|
||||
}
|
||||
|
||||
private boolean isCheepItem(ItemStack stack) {
|
||||
return !stack.isEmpty() && stack.is(BuiltInRegistries.ITEM.getOptional(CHEEP_ITEM_ID).orElse(Items.AIR));
|
||||
}
|
||||
|
||||
private static class HuntCheepGoal extends Goal {
|
||||
private static final int COOLDOWN_TICKS = 600; // 30 seconds
|
||||
private static final int COOLDOWN_TICKS = 600;
|
||||
private static final double HUNT_RANGE = 16.0D;
|
||||
private static final double ATTACK_RANGE_SQ = 2.5D * 2.5D;
|
||||
|
||||
@@ -421,13 +429,21 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
if (dorrie.level().isClientSide) return false;
|
||||
if (cooldown > 0) { cooldown--; return false; }
|
||||
if (dorrie.level().isClientSide) {
|
||||
return false;
|
||||
}
|
||||
if (cooldown > 0) {
|
||||
cooldown--;
|
||||
return false;
|
||||
}
|
||||
if (dorrie.getControllingPassenger() != null) {
|
||||
return false;
|
||||
}
|
||||
List<CheepEntity> nearby = dorrie.level().getEntitiesOfClass(
|
||||
CheepEntity.class,
|
||||
dorrie.getBoundingBox().inflate(HUNT_RANGE)
|
||||
);
|
||||
if (nearby.isEmpty()) return false;
|
||||
CheepEntity.class, dorrie.getBoundingBox().inflate(HUNT_RANGE));
|
||||
if (nearby.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
nearby.sort((a, b) -> Double.compare(a.distanceToSqr(dorrie), b.distanceToSqr(dorrie)));
|
||||
target = nearby.get(0);
|
||||
return true;
|
||||
@@ -435,7 +451,9 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return target != null && target.isAlive() && dorrie.distanceToSqr(target) <= HUNT_RANGE * HUNT_RANGE * 4;
|
||||
return target != null && target.isAlive()
|
||||
&& dorrie.getControllingPassenger() == null
|
||||
&& dorrie.distanceToSqr(target) <= HUNT_RANGE * HUNT_RANGE * 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -445,11 +463,14 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
if (target == null) return;
|
||||
if (target == null) {
|
||||
return;
|
||||
}
|
||||
dorrie.getLookControl().setLookAt(target, 30.0F, 30.0F);
|
||||
dorrie.getNavigation().moveTo(target, 1.4D);
|
||||
if (dorrie.distanceToSqr(target) <= ATTACK_RANGE_SQ) {
|
||||
target.hurt(dorrie.damageSources().mobAttack(dorrie), (float) dorrie.getAttributeValue(Attributes.ATTACK_DAMAGE));
|
||||
target.hurt(dorrie.damageSources().mobAttack(dorrie),
|
||||
(float) dorrie.getAttributeValue(Attributes.ATTACK_DAMAGE));
|
||||
stop();
|
||||
}
|
||||
}
|
||||
@@ -460,6 +481,5 @@ public class DorrieEntity extends Animal implements GeoEntity {
|
||||
dorrie.getNavigation().stop();
|
||||
cooldown = COOLDOWN_TICKS;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+1233
File diff suppressed because it is too large.
Load diff
@@ -15,6 +15,7 @@ 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.LookAtPlayerGoal;
|
||||
import net.minecraft.world.entity.ai.goal.PanicGoal;
|
||||
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;
|
||||
import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal;
|
||||
import net.minecraft.world.entity.animal.Animal;
|
||||
@@ -38,9 +39,12 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
private static final RawAnimation FART_ANIM = RawAnimation.begin().thenPlay("fart");
|
||||
private static final int FART_ANIMATION_TICKS = 30;
|
||||
private static final int STINK_BURST_PARTICLES = 32;
|
||||
private static final double STINK_BURST_RADIUS = 8.0D;
|
||||
private static final int STINK_BURST_DURATION_TICKS = 1200;
|
||||
|
||||
private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this);
|
||||
private int fartAnimationTicks;
|
||||
private boolean pendingFartBurst;
|
||||
|
||||
public StinkBugEntity(EntityType<? extends StinkBugEntity> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -65,9 +69,10 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(1, new WaterAvoidingRandomStrollGoal(this, 0.9D));
|
||||
this.goalSelector.addGoal(2, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
||||
this.goalSelector.addGoal(3, new RandomLookAroundGoal(this));
|
||||
this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D));
|
||||
this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 0.9D));
|
||||
this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
||||
this.goalSelector.addGoal(4, new RandomLookAroundGoal(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -76,15 +81,20 @@ public class StinkBugEntity extends Animal implements GeoEntity {
|
||||
|
||||
if (this.fartAnimationTicks > 0) {
|
||||
this.fartAnimationTicks--;
|
||||
if (this.fartAnimationTicks == 0 && this.pendingFartBurst && !this.level().isClientSide()) {
|
||||
StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES);
|
||||
StinkyBehavior.applyBurstStinkyEffect(this, STINK_BURST_RADIUS, STINK_BURST_DURATION_TICKS);
|
||||
this.pendingFartBurst = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hurt(DamageSource source, float amount) {
|
||||
boolean hurt = super.hurt(source, amount);
|
||||
if (hurt) {
|
||||
if (hurt && !this.pendingFartBurst) {
|
||||
this.triggerFartAnimation();
|
||||
StinkyBehavior.emitBurst(this, STINK_BURST_PARTICLES);
|
||||
this.pendingFartBurst = true;
|
||||
}
|
||||
return hurt;
|
||||
}
|
||||
|
||||
@@ -163,6 +163,7 @@ public class ToreterrorEntity extends Monster implements GeoEntity {
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new ToreterrorFloatGoal());
|
||||
this.goalSelector.addGoal(1, new ToreterrorRangedGoal());
|
||||
this.goalSelector.addGoal(2, new ToreterrorJumpGoal());
|
||||
this.goalSelector.addGoal(3, new ToreterrorSpinGoal());
|
||||
@@ -822,6 +823,28 @@ public class ToreterrorEntity extends Monster implements GeoEntity {
|
||||
}
|
||||
}
|
||||
|
||||
private final class ToreterrorFloatGoal extends Goal {
|
||||
ToreterrorFloatGoal() {
|
||||
this.setFlags(EnumSet.of(Flag.JUMP));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return ToreterrorEntity.this.isInWater() && !ToreterrorEntity.this.onGround();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
return canUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
Vec3 vel = ToreterrorEntity.this.getDeltaMovement();
|
||||
ToreterrorEntity.this.setDeltaMovement(vel.x, Math.min(vel.y + 0.08D, 0.2D), vel.z);
|
||||
}
|
||||
}
|
||||
|
||||
private final class ToreterrorSpinGoal extends Goal {
|
||||
ToreterrorSpinGoal() {
|
||||
this.setFlags(EnumSet.of(Flag.MOVE));
|
||||
|
||||
+41
-22
@@ -55,6 +55,7 @@ import software.bernie.geckolib.animation.AnimationState;
|
||||
import software.bernie.geckolib.util.GeckoLibUtil;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
@@ -71,6 +72,8 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
SynchedEntityData.defineId(FlyingSquirrelEntity.class, EntityDataSerializers.BOOLEAN);
|
||||
private static final EntityDataAccessor<Integer> TEXTURE_VARIANT =
|
||||
SynchedEntityData.defineId(FlyingSquirrelEntity.class, EntityDataSerializers.INT);
|
||||
private static final EntityDataAccessor<Optional<UUID>> SHOULDER_PLAYER_DATA =
|
||||
SynchedEntityData.defineId(FlyingSquirrelEntity.class, EntityDataSerializers.OPTIONAL_UUID);
|
||||
|
||||
private static final String PICKUP_ANIM_TICKS_KEY = "PickupAnimTicks";
|
||||
private static final String TEXTURE_VARIANT_KEY = "TextureVariant";
|
||||
@@ -227,6 +230,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
builder.define(CLIMBING, false);
|
||||
builder.define(PICKING_UP_NUT, false);
|
||||
builder.define(TEXTURE_VARIANT, TEXTURE_VARIANT_REGULAR);
|
||||
builder.define(SHOULDER_PLAYER_DATA, Optional.empty());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -376,13 +380,19 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
}
|
||||
|
||||
if (this.isOnShoulder()) {
|
||||
if (!(this.getVehicle() instanceof Player shoulderPlayer)
|
||||
|| !shoulderPlayer.isAlive()) {
|
||||
Player shoulderPlayer = this.getShoulderPlayer();
|
||||
if (shoulderPlayer == null || !shoulderPlayer.isAlive()) {
|
||||
this.dismountShoulder();
|
||||
} else if (this.shoulderSneakGraceTicks <= 0 && shoulderPlayer.isShiftKeyDown()) {
|
||||
this.glideOffShoulder();
|
||||
} else {
|
||||
Vec3 shoulderPos = this.getShoulderRidePos(shoulderPlayer);
|
||||
this.setPos(shoulderPos.x, shoulderPos.y, shoulderPos.z);
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
this.setYRot(shoulderPlayer.getYHeadRot());
|
||||
this.setXRot(shoulderPlayer.getXRot());
|
||||
this.yBodyRot = shoulderPlayer.getYHeadRot();
|
||||
this.yHeadRot = shoulderPlayer.getYHeadRot();
|
||||
this.fallDistance = 0.0F;
|
||||
}
|
||||
this.setNoGravity(true);
|
||||
@@ -434,22 +444,25 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
|
||||
this.tickIdleStallLogging(horizontalSpeed);
|
||||
}
|
||||
if (this.isOnShoulder() && this.level().isClientSide) {
|
||||
Player shoulderPlayer = this.getShoulderPlayer();
|
||||
if (shoulderPlayer != null) {
|
||||
Vec3 shoulderPos = this.getShoulderRidePos(shoulderPlayer);
|
||||
this.setPos(shoulderPos.x, shoulderPos.y, shoulderPos.z);
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
this.setYRot(shoulderPlayer.getYHeadRot());
|
||||
this.setXRot(shoulderPlayer.getXRot());
|
||||
this.yBodyRot = shoulderPlayer.getYHeadRot();
|
||||
this.yHeadRot = shoulderPlayer.getYHeadRot();
|
||||
this.fallDistance = 0.0F;
|
||||
}
|
||||
}
|
||||
this.setNoGravity(this.isGliding() || this.isClimbingTrunk() || this.isClimbingToShoulder() || this.isOnShoulder());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rideTick() {
|
||||
super.rideTick();
|
||||
if (this.getVehicle() instanceof Player player) {
|
||||
Vec3 shoulderPos = this.getShoulderRidePos(player);
|
||||
this.setPos(shoulderPos.x, shoulderPos.y, shoulderPos.z);
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
this.setYRot(player.getYHeadRot());
|
||||
this.setXRot(player.getXRot());
|
||||
this.yBodyRot = player.getYHeadRot();
|
||||
this.yHeadRot = player.getYHeadRot();
|
||||
this.fallDistance = 0.0F;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -703,7 +716,14 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
}
|
||||
|
||||
public boolean isOnShoulder() {
|
||||
return this.getVehicle() instanceof Player;
|
||||
return this.entityData.get(SHOULDER_PLAYER_DATA).isPresent();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Player getShoulderPlayer() {
|
||||
return this.entityData.get(SHOULDER_PLAYER_DATA)
|
||||
.map(uuid -> this.level().getPlayerByUUID(uuid))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public boolean isClimbingToShoulder() {
|
||||
@@ -725,10 +745,9 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
}
|
||||
|
||||
private void dismountShoulder() {
|
||||
Entity vehicle = this.getVehicle();
|
||||
if (vehicle != null) {
|
||||
this.stopRiding();
|
||||
Vec3 dismountPos = vehicle.position().add(0.0D, 0.1D, 0.0D);
|
||||
Player shoulderPlayer = this.getShoulderPlayer();
|
||||
if (shoulderPlayer != null) {
|
||||
Vec3 dismountPos = shoulderPlayer.position().add(0.0D, 0.1D, 0.0D);
|
||||
this.setPos(dismountPos.x, dismountPos.y, dismountPos.z);
|
||||
}
|
||||
this.clearShoulderMountState();
|
||||
@@ -737,6 +756,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
}
|
||||
|
||||
private void clearShoulderMountState() {
|
||||
this.entityData.set(SHOULDER_PLAYER_DATA, Optional.empty());
|
||||
this.shoulderPlayerId = null;
|
||||
this.shoulderClimbStartPos = null;
|
||||
this.climbingToShoulderTicks = 0;
|
||||
@@ -746,16 +766,15 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
}
|
||||
|
||||
private void glideOffShoulder() {
|
||||
Entity vehicle = this.getVehicle();
|
||||
if (!(vehicle instanceof Player player)) {
|
||||
Player player = this.getShoulderPlayer();
|
||||
if (player == null) {
|
||||
this.dismountShoulder();
|
||||
return;
|
||||
}
|
||||
|
||||
Vec3 launchPos = this.getShoulderRidePos(player);
|
||||
this.stopRiding();
|
||||
this.setPos(launchPos.x, launchPos.y, launchPos.z);
|
||||
this.clearShoulderMountState();
|
||||
this.setPos(launchPos.x, launchPos.y, launchPos.z);
|
||||
this.fallDistance = 0.0F;
|
||||
|
||||
BlockPos glideTarget = this.findFallGlideTarget();
|
||||
@@ -815,7 +834,7 @@ public class FlyingSquirrelEntity extends TamableAnimal implements GeoEntity {
|
||||
this.shoulderPlayerId = null;
|
||||
this.shoulderSneakGraceTicks = SHOULDER_SNEAK_GRACE_TICKS;
|
||||
this.setClimbingTrunk(false);
|
||||
this.startRiding(player, true);
|
||||
this.entityData.set(SHOULDER_PLAYER_DATA, Optional.of(player.getUUID()));
|
||||
this.setDeltaMovement(Vec3.ZERO);
|
||||
this.fallDistance = 0.0F;
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.item;
|
||||
|
||||
import net.minecraft.world.item.Item;
|
||||
|
||||
public class CheepOnAStickItem extends Item {
|
||||
public CheepOnAStickItem(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
package com.craisinlord.antarchy.content.menu;
|
||||
|
||||
import net.minecraft.world.Container;
|
||||
import net.minecraft.world.SimpleContainer;
|
||||
import net.minecraft.world.entity.player.Inventory;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||
import net.minecraft.world.inventory.MenuType;
|
||||
import net.minecraft.world.inventory.Slot;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.item.Items;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class DorrieMenu extends AbstractContainerMenu {
|
||||
// Set by the Fabric platform during registration so common entity code can open the menu.
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Supplier<MenuType<DorrieMenu>> TYPE_SUPPLIER = () -> {
|
||||
throw new IllegalStateException("DorrieMenu.TYPE_SUPPLIER accessed before registration");
|
||||
};
|
||||
|
||||
private static final int EQUIPMENT_SLOTS = 1;
|
||||
private static final int PLAYER_INV_ROWS = 3;
|
||||
private static final int PLAYER_INV_COLS = 9;
|
||||
|
||||
// GUI layout constants (relative to background image top-left)
|
||||
public static final int SADDLE_SLOT_X = 80;
|
||||
public static final int SADDLE_SLOT_Y = 18;
|
||||
public static final int PLAYER_INV_X = 8;
|
||||
public static final int PLAYER_INV_Y = 48;
|
||||
public static final int HOTBAR_Y = 106;
|
||||
|
||||
private final Container equipment;
|
||||
|
||||
// Server-side constructor — receives the real Dorrie inventory.
|
||||
public DorrieMenu(int syncId, Inventory playerInventory, Container equipment) {
|
||||
super(TYPE_SUPPLIER.get(), syncId);
|
||||
this.equipment = equipment;
|
||||
checkContainerSize(equipment, EQUIPMENT_SLOTS);
|
||||
|
||||
// Slot 0: saddle
|
||||
this.addSlot(new Slot(equipment, 0, SADDLE_SLOT_X, SADDLE_SLOT_Y) {
|
||||
@Override
|
||||
public boolean mayPlace(ItemStack stack) {
|
||||
return stack.is(Items.SADDLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxStackSize() {
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
|
||||
// Player inventory (3 × 9)
|
||||
for (int row = 0; row < PLAYER_INV_ROWS; row++) {
|
||||
for (int col = 0; col < PLAYER_INV_COLS; col++) {
|
||||
this.addSlot(new Slot(
|
||||
playerInventory,
|
||||
col + row * PLAYER_INV_COLS + PLAYER_INV_COLS,
|
||||
PLAYER_INV_X + col * 18,
|
||||
PLAYER_INV_Y + row * 18
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// Hotbar (9)
|
||||
for (int col = 0; col < PLAYER_INV_COLS; col++) {
|
||||
this.addSlot(new Slot(playerInventory, col, PLAYER_INV_X + col * 18, HOTBAR_Y));
|
||||
}
|
||||
}
|
||||
|
||||
// Client-side factory — syncs slot data from server.
|
||||
public static DorrieMenu clientCreate(int syncId, Inventory playerInventory) {
|
||||
return new DorrieMenu(syncId, playerInventory, new SimpleContainer(EQUIPMENT_SLOTS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean stillValid(Player player) {
|
||||
return this.equipment.stillValid(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack quickMoveStack(Player player, int index) {
|
||||
ItemStack result = ItemStack.EMPTY;
|
||||
Slot slot = this.slots.get(index);
|
||||
if (!slot.hasItem()) return result;
|
||||
|
||||
ItemStack stack = slot.getItem();
|
||||
result = stack.copy();
|
||||
|
||||
int equipEnd = EQUIPMENT_SLOTS;
|
||||
int invEnd = equipEnd + PLAYER_INV_ROWS * PLAYER_INV_COLS;
|
||||
int totalSlots = invEnd + PLAYER_INV_COLS;
|
||||
|
||||
if (index < equipEnd) {
|
||||
// Equipment slot → player inventory
|
||||
if (!this.moveItemStackTo(stack, equipEnd, totalSlots, true)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
} else {
|
||||
// Player inventory/hotbar → try equipment slot first
|
||||
if (stack.is(Items.SADDLE) && this.slots.get(0).mayPlace(stack)) {
|
||||
if (!this.moveItemStackTo(stack, 0, equipEnd, false)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
} else if (index < invEnd) {
|
||||
// Inventory → hotbar
|
||||
if (!this.moveItemStackTo(stack, invEnd, totalSlots, false)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
} else {
|
||||
// Hotbar → inventory
|
||||
if (!this.moveItemStackTo(stack, equipEnd, invEnd, false)) {
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (stack.isEmpty()) {
|
||||
slot.set(ItemStack.EMPTY);
|
||||
} else {
|
||||
slot.setChanged();
|
||||
}
|
||||
|
||||
if (stack.getCount() == result.getCount()) return ItemStack.EMPTY;
|
||||
slot.onTake(player, stack);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.network.codec.ByteBufCodecs;
|
||||
import net.minecraft.network.codec.StreamCodec;
|
||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public record HerculesBeetleImpactShakePayload(int durationTicks) implements CustomPacketPayload {
|
||||
public static final Type<HerculesBeetleImpactShakePayload> TYPE =
|
||||
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_impact_shake"));
|
||||
public static final StreamCodec<ByteBuf, HerculesBeetleImpactShakePayload> STREAM_CODEC =
|
||||
ByteBufCodecs.VAR_INT.map(HerculesBeetleImpactShakePayload::new, HerculesBeetleImpactShakePayload::durationTicks);
|
||||
|
||||
@Override
|
||||
public Type<HerculesBeetleImpactShakePayload> type() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
||||
public final class HerculesBeetleImpactShakeSync {
|
||||
private static final BiConsumer<ServerPlayer, Integer> NOOP = (player, ticks) -> {
|
||||
};
|
||||
|
||||
private static volatile BiConsumer<ServerPlayer, Integer> sink = NOOP;
|
||||
|
||||
private HerculesBeetleImpactShakeSync() {
|
||||
}
|
||||
|
||||
public static void setSink(BiConsumer<ServerPlayer, Integer> sink) {
|
||||
HerculesBeetleImpactShakeSync.sink = sink == null ? NOOP : sink;
|
||||
}
|
||||
|
||||
public static void send(ServerPlayer player, int ticks) {
|
||||
sink.accept(player, ticks);
|
||||
}
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.network.codec.ByteBufCodecs;
|
||||
import net.minecraft.network.codec.StreamCodec;
|
||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public record HerculesBeetleJumpInputPayload(boolean pressing) implements CustomPacketPayload {
|
||||
public static final Type<HerculesBeetleJumpInputPayload> TYPE =
|
||||
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_jump_input"));
|
||||
public static final StreamCodec<ByteBuf, HerculesBeetleJumpInputPayload> STREAM_CODEC =
|
||||
StreamCodec.composite(
|
||||
ByteBufCodecs.BOOL, HerculesBeetleJumpInputPayload::pressing,
|
||||
HerculesBeetleJumpInputPayload::new
|
||||
);
|
||||
|
||||
@Override
|
||||
public Type<HerculesBeetleJumpInputPayload> type() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.network.codec.StreamCodec;
|
||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public record HerculesBeetleMountedAttackPayload() implements CustomPacketPayload {
|
||||
public static final Type<HerculesBeetleMountedAttackPayload> TYPE =
|
||||
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_mounted_attack"));
|
||||
public static final StreamCodec<ByteBuf, HerculesBeetleMountedAttackPayload> STREAM_CODEC =
|
||||
StreamCodec.unit(new HerculesBeetleMountedAttackPayload());
|
||||
|
||||
@Override
|
||||
public Type<HerculesBeetleMountedAttackPayload> type() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.craisinlord.antarchy.content.network;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.network.codec.ByteBufCodecs;
|
||||
import net.minecraft.network.codec.StreamCodec;
|
||||
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
|
||||
public record HerculesBeetleMountedChargePayload(int chargeTicks) implements CustomPacketPayload {
|
||||
public static final Type<HerculesBeetleMountedChargePayload> TYPE =
|
||||
new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "hercules_beetle_mounted_charge"));
|
||||
public static final StreamCodec<ByteBuf, HerculesBeetleMountedChargePayload> STREAM_CODEC =
|
||||
ByteBufCodecs.VAR_INT.map(HerculesBeetleMountedChargePayload::new, HerculesBeetleMountedChargePayload::chargeTicks);
|
||||
|
||||
@Override
|
||||
public Type<HerculesBeetleMountedChargePayload> type() {
|
||||
return TYPE;
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
package com.craisinlord.antarchy.mixins.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.DorrieEntity;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.level.BlockGetter;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyArgs;
|
||||
import org.spongepowered.asm.mixin.injection.invoke.arg.Args;
|
||||
|
||||
@Mixin(Camera.class)
|
||||
public abstract class MountedVehicleCameraMixin {
|
||||
@Shadow
|
||||
private Entity entity;
|
||||
|
||||
@ModifyArgs(
|
||||
method = "setup",
|
||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;move(FFF)V")
|
||||
)
|
||||
private void antarchy$adjustMountedCameraOffset(
|
||||
Args args,
|
||||
BlockGetter level,
|
||||
Entity entity,
|
||||
boolean detached,
|
||||
boolean mirrored,
|
||||
float partialTick
|
||||
) {
|
||||
if (!detached || this.entity == null || this.entity.getVehicle() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Entity vehicle = this.entity.getVehicle();
|
||||
if (vehicle instanceof HerculesBeetleEntity) {
|
||||
args.set(0, (Float) args.get(0) * 1.45F);
|
||||
args.set(1, (Float) args.get(1) + 0.2F);
|
||||
args.set(2, (Float) args.get(2) + 0.45F);
|
||||
return;
|
||||
}
|
||||
|
||||
if (vehicle instanceof DorrieEntity) {
|
||||
args.set(0, (Float) args.get(0) * 1.6F);
|
||||
args.set(1, (Float) args.get(1) + 0.15F);
|
||||
args.set(2, (Float) args.get(2) + 0.55F);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,6 +51,7 @@
|
||||
"client.ElythiaSkyMixin",
|
||||
"client.ElytraModelAccessor",
|
||||
"client.LightningBoltRendererMixin",
|
||||
"client.MountedVehicleCameraMixin",
|
||||
"client.ParalyzedMouseTurnMixin",
|
||||
"client.ScreenEffectRendererFireVisualMixin",
|
||||
"client.SplashManagerMixin",
|
||||
|
||||
@@ -766,12 +766,13 @@
|
||||
"death.attack.water_soaked.player": "%1$s was super soaked to death by %2$s",
|
||||
"entity.antarchy.cheep": "Cheep",
|
||||
"entity.antarchy.dorrie": "Dorrie",
|
||||
"entity.antarchy.hercules_beetle": "Hercules Beetle",
|
||||
"item.antarchy.cheep": "Cheep",
|
||||
"item.antarchy.cheep_on_a_stick": "Cheep on a Stick",
|
||||
"item.antarchy.cheep_spawn_egg": "Cheep Spawn Egg",
|
||||
"item.antarchy.dorrie_spawn_egg": "Dorrie Spawn Egg",
|
||||
"container.antarchy.dorrie": "Dorrie",
|
||||
"item.antarchy.hercules_beetle_spawn_egg": "Hercules Beetle Spawn Egg",
|
||||
"key.antarchy.dorrie_charge_jump": "Dorrie: Charge Jump",
|
||||
"key.antarchy.hercules_beetle_charge": "Hercules Beetle: Charge",
|
||||
"entity.antarchy.reverie": "Reverie",
|
||||
"biome.antarchy.thoraxis": "Thoraxis",
|
||||
"biome.antarchy.nightmare_wastes": "Nightmare Wastes",
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"parent": "minecraft:item/template_spawn_egg"
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
"logical_height": 192,
|
||||
"infiniburn": "#minecraft:infiniburn_overworld",
|
||||
"effects": "minecraft:overworld",
|
||||
"ambient_light": 0.01,
|
||||
"ambient_light": 0.015,
|
||||
"piglin_safe": false,
|
||||
"has_raids": false,
|
||||
"monster_spawn_light_level": 0,
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"minecraft:bedrock",
|
||||
"minecraft:obsidian",
|
||||
"minecraft:crying_obsidian",
|
||||
"minecraft:barrier",
|
||||
"minecraft:command_block",
|
||||
"minecraft:chain_command_block",
|
||||
"minecraft:repeating_command_block",
|
||||
"minecraft:structure_block",
|
||||
"minecraft:jigsaw",
|
||||
"minecraft:structure_void",
|
||||
"minecraft:end_portal_frame",
|
||||
"minecraft:end_portal",
|
||||
"minecraft:end_gateway"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"minecraft:glow_berries"
|
||||
]
|
||||
}
|
||||
@@ -18,10 +18,6 @@
|
||||
}
|
||||
},
|
||||
"spawn_costs": {
|
||||
"antarchy:brutalfly": {
|
||||
"energy_budget": 0.3,
|
||||
"charge": 1.2
|
||||
}
|
||||
},
|
||||
"carvers": {
|
||||
"air": [],
|
||||
|
||||
@@ -22,7 +22,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"spawn_costs": {},
|
||||
"spawn_costs": {
|
||||
"antarchy:hercules_beetle": {
|
||||
"energy_budget": 0.1,
|
||||
"charge": 15
|
||||
}
|
||||
},
|
||||
"carvers": {
|
||||
"air": [],
|
||||
"liquid": []
|
||||
@@ -61,6 +66,12 @@
|
||||
"weight": 95,
|
||||
"minCount": 2,
|
||||
"maxCount": 5
|
||||
},
|
||||
{
|
||||
"type": "antarchy:hercules_beetle",
|
||||
"weight": 5,
|
||||
"minCount": 1,
|
||||
"maxCount": 1
|
||||
}
|
||||
],
|
||||
"creature": [
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"antarchy:jumpy_bug",
|
||||
"antarchy:spit_bug",
|
||||
"antarchy:stink_bug",
|
||||
"antarchy:hercules_beetle",
|
||||
"antarchy:creeping_horror",
|
||||
"antarchy:lurking_terror",
|
||||
"antarchy:scorpion",
|
||||
|
||||
@@ -114,6 +114,7 @@ import com.craisinlord.antarchy.content.item.DiamondMinecartItem;
|
||||
import com.craisinlord.antarchy.content.item.ReverieBottleItem;
|
||||
import com.craisinlord.antarchy.content.item.ScorpionWhipItem;
|
||||
import com.craisinlord.antarchy.content.item.ScorpionWhipTetherSync;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync;
|
||||
import com.craisinlord.antarchy.content.item.SizeRayItem;
|
||||
import com.craisinlord.antarchy.content.item.SquidzookaItem;
|
||||
import com.craisinlord.antarchy.content.item.SimpleToolTier;
|
||||
@@ -1820,14 +1821,19 @@ public final class AntarchyFabricContent {
|
||||
.sized(2.4F, 2.0F)
|
||||
.clientTrackingRange(10)
|
||||
.build("dorrie"));
|
||||
public static final DeferredHolder<EntityType<?>, EntityType<com.craisinlord.antarchy.content.entity.HerculesBeetleEntity>> HERCULES_BEETLE = ENTITY_TYPES.register("hercules_beetle",
|
||||
() -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.HerculesBeetleEntity::new, MobCategory.MONSTER)
|
||||
.sized(3.0F, 4.0F)
|
||||
.clientTrackingRange(12)
|
||||
.build("hercules_beetle"));
|
||||
public static final DeferredItem<Item> CHEEP_ITEM = ITEMS.register("cheep",
|
||||
() -> new Item(new Item.Properties().food(new FoodProperties.Builder().nutrition(2).saturationModifier(0.2F).build())));
|
||||
public static final DeferredItem<com.craisinlord.antarchy.content.item.CheepOnAStickItem> CHEEP_ON_A_STICK = ITEMS.register("cheep_on_a_stick",
|
||||
() -> new com.craisinlord.antarchy.content.item.CheepOnAStickItem(new Item.Properties().stacksTo(1).durability(25)));
|
||||
public static final DeferredItem<DeferredSpawnEggItem> CHEEP_SPAWN_EGG = ITEMS.register("cheep_spawn_egg",
|
||||
() -> new DeferredSpawnEggItem(CHEEP, 0xFF00AA, 0x00FF44, new Item.Properties()));
|
||||
public static final DeferredItem<DeferredSpawnEggItem> DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg",
|
||||
() -> new DeferredSpawnEggItem(DORRIE, 0x1B91B3, 0xC0E8FF, new Item.Properties()));
|
||||
public static final DeferredItem<DeferredSpawnEggItem> HERCULES_BEETLE_SPAWN_EGG = ITEMS.register("hercules_beetle_spawn_egg",
|
||||
() -> new DeferredSpawnEggItem(HERCULES_BEETLE, 0x6B1F2A, 0xD4AF37, new Item.Properties().rarity(Rarity.RARE)));
|
||||
|
||||
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> ANTARCHY_TAB = CREATIVE_MODE_TABS.register("antarchy",
|
||||
() -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0)
|
||||
@@ -1917,6 +1923,7 @@ public final class AntarchyFabricContent {
|
||||
FabricDefaultAttributeRegistry.register(LURKING_TERROR.get(), LurkingTerrorEntity.createAttributes().build());
|
||||
FabricDefaultAttributeRegistry.register(CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build());
|
||||
FabricDefaultAttributeRegistry.register(DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build());
|
||||
FabricDefaultAttributeRegistry.register(HERCULES_BEETLE.get(), com.craisinlord.antarchy.content.entity.HerculesBeetleEntity.createAttributes().build());
|
||||
|
||||
FabricDefaultAttributeRegistry.register(RED_ANT.get(), buildAntAttributes(
|
||||
AntarchySettings.redAntHealth(),
|
||||
@@ -2069,10 +2076,10 @@ public final class AntarchyFabricContent {
|
||||
"bomber_spawn_egg", "jumpy_bug_spawn_egg", "spit_bug_spawn_egg", "stink_bug_spawn_egg", "cloud_shark_spawn_egg", "kraken_spawn_egg", "missile_squid_spawn_egg", "octopus_bomb_spawn_egg",
|
||||
"nightmare_spawn_egg", "bed_bug_spawn_egg", "lucid_spawn_egg", "scorpion_spawn_egg",
|
||||
"basilisk_spawn_egg", "emperor_scorpion_spawn_egg", "toreterror_spawn_egg",
|
||||
"hercules_beetle_spawn_egg",
|
||||
"creeping_horror_spawn_egg", "lurking_terror_spawn_egg" -> 90;
|
||||
case "stink_bug", "chiten" -> 22;
|
||||
case "cheep" -> 21;
|
||||
case "cheep_on_a_stick" -> 52;
|
||||
case "water_cannon" -> 52;
|
||||
case "primordial_helmet", "primordial_chestplate", "primordial_leggings", "primordial_boots" -> 53;
|
||||
case "jumpy_boots" -> 54;
|
||||
@@ -2359,6 +2366,7 @@ public final class AntarchyFabricContent {
|
||||
|
||||
// Wire common-module accessors after all registrations are complete.
|
||||
AntarchyObjects.CHEEP_ITEM = () -> CHEEP_ITEM.get();
|
||||
AntarchyObjects.setHerculesBeetle(() -> HERCULES_BEETLE.get());
|
||||
|
||||
AntarchySoundEvents.bind(
|
||||
SQUIDZOOKA_FIRE,
|
||||
@@ -2588,6 +2596,7 @@ public final class AntarchyFabricContent {
|
||||
LucidEyeProjectileEntity.invertedEffectSupplier = () -> mobEffectHolder(INVERTED);
|
||||
|
||||
ScorpionWhipTetherSync.setSink(AntarchyFabricNetworking::syncScorpionWhipTether);
|
||||
HerculesBeetleImpactShakeSync.setSink((player, ticks) -> net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking.send(player, new com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload(ticks)));
|
||||
BloodCrystalKatanaItem.setTrailCallback(AntarchyFabricNetworking::syncKatanaTrail);
|
||||
com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyFabricNetworking::syncGravityEntity);
|
||||
AntarchyFabricEvents.register();
|
||||
|
||||
+4
-4
@@ -1,6 +1,7 @@
|
||||
package com.craisinlord.antarchy.fabric.client;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.craisinlord.antarchy.content.client.renderer.*;
|
||||
import com.craisinlord.antarchy.content.client.particle.*;
|
||||
import com.craisinlord.antarchy.content.client.renderer.AntiwaterFluidRenderer;
|
||||
@@ -49,10 +50,6 @@ public final class AntarchyFabricClientBootstrap {
|
||||
|
||||
public static void register() {
|
||||
AntarchyKeyBindings.register();
|
||||
net.minecraft.client.gui.screens.MenuScreens.register(
|
||||
com.craisinlord.antarchy.fabric.AntarchyFabricContent.DORRIE_MENU.get(),
|
||||
com.craisinlord.antarchy.content.client.screen.DorrieScreen::new
|
||||
);
|
||||
registerRenderers();
|
||||
registerEntityLayers();
|
||||
registerColors();
|
||||
@@ -119,6 +116,7 @@ public final class AntarchyFabricClientBootstrap {
|
||||
EntityRendererRegistry.register(AntarchyFabricContent.LURKING_TERROR.get(), LurkingTerrorRenderer::new);
|
||||
EntityRendererRegistry.register(AntarchyFabricContent.CHEEP.get(), com.craisinlord.antarchy.content.client.renderer.CheepRenderer::new);
|
||||
EntityRendererRegistry.register(AntarchyFabricContent.DORRIE.get(), com.craisinlord.antarchy.content.client.renderer.DorrieRenderer::new);
|
||||
EntityRendererRegistry.register(AntarchyFabricContent.HERCULES_BEETLE.get(), com.craisinlord.antarchy.content.client.renderer.HerculesBeetleRenderer::new);
|
||||
|
||||
EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.boatLayer(), BoatModel::createBodyModel);
|
||||
EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel);
|
||||
@@ -321,6 +319,7 @@ public final class AntarchyFabricClientBootstrap {
|
||||
|
||||
private static void registerClientCallbacks() {
|
||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
||||
HerculesBeetleImpactShakeClientState.tick();
|
||||
if (client.player != null) {
|
||||
ParalyzedClientHandler.clampPlayerInput(client.player);
|
||||
}
|
||||
@@ -332,6 +331,7 @@ public final class AntarchyFabricClientBootstrap {
|
||||
BloodCrystalKatanaTrailHandler.tick();
|
||||
ScorpionWhipTetherRenderHandler.tick();
|
||||
DorrieJumpClientHandler.tick();
|
||||
HerculesBeetleClientHandler.tick();
|
||||
});
|
||||
|
||||
GravityGunClientHandler.register();
|
||||
|
||||
@@ -24,11 +24,19 @@ public final class AntarchyKeyBindings {
|
||||
CATEGORY
|
||||
);
|
||||
|
||||
public static final KeyMapping HERCULES_BEETLE_CHARGE = new KeyMapping(
|
||||
"key.antarchy.hercules_beetle_charge",
|
||||
InputConstants.Type.KEYSYM,
|
||||
GLFW.GLFW_KEY_LEFT_CONTROL,
|
||||
CATEGORY
|
||||
);
|
||||
|
||||
private AntarchyKeyBindings() {}
|
||||
|
||||
public static void register() {
|
||||
KeyBindingHelper.registerKeyBinding(BRUTALFLY_FLAP);
|
||||
KeyBindingHelper.registerKeyBinding(DORRIE_CHARGE_JUMP);
|
||||
KeyBindingHelper.registerKeyBinding(HERCULES_BEETLE_CHARGE);
|
||||
}
|
||||
|
||||
public static boolean isBrutalflyFlapPressed() {
|
||||
@@ -38,4 +46,8 @@ public final class AntarchyKeyBindings {
|
||||
public static boolean isDorrieChargeJumpPressed() {
|
||||
return Minecraft.getInstance().screen == null && DORRIE_CHARGE_JUMP.isDown();
|
||||
}
|
||||
|
||||
public static boolean isHerculesBeetleChargePressed() {
|
||||
return Minecraft.getInstance().screen == null && HERCULES_BEETLE_CHARGE.isDown();
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
package com.craisinlord.antarchy.fabric.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload;
|
||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
|
||||
public final class HerculesBeetleClientHandler {
|
||||
private static final int MAX_CHARGE_TICKS = 40;
|
||||
|
||||
private static boolean wasPressingJump;
|
||||
private static boolean wasPressingAttack;
|
||||
private static boolean wasCharging;
|
||||
private static int chargeTicks;
|
||||
|
||||
private HerculesBeetleClientHandler() {
|
||||
}
|
||||
|
||||
public static void tick() {
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
LocalPlayer player = mc.player;
|
||||
if (player == null || mc.screen != null) {
|
||||
resetAll();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(player.getVehicle() instanceof HerculesBeetleEntity)) {
|
||||
resetAll();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean pressingJump = mc.options.keyJump.isDown();
|
||||
if (pressingJump != wasPressingJump) {
|
||||
ClientPlayNetworking.send(new HerculesBeetleJumpInputPayload(pressingJump));
|
||||
wasPressingJump = pressingJump;
|
||||
}
|
||||
|
||||
boolean pressingAttack = mc.options.keyAttack.isDown();
|
||||
if (pressingAttack && !wasPressingAttack) {
|
||||
ClientPlayNetworking.send(new HerculesBeetleMountedAttackPayload());
|
||||
}
|
||||
wasPressingAttack = pressingAttack;
|
||||
|
||||
boolean charging = AntarchyKeyBindings.isHerculesBeetleChargePressed();
|
||||
if (charging) {
|
||||
chargeTicks = Math.min(chargeTicks + 1, MAX_CHARGE_TICKS);
|
||||
} else if (wasCharging && chargeTicks > 0) {
|
||||
ClientPlayNetworking.send(new HerculesBeetleMountedChargePayload(chargeTicks));
|
||||
chargeTicks = 0;
|
||||
}
|
||||
wasCharging = charging;
|
||||
}
|
||||
|
||||
private static void resetAll() {
|
||||
if (wasPressingJump) {
|
||||
ClientPlayNetworking.send(new HerculesBeetleJumpInputPayload(false));
|
||||
wasPressingJump = false;
|
||||
}
|
||||
wasPressingAttack = false;
|
||||
wasCharging = false;
|
||||
chargeTicks = 0;
|
||||
}
|
||||
}
|
||||
+18
-5
@@ -1,7 +1,8 @@
|
||||
package com.craisinlord.antarchy.fabric.mixin.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.ToreterrorEntity;
|
||||
import com.craisinlord.antarchy.content.item.BigBerthaItem;
|
||||
import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity;
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.math.Axis;
|
||||
import net.minecraft.client.Minecraft;
|
||||
@@ -16,14 +17,15 @@ import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(GameRenderer.class)
|
||||
public abstract class ToreterrorCameraShakeMixin {
|
||||
public abstract class CameraShakeMixin {
|
||||
private static final double MAX_SHAKE_RANGE = 48.0D;
|
||||
private static final int TORETERROR_SHAKE_TICKS = 25;
|
||||
private static final double NIGHTMARE_SHAKE_RANGE = 32.0D;
|
||||
|
||||
@Shadow @Final private Minecraft minecraft;
|
||||
|
||||
@Inject(method = "bobView", at = @At("TAIL"))
|
||||
private void applyToreterrorShake(PoseStack poseStack, float partialTick, CallbackInfo ci) {
|
||||
private void applyCameraShake(PoseStack poseStack, float partialTick, CallbackInfo ci) {
|
||||
if (minecraft.level == null || minecraft.player == null) return;
|
||||
|
||||
Vec3 cameraPos = minecraft.gameRenderer.getMainCamera().getPosition();
|
||||
@@ -39,8 +41,19 @@ public abstract class ToreterrorCameraShakeMixin {
|
||||
shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.0F);
|
||||
}
|
||||
|
||||
if (BigBerthaItem.clientShakeTicks > 0) {
|
||||
shakeStrength += (float) BigBerthaItem.clientShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F;
|
||||
for (NightmareEntity nightmare : minecraft.level.getEntitiesOfClass(
|
||||
NightmareEntity.class,
|
||||
minecraft.player.getBoundingBox().inflate(NIGHTMARE_SHAKE_RANGE),
|
||||
entity -> entity.isAlive() && entity.isRoaring()
|
||||
)) {
|
||||
double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D)));
|
||||
if (distance > NIGHTMARE_SHAKE_RANGE) continue;
|
||||
shakeStrength += (float) ((1.0D - distance / NIGHTMARE_SHAKE_RANGE) * 1.35D);
|
||||
}
|
||||
|
||||
int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks();
|
||||
if (beetleShakeTicks > 0) {
|
||||
shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F;
|
||||
}
|
||||
|
||||
if (shakeStrength <= 0.0F) return;
|
||||
-63
@@ -1,63 +0,0 @@
|
||||
package com.craisinlord.antarchy.fabric.mixin.client;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.math.Axis;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
//TODO FIX ON FABRIC SIDE
|
||||
@Mixin(GameRenderer.class)
|
||||
public abstract class NightmareCameraShakeMixin {
|
||||
// private static final double MAX_SHAKE_RANGE = 32.0D;
|
||||
//
|
||||
// @Shadow @Final private Minecraft minecraft;
|
||||
//
|
||||
// @Redirect(
|
||||
// method = "renderLevel",
|
||||
// at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GameRenderer;bobView(Lcom/mojang/blaze3d/vertex/PoseStack;F)V")
|
||||
// )
|
||||
// private void applyNightmareCameraShake(GameRenderer instance, PoseStack poseStack, float partialTick) {
|
||||
// instance.bobView(poseStack, partialTick);
|
||||
// if (minecraft.level == null || minecraft.player == null) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// Vec3 cameraPos = minecraft.gameRenderer.getMainCamera().getPosition();
|
||||
// float shakeStrength = 0.0F;
|
||||
//
|
||||
// for (NightmareEntity nightmare : minecraft.level.getEntitiesOfClass(
|
||||
// NightmareEntity.class,
|
||||
// minecraft.player.getBoundingBox().inflate(MAX_SHAKE_RANGE),
|
||||
// e -> e.isAlive() && e.isRoaring()
|
||||
// )) {
|
||||
// double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D)));
|
||||
// if (distance > MAX_SHAKE_RANGE) {
|
||||
// continue;
|
||||
// }
|
||||
// shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.35D);
|
||||
// }
|
||||
//
|
||||
// if (shakeStrength <= 0.0F) {
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// float time = (float) (minecraft.player.tickCount + partialTick);
|
||||
// float yawOffset = Mth.sin(time * 1.85F) * shakeStrength * 1.8F;
|
||||
// float pitchOffset = Mth.cos(time * 2.15F) * shakeStrength * 1.45F;
|
||||
// float rollOffset = Mth.sin(time * 2.65F) * shakeStrength * 1.05F;
|
||||
//
|
||||
// poseStack.mulPose(Axis.YP.rotationDegrees(yawOffset));
|
||||
// poseStack.mulPose(Axis.XP.rotationDegrees(pitchOffset));
|
||||
// poseStack.mulPose(Axis.ZP.rotationDegrees(rollOffset));
|
||||
// }
|
||||
}
|
||||
+2
@@ -34,5 +34,7 @@ public final class AntarchyFabricClientNetworking {
|
||||
payload.anchorY(),
|
||||
payload.anchorZ()
|
||||
)));
|
||||
ClientPlayNetworking.registerGlobalReceiver(HerculesBeetleImpactShakePayload.TYPE, (payload, context) ->
|
||||
context.client().execute(() -> AntarchyFabricNetworking.triggerHerculesBeetleImpactShake(payload.durationTicks())));
|
||||
}
|
||||
}
|
||||
+35
@@ -1,12 +1,15 @@
|
||||
package com.craisinlord.antarchy.fabric.network;
|
||||
|
||||
import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity;
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner;
|
||||
import com.craisinlord.antarchy.content.entity.multipart.network.MultipartAttackPayload;
|
||||
import com.craisinlord.antarchy.content.entity.multipart.network.MultipartInteractPayload;
|
||||
import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper;
|
||||
import com.craisinlord.antarchy.content.item.BrutalflyElytraItem;
|
||||
import com.craisinlord.antarchy.content.item.BigBerthaItem;
|
||||
import com.craisinlord.antarchy.content.item.JumpyBootsHelper;
|
||||
import com.craisinlord.antarchy.fabric.util.JumpyBootsFabricHelper;
|
||||
import com.craisinlord.antarchy.content.item.JumpyBootsItem;
|
||||
@@ -47,6 +50,7 @@ public final class AntarchyFabricNetworking {
|
||||
PayloadTypeRegistry.playS2C().register(ScorpionWhipTetherPayload.TYPE, ScorpionWhipTetherPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playS2C().register(BrutalflyElytraAnimationPayload.TYPE, BrutalflyElytraAnimationPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playS2C().register(ThoraxisWeatherPayload.TYPE, ThoraxisWeatherPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playS2C().register(HerculesBeetleImpactShakePayload.TYPE, HerculesBeetleImpactShakePayload.STREAM_CODEC);
|
||||
|
||||
PayloadTypeRegistry.playC2S().register(GravityGunPrimaryPayload.TYPE, GravityGunPrimaryPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(GravityGunScrollPayload.TYPE, GravityGunScrollPayload.STREAM_CODEC);
|
||||
@@ -55,6 +59,9 @@ public final class AntarchyFabricNetworking {
|
||||
PayloadTypeRegistry.playC2S().register(JumpyBootsLaunchPayload.TYPE, JumpyBootsLaunchPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(DorrieJumpInputPayload.TYPE, DorrieJumpInputPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload.TYPE, com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(HerculesBeetleJumpInputPayload.TYPE, HerculesBeetleJumpInputPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedAttackPayload.TYPE, HerculesBeetleMountedAttackPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(HerculesBeetleMountedChargePayload.TYPE, HerculesBeetleMountedChargePayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(MultipartAttackPayload.TYPE, MultipartAttackPayload.STREAM_CODEC);
|
||||
PayloadTypeRegistry.playC2S().register(MultipartInteractPayload.TYPE, MultipartInteractPayload.STREAM_CODEC);
|
||||
}
|
||||
@@ -74,6 +81,12 @@ public final class AntarchyFabricNetworking {
|
||||
context.server().execute(() -> handleDorrieJumpInput(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload.TYPE, (payload, context) ->
|
||||
context.server().execute(() -> handleDorrieChargeJumpInput(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(HerculesBeetleJumpInputPayload.TYPE, (payload, context) ->
|
||||
context.server().execute(() -> handleHerculesBeetleJumpInput(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(HerculesBeetleMountedAttackPayload.TYPE, (payload, context) ->
|
||||
context.server().execute(() -> handleHerculesBeetleMountedAttack(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(HerculesBeetleMountedChargePayload.TYPE, (payload, context) ->
|
||||
context.server().execute(() -> handleHerculesBeetleMountedCharge(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(MultipartAttackPayload.TYPE, (payload, context) ->
|
||||
context.server().execute(() -> handleMultipartAttack(context.player(), payload)));
|
||||
ServerPlayNetworking.registerGlobalReceiver(MultipartInteractPayload.TYPE, (payload, context) ->
|
||||
@@ -328,4 +341,26 @@ public final class AntarchyFabricNetworking {
|
||||
dorrie.releaseJump();
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleHerculesBeetleJumpInput(ServerPlayer player, HerculesBeetleJumpInputPayload payload) {
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.setRiderJumpPressed(payload.pressing());
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleHerculesBeetleMountedAttack(ServerPlayer player, HerculesBeetleMountedAttackPayload payload) {
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.handleMountedRegularAttack(player);
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleHerculesBeetleMountedCharge(ServerPlayer player, HerculesBeetleMountedChargePayload payload) {
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.handleMountedCharge(player, payload.chargeTicks());
|
||||
}
|
||||
}
|
||||
|
||||
public static void triggerHerculesBeetleImpactShake(int durationTicks) {
|
||||
HerculesBeetleImpactShakeClientState.trigger(durationTicks);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@
|
||||
],
|
||||
"client": [
|
||||
"client.NightmareCameraShakeMixin",
|
||||
"client.ToreterrorCameraShakeMixin",
|
||||
"client.CameraShakeMixin",
|
||||
"client.DuctTapeInputMixin",
|
||||
"client.AntiwaterFogMixin",
|
||||
"client.GravityGunMouseScrollMixin",
|
||||
|
||||
+7
@@ -1,6 +1,9 @@
|
||||
package com.craisinlord.antarchy.neoforge;
|
||||
|
||||
import com.craisinlord.antarchy.config.AntarchySettings;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync;
|
||||
import net.neoforged.neoforge.network.PacketDistributor;
|
||||
import net.neoforged.fml.ModContainer;
|
||||
import net.neoforged.fml.config.ModConfig;
|
||||
import net.neoforged.fml.event.config.ModConfigEvent;
|
||||
@@ -12,6 +15,7 @@ public final class AntarchyConfigModuleNeoforge {
|
||||
modContainer.registerConfig(ModConfig.Type.COMMON, AntarchyMobsConfig.SPEC, "antarchy/antarchy_mobs.toml");
|
||||
modContainer.registerConfig(ModConfig.Type.COMMON, AntarchyToolsConfig.SPEC, "antarchy/antarchy_tools.toml");
|
||||
modContainer.registerConfig(ModConfig.Type.COMMON, AntarchyMiscConfig.SPEC, "antarchy/antarchy_misc.toml");
|
||||
HerculesBeetleImpactShakeSync.setSink((player, ticks) -> PacketDistributor.sendToPlayer(player, new HerculesBeetleImpactShakePayload(ticks)));
|
||||
AntarchyNeoforge.modEventBusTempHolder.addListener(AntarchyConfigModuleNeoforge::onConfigChange);
|
||||
}
|
||||
|
||||
@@ -169,6 +173,9 @@ public final class AntarchyConfigModuleNeoforge {
|
||||
AntarchySettings.setCheepHealth(AntarchyMobsConfig.cheepHealth());
|
||||
AntarchySettings.setCheepAttackDamage(AntarchyMobsConfig.cheepAttackDamage());
|
||||
AntarchySettings.setDorrieHealth(AntarchyMobsConfig.dorrieHealth());
|
||||
AntarchySettings.setHerculesBeetleHealth(AntarchyMobsConfig.herculesBeetleHealth());
|
||||
AntarchySettings.setHerculesBeetleAttackDamage(AntarchyMobsConfig.herculesBeetleAttackDamage());
|
||||
AntarchySettings.setHerculesBeetleChargeDamage(AntarchyMobsConfig.herculesBeetleChargeDamage());
|
||||
}
|
||||
|
||||
private static void bakeToolsConfig() {
|
||||
|
||||
@@ -193,6 +193,13 @@ public final class AntarchyMobsConfig {
|
||||
private static final ModConfigSpec.DoubleValue DORRIE_HEALTH;
|
||||
|
||||
|
||||
// Hercules Beetle
|
||||
|
||||
private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_HEALTH;
|
||||
private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_ATTACK_DAMAGE;
|
||||
private static final ModConfigSpec.DoubleValue HERCULES_BEETLE_CHARGE_DAMAGE;
|
||||
|
||||
|
||||
// Lucid
|
||||
|
||||
private static final ModConfigSpec.DoubleValue LUCID_ATTACK_RANGE;
|
||||
@@ -493,6 +500,12 @@ public final class AntarchyMobsConfig {
|
||||
DORRIE_HEALTH = b.comment("Base max health.").defineInRange("health", 60.0D, 1.0D, 32768.0D);
|
||||
b.pop();
|
||||
|
||||
b.push("herculesBeetle");
|
||||
HERCULES_BEETLE_HEALTH = b.comment("Base max health.").defineInRange("health", 500.0D, 1.0D, 32768.0D);
|
||||
HERCULES_BEETLE_ATTACK_DAMAGE = b.comment("Base melee damage for ground and flying attacks.").defineInRange("attackDamage", 30.0D, 0.0D, 1024.0D);
|
||||
HERCULES_BEETLE_CHARGE_DAMAGE = b.comment("AOE impact damage dealt when a charge collides.").defineInRange("chargeDamage", 40.0D, 0.0D, 1024.0D);
|
||||
b.pop();
|
||||
|
||||
b.push("toreterror");
|
||||
TORETERROR_HEALTH = b.comment("Base max health.").defineInRange("health", 300.0D, 1.0D, 32768.0D);
|
||||
TORETERROR_JUMP_ATTACK_DAMAGE = b.comment("Damage dealt by the jump shockwave.").defineInRange("jumpAttackDamage", 14.0D, 0.0D, 1024.0D);
|
||||
@@ -652,4 +665,7 @@ public final class AntarchyMobsConfig {
|
||||
static double cheepHealth() { return CHEEP_HEALTH.get(); }
|
||||
static double cheepAttackDamage() { return CHEEP_ATTACK_DAMAGE.get(); }
|
||||
static double dorrieHealth() { return DORRIE_HEALTH.get(); }
|
||||
static double herculesBeetleHealth() { return HERCULES_BEETLE_HEALTH.get(); }
|
||||
static double herculesBeetleAttackDamage() { return HERCULES_BEETLE_ATTACK_DAMAGE.get(); }
|
||||
static double herculesBeetleChargeDamage() { return HERCULES_BEETLE_CHARGE_DAMAGE.get(); }
|
||||
}
|
||||
@@ -268,6 +268,7 @@ public class AntarchyNeoforge {
|
||||
() -> AntarchyNeoforgeMisc.BLOODGLASS_MAX_HEARTS,
|
||||
() -> AntarchyNeoforgeMisc.BLOODGLASS_WARD
|
||||
);
|
||||
AntarchyObjects.setHerculesBeetle(AntarchyNeoforgeEntites.HERCULES_BEETLE);
|
||||
AntarchyObjects.setOctopusBomb(AntarchyNeoforgeEntites.OCTOPUS_BOMB);
|
||||
}
|
||||
|
||||
|
||||
+9
@@ -29,11 +29,20 @@ public final class AntarchyKeyBindings {
|
||||
CATEGORY
|
||||
);
|
||||
|
||||
public static final KeyMapping HERCULES_BEETLE_CHARGE = new KeyMapping(
|
||||
"key.antarchy.hercules_beetle_charge",
|
||||
KeyConflictContext.IN_GAME,
|
||||
InputConstants.Type.KEYSYM,
|
||||
InputConstants.KEY_LCONTROL,
|
||||
CATEGORY
|
||||
);
|
||||
|
||||
private AntarchyKeyBindings() {}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) {
|
||||
event.register(BRUTALFLY_FLAP);
|
||||
event.register(DORRIE_CHARGE_JUMP);
|
||||
event.register(HERCULES_BEETLE_CHARGE);
|
||||
}
|
||||
}
|
||||
+1
@@ -132,6 +132,7 @@ public final class AntarchyNeoForgeClient {
|
||||
event.registerEntityRenderer(AntarchyNeoforgeEntites.LURKING_TERROR.get(), LurkingTerrorRenderer::new);
|
||||
event.registerEntityRenderer(AntarchyNeoforgeEntites.CHEEP.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.CheepRenderer(context)));
|
||||
event.registerEntityRenderer(AntarchyNeoforgeEntites.DORRIE.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.DorrieRenderer(context)));
|
||||
event.registerEntityRenderer(AntarchyNeoforgeEntites.HERCULES_BEETLE.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.HerculesBeetleRenderer(context)));
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
|
||||
+18
-5
@@ -1,8 +1,9 @@
|
||||
package com.craisinlord.antarchy.neoforge.client;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.craisinlord.antarchy.content.entity.ToreterrorEntity;
|
||||
import com.craisinlord.antarchy.content.item.BigBerthaItem;
|
||||
import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
@@ -12,11 +13,12 @@ import net.neoforged.fml.common.EventBusSubscriber;
|
||||
import net.neoforged.neoforge.client.event.ViewportEvent;
|
||||
|
||||
@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT)
|
||||
public final class ToreterrorCameraShakeHandler {
|
||||
public final class CameraShakeHandler {
|
||||
private static final double MAX_SHAKE_RANGE = 48.0D;
|
||||
private static final int TORETERROR_SHAKE_TICKS = 25;
|
||||
private static final double NIGHTMARE_SHAKE_RANGE = 32.0D;
|
||||
|
||||
private ToreterrorCameraShakeHandler() {
|
||||
private CameraShakeHandler() {
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
@@ -37,8 +39,19 @@ public final class ToreterrorCameraShakeHandler {
|
||||
shakeStrength += (float) ((1.0D - distance / MAX_SHAKE_RANGE) * 1.0D);
|
||||
}
|
||||
|
||||
if (BigBerthaItem.clientShakeTicks > 0) {
|
||||
shakeStrength += (float) BigBerthaItem.clientShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F;
|
||||
for (NightmareEntity nightmare : mc.level.getEntitiesOfClass(
|
||||
NightmareEntity.class,
|
||||
mc.player.getBoundingBox().inflate(NIGHTMARE_SHAKE_RANGE),
|
||||
entity -> entity.isAlive() && entity.isRoaring()
|
||||
)) {
|
||||
double distance = Math.sqrt(cameraPos.distanceToSqr(nightmare.position().add(0.0D, nightmare.getBbHeight() * 0.5D, 0.0D)));
|
||||
if (distance > NIGHTMARE_SHAKE_RANGE) continue;
|
||||
shakeStrength += (float) ((1.0D - distance / NIGHTMARE_SHAKE_RANGE) * 1.35D);
|
||||
}
|
||||
|
||||
int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks();
|
||||
if (beetleShakeTicks > 0) {
|
||||
shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F;
|
||||
}
|
||||
|
||||
if (shakeStrength <= 0.0F) return;
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
package com.craisinlord.antarchy.neoforge.client;
|
||||
|
||||
import com.craisinlord.antarchy.Antarchy;
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.player.LocalPlayer;
|
||||
import net.neoforged.api.distmarker.Dist;
|
||||
import net.neoforged.bus.api.SubscribeEvent;
|
||||
import net.neoforged.fml.common.EventBusSubscriber;
|
||||
import net.neoforged.neoforge.client.event.ClientTickEvent;
|
||||
import net.neoforged.neoforge.network.PacketDistributor;
|
||||
|
||||
@EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT)
|
||||
public final class HerculesBeetleClientHandler {
|
||||
private static final int MAX_CHARGE_TICKS = 40;
|
||||
|
||||
private static boolean wasPressingJump;
|
||||
private static boolean wasPressingAttack;
|
||||
private static boolean wasCharging;
|
||||
private static int chargeTicks;
|
||||
|
||||
private HerculesBeetleClientHandler() {
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onClientTick(ClientTickEvent.Post event) {
|
||||
HerculesBeetleImpactShakeClientState.tick();
|
||||
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
LocalPlayer player = mc.player;
|
||||
if (player == null || mc.screen != null) {
|
||||
resetAll();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(player.getVehicle() instanceof HerculesBeetleEntity)) {
|
||||
resetAll();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean pressingJump = mc.options.keyJump.isDown();
|
||||
if (pressingJump != wasPressingJump) {
|
||||
PacketDistributor.sendToServer(new HerculesBeetleJumpInputPayload(pressingJump));
|
||||
wasPressingJump = pressingJump;
|
||||
}
|
||||
|
||||
boolean pressingAttack = mc.options.keyAttack.isDown();
|
||||
if (pressingAttack && !wasPressingAttack) {
|
||||
PacketDistributor.sendToServer(new HerculesBeetleMountedAttackPayload());
|
||||
}
|
||||
wasPressingAttack = pressingAttack;
|
||||
|
||||
boolean charging = AntarchyKeyBindings.HERCULES_BEETLE_CHARGE.isDown();
|
||||
if (charging) {
|
||||
chargeTicks = Math.min(chargeTicks + 1, MAX_CHARGE_TICKS);
|
||||
} else if (wasCharging && chargeTicks > 0) {
|
||||
PacketDistributor.sendToServer(new HerculesBeetleMountedChargePayload(chargeTicks));
|
||||
chargeTicks = 0;
|
||||
}
|
||||
wasCharging = charging;
|
||||
}
|
||||
|
||||
private static void resetAll() {
|
||||
if (wasPressingJump) {
|
||||
PacketDistributor.sendToServer(new HerculesBeetleJumpInputPayload(false));
|
||||
wasPressingJump = false;
|
||||
}
|
||||
wasPressingAttack = false;
|
||||
wasCharging = false;
|
||||
chargeTicks = 0;
|
||||
}
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
package com.craisinlord.antarchy.neoforge.network;
|
||||
|
||||
import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload;
|
||||
import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.neoforged.neoforge.network.handling.IPayloadContext;
|
||||
import net.neoforged.neoforge.network.registration.PayloadRegistrar;
|
||||
|
||||
public final class HerculesBeetleNetworking {
|
||||
private HerculesBeetleNetworking() {
|
||||
}
|
||||
|
||||
public static void register(PayloadRegistrar registrar) {
|
||||
registrar.playToServer(
|
||||
HerculesBeetleJumpInputPayload.TYPE,
|
||||
HerculesBeetleJumpInputPayload.STREAM_CODEC,
|
||||
HerculesBeetleNetworking::handleJumpInput
|
||||
).playToServer(
|
||||
HerculesBeetleMountedAttackPayload.TYPE,
|
||||
HerculesBeetleMountedAttackPayload.STREAM_CODEC,
|
||||
HerculesBeetleNetworking::handleMountedAttack
|
||||
).playToServer(
|
||||
HerculesBeetleMountedChargePayload.TYPE,
|
||||
HerculesBeetleMountedChargePayload.STREAM_CODEC,
|
||||
HerculesBeetleNetworking::handleMountedCharge
|
||||
).playToClient(
|
||||
HerculesBeetleImpactShakePayload.TYPE,
|
||||
HerculesBeetleImpactShakePayload.STREAM_CODEC,
|
||||
HerculesBeetleNetworking::handleImpactShake
|
||||
);
|
||||
}
|
||||
|
||||
private static void handleJumpInput(HerculesBeetleJumpInputPayload payload, IPayloadContext context) {
|
||||
context.enqueueWork(() -> {
|
||||
if (!(context.player() instanceof ServerPlayer player)) {
|
||||
return;
|
||||
}
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.setRiderJumpPressed(payload.pressing());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void handleMountedAttack(HerculesBeetleMountedAttackPayload payload, IPayloadContext context) {
|
||||
context.enqueueWork(() -> {
|
||||
if (!(context.player() instanceof ServerPlayer player)) {
|
||||
return;
|
||||
}
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.handleMountedRegularAttack(player);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void handleMountedCharge(HerculesBeetleMountedChargePayload payload, IPayloadContext context) {
|
||||
context.enqueueWork(() -> {
|
||||
if (!(context.player() instanceof ServerPlayer player)) {
|
||||
return;
|
||||
}
|
||||
if (player.getVehicle() instanceof HerculesBeetleEntity beetle) {
|
||||
beetle.handleMountedCharge(player, payload.chargeTicks());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void handleImpactShake(HerculesBeetleImpactShakePayload payload, IPayloadContext context) {
|
||||
context.enqueueWork(() -> HerculesBeetleImpactShakeClientState.trigger(payload.durationTicks()));
|
||||
}
|
||||
}
|
||||
+2
-3
@@ -115,7 +115,6 @@ public class AntarchyNeoforgeCreativeModeTabs {
|
||||
}
|
||||
|
||||
if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) {
|
||||
event.accept(AntarchyNeoforgeItems.CHEEP_ON_A_STICK.get());
|
||||
event.insertAfter(new ItemStack(Items.SHEARS), new ItemStack(AntarchyNeoforgeItems.DUCT_TAPE_ITEM.get()), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS);
|
||||
event.insertAfter(new ItemStack(Items.MINECART), new ItemStack(AntarchyNeoforgeItems.DIAMOND_MINECART_ITEM.get()), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS);
|
||||
event.accept(AntarchyNeoforgeItems.BILE_BUCKET.get());
|
||||
@@ -384,7 +383,7 @@ public class AntarchyNeoforgeCreativeModeTabs {
|
||||
// 8 - Blood crystal blocks (not the shard ingredient)
|
||||
case "blood_crystal_block", "small_blood_crystal_bud", "medium_blood_crystal_bud",
|
||||
"large_blood_crystal_bud", "budding_blood_crystal", "blood_crystal_cluster",
|
||||
"myrmite", "broodstone", "chiten_block", "amber_moss_block", "amber_moss_carpet" -> 8;
|
||||
"myrmite", "broodstone", "chiten_block", "chiten_spike", "amber_moss_block", "amber_moss_carpet" -> 8;
|
||||
|
||||
// 9 - Ouranwood leaves
|
||||
case "ouranwood_leaves" -> 9;
|
||||
@@ -409,7 +408,7 @@ public class AntarchyNeoforgeCreativeModeTabs {
|
||||
|
||||
// 15 - Tools
|
||||
case "ultimate_pickaxe", "ultimate_axe", "ultimate_shovel", "ultimate_hoe",
|
||||
"duct_tape", "diamond_minecart", "gravity_sculk_sensor", "cheep_on_a_stick" -> 15;
|
||||
"duct_tape", "diamond_minecart", "gravity_sculk_sensor" -> 15;
|
||||
|
||||
// 16 - Liquid buckets
|
||||
case "bile_bucket", "ichor_bucket", "antiwater_bucket", "cloud_bucket" -> 16;
|
||||
|
||||
+6
@@ -15,6 +15,7 @@ import com.craisinlord.antarchy.content.entity.DrTrayaurusEntity;
|
||||
import com.craisinlord.antarchy.content.entity.EasterBunnyEntity;
|
||||
import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity;
|
||||
import com.craisinlord.antarchy.content.entity.HushProjectileEntity;
|
||||
import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity;
|
||||
import com.craisinlord.antarchy.content.entity.JumpyBugEntity;
|
||||
import com.craisinlord.antarchy.content.entity.MantisEntity;
|
||||
import com.craisinlord.antarchy.content.entity.MissileSquidEntity;
|
||||
@@ -311,6 +312,11 @@ public final class AntarchyNeoforgeEntites {
|
||||
.sized(2.4F, 2.0F)
|
||||
.clientTrackingRange(10)
|
||||
.build("dorrie"));
|
||||
public static final DeferredHolder<EntityType<?>, EntityType<HerculesBeetleEntity>> HERCULES_BEETLE = ENTITY_TYPES.register("hercules_beetle",
|
||||
() -> EntityType.Builder.of(HerculesBeetleEntity::new, MobCategory.MONSTER)
|
||||
.sized(3.0F, 4.0F)
|
||||
.clientTrackingRange(12)
|
||||
.build("hercules_beetle"));
|
||||
public static final DeferredHolder<EntityType<?>, EntityType<UpwardFallingBlockEntity>> UPWARD_FALLING_BLOCK = ENTITY_TYPES.register("upward_falling_block",
|
||||
() -> EntityType.Builder.<UpwardFallingBlockEntity>of(
|
||||
UpwardFallingBlockEntity::new, MobCategory.MISC)
|
||||
|
||||
+1
@@ -74,6 +74,7 @@ public class AntarchyNeoforgeEntityAttributes {
|
||||
event.put(AntarchyNeoforgeEntites.MOLEVORE.get(), MolevoreEntity.createAttributes().build());
|
||||
event.put(AntarchyNeoforgeEntites.CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build());
|
||||
event.put(AntarchyNeoforgeEntites.DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build());
|
||||
event.put(AntarchyNeoforgeEntites.HERCULES_BEETLE.get(), com.craisinlord.antarchy.content.entity.HerculesBeetleEntity.createAttributes().build());
|
||||
}
|
||||
|
||||
private static AttributeSupplier.Builder buildAntAttributes(double health, double speed, double attackDamage) {
|
||||
|
||||
+2
-3
@@ -7,7 +7,6 @@ import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity;
|
||||
import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity;
|
||||
import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity;
|
||||
import com.craisinlord.antarchy.content.item.*;
|
||||
import com.craisinlord.antarchy.content.item.CheepOnAStickItem;
|
||||
import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem;
|
||||
import com.craisinlord.antarchy.content.item.BloodCrystalAppleItem;
|
||||
import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem;
|
||||
@@ -369,8 +368,6 @@ public final class AntarchyNeoforgeItems {
|
||||
.nutrition(2)
|
||||
.saturationModifier(0.2F)
|
||||
.build())));
|
||||
public static final DeferredItem<CheepOnAStickItem> CHEEP_ON_A_STICK = ITEMS.register("cheep_on_a_stick",
|
||||
() -> new CheepOnAStickItem(new Item.Properties().stacksTo(1).durability(25)));
|
||||
public static final DeferredItem<Item> MOLEWORM_ITEM = ITEMS.register("moleworm",
|
||||
() -> new Item(new Item.Properties()
|
||||
.food(new FoodProperties.Builder()
|
||||
@@ -591,6 +588,8 @@ public final class AntarchyNeoforgeItems {
|
||||
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.CHEEP, 0xAA22FF, 0x22FF44, new Item.Properties()));
|
||||
public static final DeferredItem<DeferredSpawnEggItem> DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg",
|
||||
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.DORRIE, 0x1B91B3, 0xC0E8FF, new Item.Properties()));
|
||||
public static final DeferredItem<DeferredSpawnEggItem> HERCULES_BEETLE_SPAWN_EGG = ITEMS.register("hercules_beetle_spawn_egg",
|
||||
() -> new DeferredSpawnEggItem(AntarchyNeoforgeEntites.HERCULES_BEETLE, 0x6B1F2A, 0xD4AF37, new Item.Properties().rarity(Rarity.RARE)));
|
||||
|
||||
private AntarchyNeoforgeItems() {}
|
||||
|
||||
|
||||
+2
@@ -4,6 +4,7 @@ import com.craisinlord.antarchy.content.network.BloodCrystalKatanaTrailPayload;
|
||||
import com.craisinlord.antarchy.neoforge.network.AntarchyGravityNetworking;
|
||||
import com.craisinlord.antarchy.neoforge.network.BrutalflyElytraNetworking;
|
||||
import com.craisinlord.antarchy.neoforge.network.DorrieJumpNetworking;
|
||||
import com.craisinlord.antarchy.neoforge.network.HerculesBeetleNetworking;
|
||||
import com.craisinlord.antarchy.neoforge.network.JumpyBootsNetworking;
|
||||
import com.craisinlord.antarchy.neoforge.network.MultipartNetworking;
|
||||
import net.neoforged.bus.api.IEventBus;
|
||||
@@ -22,6 +23,7 @@ public class AntarchyNeoforgePayloadHandlers {
|
||||
BrutalflyElytraNetworking.register(registrar);
|
||||
JumpyBootsNetworking.register(registrar);
|
||||
DorrieJumpNetworking.register(registrar);
|
||||
HerculesBeetleNetworking.register(registrar);
|
||||
registrar.playToClient(
|
||||
com.craisinlord.antarchy.content.network.BloodglassStatePayload.TYPE,
|
||||
com.craisinlord.antarchy.content.network.BloodglassStatePayload.STREAM_CODEC,
|
||||
|
||||
Reference in new issue
Block a user