Skip to content

Commit

Permalink
feat: Sentry Mode ( temporarily for MarkThreeSuit )
Browse files Browse the repository at this point in the history
todo: global model + rotation
  • Loading branch information
Duzos committed Sep 29, 2024
1 parent f0f6068 commit c9eef5d
Show file tree
Hide file tree
Showing 11 changed files with 269 additions and 55 deletions.
77 changes: 47 additions & 30 deletions src/main/java/mc/duzo/timeless/client/TimelessClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import mc.duzo.animation.player.holder.PlayerAnimationHolder;
import mc.duzo.animation.registry.AnimationRegistry;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;

import net.minecraft.util.Identifier;
Expand All @@ -15,6 +16,8 @@
import mc.duzo.timeless.client.gui.JarvisGui;
import mc.duzo.timeless.client.keybind.TimelessKeybinds;
import mc.duzo.timeless.client.network.ClientNetwork;
import mc.duzo.timeless.client.render.entity.IronManEntityRenderer;
import mc.duzo.timeless.registry.Register;
import mc.duzo.timeless.suit.Suit;
import mc.duzo.timeless.suit.client.ClientSuitRegistry;
import mc.duzo.timeless.suit.client.animation.SuitAnimationHolder;
Expand All @@ -26,7 +29,7 @@
public class TimelessClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
Animations.init();
ClientRegister.init();
ClientNetwork.init();
ClientSuitRegistry.init();
TimelessKeybinds.init();
Expand All @@ -36,51 +39,65 @@ public void onInitializeClient() {
});
}

