Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update 20250104 - Full Ballista Implementation #26

Merged
merged 1 commit into from
Jan 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/FUNDING.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cl
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
custom: ["https://www.paypal.me/satch5600"] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.virus5600.defensive_measures.model.entity;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.util.Identifier;

import org.jetbrains.annotations.Nullable;

import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.constant.DataTickets;
import software.bernie.geckolib.model.GeoModel;
import software.bernie.geckolib.model.data.EntityModelData;
import software.bernie.geckolib.renderer.GeoRenderer;

import com.virus5600.defensive_measures.DefensiveMeasures;
import com.virus5600.defensive_measures.entity.turrets.BallistaTurretEntity;

import java.util.Optional;

@Environment(EnvType.CLIENT)
public class BallistaTurretModel extends GeoModel<BallistaTurretEntity> {
/////////////////////////
/// INTERFACE METHODS ///
/////////////////////////

@Override
public Identifier getModelResource(BallistaTurretEntity ballistaTurretEntity, @Nullable GeoRenderer<BallistaTurretEntity> geoRenderer) {
return Identifier.of(DefensiveMeasures.MOD_ID, "geo/ballista.geo.json");
}

@Override
public Identifier getTextureResource(BallistaTurretEntity ballistaTurretEntity, @Nullable GeoRenderer<BallistaTurretEntity> geoRenderer) {
return Identifier.of(DefensiveMeasures.MOD_ID, "textures/entity/ballista/ballista.png");
}

@Override
public Identifier getAnimationResource(BallistaTurretEntity animatable) {
return Identifier.of(DefensiveMeasures.MOD_ID, "animations/ballista.animation.json");
}

@Override
public void setCustomAnimations(BallistaTurretEntity animatable, long instanceId, AnimationState<BallistaTurretEntity> animationState) {
super.setCustomAnimations(animatable, instanceId, animationState);

Optional<GeoBone> base = this.getBone("base");
Optional<GeoBone> neck = this.getBone("head");
Optional<GeoBone> head = this.getBone("bow");

EntityModelData extraData = (EntityModelData) animationState.getExtraData()
.get(DataTickets.ENTITY_MODEL_DATA);

if (neck.isPresent()) {
float targetYRot = (extraData.netHeadYaw() * ((float) Math.PI / 180F));
targetYRot = Math.min(targetYRot, animatable.getMaxHeadRotation());
neck.get().updateRotation(0, targetYRot, 0);

if (head.isPresent()) {
float targetXRot = (extraData.headPitch() * ((float) Math.PI / 180F));
targetXRot = Math.min(targetXRot, animatable.getMaxLookPitchChange());
head.get().updateRotation(targetXRot, 0, 0);
}
}

animatable.setBodyYaw(0);
base.ifPresent(geoBone -> geoBone.setRotY(0));
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package com.virus5600.defensive_measures.model.entity;

import com.virus5600.defensive_measures.DefensiveMeasures;
import com.virus5600.defensive_measures.entity.turrets.CannonTurretEntity;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;

import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.constant.DataTickets;
import software.bernie.geckolib.model.GeoModel;
import software.bernie.geckolib.model.data.EntityModelData;
import software.bernie.geckolib.renderer.GeoRenderer;

import org.jetbrains.annotations.Nullable;

import com.virus5600.defensive_measures.DefensiveMeasures;
import com.virus5600.defensive_measures.entity.turrets.CannonTurretEntity;

import java.util.Optional;

@Environment(EnvType.CLIENT)
Expand Down Expand Up @@ -44,22 +47,22 @@ public void setCustomAnimations(CannonTurretEntity animatable, long instanceId,
Optional<GeoBone> neck = this.getBone("stand");
Optional<GeoBone> head = this.getBone("head");

EntityModelData extraData = (EntityModelData) animationState.getExtraData().get(DataTickets.ENTITY_MODEL_DATA);
EntityModelData extraData = (EntityModelData) animationState.getExtraData()
.get(DataTickets.ENTITY_MODEL_DATA);

if (neck.isPresent()) {
float targetYRot = (extraData.netHeadYaw() * ((float) Math.PI / 180F));
neck.get().setRotY(targetYRot);
targetYRot = Math.min(targetYRot, animatable.getMaxHeadRotation());
neck.get().updateRotation(0, targetYRot, 0);

if (head.isPresent()) {
float targetXRot = (extraData.headPitch() * ((float) Math.PI / 180F));
head.get().setRotX(targetXRot);
targetXRot = Math.min(targetXRot, animatable.getMaxLookPitchChange());
head.get().updateRotation(targetXRot, 0, 0);
}
}

if (base.isPresent()) {
base.get().setRotX(0);
base.get().setRotY(0);
base.get().setRotZ(0);
}
animatable.setBodyYaw(0);
base.ifPresent(geoBone -> geoBone.setRotY(0));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.virus5600.defensive_measures.renderer;

import net.minecraft.client.render.entity.EntityRendererFactory.Context;

import com.virus5600.defensive_measures.entity.turrets.TurretEntity;

import software.bernie.geckolib.animatable.GeoAnimatable;
import software.bernie.geckolib.model.GeoModel;
import software.bernie.geckolib.renderer.GeoEntityRenderer;

public class BaseTurretRenderer<T extends TurretEntity & GeoAnimatable> extends GeoEntityRenderer<T> {
public BaseTurretRenderer(Context ctx, GeoModel<T> model) {
super(ctx, model);
}

@Override
protected float getDeathMaxRotation(TurretEntity animatable, float partialTick) {
return 0.0f;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.virus5600.defensive_measures.renderer;

import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;

import com.virus5600.defensive_measures.DefensiveMeasures;
import com.virus5600.defensive_measures.entity.ModEntities;
import com.virus5600.defensive_measures.renderer.entity.CannonTurretRenderer;
import com.virus5600.defensive_measures.renderer.projectiles.BallistaArrowRenderer;
import com.virus5600.defensive_measures.renderer.projectiles.CannonballRenderer;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import com.virus5600.defensive_measures.renderer.entity.*;
import com.virus5600.defensive_measures.renderer.projectiles.*;

public class ModEntityRenderer {
public static void registerEntityRenderers() {
Expand All @@ -17,6 +17,7 @@ public static void registerEntityRenderers() {

// v1.0.0
EntityRendererRegistry.register(ModEntities.CANNON_TURRET, CannonTurretRenderer::new);
EntityRendererRegistry.register(ModEntities.BALLISTA_TURRET, BallistaTurretRenderer::new);

/////////////////
// PROJECTILES //
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.virus5600.defensive_measures.renderer.entity;

import net.minecraft.client.render.entity.EntityRendererFactory.Context;

import com.virus5600.defensive_measures.entity.turrets.BallistaTurretEntity;
import com.virus5600.defensive_measures.model.entity.BallistaTurretModel;
import com.virus5600.defensive_measures.renderer.BaseTurretRenderer;

public class BallistaTurretRenderer extends BaseTurretRenderer<BallistaTurretEntity> {
public BallistaTurretRenderer(Context ctx) {
super(ctx, new BallistaTurretModel());
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package com.virus5600.defensive_measures.renderer.entity;

import com.virus5600.defensive_measures.model.entity.CannonTurretModel;
import net.minecraft.client.render.entity.EntityRendererFactory.Context;

import com.virus5600.defensive_measures.entity.turrets.CannonTurretEntity;
import com.virus5600.defensive_measures.model.entity.CannonTurretModel;
import com.virus5600.defensive_measures.renderer.BaseTurretRenderer;

import software.bernie.geckolib.renderer.GeoEntityRenderer;

public class CannonTurretRenderer extends GeoEntityRenderer<CannonTurretEntity> {
public class CannonTurretRenderer extends BaseTurretRenderer<CannonTurretEntity> {
public CannonTurretRenderer(Context ctx) {
super(ctx, new CannonTurretModel());
}

@Override
protected float getDeathMaxRotation(CannonTurretEntity animatable, float partialTick) {
return 0.0f;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.virus5600.defensive_measures;

import com.virus5600.defensive_measures.advancement.criterion.ModCriterion;
import com.virus5600.defensive_measures.block.ModBlocks;
import com.virus5600.defensive_measures.entity.ModEntities;
import com.virus5600.defensive_measures.entity.damage.ModDamageSources;
import com.virus5600.defensive_measures.entity.damage.ModDamageTypes;
import com.virus5600.defensive_measures.item.ModItemGroups;
import com.virus5600.defensive_measures.item.ModItems;
import com.virus5600.defensive_measures.particle.ModParticles;
Expand Down Expand Up @@ -41,12 +44,14 @@ public void onInitialize() {
// Use https://github.com/Khazoda/basic-weapons/blob/latest-stable/src/main/java/com/seacroak/basicweapons/util/Reggie.java as a reference

// Modded Stuff's Registration
ModDamageTypes.registerDamageTypes();
ModItemGroups.registerModItemGroups();
ModItems.registerModItems();
ModSoundEvents.registerSoundEvents();
ModBlocks.registerModBlocks();
ModCriterion.registerModCriterion();
ModParticles.registerParticles();
ModEntities.registerModEntityAttributes();
ModParticles.registerParticles();

// Networking part

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ public Codec<TurretItemRetrievedCriterion.Conditions> getConditionsCodec() {
}

public void trigger(ServerPlayerEntity player, ItemStack stack) {
this.trigger(player, conditions -> conditions.matches(stack));
super.trigger(player, conditions -> conditions.matches(stack));
}

public static record Conditions(Optional<LootContextPredicate> player, Optional<ItemPredicate> item) implements AbstractCriterion.Conditions {
public record Conditions(Optional<LootContextPredicate> player, Optional<ItemPredicate> item) implements AbstractCriterion.Conditions {
public static final Codec<TurretItemRetrievedCriterion.Conditions> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
EntityPredicate.LOOT_CONTEXT_PREDICATE_CODEC
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.virus5600.defensive_measures.block;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;

import com.virus5600.defensive_measures.entity.damage.ModDamageSources;
import com.virus5600.defensive_measures.entity.damage.ModDamageTypes;

public class ArrowheadBlock extends Block {
private static final VoxelShape BOTTOM;
private static final VoxelShape MIDDLE;
private static final VoxelShape TOP;
private static final VoxelShape SHAPE;

public ArrowheadBlock(Settings settings) {
super(settings);

settings.hardness(1.5f)
.resistance(1.0f)
.nonOpaque();
}

@Override
protected VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return SHAPE;
}

@Override
public void onSteppedOn(World world, BlockPos pos, BlockState state, Entity entity) {
if (entity instanceof LivingEntity livingEntity) {
if (world instanceof ServerWorld serverWorld) {
DamageSource dmgSrc = ModDamageSources.create(world, ModDamageTypes.ARROWHEAD);
livingEntity.damage(serverWorld, dmgSrc, 2);
}
}

super.onSteppedOn(world, pos, state, entity);
}

static {
BOTTOM = Block.createCuboidShape(6f, 0f, 6f, 10f, 2f, 10f);
MIDDLE = Block.createCuboidShape(6.5f, 1.75f, 6.5f, 9.5f, 3.25f, 9.5f);
TOP = Block.createCuboidShape(7f, 2.25f, 7f, 9f, 4.25f, 9f);
SHAPE = VoxelShapes.union(BOTTOM, MIDDLE, TOP);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.virus5600.defensive_measures.block;

import net.minecraft.block.AbstractBlock.Settings;
import net.minecraft.block.Block;

import com.virus5600.defensive_measures.DefensiveMeasures;
import com.virus5600.defensive_measures.util.RegistryUtil;

public class ModBlocks {
// 1.0.0
public final static Block ARROWHEAD = RegistryUtil.registerBlock("arrowhead", ArrowheadBlock::new, Settings.create());

public static void registerModBlocks() {
DefensiveMeasures.LOGGER.info("REGISTERING BLOCKS FOR {}...", DefensiveMeasures.MOD_NAME);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,13 @@ public class ModEntities {
.eyeHeight(0.51F)
);

// public static final EntityType<BallistaTurretEntity> BALLISTA = Registry.register(
// Registries.ENTITY_TYPE,
// Identifier.of(DefensiveMeasures.MOD_ID, "ballista"),
// Builder
// .create(BallistaTurretEntity::new, SpawnGroup.MISC)
// .dimensions(1F, 1F)
// .build()
// );
public static final EntityType<BallistaTurretEntity> BALLISTA_TURRET = RegistryUtil.registerEntity(
"ballista",
Builder
.create(BallistaTurretEntity::new, SpawnGroup.MISC)
.dimensions(1F, 1F)
.eyeHeight(0.75F)
);
//
// public static final EntityType<MGTurretEntity> MG_TURRET = Registry.register(
// Registries.ENTITY_TYPE,
Expand Down Expand Up @@ -79,7 +78,7 @@ public static void registerModEntityAttributes() {
// TURRETS //
// v1.0.0
FabricDefaultAttributeRegistry.register(ModEntities.CANNON_TURRET, CannonTurretEntity.setAttributes());
// FabricDefaultAttributeRegistry.register(ModEntities.BALLISTA, BallistaTurretEntity.setAttributes());
FabricDefaultAttributeRegistry.register(ModEntities.BALLISTA_TURRET, BallistaTurretEntity.setAttributes());
// FabricDefaultAttributeRegistry.register(ModEntities.MG_TURRET, MGTurretEntity.setAttributes());
}
}
Loading
Loading