You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.5 KiB
Java
106 lines
4.5 KiB
Java
package com.zivilon.cinder_loe.mixins;
|
|
|
|
import com.zivilon.cinder_loe.CinderLoE;
|
|
import com.zivilon.cinder_loe.client.model.*;
|
|
import com.zivilon.cinder_loe.entity.Renegade;
|
|
import com.zivilon.cinder_loe.util.IEntityLivingBase;
|
|
import com.zivilon.cinder_loe.util.Utilities;
|
|
|
|
import org.spongepowered.asm.mixin.Mixin;
|
|
import org.spongepowered.asm.mixin.Shadow;
|
|
import org.spongepowered.asm.mixin.Overwrite;
|
|
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityCreature;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.IEntityLivingData;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.world.World;
|
|
|
|
import lotr.common.entity.npc.LOTREntityNPC;
|
|
import lotr.common.entity.projectile.LOTREntitySpear;
|
|
import lotr.common.entity.ai.LOTREntityAIAttackOnCollide;
|
|
import lotr.common.item.LOTRItemSpear;
|
|
import lotr.common.item.LOTRWeaponStats;
|
|
|
|
import java.util.UUID;
|
|
|
|
@Mixin(LOTREntityAIAttackOnCollide.class)
|
|
public class MixinLOTREntityAIAttackOnCollide {
|
|
|
|
@Shadow(remap = false)
|
|
protected World worldObj;
|
|
@Shadow(remap = false)
|
|
protected EntityCreature theOwner;
|
|
@Shadow(remap = false)
|
|
protected EntityLivingBase attackTarget;
|
|
@Shadow(remap = false)
|
|
protected int attackTick;
|
|
@Shadow(remap = false)
|
|
protected void updateLookAndPathing() {}
|
|
public UUID leader_id;
|
|
public Entity leader;
|
|
|
|
@Overwrite
|
|
public void updateTask() {
|
|
if (warband_task()) return;
|
|
update_vanilla_task();
|
|
}
|
|
|
|
private boolean warband_task() {
|
|
EntityCreature entity = this.theOwner;
|
|
UUID leader_id = ((IEntityLivingBase)entity).get_warband_uuid();
|
|
|
|
if (leader_id != null) {
|
|
if (leader == null)
|
|
leader = Utilities.find_entity_by_uuid(entity.worldObj, leader_id);
|
|
if (leader != null && entity.getDistanceSqToEntity(leader) > 576.0D) {
|
|
entity.setAttackTarget(null);
|
|
((IEntityLivingBase)entity).set_follow_target(leader);
|
|
entity.getNavigator().tryMoveToEntityLiving(leader, 1.3D);
|
|
return true; // Return here to not run default logic
|
|
}
|
|
}
|
|
((IEntityLivingBase)entity).set_follow_target(null);
|
|
return false;
|
|
}
|
|
|
|
private void update_vanilla_task() {
|
|
updateLookAndPathing();
|
|
if (this.attackTick > 0)
|
|
this.attackTick--;
|
|
ItemStack weapon = this.theOwner.getHeldItem();
|
|
if (weapon != null && weapon.getItem() instanceof LOTRItemSpear && this.attackTick <= 0 && this.theOwner instanceof LOTREntityNPC) {
|
|
LOTREntityNPC theNPC = (LOTREntityNPC)this.theOwner;
|
|
ItemStack spearBackup = theNPC.npcItemsInv.getSpearBackup();
|
|
if (spearBackup != null) {
|
|
LOTRItemSpear spearItem = (LOTRItemSpear)weapon.getItem();
|
|
double d = this.theOwner.getDistanceToEntity((Entity)this.attackTarget);
|
|
double range = this.theOwner.getNavigator().getPathSearchRange();
|
|
if (d > 5.0D && d < range * 0.75D) {
|
|
LOTREntitySpear spear = new LOTREntitySpear(this.worldObj, (EntityLivingBase)this.theOwner, this.attackTarget, weapon.copy(), 0.75F + (float)d * 0.025F, 0.5F);
|
|
this.worldObj.playSoundAtEntity((Entity)this.theOwner, "random.bow", 1.0F, 1.0F / (this.worldObj.rand.nextFloat() * 0.4F + 1.2F) + 0.25F);
|
|
this.worldObj.spawnEntityInWorld((Entity)spear);
|
|
this.attackTick = 30 + this.theOwner.getRNG().nextInt(20);
|
|
if (ItemStack.areItemStacksEqual(theNPC.npcItemsInv.getIdleItem(), theNPC.npcItemsInv.getMeleeWeapon()))
|
|
theNPC.npcItemsInv.setIdleItem(spearBackup);
|
|
theNPC.npcItemsInv.setMeleeWeapon(spearBackup);
|
|
theNPC.npcItemsInv.setSpearBackup(null);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
float weaponReach = 1.0F;
|
|
if (this.theOwner.ridingEntity != null)
|
|
weaponReach = LOTREntityNPC.MOUNT_RANGE_BONUS;
|
|
weaponReach *= LOTRWeaponStats.getMeleeReachFactor(this.theOwner.getHeldItem());
|
|
float meleeRange = (float)this.theOwner.boundingBox.getAverageEdgeLength() + weaponReach;
|
|
if (this.theOwner.getDistanceSqToEntity((Entity)this.attackTarget) <= (meleeRange * meleeRange))
|
|
if (this.attackTick <= 0) {
|
|
this.attackTick = LOTRWeaponStats.getAttackTimeMob(weapon);
|
|
this.theOwner.attackEntityAsMob((Entity)this.attackTarget);
|
|
this.theOwner.swingItem();
|
|
}
|
|
}
|
|
}
|