public static class Animations {
public static class ClientRegister {
public static void init() {
Animations.init();
Renderers.init();
}

public static class Players {
public static final Supplier<PlayerAnimationHolder> MARK_FIVE_CASE_OPEN = AnimationRegistry.instance().register(() -> new PlayerAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_mk5_case_open_player"), MarkFiveAnimations.CASE_OPEN_PLAYER));
public static final Supplier<PlayerAnimationHolder> MARK_FIVE_CASE_CLOSE = AnimationRegistry.instance().register(() -> new PlayerAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_mk5_case_close_player"), MarkFiveAnimations.CASE_CLOSE_PLAYER));
public static class Animations {

public static void init() {}
public static class Players {
public static final Supplier<PlayerAnimationHolder> MARK_FIVE_CASE_OPEN = AnimationRegistry.instance().register(() -> new PlayerAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_mk5_case_open_player"), MarkFiveAnimations.CASE_OPEN_PLAYER));
public static final Supplier<PlayerAnimationHolder> MARK_FIVE_CASE_CLOSE = AnimationRegistry.instance().register(() -> new PlayerAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_mk5_case_close_player"), MarkFiveAnimations.CASE_CLOSE_PLAYER));

}
public static class Suits {
public static class MarkFive {
public static final Supplier<MarkFiveCaseAnimation> CASE_OPEN = AnimationRegistry.instance().register(() -> new MarkFiveCaseAnimation(true));
public static final Supplier<MarkFiveCaseAnimation> CASE_CLOSE = AnimationRegistry.instance().register(() -> new MarkFiveCaseAnimation(false));
public static final Supplier<MarkFiveMaskAnimation> MASK_OPEN = AnimationRegistry.instance().register(() -> new MarkFiveMaskAnimation(true));
public static final Supplier<MarkFiveMaskAnimation> MASK_CLOSE = AnimationRegistry.instance().register(() -> new MarkFiveMaskAnimation(false));
public static void init() {}

public static void init() {
}
public static class Suits {
public static class MarkFive {
public static final Supplier<MarkFiveCaseAnimation> CASE_OPEN = AnimationRegistry.instance().register(() -> new MarkFiveCaseAnimation(true));
public static final Supplier<MarkFiveCaseAnimation> CASE_CLOSE = AnimationRegistry.instance().register(() -> new MarkFiveCaseAnimation(false));
public static final Supplier<MarkFiveMaskAnimation> MASK_OPEN = AnimationRegistry.instance().register(() -> new MarkFiveMaskAnimation(true));
public static final Supplier<MarkFiveMaskAnimation> MASK_CLOSE = AnimationRegistry.instance().register(() -> new MarkFiveMaskAnimation(false));

public static void init() {

}
}
public static class IronMan {
public static final Supplier<MarkFiveMaskAnimation> MASK_OPEN = AnimationRegistry.instance().register(() -> new SuitAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_generic_mask_open"), GenericIronManAnimations.MASK_OPEN, new AnimationInfo(AnimationInfo.RenderType.TORSO_HEAD, null, AnimationInfo.Movement.ALLOW, AnimationInfo.Transform.TARGETED), false));
public static final Supplier<MarkFiveMaskAnimation> MASK_CLOSE = AnimationRegistry.instance().register(() -> new SuitAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_generic_mask_close"), GenericIronManAnimations.MASK_CLOSE, new AnimationInfo(AnimationInfo.RenderType.TORSO_HEAD, null, AnimationInfo.Movement.ALLOW, AnimationInfo.Transform.TARGETED), false));

public static void init() {

}
}
}
public static class IronMan {
public static final Supplier<MarkFiveMaskAnimation> MASK_OPEN = AnimationRegistry.instance().register(() -> new SuitAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_generic_mask_open"), GenericIronManAnimations.MASK_OPEN, new AnimationInfo(AnimationInfo.RenderType.TORSO_HEAD, null, AnimationInfo.Movement.ALLOW, AnimationInfo.Transform.TARGETED), false));
public static final Supplier<MarkFiveMaskAnimation> MASK_CLOSE = AnimationRegistry.instance().register(() -> new SuitAnimationHolder(new Identifier(Timeless.MOD_ID, "ironman_generic_mask_close"), GenericIronManAnimations.MASK_CLOSE, new AnimationInfo(AnimationInfo.RenderType.TORSO_HEAD, null, AnimationInfo.Movement.ALLOW, AnimationInfo.Transform.TARGETED), false));

public static void init() {
IronMan.init();
MarkFive.init();

AnimationEvents.FIND_ANIMATION_INFO.register(player -> {
Suit suit = Suit.findSuit(player).orElse(null);
if (suit == null) return AnimationEvents.Result.pass();

return new AnimationEvents.Result<>(suit.toClient().getAnimationInfo(player));
});
}
}

public static void init() {
IronMan.init();
MarkFive.init();

AnimationEvents.FIND_ANIMATION_INFO.register(player -> {
Suit suit = Suit.findSuit(player).orElse(null);
if (suit == null) return AnimationEvents.Result.pass();

return new AnimationEvents.Result<>(suit.toClient().getAnimationInfo(player));
});
Players.init();
Suits.init();
}
}

public static void init() {
Players.init();
Suits.init();
public static class Renderers {
public static void init() {
EntityRendererRegistry.register(Register.Entities.IRON_MAN, IronManEntityRenderer::new);
}
}
}

}
3 changes: 2 additions & 1 deletion src/main/java/mc/duzo/timeless/client/gui/JarvisGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

public class JarvisGui {
private static final Identifier HUD = new Identifier(Timeless.MOD_ID, "textures/gui/jarvis/hud.png");
private static final int ALPHA_GRAY = ColorHelper.Argb.getArgb(125, 255, 255 ,255);
private static final int ALPHA_GRAY = ColorHelper.Argb.getArgb(125, 255, 255, 255);

public static void render(DrawContext context, float delta) {
MinecraftClient client = MinecraftClient.getInstance();
Expand All @@ -34,6 +34,7 @@ public static void render(DrawContext context, float delta) {
if (!(suit.hasPower(PowerRegistry.JARVIS))) return;
if (suit.hasPower(PowerRegistry.MASK_TOGGLE) && !(MaskTogglePower.hasMask(player))) return;


// has flight
boolean hasFlight = FlightPower.hasFlight(player);
boolean hasHover = HoverPower.hasHover(player);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package mc.duzo.timeless.client.render.entity;

import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.RotationAxis;

import mc.duzo.timeless.suit.client.render.SuitModel;
import mc.duzo.timeless.suit.ironman.IronManEntity;
import mc.duzo.timeless.suit.ironman.IronManSuit;

public class IronManEntityRenderer extends EntityRenderer<IronManEntity> {
public IronManEntityRenderer(EntityRendererFactory.Context ctx) {
super(ctx);
}

@Override
public void render(IronManEntity entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) {
super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light);

IronManSuit suit = entity.getSuit();
SuitModel model = suit.toClient().model();
VertexConsumer consumer = vertexConsumers.getBuffer(RenderLayer.getEntityTranslucent(model.texture()));

matrices.push();

matrices.translate(0, 3, 0);
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(entity.getYaw())); // todo - rotation is wrong
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(180));

model.render(entity, tickDelta, matrices, consumer, light, 1, 1, 1, 1); // todo - the model appears to be global, meaning all transforms to one get applied to all. needs fixing ASAP

if (model.emission().isPresent()) {
VertexConsumer emissionConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutoutNoCullZOffset(model.emission().get(), true));
model.render(entity, tickDelta, matrices, emissionConsumer, LightmapTextureManager.MAX_LIGHT_COORDINATE, 1, 1, 1, 1);
}

matrices.pop();
}

@Override
public Identifier getTexture(IronManEntity entity) {
return entity.getSuit().toClient().texture();
}
}
9 changes: 9 additions & 0 deletions src/main/java/mc/duzo/timeless/power/PowerRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import mc.duzo.timeless.power.impl.HoverPower;
import mc.duzo.timeless.power.impl.IceOverPower;
import mc.duzo.timeless.power.impl.MaskTogglePower;
import mc.duzo.timeless.suit.Suit;
import mc.duzo.timeless.suit.ironman.IronManEntity;
import mc.duzo.timeless.suit.ironman.IronManSuit;
import mc.duzo.timeless.suit.ironman.mk5.MarkFiveCase;

public class PowerRegistry {
Expand All @@ -29,6 +32,12 @@ public static <T extends Power> T register(T entry) {
public static Power JARVIS = Power.Builder.create(new Identifier(Timeless.MOD_ID, "jarvis")).build().register();
public static Power MASK_TOGGLE = new MaskTogglePower().register();
public static Power ICES_OVER = new IceOverPower().register();
public static Power SENTRY = Power.Builder.create(new Identifier(Timeless.MOD_ID, "sentry")).run((player) -> {
if (!(Suit.findSuit(player).orElse(null) instanceof IronManSuit suit)) return;

player.getWorld().spawnEntity(new IronManEntity(player.getServerWorld(), suit, player));
player.getArmorItems().forEach(stack -> stack.setCount(0));
}).build().register();

public static void init() {}
}
22 changes: 22 additions & 0 deletions src/main/java/mc/duzo/timeless/registry/Register.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry;

import net.minecraft.block.Block;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.entity.attribute.DefaultAttributeContainer;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
Expand All @@ -20,6 +26,7 @@
import mc.duzo.timeless.power.PowerRegistry;
import mc.duzo.timeless.suit.SuitRegistry;
import mc.duzo.timeless.suit.client.animation.SuitAnimationTracker;
import mc.duzo.timeless.suit.ironman.IronManEntity;
import mc.duzo.timeless.suit.ironman.mk5.MarkFiveCase;
import mc.duzo.timeless.suit.set.SetRegistry;

Expand Down Expand Up @@ -77,13 +84,28 @@ public static void init() {
}
}

public static class Entities {
public static final EntityType<IronManEntity> IRON_MAN = register(Registries.ENTITY_TYPE, "iron_man", EntityType.Builder.<IronManEntity>create(IronManEntity::new, SpawnGroup.MISC)
.setDimensions(0.6f, 1.8f)
.build("iron_man"));

public static void init() {
registerAttributes(IRON_MAN, MobEntity.createLivingAttributes().build());
}

private static void registerAttributes(EntityType<? extends LivingEntity> type, DefaultAttributeContainer attributes) {
FabricDefaultAttributeRegistry.register(type, attributes);
}
}

public static void init() {
PowerRegistry.init();
SetRegistry.init();
SuitRegistry.init();
ItemGroups.init();
Sounds.init();
Trackers.init();
Entities.init();
}

public static <V, T extends V> T register(Registry<V> registry, String name, T entry) {
Expand Down
109 changes: 109 additions & 0 deletions src/main/java/mc/duzo/timeless/suit/ironman/IronManEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package mc.duzo.timeless.suit.ironman;

import java.util.List;

import net.minecraft.entity.EntityType;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Arm;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

import mc.duzo.timeless.registry.Register;
import mc.duzo.timeless.suit.SuitRegistry;

public class IronManEntity extends LivingEntity { // todo - PathAwareEntity for sentry mode
private static final TrackedData<String> SUIT = DataTracker.registerData(IronManEntity.class, TrackedDataHandlerRegistry.STRING);

public IronManEntity(EntityType<? extends IronManEntity> entityType, World world) {
super(entityType, world);
}
public IronManEntity(World world, IronManSuit suit) {
this(Register.Entities.IRON_MAN, world);

this.setSuit(suit);
}
public IronManEntity(World world, IronManSuit suit, BlockPos pos, float yaw, float pitch) {
this(world, suit);

this.refreshPositionAndAngles(pos.getX(), pos.getY(), pos.getZ(), yaw, pitch);
}
public IronManEntity(World world, IronManSuit suit, ServerPlayerEntity source) {
this(world, suit, source.getBlockPos(), source.getYaw(), source.getPitch());
}

public IronManSuit getSuit() {
return (IronManSuit) SuitRegistry.REGISTRY.get(new Identifier(this.dataTracker.get(SUIT)));
}
private void setSuit(String string) {
this.dataTracker.set(SUIT, string);
}
private void setSuit(Identifier id) {
this.setSuit(id.toString());
}
private void setSuit(IronManSuit suit) {
this.setSuit(suit.id());
}

@Override
public ActionResult interact(PlayerEntity player, Hand hand) {
boolean success = this.getSuit().getSet().wear(player);

if (success) {
this.discard();
}

return success ? ActionResult.SUCCESS : ActionResult.FAIL;
}

@Override
protected void initDataTracker() {
super.initDataTracker();

this.dataTracker.startTracking(SUIT, "");
}

@Override
public void writeCustomDataToNbt(NbtCompound nbt) {
super.writeCustomDataToNbt(nbt);

nbt.putString("Suit", this.dataTracker.get(SUIT));
}

@Override
public void readCustomDataFromNbt(NbtCompound nbt) {
super.readCustomDataFromNbt(nbt);

this.setSuit(nbt.getString("Suit"));
}

@Override
public Iterable<ItemStack> getArmorItems() {
return List.of();
}

@Override
public ItemStack getEquippedStack(EquipmentSlot slot) {
return ItemStack.EMPTY;
}

@Override
public void equipStack(EquipmentSlot slot, ItemStack stack) {

}

@Override
public Arm getMainArm() {
return Arm.RIGHT;
}
}
Loading

0 comments on commit c9eef5d

Please sign in to comment.