From 1cdeb3495362f4d59eccd3fd7648562394e63d50 Mon Sep 17 00:00:00 2001 From: Goodbird Date: Sat, 20 Jan 2024 12:16:31 +0300 Subject: [PATCH 01/17] Implemented the interface for ScriptedCommandEvent --- .../npcs/scripted/event/CustomNPCsEvent.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java index e62d46d47..3f8508fc7 100644 --- a/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java @@ -9,6 +9,7 @@ import cpw.mods.fml.common.eventhandler.Cancelable; import cpw.mods.fml.common.eventhandler.Event; import noppes.npcs.api.AbstractNpcAPI; import noppes.npcs.api.IPos; +import noppes.npcs.api.IWorld; import noppes.npcs.api.event.ICustomNPCsEvent; import noppes.npcs.api.handler.data.INaturalSpawn; import noppes.npcs.constants.EnumScriptType; @@ -80,4 +81,56 @@ public class CustomNPCsEvent extends Event implements ICustomNPCsEvent { return this.airSpawnPassed; } } + + public static class ScriptedCommandEvent extends CustomNPCsEvent implements ICustomNPCsEvent.ScriptedCommandEvent { + + public IWorld world; + public IPos pos; + public String senderName; + public int id; + public String[] args; + public String replyMessage = ""; + + public ScriptedCommandEvent(IWorld world, IPos pos, String senderName, int id, String[] args){ + this.world = world; + this.pos = pos; + this.senderName = senderName; + this.id = id; + this.args = args; + } + + public String getHookName() { + return EnumScriptType.SCRIPT_COMMAND.function; + } + + @Override + public IWorld getSenderWorld() { + return world; + } + + @Override + public IPos getSenderPosition() { + return pos; + } + + @Override + public String getSenderName() { + return senderName; + } + + @Override + public void setReplyMessage(String message) { + replyMessage = message; + } + + @Override + public int getId() { + return id; + } + + @Override + public String[] getArgs() { + return args; + } + } } From 1421f9e81997c8d71050ead42d5bb78438ab7aaf Mon Sep 17 00:00:00 2001 From: Goodbird Date: Sat, 20 Jan 2024 12:17:15 +0300 Subject: [PATCH 02/17] Added an event hook for the scripted command event --- src/main/java/noppes/npcs/EventHooks.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index ea784ccd4..2a9cd8dc8 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -568,6 +568,13 @@ public class EventHooks { return false; } + public static void onScriptedCommand(CustomNPCsEvent.ScriptedCommandEvent event) { + ForgeDataScript handler = ScriptController.Instance.forgeScripts; + if (handler.isEnabled()) { + handler.callScript(EnumScriptType.SCRIPT_COMMAND, event); + } + } + public static void onCustomGuiButton(IPlayer player, ICustomGui gui, int buttonId) { CustomGuiEvent.ButtonEvent event = new CustomGuiEvent.ButtonEvent(player, gui, buttonId); CustomGuiController.onButton(event); From e6c86a61db49700ec98c14e9c9ad8a8eb59d5628 Mon Sep 17 00:00:00 2001 From: Goodbird Date: Sat, 20 Jan 2024 12:22:05 +0300 Subject: [PATCH 03/17] Created a subcommand triggering scripted command event --- .../java/kamkeel/command/CommandCommand.java | 56 +++++++++++++++++++ .../java/kamkeel/command/CommandKamkeel.java | 1 + 2 files changed, 57 insertions(+) create mode 100644 src/main/java/kamkeel/command/CommandCommand.java diff --git a/src/main/java/kamkeel/command/CommandCommand.java b/src/main/java/kamkeel/command/CommandCommand.java new file mode 100644 index 000000000..81f0aa0ae --- /dev/null +++ b/src/main/java/kamkeel/command/CommandCommand.java @@ -0,0 +1,56 @@ +package kamkeel.command; + +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.math.BlockPos; +import noppes.npcs.EventHooks; +import noppes.npcs.api.IPos; +import noppes.npcs.api.IWorld; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.event.CustomNPCsEvent; + +public class CommandCommand extends CommandKamkeelBase { + + @Override + public String getCommandName() { + return "command"; + } + + @Override + public String getDescription() { + return "command CommandID [arg1 arg2 ... argn]"; + } + + + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if (args.length < 1) { + sendError(sender, "You must specify the command id"); + return; + } + + int commandId; + try { + commandId = Integer.parseInt(args[0]); + } catch (NumberFormatException ex) { + sendError(sender, "CommandID must be an integer: " + args[0]); + return; + } + + String[] commandArgs = new String[args.length - 1]; + System.arraycopy(args, 1, commandArgs, 0, args.length - 1); + + IWorld senderWorld = NpcAPI.Instance().getIWorld(sender.getEntityWorld()); + + ChunkCoordinates senderCoords = sender.getPlayerCoordinates(); + IPos senderPos = NpcAPI.Instance().getIPos(new BlockPos(senderCoords.posX, senderCoords.posY, senderCoords.posZ)); + + CustomNPCsEvent.ScriptedCommandEvent event = new CustomNPCsEvent.ScriptedCommandEvent(senderWorld, senderPos, sender.getCommandSenderName(), commandId, commandArgs); + EventHooks.onScriptedCommand(event); + + if (!event.replyMessage.isEmpty()) { + sendMessage(sender, event.replyMessage); + } + } +} diff --git a/src/main/java/kamkeel/command/CommandKamkeel.java b/src/main/java/kamkeel/command/CommandKamkeel.java index b2eacc390..8ab279507 100644 --- a/src/main/java/kamkeel/command/CommandKamkeel.java +++ b/src/main/java/kamkeel/command/CommandKamkeel.java @@ -32,6 +32,7 @@ public class CommandKamkeel extends CommandBase{ registerCommand(new ConfigCommand()); registerCommand(new AnimationCommand()); registerCommand(new OverlayCommand()); + registerCommand(new CommandCommand()); } public void registerCommand(CommandKamkeelBase command){ From d9569d0ef7cca31ca28ecb1f7971883137b53572 Mon Sep 17 00:00:00 2001 From: Goodbird Date: Sat, 20 Jan 2024 12:22:17 +0300 Subject: [PATCH 04/17] New API branch --- src/api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api b/src/api index e3980ce21..f96bb398f 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit e3980ce21720e963bb3d3169931885eb0bc60caa +Subproject commit f96bb398ff2179f4a7761740f7e959e6b0d22be8 From a4bfc9d92e8c22b008c9d195e1fb24cd7dec36a7 Mon Sep 17 00:00:00 2001 From: Goodbird Date: Mon, 22 Jan 2024 22:41:18 +0300 Subject: [PATCH 05/17] Removed the ability to use an NPC wand on a scripted block --- src/main/java/noppes/npcs/blocks/BlockScripted.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/blocks/BlockScripted.java b/src/main/java/noppes/npcs/blocks/BlockScripted.java index 0a08b68a1..b004105c6 100644 --- a/src/main/java/noppes/npcs/blocks/BlockScripted.java +++ b/src/main/java/noppes/npcs/blocks/BlockScripted.java @@ -58,7 +58,7 @@ public class BlockScripted extends BlockContainer { if (world.isRemote) return true; ItemStack currentItem = player.inventory.getCurrentItem(); - if (currentItem != null && (currentItem.getItem() == CustomItems.wand || currentItem.getItem() == CustomItems.scripter)) { + if (currentItem != null && (currentItem.getItem() == CustomItems.scripter)) { NoppesUtilServer.sendOpenGui(player, EnumGuiType.ScriptBlock, null, x, y, z); return true; } From e882cdacb2332e6203f8d38df11aed8016c0c8d0 Mon Sep 17 00:00:00 2001 From: Goodbird Date: Mon, 22 Jan 2024 23:05:12 +0300 Subject: [PATCH 06/17] Turned command id into a string --- src/main/java/kamkeel/command/CommandCommand.java | 12 +++--------- .../noppes/npcs/scripted/event/CustomNPCsEvent.java | 6 +++--- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/kamkeel/command/CommandCommand.java b/src/main/java/kamkeel/command/CommandCommand.java index 81f0aa0ae..23fa242ca 100644 --- a/src/main/java/kamkeel/command/CommandCommand.java +++ b/src/main/java/kamkeel/command/CommandCommand.java @@ -19,24 +19,18 @@ public class CommandCommand extends CommandKamkeelBase { @Override public String getDescription() { - return "command CommandID [arg1 arg2 ... argn]"; + return "command CommandName [arg1 arg2 ... argn]"; } @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { if (args.length < 1) { - sendError(sender, "You must specify the command id"); + sendError(sender, "You must specify the command name"); return; } - int commandId; - try { - commandId = Integer.parseInt(args[0]); - } catch (NumberFormatException ex) { - sendError(sender, "CommandID must be an integer: " + args[0]); - return; - } + String commandId = args[0]; String[] commandArgs = new String[args.length - 1]; System.arraycopy(args, 1, commandArgs, 0, args.length - 1); diff --git a/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java index 3f8508fc7..32154a730 100644 --- a/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/CustomNPCsEvent.java @@ -87,11 +87,11 @@ public class CustomNPCsEvent extends Event implements ICustomNPCsEvent { public IWorld world; public IPos pos; public String senderName; - public int id; + public String id; public String[] args; public String replyMessage = ""; - public ScriptedCommandEvent(IWorld world, IPos pos, String senderName, int id, String[] args){ + public ScriptedCommandEvent(IWorld world, IPos pos, String senderName, String id, String[] args){ this.world = world; this.pos = pos; this.senderName = senderName; @@ -124,7 +124,7 @@ public class CustomNPCsEvent extends Event implements ICustomNPCsEvent { } @Override - public int getId() { + public String getId() { return id; } From bd8fefc2a4b9f4940254ae8d3e245f73573d953c Mon Sep 17 00:00:00 2001 From: Goodbird Date: Mon, 22 Jan 2024 23:05:29 +0300 Subject: [PATCH 07/17] Changed API --- src/api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api b/src/api index f96bb398f..8afc6f6f3 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit f96bb398ff2179f4a7761740f7e959e6b0d22be8 +Subproject commit 8afc6f6f3d0aaaa351240cb18d97bf1d354fa384 From df8e7a1b3b09f028c2e250e4745c154ec3b96405 Mon Sep 17 00:00:00 2001 From: Kam Date: Mon, 22 Jan 2024 21:56:06 -0500 Subject: [PATCH 08/17] Update api --- src/api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api b/src/api index 8afc6f6f3..f5bf161c4 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 8afc6f6f3d0aaaa351240cb18d97bf1d354fa384 +Subproject commit f5bf161c474ba661d4b6f59f756c43805c03a1b7 From b697f009cc3d523a61c53d297d763d8f5a978410 Mon Sep 17 00:00:00 2001 From: Kam Date: Mon, 22 Jan 2024 21:56:25 -0500 Subject: [PATCH 09/17] Update api --- src/api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api b/src/api index 28e74054b..f5bf161c4 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 28e74054b7bcea56e7fcb63ba2ee6330407b40e3 +Subproject commit f5bf161c474ba661d4b6f59f756c43805c03a1b7 From ebffc0e80ebeb8d62bf3d8e112adb69e65db2fa6 Mon Sep 17 00:00:00 2001 From: Kam Date: Tue, 23 Jan 2024 23:16:42 -0500 Subject: [PATCH 10/17] Create Combat Handler to help Ai to help manage which player should be at tacked --- .../java/noppes/npcs/NoppesUtilServer.java | 4 +- .../java/noppes/npcs/ai/CombatHandler.java | 106 ++++++++++++++++++ .../noppes/npcs/ai/EntityAIAttackTarget.java | 72 ++++++------ .../noppes/npcs/ai/EntityAIPounceTarget.java | 63 +++++++++++ .../npcs/ai/EntityAISprintToTarget.java | 12 +- .../npcs/ai/target/EntityAIClearTarget.java | 16 +-- .../npcs/entity/EntityNPCInterface.java | 49 +++++--- 7 files changed, 253 insertions(+), 69 deletions(-) create mode 100644 src/main/java/noppes/npcs/ai/CombatHandler.java create mode 100644 src/main/java/noppes/npcs/ai/EntityAIPounceTarget.java diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index b4572f305..bb7af2bbf 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -856,7 +856,7 @@ public class NoppesUtilServer { } public static Entity GetDamageSourcee(DamageSource damagesource) { - Object entity = damagesource.getEntity(); + Entity entity = damagesource.getEntity(); if(entity == null) { entity = damagesource.getSourceOfDamage(); } @@ -867,7 +867,7 @@ public class NoppesUtilServer { entity = ((EntityThrowable)entity).getThrower(); } - return (Entity)entity; + return entity; } public static void isGUIOpen(ByteBuf buffer, EntityPlayer player) throws IOException { diff --git a/src/main/java/noppes/npcs/ai/CombatHandler.java b/src/main/java/noppes/npcs/ai/CombatHandler.java new file mode 100644 index 000000000..5063977ba --- /dev/null +++ b/src/main/java/noppes/npcs/ai/CombatHandler.java @@ -0,0 +1,106 @@ +package noppes.npcs.ai; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.DamageSource; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.entity.EntityNPCInterface; + +public class CombatHandler { + + private Map aggressors = new HashMap(); + private EntityNPCInterface npc; + private long startTime = 0; + private int combatResetTimer = 0; + public CombatHandler(EntityNPCInterface npc) { + this.npc = npc; + } + + public void update(){ + if(npc.isKilled()){ + if(npc.isAttacking()){ + reset(); + } + return; + } + if(npc.getAttackTarget() != null && !npc.isAttacking()){ + start(); + } + + if(!shouldCombatContinue()){ + if(combatResetTimer++ > 40){ + reset(); + } + return; + } + combatResetTimer = 0; + } + + + private boolean shouldCombatContinue() { + if(npc.getAttackTarget() == null) + return false; + return isValidTarget(npc.getAttackTarget()); + } + + public void damage(DamageSource source, float damageAmount){ + combatResetTimer = 0; + Entity e = NoppesUtilServer.GetDamageSourcee(source); + System.out.println(e); + if(e instanceof EntityLivingBase){ + EntityLivingBase el = (EntityLivingBase) e; + Float f = aggressors.get(el); + if(f == null) + f = 0f; + aggressors.put(el, f + damageAmount); + } + } + + public void start(){ + combatResetTimer = 0; + startTime = npc.worldObj.getWorldInfo().getWorldTotalTime(); + npc.setBoolFlag(true, 4); + } + + public void reset(){ + combatResetTimer = 0; + aggressors.clear(); + npc.setBoolFlag(true, 4); + } + + public boolean checkTarget() { + if(aggressors.isEmpty() || npc.ticksExisted % 10 != 0) + return false; + EntityLivingBase target = npc.getAttackTarget(); + Float current = 0f; + if(isValidTarget(target)){ + current = aggressors.get(target); + if(current == null) + current = 0f; + } + else + target = null; + for (Map.Entry entry : aggressors.entrySet()){ + if(entry.getValue() > current && isValidTarget(entry.getKey())){ + current = entry.getValue(); + target = entry.getKey(); + } + } + return target == null; + } + + public boolean isValidTarget(EntityLivingBase target){ + if(target == null || !target.isEntityAlive()) + return false; + + if(target instanceof EntityPlayer && ((EntityPlayer)target).capabilities.disableDamage) + return false; + + return npc.isInRange(target, npc.stats.aggroRange); + } + +} diff --git a/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java b/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java index a7e411f2a..4ed4d94ce 100644 --- a/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java +++ b/src/main/java/noppes/npcs/ai/EntityAIAttackTarget.java @@ -12,24 +12,24 @@ import noppes.npcs.entity.EntityNPCInterface; public class EntityAIAttackTarget extends EntityAIBase { - World worldObj; - EntityNPCInterface attacker; - EntityLivingBase entityTarget; + private World world; + private EntityNPCInterface npc; + private EntityLivingBase entityTarget; /** * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0. */ - int attackTick; + private int attackTick; /** The PathEntity of our entity. */ - PathEntity entityPathEntity; + private PathEntity entityPathEntity; private int field_75445_i; private boolean navOverride = false; public EntityAIAttackTarget(EntityNPCInterface par1EntityLiving){ this.attackTick = 0; - this.attacker = par1EntityLiving; - this.worldObj = par1EntityLiving.worldObj; + this.npc = par1EntityLiving; + this.world = par1EntityLiving.worldObj; this.setMutexBits(this.navOverride ? AiMutex.PATHING : AiMutex.LOOK + AiMutex.PASSIVE); } @@ -37,7 +37,7 @@ public class EntityAIAttackTarget extends EntityAIBase * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute(){ - EntityLivingBase entitylivingbase = this.attacker.getAttackTarget(); + EntityLivingBase entitylivingbase = this.npc.getAttackTarget(); if (entitylivingbase == null){ return false; @@ -45,21 +45,21 @@ public class EntityAIAttackTarget extends EntityAIBase else if (!entitylivingbase.isEntityAlive()){ return false; } - else if (this.attacker.inventory.getProjectile() != null && this.attacker.ai.useRangeMelee == 0){ + else if (this.npc.inventory.getProjectile() != null && this.npc.ai.useRangeMelee == 0){ return false; } - double var2 = this.attacker.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ); - double var3 = this.attacker.ai.distanceToMelee * this.attacker.ai.distanceToMelee; + double var2 = this.npc.getDistanceSq(entitylivingbase.posX, entitylivingbase.boundingBox.minY, entitylivingbase.posZ); + double var3 = this.npc.ai.distanceToMelee * this.npc.ai.distanceToMelee; - if (this.attacker.ai.useRangeMelee == 1 && var2 > var3){ + if (this.npc.ai.useRangeMelee == 1 && var2 > var3){ return false; } else{ this.entityTarget = entitylivingbase; - this.attacker.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(((EntityNPCInterface) this.attacker).stats.aggroRange); - this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(entitylivingbase); - this.attacker.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(ConfigMain.NpcNavRange); + this.npc.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(((EntityNPCInterface) this.npc).stats.aggroRange); + this.entityPathEntity = this.npc.getNavigator().getPathToEntityLiving(entitylivingbase); + this.npc.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(ConfigMain.NpcNavRange); return this.entityPathEntity != null; } } @@ -69,16 +69,16 @@ public class EntityAIAttackTarget extends EntityAIBase */ public boolean continueExecuting() { - this.entityTarget = this.attacker.getAttackTarget(); + this.entityTarget = this.npc.getAttackTarget(); if(entityTarget == null || !entityTarget.isEntityAlive()) return false; - if(attacker.getDistanceToEntity(entityTarget) > attacker.stats.aggroRange) + if(npc.getDistanceToEntity(entityTarget) > npc.stats.aggroRange) return false; - if (this.attacker.ai.useRangeMelee == 1 && attacker.getDistanceSqToEntity(entityTarget) > (this.attacker.ai.distanceToMelee * this.attacker.ai.distanceToMelee)) + if (this.npc.ai.useRangeMelee == 1 && npc.getDistanceSqToEntity(entityTarget) > (this.npc.ai.distanceToMelee * this.npc.ai.distanceToMelee)) return false; - return this.attacker.isWithinHomeDistance(MathHelper.floor_double(entityTarget.posX), MathHelper.floor_double(entityTarget.posY), MathHelper.floor_double(entityTarget.posZ)); + return this.npc.isWithinHomeDistance(MathHelper.floor_double(entityTarget.posX), MathHelper.floor_double(entityTarget.posY), MathHelper.floor_double(entityTarget.posZ)); } /** @@ -86,11 +86,11 @@ public class EntityAIAttackTarget extends EntityAIBase */ public void startExecuting(){ if(!navOverride) - this.attacker.getNavigator().setPath(this.entityPathEntity, 1.3D); + this.npc.getNavigator().setPath(this.entityPathEntity, 1.3D); this.field_75445_i = 0; - if (this.attacker.getRangedTask() != null && this.attacker.ai.useRangeMelee == 2) + if (this.npc.getRangedTask() != null && this.npc.ai.useRangeMelee == 2) { - this.attacker.getRangedTask().navOverride(true); + this.npc.getRangedTask().navOverride(true); } } @@ -101,11 +101,11 @@ public class EntityAIAttackTarget extends EntityAIBase { this.entityPathEntity = null; this.entityTarget = null; - this.attacker.setAttackTarget(null); - this.attacker.getNavigator().clearPathEntity(); - if (this.attacker.getRangedTask() != null && this.attacker.ai.useRangeMelee == 2) + this.npc.setAttackTarget(null); + this.npc.getNavigator().clearPathEntity(); + if (this.npc.getRangedTask() != null && this.npc.ai.useRangeMelee == 2) { - this.attacker.getRangedTask().navOverride(false); + this.npc.getRangedTask().navOverride(false); } } @@ -114,26 +114,26 @@ public class EntityAIAttackTarget extends EntityAIBase */ public void updateTask() { - this.attacker.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F); + this.npc.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F); if (!navOverride && --this.field_75445_i <= 0) { - this.field_75445_i = 4 + this.attacker.getRNG().nextInt(7); - this.attacker.getNavigator().tryMoveToEntityLiving(this.entityTarget, 1.3f); + this.field_75445_i = 4 + this.npc.getRNG().nextInt(7); + this.npc.getNavigator().tryMoveToEntityLiving(this.entityTarget, 1.3f); } this.attackTick = Math.max(this.attackTick - 1, 0); - double distance = this.attacker.getDistanceSq(this.entityTarget.posX, this.entityTarget.boundingBox.minY, this.entityTarget.posZ); - double range = attacker.stats.attackRange * attacker.stats.attackRange + entityTarget.width; - double minRange = this.attacker.width * 2.0F * this.attacker.width * 2.0F + entityTarget.width; + double distance = this.npc.getDistanceSq(this.entityTarget.posX, this.entityTarget.boundingBox.minY, this.entityTarget.posZ); + double range = npc.stats.attackRange * npc.stats.attackRange + entityTarget.width; + double minRange = this.npc.width * 2.0F * this.npc.width * 2.0F + entityTarget.width; if(minRange > range) range = minRange; - if (distance <= range && (attacker.canSee(this.entityTarget) || distance < minRange)) + if (distance <= range && (npc.canSee(this.entityTarget) || distance < minRange)) { if (this.attackTick <= 0) { - this.attackTick = this.attacker.stats.attackSpeed; - this.attacker.swingItem(); - this.attacker.attackEntityAsMob(this.entityTarget); + this.attackTick = this.npc.stats.attackSpeed; + this.npc.swingItem(); + this.npc.attackEntityAsMob(this.entityTarget); } } } diff --git a/src/main/java/noppes/npcs/ai/EntityAIPounceTarget.java b/src/main/java/noppes/npcs/ai/EntityAIPounceTarget.java new file mode 100644 index 000000000..18e1c34f2 --- /dev/null +++ b/src/main/java/noppes/npcs/ai/EntityAIPounceTarget.java @@ -0,0 +1,63 @@ +package noppes.npcs.ai; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.util.MathHelper; +import noppes.npcs.entity.EntityNPCInterface; + +public class EntityAIPounceTarget extends EntityAIBase { + private EntityNPCInterface npc; + private EntityLivingBase leapTarget; + private float leapSpeed = 1.2F; + + public EntityAIPounceTarget(EntityNPCInterface leapingEntity){ + this.npc = leapingEntity; + this.setMutexBits(4); + } + + @Override + public boolean shouldExecute(){ + if(!this.npc.onGround) + return false; + + this.leapTarget = this.npc.getAttackTarget(); + + if (this.leapTarget == null || !this.npc.getEntitySenses().canSee(leapTarget)) + return false; + + return !npc.isInRange(leapTarget, 4) && npc.isInRange(leapTarget, 8) && this.npc.getRNG().nextInt(5) == 0; + } + + @Override + public boolean continueExecuting(){ + return !this.npc.onGround; + } + + @Override + public void startExecuting(){ + double varX = this.leapTarget.posX - this.npc.posX; + double varY = this.leapTarget.boundingBox.minY - this.npc.boundingBox.minY; + double varZ = this.leapTarget.posZ - this.npc.posZ; + float varF = MathHelper.sqrt_double(varX * varX + varZ * varZ); + float angle = this.getAngleForXYZ(varX, varY, varZ, varF); + float yaw = (float)(Math.atan2(varX, varZ) * 180.0D / Math.PI); + this.npc.motionX = (double)(MathHelper.sin(yaw / 180.0F * (float)Math.PI) * MathHelper.cos(angle / 180.0F * (float)Math.PI)); + this.npc.motionZ = (double)(MathHelper.cos(yaw / 180.0F * (float)Math.PI) * MathHelper.cos(angle / 180.0F * (float)Math.PI)); + this.npc.motionY = (double)(MathHelper.sin((angle + 1.0F) / 180.0F * (float)Math.PI)); + this.npc.motionX *= this.leapSpeed; + this.npc.motionZ *= this.leapSpeed; + this.npc.motionY *= this.leapSpeed; + } + + public float getAngleForXYZ(double varX, double varY, double varZ, double horiDist) { + float g = 0.1F; + float var1 = this.leapSpeed * this.leapSpeed; + double var2 = (g * horiDist); + double var3 = ((g * horiDist * horiDist) + (2 * varY * var1)); + double var4 = (var1 * var1) - (g * var3); + if (var4 < 0) return 90.0F; + float var6 = var1 - MathHelper.sqrt_double(var4); + float var7 = (float) (Math.atan2(var6 , var2) * 180.0D / Math.PI); + return var7; + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/ai/EntityAISprintToTarget.java b/src/main/java/noppes/npcs/ai/EntityAISprintToTarget.java index b2bf7dfd0..1d615dff7 100644 --- a/src/main/java/noppes/npcs/ai/EntityAISprintToTarget.java +++ b/src/main/java/noppes/npcs/ai/EntityAISprintToTarget.java @@ -8,15 +8,15 @@ import noppes.npcs.entity.EntityNPCInterface; public class EntityAISprintToTarget extends EntityAIBase { /** The entity that is leaping. */ - EntityNPCInterface runner; + private EntityNPCInterface runner; /** The entity that the leaper is leaping towards. */ - EntityLivingBase runTarget; + private EntityLivingBase runTarget; public EntityAISprintToTarget(EntityNPCInterface par1EntityLiving) { this.runner = par1EntityLiving; - this.setMutexBits(AiMutex.PASSIVE + AiMutex.PATHING); + this.setMutexBits(AiMutex.PASSIVE); } /** @@ -37,9 +37,9 @@ public class EntityAISprintToTarget extends EntityAIBase else { switch(this.runner.ai.onAttack) - { - case 0 : return this.runner.getDistanceSqToEntity(this.runTarget) >= 64.0D ? (!this.runner.onGround ? false : true) : false; - case 2 : return this.runner.getDistanceSqToEntity(this.runTarget) <= 49.0D ? (!this.runner.onGround ? false : true) : false; + { + case 0 : return !this.runner.isInRange(runTarget, 8)? (!this.runner.onGround ? false : true) : false; + case 2 : return this.runner.isInRange(runTarget, 7)? (!this.runner.onGround ? false : true) : false; default : return false; } } diff --git a/src/main/java/noppes/npcs/ai/target/EntityAIClearTarget.java b/src/main/java/noppes/npcs/ai/target/EntityAIClearTarget.java index ab38f9feb..ca8a69f9c 100644 --- a/src/main/java/noppes/npcs/ai/target/EntityAIClearTarget.java +++ b/src/main/java/noppes/npcs/ai/target/EntityAIClearTarget.java @@ -16,19 +16,15 @@ public class EntityAIClearTarget extends EntityAITarget @Override public boolean shouldExecute(){ - target = taskOwner.getAttackTarget(); + target = npc.getAttackTarget(); if (target == null) return false; - - if(target instanceof EntityPlayer && ((EntityPlayer)target).capabilities.disableDamage) - return true; - - int distance = npc.stats.aggroRange * 2 * npc.stats.aggroRange; - if(npc.getOwner() != null && npc.getDistanceSqToEntity(npc.getOwner()) > distance){ - return true; + + if(npc.getOwner() != null && !npc.isInRange(npc.getOwner(), npc.stats.aggroRange * 2)){ + return true; } - - return npc.getDistanceSqToEntity(target) > distance; + + return npc.combatHandler.checkTarget(); } @Override diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index f37f333c6..eaf41ade2 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -66,7 +66,7 @@ import noppes.npcs.util.GameProfileAlt; import java.io.IOException; import java.util.*; -public abstract class EntityNPCInterface extends EntityCreature implements IEntityAdditionalSpawnData, ICommandSender, IRangedAttackMob, IBossDisplayData{ +public abstract class EntityNPCInterface extends EntityCreature implements IEntityAdditionalSpawnData, ICommandSender, IRangedAttackMob, IBossDisplayData { public ICustomNpc wrappedNPC; public static final GameProfileAlt chateventProfile = new GameProfileAlt(); @@ -80,6 +80,8 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public DataTransform transform; public DataTimers timers; + public CombatHandler combatHandler = new CombatHandler(this); + public String linkedName = ""; public long linkedLast = 0; public LinkedData linkedData; @@ -295,10 +297,10 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti updateTasks(); updateHitbox(); } - setBoolFlag(this.getAttackTarget() != null, 4); + // setBoolFlag(this.getAttackTarget() != null, 4); setBoolFlag(!getNavigator().noPath(), 1); setBoolFlag(isInteracting(), 2); - + combatHandler.update(); onCollide(); } @@ -334,6 +336,12 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } } + @Override + protected void damageEntity(DamageSource damageSrc, float damageAmount){ + super.damageEntity(damageSrc, damageAmount); + combatHandler.damage(damageSrc, damageAmount); + } + public void updateClient() { NBTTagCompound compound = writeSpawnData(); compound.setInteger("EntityId", getEntityId()); @@ -661,19 +669,21 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti removeTask(aiRange); aiLeap = aiAttackTarget = aiResponse = aiSprint = aiRange = null; + if (this.ai.canSprint) + this.tasks.addTask(this.taskCount++, new EntityAISprintToTarget(this)); + if (this.ai.onAttack == 1) this.tasks.addTask(this.taskCount++, aiResponse = new EntityAIPanic(this, 1.2F)); else if (this.ai.onAttack == 2) { this.tasks.addTask(this.taskCount++, aiResponse = new EntityAIAvoidTarget(this)); - this.setCanSprint(); } else if (this.ai.onAttack == 0) { this.setCanLeap(); - this.setCanSprint(); if (this.inventory.getProjectile() == null || this.ai.useRangeMelee == 2) { + System.out.println("checking this stuff"); switch(this.ai.tacticalVariant) { case Dodge : this.tasks.addTask(this.taskCount++, aiResponse = new EntityAIZigZagTarget(this, 1.0D, this.ai.tacticalRadius)); break; @@ -759,15 +769,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti */ public void setCanLeap() { if (this.ai.canLeap) - this.tasks.addTask(this.taskCount++, aiLeap = new EntityAILeapAtTarget(this, 0.4F)); - } - - /* - * Branch task function for sprinting - */ - public void setCanSprint() { - if (this.ai.canSprint) - this.tasks.addTask(this.taskCount++, aiSprint = new EntityAISprintToTarget(this)); + this.tasks.addTask(this.taskCount++, aiLeap = new EntityAIPounceTarget(this)); } /* @@ -1063,6 +1065,8 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti setHealth(getMaxHealth()); dataWatcher.updateObject(14, 0); // animation Normal dataWatcher.updateObject(15, 0); + + combatHandler.reset(); this.setAttackTarget(null); this.setRevengeTarget(null); this.deathTime = 0; @@ -1462,6 +1466,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.motionY = 0.4000000059604645D; } } + @Override public void addVelocity(double p_70024_1_, double p_70024_3_, double p_70024_5_) { if (this.attackingPlayer != null) { @@ -1667,12 +1672,26 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti super.setInWeb(); } + public boolean isInRange(Entity entity, double range){ + return this.isInRange(entity.posX, entity.posY, entity.posZ, range); + } + + public boolean isInRange(double posX, double posY, double posZ, double range){ + double y = Math.abs(this.posY - posY); + if(posY >= 0 && y > range) + return false; + + double x = Math.abs(this.posX - posX); + double z = Math.abs(this.posZ - posZ); + + return x <= range && z <= range; + } + @Override public boolean canBeCollidedWith(){ return !isKilled(); } - // obviously we dont want this @Override public boolean canBePushed() { return this.display.collidesWith == 0; From 509d32bfc14545b698debc174a82d8fa95b1dcef Mon Sep 17 00:00:00 2001 From: Kam Date: Tue, 23 Jan 2024 23:32:02 -0500 Subject: [PATCH 11/17] Add two types of Leaps -- Jump and Pounce --- src/main/java/noppes/npcs/DataAI.java | 6 +++--- src/main/java/noppes/npcs/VersionCompatibility.java | 8 +++++++- .../java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java | 4 ++-- src/main/java/noppes/npcs/entity/EntityNPCInterface.java | 8 +++++--- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/noppes/npcs/DataAI.java b/src/main/java/noppes/npcs/DataAI.java index 7e4236374..7f4a7aa9a 100644 --- a/src/main/java/noppes/npcs/DataAI.java +++ b/src/main/java/noppes/npcs/DataAI.java @@ -26,7 +26,7 @@ public class DataAI { public boolean avoidsSun = false; public boolean returnToStart = true; public boolean directLOS = true; - public boolean canLeap = false; + public int leapType = 0; public boolean canSprint = false; public boolean stopAndInteract = true; public EnumNavType tacticalVariant = EnumNavType.Default; @@ -72,7 +72,7 @@ public class DataAI { doorInteract = compound.getInteger("DoorInteract"); findShelter = compound.getInteger("FindShelter"); directLOS = compound.getBoolean("DirectLOS"); - canLeap = compound.getBoolean("CanLeap"); + leapType = compound.getInteger("LeapType"); canSprint = compound.getBoolean("CanSprint"); canFireIndirect = compound.getInteger("FireIndirect"); useRangeMelee = compound.getInteger("RangeAndMelee"); @@ -140,7 +140,7 @@ public class DataAI { compound.setInteger("DoorInteract", doorInteract); compound.setInteger("FindShelter", findShelter); compound.setBoolean("DirectLOS", directLOS); - compound.setBoolean("CanLeap", canLeap); + compound.setInteger("LeapType", leapType); compound.setBoolean("CanSprint", canSprint); compound.setInteger("FireIndirect", canFireIndirect); compound.setInteger("RangeAndMelee", useRangeMelee); diff --git a/src/main/java/noppes/npcs/VersionCompatibility.java b/src/main/java/noppes/npcs/VersionCompatibility.java index a16e48a3d..23445f625 100644 --- a/src/main/java/noppes/npcs/VersionCompatibility.java +++ b/src/main/java/noppes/npcs/VersionCompatibility.java @@ -13,11 +13,17 @@ import java.util.Collection; import java.util.List; public class VersionCompatibility { - public static int ModRev = 21; + public static int ModRev = 22; public static void CheckNpcCompatibility(EntityNPCInterface npc, NBTTagCompound compound){ if(npc.npcVersion == ModRev) return; + if(npc.npcVersion < 22) { + if (compound.hasKey("CanLeap")) { + boolean canLeap = compound.getBoolean("CanLeap"); + compound.setInteger("LeapType", !canLeap ? 0 : 1); + } + } if(npc.npcVersion < 19) { if (compound.hasKey("CanDrown")) { compound.setInteger("DrowningType", (compound.getBoolean("CanDrown") ? 1 : 0)); diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java index e54840f77..6e93f7d1d 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNpcAI.java @@ -39,7 +39,7 @@ public class GuiNpcAI extends GuiNPCInterface2 implements ITextfieldListener, IG addLabel(new GuiNpcLabel(11,"ai.return", guiLeft + 150, guiTop + 40)); addButton(new GuiNpcButton(6, guiLeft + 230, guiTop + 35, 60, 20, new String[]{"gui.no","gui.yes"} ,npc.ai.returnToStart ? 1:0)); addLabel(new GuiNpcLabel(17,"ai.leapattarget", guiLeft + 150, guiTop + 65)); - addButton(new GuiNpcButton(15,guiLeft + 230, guiTop + 60, 60, 20, new String[]{"gui.no", "gui.yes"} ,npc.ai.canLeap ? 1:0)); + addButton(new GuiNpcButton(15,guiLeft + 230, guiTop + 60, 60, 20, new String[]{"gui.no", "ai.jump", "ai.pounce"} ,npc.ai.leapType)); addLabel(new GuiNpcLabel(15, "ai.indirect", guiLeft + 150, guiTop + 90)); addButton(new GuiNpcButton(13, guiLeft + 230, guiTop + 85, 60, 20, new String[]{"gui.no", "gui.whendistant", "gui.whenhidden"}, ai.canFireIndirect)); addLabel(new GuiNpcLabel(16, "ai.rangemelee", guiLeft + 150, guiTop + 115)); @@ -129,7 +129,7 @@ public class GuiNpcAI extends GuiNPCInterface2 implements ITextfieldListener, IG initGui(); } else if (button.id == 15) { - ai.canLeap = (button.getValue() == 1); + ai.leapType = (byte) button.getValue(); } else if (button.id == 16) { ai.canSprint = (button.getValue() == 1); diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index eaf41ade2..01a37ac32 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -680,7 +680,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } else if (this.ai.onAttack == 0) { - this.setCanLeap(); + this.setLeapTask(); if (this.inventory.getProjectile() == null || this.ai.useRangeMelee == 2) { System.out.println("checking this stuff"); @@ -767,8 +767,10 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti /* * Branch task function for leaping */ - public void setCanLeap() { - if (this.ai.canLeap) + public void setLeapTask() { + if (this.ai.leapType == 1) + this.tasks.addTask(this.taskCount++, aiLeap = new EntityAILeapAtTarget(this, 0.4F)); + if (this.ai.leapType == 2) this.tasks.addTask(this.taskCount++, aiLeap = new EntityAIPounceTarget(this)); } From d82466e281cd8d120106c3e3b11019fb444d8fda Mon Sep 17 00:00:00 2001 From: Kam Date: Tue, 23 Jan 2024 23:42:12 -0500 Subject: [PATCH 12/17] Remove Print oops --- src/main/java/noppes/npcs/entity/EntityNPCInterface.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 01a37ac32..ef66faf00 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -683,7 +683,6 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.setLeapTask(); if (this.inventory.getProjectile() == null || this.ai.useRangeMelee == 2) { - System.out.println("checking this stuff"); switch(this.ai.tacticalVariant) { case Dodge : this.tasks.addTask(this.taskCount++, aiResponse = new EntityAIZigZagTarget(this, 1.0D, this.ai.tacticalRadius)); break; From bc0439ee0b5f1d8a90e5a90b7803307825b2a16b Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 24 Jan 2024 00:10:24 -0500 Subject: [PATCH 13/17] Fly Moving Helper --- .../java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index bdb317883..59e4273bc 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -38,7 +38,10 @@ public class FlyingMoveHelper extends EntityMoveHelper{ double d5 = MathHelper.sqrt_double(d4); speed = Math.min(d5/5.0D,speed); - if (this.entity.hurtTime == 0 && d4 > 0.5D) { + // its here louis! + // This is the hurt time that stuns the NPC!!!!!! + // if (this.entity.hurtTime == 0 && d4 > 0.5D) { + if (d4 >= 0.5D) { this.entity.motionX += (speed * (d0 / d5) - this.entity.motionX) * speed; this.entity.motionZ += (speed * (d2 / d5) - this.entity.motionZ) * speed; From 0ee066b974e8c0b3035b28b48c8e8d348e0ff6f8 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:34:06 -0600 Subject: [PATCH 14/17] Initial commit for first person animations, still need to debug and fix. --- .../npcs/client/ClientEventHandler.java | 29 ++ .../java/noppes/npcs/config/ConfigMixin.java | 9 + .../npcs/mixin/CustomNPCsMixinPlugin.java | 3 + .../noppes/npcs/mixin/MixinItemRenderer.java | 313 ++++++++++++++++++ src/main/resources/META-INF/customnpcs_at.cfg | 6 +- 5 files changed, 359 insertions(+), 1 deletion(-) create mode 100644 src/main/java/noppes/npcs/mixin/MixinItemRenderer.java diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index 06e24ee67..eb421653d 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -11,13 +11,16 @@ import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.*; import net.minecraftforge.event.entity.living.LivingEvent; +import noppes.npcs.config.ConfigMixin; import noppes.npcs.controllers.data.AnimationData; import noppes.npcs.client.gui.customoverlay.OverlayCustom; import noppes.npcs.client.renderer.RenderCNPCPlayer; import noppes.npcs.constants.EnumAnimationPart; import noppes.npcs.controllers.data.Animation; +import noppes.npcs.controllers.data.Frame; import noppes.npcs.controllers.data.FramePart; import noppes.npcs.entity.EntityNPCInterface; +import org.lwjgl.opengl.GL11; import java.lang.reflect.Field; import java.util.ArrayList; @@ -196,6 +199,32 @@ public class ClientEventHandler { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { partialHandTicks = event.partialTicks; + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if (ConfigMixin.FirstPersonAnimationMixin && ClientCacheHandler.playerAnimations.containsKey(player.getUniqueID())) { + for (Map.Entry entry : ClientEventHandler.originalValues.entrySet()) { + ModelRenderer renderer = entry.getKey(); + FramePart part = entry.getValue(); + renderer.rotateAngleX = part.rotation[0]; + renderer.rotateAngleY = part.rotation[1]; + renderer.rotateAngleZ = part.rotation[2]; + renderer.rotationPointX = part.pivot[0]; + renderer.rotationPointY = part.pivot[1]; + renderer.rotationPointZ = part.pivot[2]; + } + + AnimationData animData = ClientCacheHandler.playerAnimations.get(player.getUniqueID()); + if (animData != null && animData.isActive()) { + Frame frame = (Frame) animData.animation.currentFrame(); + for (EnumAnimationPart e : EnumAnimationPart.values()) { + if (frame.frameParts.containsKey(e)) { + FramePart part = frame.frameParts.get(e); + part.interpolateOffset(); + part.interpolateAngles(); + } + } + } + } } public static boolean hasOverlays(EntityPlayer player) { diff --git a/src/main/java/noppes/npcs/config/ConfigMixin.java b/src/main/java/noppes/npcs/config/ConfigMixin.java index 08dd65063..9a21fc0e3 100644 --- a/src/main/java/noppes/npcs/config/ConfigMixin.java +++ b/src/main/java/noppes/npcs/config/ConfigMixin.java @@ -25,6 +25,9 @@ public class ConfigMixin public static Property AnimationMixinProperty; public static boolean AnimationMixin = true; + public static Property FirstPersonAnimationMixinProperty; + public static boolean FirstPersonAnimationMixin = true; + public static void init(File configFile) { config = new Configuration(configFile); @@ -39,6 +42,12 @@ public class ConfigMixin AnimationMixinProperty = config.get(CLIENT, "Animation Mixin", true, "Enables mixins for the ModelRenderer and RenderPlayer classes, allowing for additional animation functionality in the API. If crashes or visual errors occur, please disable."); AnimationMixin = AnimationMixinProperty.getBoolean(true); + if (AnimationMixin) { + FirstPersonAnimationMixinProperty = config.get(CLIENT, "First Person Animation Mixin", true, "Enables mixins for the ItemRenderer class, allowing for animations to be visible in first person. Can only be enabled if the animation mixin is enabled. If crashes or visual errors occur, please disable."); + FirstPersonAnimationMixin = FirstPersonAnimationMixinProperty.getBoolean(true); + } else { + FirstPersonAnimationMixin = false; + } } catch (Exception e) { diff --git a/src/main/java/noppes/npcs/mixin/CustomNPCsMixinPlugin.java b/src/main/java/noppes/npcs/mixin/CustomNPCsMixinPlugin.java index b00fd404d..db956d0f5 100644 --- a/src/main/java/noppes/npcs/mixin/CustomNPCsMixinPlugin.java +++ b/src/main/java/noppes/npcs/mixin/CustomNPCsMixinPlugin.java @@ -53,6 +53,9 @@ public class CustomNPCsMixinPlugin implements IMixinConfigPlugin { mixins.add("MixinModelRenderer"); mixins.add("MixinRenderPlayer"); } + if (ConfigMixin.FirstPersonAnimationMixin) { + mixins.add("MixinItemRenderer"); + } } return mixins; } diff --git a/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java b/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java new file mode 100644 index 000000000..003a42b5b --- /dev/null +++ b/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java @@ -0,0 +1,313 @@ +package noppes.npcs.mixin; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.MinecraftForgeClient; +import noppes.npcs.client.ClientCacheHandler; +import noppes.npcs.client.ClientEventHandler; +import noppes.npcs.constants.EnumAnimationPart; +import noppes.npcs.controllers.data.Animation; +import noppes.npcs.controllers.data.AnimationData; +import noppes.npcs.controllers.data.Frame; +import noppes.npcs.controllers.data.FramePart; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +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.callback.CallbackInfo; + +import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON; + +@Mixin(ItemRenderer.class) +public class MixinItemRenderer { + + @Inject(method = "renderItemInFirstPerson", at = @At(value = "HEAD"), cancellable = true) + public void renderItemInFirstPerson(float p_78440_1_, CallbackInfo callbackInfo) + { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + Render renderer = RenderManager.instance.getEntityRenderObject(player); + if (renderer instanceof RendererLivingEntity && ((RendererLivingEntity) renderer).mainModel instanceof ModelBiped) { + if (mixin_renderFirstPersonAnimation(p_78440_1_, player, (ModelBiped) ((RendererLivingEntity) renderer).mainModel)) { + callbackInfo.cancel(); + } + } + } + + private boolean mixin_renderFirstPersonAnimation(float partialRenderTick, EntityPlayer player, ModelBiped model) { + ModelRenderer[] parts = new ModelRenderer[]{model.bipedRightArm, model.bipedLeftArm, model.bipedRightLeg, model.bipedLeftLeg}; + EnumAnimationPart[] enumParts = new EnumAnimationPart[]{EnumAnimationPart.RIGHT_ARM, EnumAnimationPart.LEFT_ARM, EnumAnimationPart.RIGHT_LEG, EnumAnimationPart.LEFT_LEG}; + Frame frame = null; + + AnimationData animationData = ClientCacheHandler.playerAnimations.get(player.getUniqueID()); + if (animationData != null && animationData.isActive() && animationData.getAnimation() != null && animationData.getAnimation().currentFrame() != null) { + Animation animation = (Animation) animationData.getAnimation(); + frame = (Frame) animation.currentFrame(); + for (int i = 0; i < parts.length; i++) { + ModelRenderer part = parts[i]; + EnumAnimationPart enumPart = enumParts[i]; + FramePart originalPart = ClientEventHandler.originalValues.get(part); + if (originalPart != null && frame.frameParts.containsKey(enumPart)) { + FramePart animatedPart = frame.frameParts.get(enumPart); + part.rotationPointX = originalPart.pivot[0] + animatedPart.prevPivots[0]; + part.rotationPointY = originalPart.pivot[1] + animatedPart.prevPivots[1]; + part.rotationPointZ = originalPart.pivot[2] + animatedPart.prevPivots[2]; + part.rotateAngleX = animatedPart.prevRotations[0]; + part.rotateAngleY = animatedPart.prevRotations[1]; + part.rotateAngleZ = animatedPart.prevRotations[2]; + } + } + } else { + return false; + } + + ItemRenderer itemRenderer = Minecraft.getMinecraft().entityRenderer.itemRenderer; + float f1 = 1.0F;//itemRenderer.prevEquippedProgress + (itemRenderer.equippedProgress - itemRenderer.prevEquippedProgress) * partialRenderTick; + + EntityClientPlayerMP entityclientplayermp = Minecraft.getMinecraft().thePlayer; +// float f2 = entityclientplayermp.prevRotationPitch + (entityclientplayermp.rotationPitch - entityclientplayermp.prevRotationPitch) * partialRenderTick; +// GL11.glPushMatrix(); +// GL11.glRotatef(f2, 1.0F, 0.0F, 0.0F); +// GL11.glRotatef(entityclientplayermp.prevRotationYaw + (entityclientplayermp.rotationYaw - entityclientplayermp.prevRotationYaw) * p_78440_1_, 0.0F, 1.0F, 0.0F); +// RenderHelper.enableStandardItemLighting(); +// GL11.glPopMatrix(); + EntityPlayerSP entityplayersp = (EntityPlayerSP)entityclientplayermp; + float f3 = entityplayersp.prevRenderArmPitch + (entityplayersp.renderArmPitch - entityplayersp.prevRenderArmPitch) * partialRenderTick; + float f4 = entityplayersp.prevRenderArmYaw + (entityplayersp.renderArmYaw - entityplayersp.prevRenderArmYaw) * partialRenderTick; + GL11.glRotatef((entityclientplayermp.rotationPitch - f3) * 0.1F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef((entityclientplayermp.rotationYaw - f4) * 0.1F, 0.0F, 1.0F, 0.0F); + ItemStack itemstack = itemRenderer.itemToRender; + + int i = Minecraft.getMinecraft().theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(entityclientplayermp.posX), MathHelper.floor_double(entityclientplayermp.posY), MathHelper.floor_double(entityclientplayermp.posZ), 0); + int j = i % 65536; + int k = i / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j / 1.0F, (float)k / 1.0F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(entityclientplayermp.getLocationSkin()); + + GL11.glPushMatrix(); + GL11.glTranslatef(0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedRightArm.render(0.0625F); + GL11.glPopMatrix(); + + if (itemstack != null) + { + float f11, f12; + GL11.glPushMatrix(); + + if (player.fishEntity != null) + { + itemstack = new ItemStack(Items.stick); + } + + float p_78785_1_ = 0.0625F; + GL11.glTranslatef(0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + + GL11.glTranslatef(model.bipedRightArm.rotationPointX * p_78785_1_, model.bipedRightArm.rotationPointY * p_78785_1_, model.bipedRightArm.rotationPointZ * p_78785_1_); + GL11.glRotatef((float) Math.toDegrees(model.bipedRightArm.rotateAngleZ), 0, 0, 1); + GL11.glRotatef((float) Math.toDegrees(model.bipedRightArm.rotateAngleY), 0, 1, 0); + GL11.glRotatef((float) Math.toDegrees(model.bipedRightArm.rotateAngleX), 1, 0, 0); + GL11.glTranslatef(-0.1F, 0.6F, 0.0F); + + GL11.glRotatef(255, 0, 1, 0); + GL11.glRotatef(45, 1, 0, 0); + GL11.glRotatef(80, 0, 0, 1); + + float f6 = 1/1.5F; + GL11.glScalef(f6, f6, f6); + + if (itemstack.getItem().requiresMultipleRenderPasses()) + { + for (k = 0; k < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); ++k) + { + i = itemstack.getItem().getColorFromItemStack(itemstack, k); + f12 = (float)(i >> 16 & 255) / 255.0F; + f3 = (float)(i >> 8 & 255) / 255.0F; + f4 = (float)(i & 255) / 255.0F; + GL11.glColor4f(f12, f3, f4, 1.0F); + mixin_renderItem(player, itemstack, k, EQUIPPED_FIRST_PERSON); + } + } + else + { + k = itemstack.getItem().getColorFromItemStack(itemstack, 0); + f11 = (float)(k >> 16 & 255) / 255.0F; + f12 = (float)(k >> 8 & 255) / 255.0F; + f3 = (float)(k & 255) / 255.0F; + GL11.glColor4f(f11, f12, f3, 1.0F); + mixin_renderItem(player, itemstack, 0, EQUIPPED_FIRST_PERSON); + } + + GL11.glPopMatrix(); + } + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedLeftArm.render(0.0625F); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslatef(0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedRightLeg.render(0.0625F); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glTranslatef(-0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedLeftLeg.render(0.0625F); + GL11.glPopMatrix(); + + if (frame != null) { + for (int p = 0; p < parts.length; p++) { + ModelRenderer part = parts[p]; + EnumAnimationPart enumPart = enumParts[p]; + FramePart originalPart = ClientEventHandler.originalValues.get(part); + if (originalPart != null && frame.frameParts.containsKey(enumPart)) { + part.rotationPointX = originalPart.pivot[0]; + part.rotationPointY = originalPart.pivot[1]; + part.rotationPointZ = originalPart.pivot[2]; + part.rotateAngleX = originalPart.rotation[0]; + part.rotateAngleY = originalPart.rotation[1]; + part.rotateAngleZ = originalPart.rotation[2]; + } + } + } + + return true; + } + + @Shadow private RenderBlocks renderBlocksIr; + @Shadow private static ResourceLocation RES_ITEM_GLINT; + + private void mixin_renderItem(EntityLivingBase p_78443_1_, ItemStack p_78443_2_, int p_78443_3_, IItemRenderer.ItemRenderType type) { + GL11.glPushMatrix(); + TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager(); + Item item = p_78443_2_.getItem(); + Block block = Block.getBlockFromItem(item); + + if (p_78443_2_ != null && block != null && block.getRenderBlockPass() != 0) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + } + IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(p_78443_2_, type); + if (customRenderer != null) { + texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber())); + ForgeHooksClient.renderEquippedItem(type, customRenderer, renderBlocksIr, p_78443_1_, p_78443_2_); + } else if (p_78443_2_.getItemSpriteNumber() == 0 && item instanceof ItemBlock && RenderBlocks.renderItemIn3d(block.getRenderType())) { + texturemanager.bindTexture(texturemanager.getResourceLocation(0)); + + GL11.glTranslatef(0.0F, 0.2F,-0.2F); + if (p_78443_2_ != null && block != null && block.getRenderBlockPass() != 0) { + GL11.glDepthMask(false); + renderBlocksIr.renderBlockAsItem(block, p_78443_2_.getItemDamage(), 1.0F); + GL11.glDepthMask(true); + } else { + renderBlocksIr.renderBlockAsItem(block, p_78443_2_.getItemDamage(), 1.0F); + } + } else { + IIcon iicon = p_78443_1_.getItemIcon(p_78443_2_, p_78443_3_); + + if (iicon == null) { + GL11.glPopMatrix(); + return; + } + + texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber())); + TextureUtil.func_152777_a(false, false, 1.0F); + Tessellator tessellator = Tessellator.instance; + float f = iicon.getMinU(); + float f1 = iicon.getMaxU(); + float f2 = iicon.getMinV(); + float f3 = iicon.getMaxV(); + float f4 = 0.0F; + float f5 = 0.3F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glTranslatef(-f4, -f5, 0.0F); + float f6 = 1.5F; + GL11.glScalef(f6, f6, f6); + GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(-0.9375F, -0.0625F, 0.0F); + ItemRenderer.renderItemIn2D(tessellator, f1, f2, f, f3, iicon.getIconWidth(), iicon.getIconHeight(), 0.0625F); + + if (p_78443_2_.hasEffect(p_78443_3_)) { + GL11.glDepthFunc(GL11.GL_EQUAL); + GL11.glDisable(GL11.GL_LIGHTING); + texturemanager.bindTexture(RES_ITEM_GLINT); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(768, 1, 1, 0); + float f7 = 0.76F; + GL11.glColor4f(0.5F * f7, 0.25F * f7, 0.8F * f7, 1.0F); + GL11.glMatrixMode(GL11.GL_TEXTURE); + GL11.glPushMatrix(); + float f8 = 0.125F; + GL11.glScalef(f8, f8, f8); + float f9 = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F * 8.0F; + GL11.glTranslatef(f9, 0.0F, 0.0F); + GL11.glRotatef(-50.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + GL11.glScalef(f8, f8, f8); + f9 = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F * 8.0F; + GL11.glTranslatef(-f9, 0.0F, 0.0F); + GL11.glRotatef(10.0F, 0.0F, 0.0F, 1.0F); + ItemRenderer.renderItemIn2D(tessellator, 0.0F, 0.0F, 1.0F, 1.0F, 256, 256, 0.0625F); + GL11.glPopMatrix(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDepthFunc(GL11.GL_LEQUAL); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + texturemanager.bindTexture(texturemanager.getResourceLocation(p_78443_2_.getItemSpriteNumber())); + TextureUtil.func_147945_b(); + } + + GL11.glPopMatrix(); + } +} diff --git a/src/main/resources/META-INF/customnpcs_at.cfg b/src/main/resources/META-INF/customnpcs_at.cfg index 51efd0be4..31d46a398 100644 --- a/src/main/resources/META-INF/customnpcs_at.cfg +++ b/src/main/resources/META-INF/customnpcs_at.cfg @@ -7,4 +7,8 @@ public net.minecraft.client.model.ModelRenderer field_78810_s # baseModel #Minecraft public net.minecraft.client.Minecraft field_71428_T # timer #Entity -public net.minecraft.entity.Entity field_70148_d # firstUpdate \ No newline at end of file +public net.minecraft.entity.Entity field_70148_d # firstUpdate +#RendererLivingEntity +public net.minecraft.client.renderer.entity.RendererLivingEntity field_77045_g # mainModel +#ItemRenderer +public net.minecraft.client.renderer.ItemRenderer field_78453_b # itemToRender \ No newline at end of file From 5dd3da83cd5045739e0843be3afe8cf7f355eb33 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 24 Jan 2024 17:59:43 -0600 Subject: [PATCH 15/17] Fixed animations not animating in first person. --- src/main/java/noppes/npcs/client/ClientEventHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index eb421653d..1298af580 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -6,6 +6,7 @@ import cpw.mods.fml.relauncher.Side; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.entity.player.EntityPlayer; @@ -198,9 +199,14 @@ public class ClientEventHandler { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + Render playerRenderer = RenderManager.instance.getEntityRenderObject(player); + if (playerRenderer instanceof RendererLivingEntity) { + ClientEventHandler.renderer = (RendererLivingEntity) playerRenderer; + } + ClientEventHandler.partialRenderTick = Minecraft.getMinecraft().timer.renderPartialTicks; partialHandTicks = event.partialTicks; - EntityPlayer player = Minecraft.getMinecraft().thePlayer; if (ConfigMixin.FirstPersonAnimationMixin && ClientCacheHandler.playerAnimations.containsKey(player.getUniqueID())) { for (Map.Entry entry : ClientEventHandler.originalValues.entrySet()) { ModelRenderer renderer = entry.getKey(); From d683b3e64d829fedd0d592b8744fbb5f872348e5 Mon Sep 17 00:00:00 2001 From: luisc Date: Wed, 24 Jan 2024 18:10:17 -0600 Subject: [PATCH 16/17] More fixes to first-person animation rendering. --- .../npcs/client/ClientEventHandler.java | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index 1298af580..26b48021b 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -200,34 +200,22 @@ public class ClientEventHandler { @SubscribeEvent public void onRenderHand(RenderHandEvent event) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; - Render playerRenderer = RenderManager.instance.getEntityRenderObject(player); - if (playerRenderer instanceof RendererLivingEntity) { - ClientEventHandler.renderer = (RendererLivingEntity) playerRenderer; - } - ClientEventHandler.partialRenderTick = Minecraft.getMinecraft().timer.renderPartialTicks; - partialHandTicks = event.partialTicks; - if (ConfigMixin.FirstPersonAnimationMixin && ClientCacheHandler.playerAnimations.containsKey(player.getUniqueID())) { - for (Map.Entry entry : ClientEventHandler.originalValues.entrySet()) { - ModelRenderer renderer = entry.getKey(); - FramePart part = entry.getValue(); - renderer.rotateAngleX = part.rotation[0]; - renderer.rotateAngleY = part.rotation[1]; - renderer.rotateAngleZ = part.rotation[2]; - renderer.rotationPointX = part.pivot[0]; - renderer.rotationPointY = part.pivot[1]; - renderer.rotationPointZ = part.pivot[2]; + Render playerRenderer = RenderManager.instance.getEntityRenderObject(player); + if (playerRenderer instanceof RendererLivingEntity) { + ClientEventHandler.renderer = (RendererLivingEntity) playerRenderer; } + ClientEventHandler.renderingPlayer = player; + ClientEventHandler.partialRenderTick = Minecraft.getMinecraft().timer.renderPartialTicks; + partialHandTicks = event.partialTicks; AnimationData animData = ClientCacheHandler.playerAnimations.get(player.getUniqueID()); if (animData != null && animData.isActive()) { Frame frame = (Frame) animData.animation.currentFrame(); - for (EnumAnimationPart e : EnumAnimationPart.values()) { - if (frame.frameParts.containsKey(e)) { - FramePart part = frame.frameParts.get(e); - part.interpolateOffset(); - part.interpolateAngles(); - } + if (frame.frameParts.containsKey(EnumAnimationPart.FULL_MODEL)) { + FramePart part = frame.frameParts.get(EnumAnimationPart.FULL_MODEL); + part.interpolateOffset(); + part.interpolateAngles(); } } } From e1b71f0bc091788fb950fed6f71d40686d1aac14 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:58:31 -0600 Subject: [PATCH 17/17] More changes & fixes to first person animation rendering: -Made right arm item render last, fixes only the right arm rendering with the correct texture. -Limbs will only be rendered if they are included in an animation. --- .../noppes/npcs/mixin/MixinItemRenderer.java | 108 ++++++++++-------- 1 file changed, 58 insertions(+), 50 deletions(-) diff --git a/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java b/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java index 003a42b5b..0baad01af 100644 --- a/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinItemRenderer.java @@ -62,7 +62,7 @@ public class MixinItemRenderer { private boolean mixin_renderFirstPersonAnimation(float partialRenderTick, EntityPlayer player, ModelBiped model) { ModelRenderer[] parts = new ModelRenderer[]{model.bipedRightArm, model.bipedLeftArm, model.bipedRightLeg, model.bipedLeftLeg}; EnumAnimationPart[] enumParts = new EnumAnimationPart[]{EnumAnimationPart.RIGHT_ARM, EnumAnimationPart.LEFT_ARM, EnumAnimationPart.RIGHT_LEG, EnumAnimationPart.LEFT_LEG}; - Frame frame = null; + Frame frame; AnimationData animationData = ClientCacheHandler.playerAnimations.get(player.getUniqueID()); if (animationData != null && animationData.isActive() && animationData.getAnimation() != null && animationData.getAnimation().currentFrame() != null) { @@ -110,16 +110,53 @@ public class MixinItemRenderer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(entityclientplayermp.getLocationSkin()); - GL11.glPushMatrix(); - GL11.glTranslatef(0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); - model.bipedRightArm.render(0.0625F); - GL11.glPopMatrix(); + if (frame.frameParts.containsKey(EnumAnimationPart.RIGHT_ARM)) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedRightArm.render(0.0625F); + GL11.glPopMatrix(); + } - if (itemstack != null) + + if (frame.frameParts.containsKey(EnumAnimationPart.LEFT_ARM)) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedLeftArm.render(0.0625F); + GL11.glPopMatrix(); + } + + + if (frame.frameParts.containsKey(EnumAnimationPart.RIGHT_LEG)) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedRightLeg.render(0.0625F); + GL11.glPopMatrix(); + } + + if (frame.frameParts.containsKey(EnumAnimationPart.LEFT_LEG)) { + GL11.glPushMatrix(); + GL11.glTranslatef(-0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); + model.bipedLeftLeg.render(0.0625F); + GL11.glPopMatrix(); + } + + if (frame.frameParts.containsKey(EnumAnimationPart.RIGHT_ARM) && itemstack != null) { float f11, f12; GL11.glPushMatrix(); @@ -172,46 +209,17 @@ public class MixinItemRenderer { GL11.glPopMatrix(); } - GL11.glPushMatrix(); - GL11.glTranslatef(-0.1F, 0.4F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.3F); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); - model.bipedLeftArm.render(0.0625F); - GL11.glPopMatrix(); - - GL11.glPushMatrix(); - GL11.glTranslatef(0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); - model.bipedRightLeg.render(0.0625F); - GL11.glPopMatrix(); - - GL11.glPushMatrix(); - GL11.glTranslatef(-0.025F, 0.6F + -0.75F * 0.8F - (1.0F - f1) * 0.6F, -0.4F); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F); - GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F); - model.bipedLeftLeg.render(0.0625F); - GL11.glPopMatrix(); - - if (frame != null) { - for (int p = 0; p < parts.length; p++) { - ModelRenderer part = parts[p]; - EnumAnimationPart enumPart = enumParts[p]; - FramePart originalPart = ClientEventHandler.originalValues.get(part); - if (originalPart != null && frame.frameParts.containsKey(enumPart)) { - part.rotationPointX = originalPart.pivot[0]; - part.rotationPointY = originalPart.pivot[1]; - part.rotationPointZ = originalPart.pivot[2]; - part.rotateAngleX = originalPart.rotation[0]; - part.rotateAngleY = originalPart.rotation[1]; - part.rotateAngleZ = originalPart.rotation[2]; - } + for (int p = 0; p < parts.length; p++) { + ModelRenderer part = parts[p]; + EnumAnimationPart enumPart = enumParts[p]; + FramePart originalPart = ClientEventHandler.originalValues.get(part); + if (originalPart != null && frame.frameParts.containsKey(enumPart)) { + part.rotationPointX = originalPart.pivot[0]; + part.rotationPointY = originalPart.pivot[1]; + part.rotationPointZ = originalPart.pivot[2]; + part.rotateAngleX = originalPart.rotation[0]; + part.rotateAngleY = originalPart.rotation[1]; + part.rotateAngleZ = originalPart.rotation[2]; } }