Skip to content

Commit e66e9b8

Browse files
committed
clean up endermans
1 parent e7aa1e3 commit e66e9b8

6 files changed

+149
-211
lines changed

src/org/vivecraft/Reflector.java

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ public class Reflector {
1919
public static Field aboveGroundTickCount = getPrivateField("J", ServerGamePacketListenerImpl.class);
2020
public static Field connection = getPrivateField("e", ServerCommonPacketListenerImpl.class);
2121

22+
public static int enderManFreezePriority = 1;
23+
public static int enderManLookTargetPriority = 1;
24+
25+
2226
public static Object getFieldValue(Field field, Object object) {
2327
try
2428
{

src/org/vivecraft/VSE.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@
4444
import org.spigotmc.SpigotConfig;
4545
import org.vivecraft.command.ConstructTabCompleter;
4646
import org.vivecraft.command.ViveCommand;
47-
import org.vivecraft.entities.CustomGoalStare;
47+
import org.vivecraft.entities.CustomEndermanFreezeWhenLookedAt;
48+
import org.vivecraft.entities.CustomEndermanLookForPlayerGoal;
4849
import org.vivecraft.entities.CustomGoalSwell;
49-
import org.vivecraft.entities.CustomPathFinderGoalPlayerWhoLookedAtTarget;
5050
import org.vivecraft.listeners.VivecraftCombatListener;
5151
import org.vivecraft.listeners.VivecraftItemListener;
5252
import org.vivecraft.listeners.VivecraftNetworkListener;
@@ -241,21 +241,21 @@ else if(entity.getType() == EntityType.ENDERMAN){
241241
EnderMan e = ((CraftEnderman) entity).getHandle();
242242
AbstractCollection<WrappedGoal> targets = (AbstractCollection<WrappedGoal>) Reflector.getFieldValue(Reflector.availableGoals, ((Mob)e).targetSelector);
243243
for(WrappedGoal b: targets){
244-
if(b.getPriority() == 1){ //replace PlayerWhoLookedAt target. Class is private cant use instanceof, check priority on all new versions.
244+
if(b.getPriority() == Reflector.enderManLookTargetPriority){ //replace PlayerWhoLookedAt target. Class is private cant use instanceof, check priority on all new versions.
245245
targets.remove(b);
246246
break;
247247
}
248248
}
249-
e.targetSelector.addGoal(1, new CustomPathFinderGoalPlayerWhoLookedAtTarget(e, e::isAngryAt));
249+
e.targetSelector.addGoal(Reflector.enderManLookTargetPriority, new CustomEndermanLookForPlayerGoal(e, e::isAngryAt));
250250

251251
AbstractCollection<WrappedGoal> goals = (AbstractCollection<WrappedGoal>) Reflector.getFieldValue(Reflector.availableGoals, ((Mob)e).goalSelector);
252252
for(WrappedGoal b: goals){
253-
if(b.getPriority()==1){//replace EndermanFreezeWhenLookedAt goal. Verify priority on new version.
253+
if(b.getPriority()==Reflector.enderManFreezePriority){//replace EndermanFreezeWhenLookedAt goal. Verify priority on new version.
254254
goals.remove(b);
255255
break;
256256
}
257257
}
258-
e.goalSelector.addGoal(1, new CustomGoalStare(e));
258+
e.goalSelector.addGoal(Reflector.enderManFreezePriority, new CustomEndermanFreezeWhenLookedAt(e));
259259
}
260260
}
261261

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.vivecraft.entities;
2+
3+
import java.util.EnumSet;
4+
5+
import net.minecraft.world.entity.LivingEntity;
6+
import net.minecraft.world.entity.ai.goal.Goal;
7+
import net.minecraft.world.entity.monster.EnderMan;
8+
import net.minecraft.world.entity.player.Player;
9+
10+
public class CustomEndermanFreezeWhenLookedAt extends Goal {
11+
private final EnderMan enderman;
12+
private LivingEntity target;
13+
14+
public CustomEndermanFreezeWhenLookedAt(EnderMan entityenderman) {
15+
this.enderman = entityenderman;
16+
this.setFlags(EnumSet.of(Flag.JUMP, Flag.MOVE));
17+
}
18+
19+
public boolean canUse() {
20+
this.target = this.enderman.getTarget();
21+
if (!(this.target instanceof Player)) {
22+
return false;
23+
} else {
24+
double d0 = this.target.distanceToSqr(this.enderman);
25+
return d0 > 256.0 ? false : EndermanUtils.isLookingAtMe((Player)this.target, this.enderman);
26+
}
27+
}
28+
29+
public void start() {
30+
this.enderman.getNavigation().stop();
31+
}
32+
33+
public void tick() {
34+
this.enderman.getLookControl().setLookAt(this.target.getX(), this.target.getEyeY(), this.target.getZ());
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package org.vivecraft.entities;
2+
3+
import java.util.function.Predicate;
4+
5+
import net.minecraft.world.entity.Entity;
6+
import net.minecraft.world.entity.LivingEntity;
7+
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;
8+
import net.minecraft.world.entity.ai.targeting.TargetingConditions;
9+
import net.minecraft.world.entity.monster.EnderMan;
10+
import net.minecraft.world.entity.player.Player;
11+
12+
public class CustomEndermanLookForPlayerGoal extends NearestAttackableTargetGoal<Player> {
13+
private final EnderMan enderman;
14+
private Player pendingTarget;
15+
private int aggroTime;
16+
private int teleportTime;
17+
private final TargetingConditions startAggroTargetConditions;
18+
private final TargetingConditions continueAggroTargetConditions = TargetingConditions.forCombat().ignoreLineOfSight();
19+
private final Predicate<LivingEntity> isAngerInducing;
20+
21+
public CustomEndermanLookForPlayerGoal(EnderMan entityenderman, Predicate<LivingEntity> p) {
22+
super(entityenderman, Player.class, 10, false, false, p);
23+
this.enderman = entityenderman;
24+
this.isAngerInducing = (entityliving) -> {
25+
return (EndermanUtils.isLookingAtMe((Player)entityliving, this.enderman) || entityenderman.isAngryAt((LivingEntity) entityliving)) && !entityenderman.hasIndirectPassenger((Entity) entityliving);
26+
};
27+
this.startAggroTargetConditions = TargetingConditions.forCombat().range(this.getFollowDistance()).selector(this.isAngerInducing);
28+
}
29+
30+
public boolean canUse() {
31+
this.pendingTarget = this.enderman.level().getNearestPlayer(this.startAggroTargetConditions, this.enderman);
32+
return this.pendingTarget != null;
33+
}
34+
35+
public void start() {
36+
this.aggroTime = this.adjustedTickDelay(5);
37+
this.teleportTime = 0;
38+
this.enderman.setBeingStaredAt();
39+
}
40+
41+
public void stop() {
42+
this.pendingTarget = null;
43+
super.stop();
44+
}
45+
46+
public boolean canContinueToUse() {
47+
if (this.pendingTarget != null) {
48+
if (!this.isAngerInducing.test(this.pendingTarget)) {
49+
return false;
50+
} else {
51+
this.enderman.lookAt(this.pendingTarget, 10.0F, 10.0F);
52+
return true;
53+
}
54+
} else {
55+
if (this.target != null) {
56+
if (this.enderman.hasIndirectPassenger(this.target)) {
57+
return false;
58+
}
59+
60+
if (this.continueAggroTargetConditions.test(this.enderman, this.target)) {
61+
return true;
62+
}
63+
}
64+
65+
return super.canContinueToUse();
66+
}
67+
}
68+
69+
public void tick() {
70+
if (this.enderman.getTarget() == null) {
71+
super.setTarget((LivingEntity)null);
72+
}
73+
74+
if (this.pendingTarget != null) {
75+
if (--this.aggroTime <= 0) {
76+
this.target = this.pendingTarget;
77+
this.pendingTarget = null;
78+
super.start();
79+
}
80+
} else {
81+
if (this.target != null && !this.enderman.isPassenger()) {
82+
if (EndermanUtils.isLookingAtMe((Player)this.target, this.enderman)) {
83+
if (this.target.distanceToSqr(this.enderman) < 16.0) {
84+
this.enderman.teleport();
85+
}
86+
87+
this.teleportTime = 0;
88+
} else if (this.target.distanceToSqr(this.enderman) > 256.0 && this.teleportTime++ >= this.adjustedTickDelay(30) && this.enderman.teleportTowards(this.target)) {
89+
this.teleportTime = 0;
90+
}
91+
}
92+
93+
super.tick();
94+
}
95+
96+
}
97+
98+
}
99+
100+

src/org/vivecraft/entities/CustomPathFinderGoalPlayerWhoLookedAtTarget.java

-163
This file was deleted.

0 commit comments

Comments
 (0)