first herc beetle implementation

This commit is contained in:
craisinlord committed 2026-06-30 14:02:16 -05:00
1 parent 14a1dfda1e
commit 8cabdb33bf
52 files changed
+2102 -411

No files matched your search

@@ -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();
@@ -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();
}
}
@@ -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;
}
}
@@ -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;
@@ -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));
// }
}
@@ -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())));
}
}
@@ -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",