mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
progress
This commit is contained in:
@@ -2857,6 +2857,620 @@ index e8c36e8541f041a0d72a86f49ced2a3ce1549be0..1bf65519883585569a1acc780554505d
|
||||
}
|
||||
}
|
||||
// Paper end
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
|
||||
index 50228e59d629e75e97d23bd3ec92088f75480827..312543a866b99192401dc7e8662634de3ae4d41b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
|
||||
@@ -69,6 +69,18 @@ public class Drowned extends Zombie implements RangedAttackMob {
|
||||
this.groundNavigation = new GroundPathNavigation(this, world);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.drownedRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.drownedRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void addBehaviourGoals() {
|
||||
this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D));
|
||||
@@ -378,7 +390,7 @@ public class Drowned extends Zombie implements RangedAttackMob {
|
||||
}
|
||||
}
|
||||
|
||||
- static class DrownedMoveControl extends MoveControl {
|
||||
+ static class DrownedMoveControl extends net.pl3x.purpur.controller.MoveControllerWASD { // Purpur
|
||||
private final Drowned drowned;
|
||||
|
||||
public DrownedMoveControl(Drowned drowned) {
|
||||
@@ -387,7 +399,7 @@ public class Drowned extends Zombie implements RangedAttackMob {
|
||||
}
|
||||
|
||||
@Override
|
||||
- public void tick() {
|
||||
+ public void vanillaTick() { // Purpur
|
||||
LivingEntity livingEntity = this.drowned.getTarget();
|
||||
if (this.drowned.wantsToSwim() && this.drowned.isInWater()) {
|
||||
if (livingEntity != null && livingEntity.getY() > this.drowned.getY() || this.drowned.searchingForLand) {
|
||||
@@ -416,7 +428,7 @@ public class Drowned extends Zombie implements RangedAttackMob {
|
||||
this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0D, -0.008D, 0.0D));
|
||||
}
|
||||
|
||||
- super.tick();
|
||||
+ super.vanillaTick(); // Purpur
|
||||
}
|
||||
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
|
||||
index ee2febe92309f277f1607c0ea024d6cd291490bc..5f8233c1be6f92bcf58c5c5db360b2660c9439ad 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
|
||||
@@ -30,6 +30,18 @@ public class ElderGuardian extends Guardian {
|
||||
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.elderGuardianRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return true;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
||||
index a39f4a1585ba888d27588a86130f6dae24f5a71b..a9c247d9c1f1eddd8ef884c0c8d80dee3bb4bf68 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
|
||||
@@ -83,9 +83,22 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.endermanRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.endermanRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this));
|
||||
this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false));
|
||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D, 0.0F));
|
||||
@@ -93,6 +106,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
this.goalSelector.addGoal(8, new RandomLookAroundGoal(this));
|
||||
this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this));
|
||||
this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt));
|
||||
this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0]));
|
||||
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true, false));
|
||||
@@ -273,7 +287,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
|
||||
@Override
|
||||
protected void customServerAiStep() {
|
||||
- if (this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) {
|
||||
+ if (getRider() == null && this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) { // Purpur - no random teleporting
|
||||
float f = this.getBrightness();
|
||||
|
||||
if (f > 0.5F && this.level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper
|
||||
@@ -373,6 +387,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
public boolean hurt(DamageSource source, float amount) {
|
||||
if (this.isInvulnerableTo(source)) {
|
||||
return false;
|
||||
+ } else if (getRider() != null) { return super.hurt(source, amount); // Purpur - no teleporting on damage
|
||||
} else if (source instanceof IndirectEntityDamageSource) {
|
||||
if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java
|
||||
index 4aecf69a335c2c6b6457f3b15a1420400878b6e6..1f315cc57f6365a782ca4e645b0dcfbe5485138a 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java
|
||||
@@ -36,13 +36,27 @@ public class Endermite extends Monster {
|
||||
this.xpReward = 3;
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.endermiteRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.endermiteRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(1, new FloatGoal(this));
|
||||
+ this.goalSelector.addGoal(1, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false));
|
||||
this.goalSelector.addGoal(3, new WaterAvoidingRandomStrollGoal(this, 1.0D));
|
||||
this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F));
|
||||
this.goalSelector.addGoal(8, new RandomLookAroundGoal(this));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this)).setAlertOthers());
|
||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java
|
||||
index 4b812fc118126040d773f87ab50047cbbda79d1c..053374baf3ec7730bcddf072ddf98e3176656435 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java
|
||||
@@ -46,10 +46,23 @@ public class Evoker extends SpellcasterIllager {
|
||||
this.xpReward = 10;
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.evokerRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.evokerRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
super.registerGoals();
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal());
|
||||
this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6D, 1.0D));
|
||||
this.goalSelector.addGoal(4, new Evoker.EvokerSummonSpellGoal());
|
||||
@@ -58,6 +71,7 @@ public class Evoker extends SpellcasterIllager {
|
||||
this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D));
|
||||
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F));
|
||||
this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, Raider.class)).setAlertOthers());
|
||||
this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300));
|
||||
this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300));
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ghast.java b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
|
||||
index 886b6eac6c6ae4d97b1b25624504c0f48e20efc4..bb1a6f6847d0e459eb26a029d8a1f5646168a422 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
|
||||
@@ -44,11 +44,42 @@ public class Ghast extends FlyingMob implements Enemy {
|
||||
this.moveControl = new Ghast.GhastMoveControl(this);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.ghastRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.ghastRidableInWater;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double getMaxY() {
|
||||
+ return level.purpurConfig.ghastMaxY;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void travel(Vec3 vec3) {
|
||||
+ super.travel(vec3);
|
||||
+ if (getRider() != null && !onGround) {
|
||||
+ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED);
|
||||
+ setSpeed(speed);
|
||||
+ Vec3 mot = getDeltaMovement();
|
||||
+ move(net.minecraft.world.entity.MoverType.SELF, mot.multiply(speed, 1.0, speed));
|
||||
+ setDeltaMovement(mot.scale(0.9D));
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(5, new Ghast.RandomFloatAroundGoal(this));
|
||||
this.goalSelector.addGoal(7, new Ghast.GhastLookGoal(this));
|
||||
this.goalSelector.addGoal(7, new Ghast.GhastShootFireballGoal(this));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> {
|
||||
return Math.abs(entityliving.getY() - this.getY()) <= 4.0D;
|
||||
}));
|
||||
@@ -90,7 +121,7 @@ public class Ghast extends FlyingMob implements Enemy {
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
- return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.FOLLOW_RANGE, 100.0D);
|
||||
+ return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.FOLLOW_RANGE, 100.0D).add(Attributes.FLYING_SPEED, 0.6D); // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -147,7 +178,7 @@ public class Ghast extends FlyingMob implements Enemy {
|
||||
return 2.6F;
|
||||
}
|
||||
|
||||
- private static class GhastMoveControl extends MoveControl {
|
||||
+ private static class GhastMoveControl extends net.pl3x.purpur.controller.FlyingMoveControllerWASD { // Purpur
|
||||
|
||||
private final Ghast ghast;
|
||||
private int floatDuration;
|
||||
@@ -158,7 +189,7 @@ public class Ghast extends FlyingMob implements Enemy {
|
||||
}
|
||||
|
||||
@Override
|
||||
- public void tick() {
|
||||
+ public void vanillaTick() { // Purpur
|
||||
if (this.operation == MoveControl.Operation.MOVE_TO) {
|
||||
if (this.floatDuration-- <= 0) {
|
||||
this.floatDuration += this.ghast.getRandom().nextInt(5) + 2;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java
|
||||
index 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..d95b110a025d48e7ab18f172e455593740e45252 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Giant.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java
|
||||
@@ -14,6 +14,24 @@ public class Giant extends Monster {
|
||||
super(type, world);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.giantRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.giantRidableInWater;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ protected void registerGoals() {
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this));
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) {
|
||||
return 10.440001F;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Guardian.java b/src/main/java/net/minecraft/world/entity/monster/Guardian.java
|
||||
index 012e43aa6e2f6e4970257988620ab76d0f75f494..4aaad673f49988be6470b817d42f3fc4e6936400 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java
|
||||
@@ -63,14 +63,35 @@ public class Guardian extends Monster {
|
||||
this.xpReward = 10;
|
||||
this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F);
|
||||
this.moveControl = new Guardian.GuardianMoveControl(this);
|
||||
+ // Purpur start
|
||||
+ this.lookControl = new net.pl3x.purpur.controller.LookControllerWASD(this) {
|
||||
+ @Override
|
||||
+ public void setYawPitch(float yaw, float pitch) {
|
||||
+ super.setYawPitch(yaw, pitch * 0.35F);
|
||||
+ }
|
||||
+ };
|
||||
+ // Purpur end
|
||||
this.clientSideTailAnimation = this.random.nextFloat();
|
||||
this.clientSideTailAnimationO = this.clientSideTailAnimation;
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.guardianRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return true;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0D);
|
||||
this.randomStrollGoal = new RandomStrollGoal(this, 1.0D, 80);
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(4, new Guardian.GuardianAttackGoal(this));
|
||||
this.goalSelector.addGoal(5, moveTowardsRestrictionGoal);
|
||||
this.goalSelector.addGoal(7, this.randomStrollGoal);
|
||||
@@ -79,6 +100,7 @@ public class Guardian extends Monster {
|
||||
this.goalSelector.addGoal(9, new RandomLookAroundGoal(this));
|
||||
this.randomStrollGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK));
|
||||
moveTowardsRestrictionGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this)));
|
||||
}
|
||||
|
||||
@@ -328,7 +350,7 @@ public class Guardian extends Monster {
|
||||
@Override
|
||||
public void travel(Vec3 movementInput) {
|
||||
if (this.isEffectiveAi() && this.isInWater()) {
|
||||
- this.moveRelative(0.1F, movementInput);
|
||||
+ this.moveRelative(getRider() != null ? getSpeed() : 0.1F, movementInput); // Purpur
|
||||
this.move(MoverType.SELF, this.getDeltaMovement());
|
||||
this.setDeltaMovement(this.getDeltaMovement().scale(0.9D));
|
||||
if (!this.isMoving() && this.getTarget() == null) {
|
||||
@@ -424,7 +446,7 @@ public class Guardian extends Monster {
|
||||
}
|
||||
}
|
||||
|
||||
- static class GuardianMoveControl extends MoveControl {
|
||||
+ static class GuardianMoveControl extends net.pl3x.purpur.controller.WaterMoveControllerWASD { // Purpur
|
||||
private final Guardian guardian;
|
||||
|
||||
public GuardianMoveControl(Guardian guardian) {
|
||||
@@ -432,8 +454,17 @@ public class Guardian extends Monster {
|
||||
this.guardian = guardian;
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
@Override
|
||||
- public void tick() {
|
||||
+ public void purpurTick(Player rider) {
|
||||
+ super.purpurTick(rider);
|
||||
+ guardian.setDeltaMovement(guardian.getDeltaMovement().add(0.0D, 0.005D, 0.0D));
|
||||
+ guardian.setMoving(guardian.getForwardMot() > 0.0F); // control tail speed
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
+ @Override
|
||||
+ public void vanillaTick() { // Purpur
|
||||
if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) {
|
||||
Vec3 vec3 = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ());
|
||||
double d = vec3.length();
|
||||
@@ -443,7 +474,7 @@ public class Guardian extends Monster {
|
||||
float h = (float)(Mth.atan2(vec3.z, vec3.x) * (double)(180F / (float)Math.PI)) - 90.0F;
|
||||
this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), h, 90.0F));
|
||||
this.guardian.yBodyRot = this.guardian.getYRot();
|
||||
- float i = (float)(this.speedModifier * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED));
|
||||
+ float i = (float)(this.getSpeedModifier() * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur
|
||||
float j = Mth.lerp(0.125F, this.guardian.getSpeed(), i);
|
||||
this.guardian.setSpeed(j);
|
||||
double k = Math.sin((double)(this.guardian.tickCount + this.guardian.getId()) * 0.5D) * 0.05D;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
|
||||
index c9fa01b910de7ecb494d3000afebea9a2bd1276a..5f57c14a7ba03af9432a839e6caed47286638b2c 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
|
||||
@@ -59,10 +59,23 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
|
||||
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.illusionerRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.illusionerRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
super.registerGoals();
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal());
|
||||
this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal());
|
||||
this.goalSelector.addGoal(5, new Illusioner.IllusionerBlindnessSpellGoal());
|
||||
@@ -70,6 +83,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
|
||||
this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D));
|
||||
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F));
|
||||
this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F));
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers(new Class[0])); // CraftBukkit - decompile error
|
||||
this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300));
|
||||
this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300));
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java
|
||||
index 130205f0d101debaa74c1172fb80863e6fa0ebe1..7d39f25734f2c52b11931e141524acd2c244c2c5 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java
|
||||
@@ -27,6 +27,23 @@ public class MagmaCube extends Slime {
|
||||
super(type, world);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.magmaCubeRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.magmaCubeRidableInWater;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public float getJumpPower() {
|
||||
+ return 0.42F * this.getBlockJumpFactor(); // from EntityLiving
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F);
|
||||
}
|
||||
@@ -57,7 +74,7 @@ public class MagmaCube extends Slime {
|
||||
}
|
||||
|
||||
@Override
|
||||
- protected ResourceLocation getDefaultLootTable() {
|
||||
+ public ResourceLocation getDefaultLootTable() { // Purpur - decompile fix
|
||||
return this.isTiny() ? BuiltInLootTables.EMPTY : this.getType().getDefaultLootTable();
|
||||
}
|
||||
|
||||
@@ -77,10 +94,11 @@ public class MagmaCube extends Slime {
|
||||
}
|
||||
|
||||
@Override
|
||||
- protected void jumpFromGround() {
|
||||
+ public void jumpFromGround() { // Purpur - protected -> public
|
||||
Vec3 vec3 = this.getDeltaMovement();
|
||||
this.setDeltaMovement(vec3.x, (double)(this.getJumpPower() + (float)this.getSize() * 0.1F), vec3.z);
|
||||
this.hasImpulse = true;
|
||||
+ this.actualJump = false; // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
|
||||
index 1ffe939bb66358391d92d3e5378865b1cc8690fd..d35e1338c0c11b89e093f8748341ce6980071485 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
|
||||
@@ -61,6 +61,59 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
this.lookControl = new Phantom.PhantomLookControl(this);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.phantomRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.phantomRidableInWater;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double getMaxY() {
|
||||
+ return level.purpurConfig.phantomMaxY;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void travel(Vec3 vec3) {
|
||||
+ super.travel(vec3);
|
||||
+ if (getRider() != null && !onGround) {
|
||||
+ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED);
|
||||
+ setSpeed(speed);
|
||||
+ Vec3 mot = getDeltaMovement();
|
||||
+ move(net.minecraft.world.entity.MoverType.SELF, mot.multiply(speed, speed, speed));
|
||||
+ setDeltaMovement(mot.scale(0.9D));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public static net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder createAttributes() {
|
||||
+ return Monster.createMonsterAttributes().add(Attributes.FLYING_SPEED, 3.0D);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean onSpacebar() {
|
||||
+ if (getRider() != null && getRider().getBukkitEntity().hasPermission("allow.special.phantom")) {
|
||||
+ shoot();
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ public boolean shoot() {
|
||||
+ org.bukkit.Location loc = ((org.bukkit.entity.LivingEntity) getBukkitEntity()).getEyeLocation();
|
||||
+ loc.setPitch(-loc.getPitch());
|
||||
+ org.bukkit.util.Vector target = loc.getDirection().normalize().multiply(100).add(loc.toVector());
|
||||
+
|
||||
+ net.pl3x.purpur.entity.PhantomFlames flames = new net.pl3x.purpur.entity.PhantomFlames(level, this);
|
||||
+ flames.canGrief = level.purpurConfig.phantomAllowGriefing;
|
||||
+ flames.shoot(target.getX() - getX(), target.getY() - getY(), target.getZ() - getZ(), 1.0F, 5.0F);
|
||||
+ level.addFreshEntity(flames);
|
||||
+ return true;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
public boolean isFlapping() {
|
||||
return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0;
|
||||
@@ -73,9 +126,11 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
+ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.goalSelector.addGoal(1, new Phantom.PhantomAttackStrategyGoal());
|
||||
this.goalSelector.addGoal(2, new Phantom.PhantomSweepAttackGoal());
|
||||
this.goalSelector.addGoal(3, new Phantom.PhantomCircleAroundAnchorGoal());
|
||||
+ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur
|
||||
this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal());
|
||||
}
|
||||
|
||||
@@ -145,7 +200,7 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
|
||||
@Override
|
||||
public void aiStep() {
|
||||
- if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning
|
||||
+ if (this.isAlive() && getRider() == null && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning // Purpur
|
||||
this.setSecondsOnFire(8);
|
||||
}
|
||||
|
||||
@@ -263,7 +318,7 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
private AttackPhase() {}
|
||||
}
|
||||
|
||||
- private class PhantomMoveControl extends MoveControl {
|
||||
+ private class PhantomMoveControl extends net.pl3x.purpur.controller.FlyingMoveControllerWASD { // Purpur
|
||||
|
||||
private float speed = 0.1F;
|
||||
|
||||
@@ -271,8 +326,19 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
super(entity);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ public void purpurTick(Player rider) {
|
||||
+ if (!Phantom.this.onGround) {
|
||||
+ // phantom is always in motion when flying
|
||||
+ // TODO - FIX THIS
|
||||
+ // rider.setForward(1.0F);
|
||||
+ }
|
||||
+ super.purpurTick(rider);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
- public void tick() {
|
||||
+ public void vanillaTick() { // Purpur
|
||||
if (Phantom.this.horizontalCollision) {
|
||||
Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F);
|
||||
this.speed = 0.1F;
|
||||
@@ -318,14 +384,20 @@ public class Phantom extends FlyingMob implements Enemy {
|
||||
}
|
||||
}
|
||||
|
||||
- private class PhantomLookControl extends LookControl {
|
||||
+ private class PhantomLookControl extends net.pl3x.purpur.controller.LookControllerWASD { // Purpur
|
||||
|
||||
public PhantomLookControl(Mob entity) {
|
||||
super(entity);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ public void purpurTick(Player rider) {
|
||||
+ setYawPitch(rider.yRot, -rider.xRotO * 0.75F);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
- public void tick() {}
|
||||
+ public void vanillaTick() {} // Purpur
|
||||
}
|
||||
|
||||
private class PhantomBodyRotationControl extends BodyRotationControl {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java
|
||||
index fdc01dee8a81f0376f3c0a154c4291d03ead7f8f..058f4e8729736f9650bb6b08e7aed28f9f78a89b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
|
||||
@@ -2870,6 +3484,29 @@ index fdc01dee8a81f0376f3c0a154c4291d03ead7f8f..058f4e8729736f9650bb6b08e7aed28f
|
||||
Vec3 vec3d = this.getDeltaMovement();
|
||||
|
||||
this.setDeltaMovement(vec3d.x, (double) this.getJumpPower(), vec3d.z);
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
index 233b390541acddcf815db4a8f299496eaea4f758..b86d29a16f4c4ad0b166506fe31e64b902ecc06b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
@@ -58,6 +58,18 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
|
||||
this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isRidable() {
|
||||
+ return level.purpurConfig.zombifiedPiglinRidable;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean rideableUnderWater() {
|
||||
+ return level.purpurConfig.zombifiedPiglinRidableInWater;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
public void setPersistentAngerTarget(@Nullable UUID uuid) {
|
||||
this.persistentAngerTarget = uuid;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
|
||||
index d286d88a3c3f93dbfa92de9421e320c92cd96350..b4ebd8d3ad90e51ed953d091610eafe558a3184f 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
|
||||
|
||||
Reference in New Issue
Block a user