Skip to content

Commit

Permalink
clean up endermans
Browse files Browse the repository at this point in the history
  • Loading branch information
jrbudda committed Jun 18, 2024
1 parent e7aa1e3 commit e66e9b8
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 211 deletions.
4 changes: 4 additions & 0 deletions src/org/vivecraft/Reflector.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ public class Reflector {
public static Field aboveGroundTickCount = getPrivateField("J", ServerGamePacketListenerImpl.class);
public static Field connection = getPrivateField("e", ServerCommonPacketListenerImpl.class);

public static int enderManFreezePriority = 1;
public static int enderManLookTargetPriority = 1;


public static Object getFieldValue(Field field, Object object) {
try
{
Expand Down
12 changes: 6 additions & 6 deletions src/org/vivecraft/VSE.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
import org.spigotmc.SpigotConfig;
import org.vivecraft.command.ConstructTabCompleter;
import org.vivecraft.command.ViveCommand;
import org.vivecraft.entities.CustomGoalStare;
import org.vivecraft.entities.CustomEndermanFreezeWhenLookedAt;
import org.vivecraft.entities.CustomEndermanLookForPlayerGoal;
import org.vivecraft.entities.CustomGoalSwell;
import org.vivecraft.entities.CustomPathFinderGoalPlayerWhoLookedAtTarget;
import org.vivecraft.listeners.VivecraftCombatListener;
import org.vivecraft.listeners.VivecraftItemListener;
import org.vivecraft.listeners.VivecraftNetworkListener;
Expand Down Expand Up @@ -241,21 +241,21 @@ else if(entity.getType() == EntityType.ENDERMAN){
EnderMan e = ((CraftEnderman) entity).getHandle();
AbstractCollection<WrappedGoal> targets = (AbstractCollection<WrappedGoal>) Reflector.getFieldValue(Reflector.availableGoals, ((Mob)e).targetSelector);
for(WrappedGoal b: targets){
if(b.getPriority() == 1){ //replace PlayerWhoLookedAt target. Class is private cant use instanceof, check priority on all new versions.
if(b.getPriority() == Reflector.enderManLookTargetPriority){ //replace PlayerWhoLookedAt target. Class is private cant use instanceof, check priority on all new versions.
targets.remove(b);
break;
}
}
e.targetSelector.addGoal(1, new CustomPathFinderGoalPlayerWhoLookedAtTarget(e, e::isAngryAt));
e.targetSelector.addGoal(Reflector.enderManLookTargetPriority, new CustomEndermanLookForPlayerGoal(e, e::isAngryAt));

AbstractCollection<WrappedGoal> goals = (AbstractCollection<WrappedGoal>) Reflector.getFieldValue(Reflector.availableGoals, ((Mob)e).goalSelector);
for(WrappedGoal b: goals){
if(b.getPriority()==1){//replace EndermanFreezeWhenLookedAt goal. Verify priority on new version.
if(b.getPriority()==Reflector.enderManFreezePriority){//replace EndermanFreezeWhenLookedAt goal. Verify priority on new version.
goals.remove(b);
break;
}
}
e.goalSelector.addGoal(1, new CustomGoalStare(e));
e.goalSelector.addGoal(Reflector.enderManFreezePriority, new CustomEndermanFreezeWhenLookedAt(e));
}
}

Expand Down
36 changes: 36 additions & 0 deletions src/org/vivecraft/entities/CustomEndermanFreezeWhenLookedAt.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.vivecraft.entities;

import java.util.EnumSet;

import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.monster.EnderMan;
import net.minecraft.world.entity.player.Player;

public class CustomEndermanFreezeWhenLookedAt extends Goal {
private final EnderMan enderman;
private LivingEntity target;

public CustomEndermanFreezeWhenLookedAt(EnderMan entityenderman) {
this.enderman = entityenderman;
this.setFlags(EnumSet.of(Flag.JUMP, Flag.MOVE));
}

public boolean canUse() {
this.target = this.enderman.getTarget();
if (!(this.target instanceof Player)) {
return false;
} else {
double d0 = this.target.distanceToSqr(this.enderman);
return d0 > 256.0 ? false : EndermanUtils.isLookingAtMe((Player)this.target, this.enderman);
}
}

public void start() {
this.enderman.getNavigation().stop();
}

public void tick() {
this.enderman.getLookControl().setLookAt(this.target.getX(), this.target.getEyeY(), this.target.getZ());
}
}
100 changes: 100 additions & 0 deletions src/org/vivecraft/entities/CustomEndermanLookForPlayerGoal.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package org.vivecraft.entities;

import java.util.function.Predicate;

import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
import net.minecraft.world.entity.ai.targeting.TargetingConditions;
import net.minecraft.world.entity.monster.EnderMan;
import net.minecraft.world.entity.player.Player;

public class CustomEndermanLookForPlayerGoal extends NearestAttackableTargetGoal<Player> {
private final EnderMan enderman;
private Player pendingTarget;
private int aggroTime;
private int teleportTime;
private final TargetingConditions startAggroTargetConditions;
private final TargetingConditions continueAggroTargetConditions = TargetingConditions.forCombat().ignoreLineOfSight();
private final Predicate<LivingEntity> isAngerInducing;

public CustomEndermanLookForPlayerGoal(EnderMan entityenderman, Predicate<LivingEntity> p) {
super(entityenderman, Player.class, 10, false, false, p);
this.enderman = entityenderman;
this.isAngerInducing = (entityliving) -> {
return (EndermanUtils.isLookingAtMe((Player)entityliving, this.enderman) || entityenderman.isAngryAt((LivingEntity) entityliving)) && !entityenderman.hasIndirectPassenger((Entity) entityliving);
};
this.startAggroTargetConditions = TargetingConditions.forCombat().range(this.getFollowDistance()).selector(this.isAngerInducing);
}

public boolean canUse() {
this.pendingTarget = this.enderman.level().getNearestPlayer(this.startAggroTargetConditions, this.enderman);
return this.pendingTarget != null;
}

public void start() {
this.aggroTime = this.adjustedTickDelay(5);
this.teleportTime = 0;
this.enderman.setBeingStaredAt();
}

public void stop() {
this.pendingTarget = null;
super.stop();
}

public boolean canContinueToUse() {
if (this.pendingTarget != null) {
if (!this.isAngerInducing.test(this.pendingTarget)) {
return false;
} else {
this.enderman.lookAt(this.pendingTarget, 10.0F, 10.0F);
return true;
}
} else {
if (this.target != null) {
if (this.enderman.hasIndirectPassenger(this.target)) {
return false;
}

if (this.continueAggroTargetConditions.test(this.enderman, this.target)) {
return true;
}
}

return super.canContinueToUse();
}
}

public void tick() {
if (this.enderman.getTarget() == null) {
super.setTarget((LivingEntity)null);
}

if (this.pendingTarget != null) {
if (--this.aggroTime <= 0) {
this.target = this.pendingTarget;
this.pendingTarget = null;
super.start();
}
} else {
if (this.target != null && !this.enderman.isPassenger()) {
if (EndermanUtils.isLookingAtMe((Player)this.target, this.enderman)) {
if (this.target.distanceToSqr(this.enderman) < 16.0) {
this.enderman.teleport();
}

this.teleportTime = 0;
} else if (this.target.distanceToSqr(this.enderman) > 256.0 && this.teleportTime++ >= this.adjustedTickDelay(30) && this.enderman.teleportTowards(this.target)) {
this.teleportTime = 0;
}
}

super.tick();
}

}

}


This file was deleted.

Loading

0 comments on commit e66e9b8

Please sign in to comment.