Files
Purpur/patches/server/0011-Integrate-ridables.patch
2019-06-15 05:00:57 -05:00

3102 lines
137 KiB
Diff

From 3d00bada2fc60e58a12a65c4bf1295555e45d050 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Tue, 30 Apr 2019 19:17:21 -0500
Subject: [PATCH] Integrate ridables
---
.../server/ControllerLookDolphin.java | 4 +-
.../java/net/minecraft/server/Entity.java | 25 +++-
.../net/minecraft/server/EntityAgeable.java | 2 +-
.../java/net/minecraft/server/EntityBat.java | 25 ++++
.../net/minecraft/server/EntityBlaze.java | 3 +-
.../java/net/minecraft/server/EntityCat.java | 34 +++--
.../minecraft/server/EntityCaveSpider.java | 1 +
.../net/minecraft/server/EntityChicken.java | 3 +-
.../java/net/minecraft/server/EntityCod.java | 1 +
.../java/net/minecraft/server/EntityCow.java | 1 +
.../net/minecraft/server/EntityCreeper.java | 50 +++++++
.../net/minecraft/server/EntityDolphin.java | 18 ++-
.../net/minecraft/server/EntityDrowned.java | 7 +-
.../minecraft/server/EntityEnderDragon.java | 1 +
.../net/minecraft/server/EntityEnderman.java | 1 +
.../net/minecraft/server/EntityEndermite.java | 3 +-
.../net/minecraft/server/EntityEvoker.java | 3 +-
.../java/net/minecraft/server/EntityFish.java | 20 +--
.../java/net/minecraft/server/EntityFox.java | 57 ++++++--
.../net/minecraft/server/EntityGhast.java | 1 +
.../minecraft/server/EntityGiantZombie.java | 2 +
.../net/minecraft/server/EntityGuardian.java | 27 +++-
.../minecraft/server/EntityGuardianElder.java | 1 +
.../net/minecraft/server/EntityHorse.java | 3 +-
.../minecraft/server/EntityHorseAbstract.java | 4 +-
.../server/EntityHorseChestedAbstract.java | 10 +-
.../minecraft/server/EntityHorseDonkey.java | 1 +
.../net/minecraft/server/EntityHorseMule.java | 1 +
.../minecraft/server/EntityHorseSkeleton.java | 7 +-
.../minecraft/server/EntityHorseZombie.java | 7 +-
.../net/minecraft/server/EntityHuman.java | 14 +-
.../server/EntityIllagerIllusioner.java | 1 +
.../minecraft/server/EntityInsentient.java | 51 ++++++-
.../net/minecraft/server/EntityIronGolem.java | 1 +
.../net/minecraft/server/EntityLiving.java | 25 +++-
.../net/minecraft/server/EntityLlama.java | 37 ++++-
.../minecraft/server/EntityLlamaTrader.java | 1 +
.../net/minecraft/server/EntityMagmaCube.java | 3 +-
.../minecraft/server/EntityMushroomCow.java | 1 +
.../net/minecraft/server/EntityOcelot.java | 1 +
.../net/minecraft/server/EntityPanda.java | 1 +
.../net/minecraft/server/EntityParrot.java | 3 +-
.../net/minecraft/server/EntityPhantom.java | 32 ++++-
.../java/net/minecraft/server/EntityPig.java | 34 ++---
.../net/minecraft/server/EntityPigZombie.java | 1 +
.../net/minecraft/server/EntityPillager.java | 1 +
.../net/minecraft/server/EntityPolarBear.java | 29 ++++
.../minecraft/server/EntityPufferFish.java | 1 +
.../net/minecraft/server/EntityRabbit.java | 3 +-
.../net/minecraft/server/EntityRavager.java | 1 +
.../net/minecraft/server/EntitySalmon.java | 1 +
.../net/minecraft/server/EntitySheep.java | 7 +-
.../net/minecraft/server/EntityShulker.java | 1 +
.../minecraft/server/EntitySilverfish.java | 1 +
.../net/minecraft/server/EntitySkeleton.java | 1 +
.../minecraft/server/EntitySkeletonStray.java | 1 +
.../server/EntitySkeletonWither.java | 1 +
.../net/minecraft/server/EntitySlime.java | 3 +-
.../net/minecraft/server/EntitySnowman.java | 2 +
.../net/minecraft/server/EntitySpider.java | 1 +
.../net/minecraft/server/EntitySquid.java | 47 ++++++
.../server/EntityTameableAnimal.java | 6 +
.../minecraft/server/EntityTropicalFish.java | 1 +
.../net/minecraft/server/EntityTurtle.java | 1 +
.../net/minecraft/server/EntityTypes.java | 4 +
.../java/net/minecraft/server/EntityVex.java | 1 +
.../net/minecraft/server/EntityVillager.java | 1 +
.../server/EntityVillagerTrader.java | 1 +
.../minecraft/server/EntityVindicator.java | 1 +
.../net/minecraft/server/EntityWitch.java | 1 +
.../net/minecraft/server/EntityWither.java | 1 +
.../java/net/minecraft/server/EntityWolf.java | 1 +
.../net/minecraft/server/EntityZombie.java | 1 +
.../minecraft/server/EntityZombieHusk.java | 1 +
.../server/EntityZombieVillager.java | 1 +
.../server/PathfinderGoalAvoidTarget.java | 9 +-
.../minecraft/server/PathfinderGoalBreed.java | 4 +-
.../server/PathfinderGoalCatSitOnBed.java | 1 +
.../server/PathfinderGoalFollowOwner.java | 2 +
.../server/PathfinderGoalGotoTarget.java | 2 +
.../server/PathfinderGoalHurtByTarget.java | 1 +
.../server/PathfinderGoalJumpOnBlock.java | 1 +
.../server/PathfinderGoalLeapAtTarget.java | 2 +
.../server/PathfinderGoalLookAtPlayer.java | 2 +
.../server/PathfinderGoalMeleeAttack.java | 2 +
...PathfinderGoalNearestAttackableTarget.java | 1 +
.../server/PathfinderGoalOcelotAttack.java | 2 +
.../PathfinderGoalRandomLookaround.java | 2 +
.../server/PathfinderGoalRandomStroll.java | 2 +
.../PathfinderGoalRandomTargetNonTamed.java | 2 +
.../minecraft/server/PathfinderGoalSit.java | 2 +
.../server/PathfinderGoalTarget.java | 1 +
.../java/net/pl3x/purpur/PurpurConfig.java | 136 ++++++++++++++++++
.../purpur/controller/ControllerLookWASD.java | 74 ++++++++++
.../purpur/controller/ControllerMoveWASD.java | 77 ++++++++++
.../controller/ControllerMoveWASDFlying.java | 62 ++++++++
.../ControllerMoveWASDFlyingWithSpacebar.java | 65 +++++++++
.../controller/ControllerMoveWASDWater.java | 42 ++++++
.../craftbukkit/entity/CraftLivingEntity.java | 10 ++
.../bukkit/craftbukkit/entity/CraftMob.java | 12 ++
100 files changed, 1061 insertions(+), 107 deletions(-)
create mode 100644 src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
create mode 100644 src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
create mode 100644 src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java
create mode 100644 src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java
create mode 100644 src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java
diff --git a/src/main/java/net/minecraft/server/ControllerLookDolphin.java b/src/main/java/net/minecraft/server/ControllerLookDolphin.java
index 454627f65..df3d6cf28 100644
--- a/src/main/java/net/minecraft/server/ControllerLookDolphin.java
+++ b/src/main/java/net/minecraft/server/ControllerLookDolphin.java
@@ -1,6 +1,6 @@
package net.minecraft.server;
-public class ControllerLookDolphin extends ControllerLook {
+public class ControllerLookDolphin extends net.pl3x.purpur.controller.ControllerLookWASD { // Purpur
private final int h;
@@ -10,7 +10,7 @@ public class ControllerLookDolphin extends ControllerLook {
}
@Override
- public void a() {
+ public void tick() { // Purpur
if (this.d) {
this.d = false;
this.a.aM = this.a(this.a.aM, this.h() + 20.0F, this.b);
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 352b6dfb3..0a34957d8 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -78,6 +78,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
private CraftEntity bukkitEntity;
PlayerChunkMap.EntityTracker tracker; // Paper
+ public PlayerChunkMap.EntityTracker getTracker() { return tracker; } // Purpur
Throwable addedToWorldStack; // Paper - entity debug
public CraftEntity getBukkitEntity() {
if (bukkitEntity == null) {
@@ -101,6 +102,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
private int id;
public boolean i; public final boolean blocksEntitySpawning() { return this.i; } // Paper - OBFHELPER
public final List<Entity> passengers;
+ private EntityHuman rider; public EntityHuman getRider() { return rider; } // Purpur
protected int j;
private Entity vehicle;
public boolean attachedToPlayer;
@@ -134,7 +136,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
public double H;
public double I;
public double J;
- public float K;
+ public float K; public float getStepHeight() { return K; } public void setStepHeight(float stepHeight) { this.K = stepHeight; } // Purpur - OBFHELPER
public boolean noclip;
public float M;
protected final Random random;
@@ -2072,6 +2074,8 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
// Spigot end
if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.getRidingPassenger() instanceof EntityHuman)) {
this.passengers.add(0, entity);
+ this.rider = (EntityHuman) entity; // Purpur
+ onMount(rider);
} else {
this.passengers.add(entity);
}
@@ -2110,6 +2114,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
return false;
}
// Spigot end
+ // Purpur start
+ if (passengers.get(0) == rider) {
+ onDismount(rider);
+ rider = null;
+ }
+ // Purpur end
this.passengers.remove(entity);
entity.j = 60;
}
@@ -3221,4 +3231,17 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
public void setMot(double d0, double d1, double d2) {
this.setMot(new Vec3D(d0, d1, d2));
}
+
+ // Purpur start
+ public void onMount(EntityHuman entityhuman) {
+ entityhuman.setJumping(false); // fixes jump on mount
+ }
+
+ public void onDismount(EntityHuman entityhuman) {
+ }
+
+ public boolean onSpacebar() {
+ return false;
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityAgeable.java b/src/main/java/net/minecraft/server/EntityAgeable.java
index e87754ef3..553245ebe 100644
--- a/src/main/java/net/minecraft/server/EntityAgeable.java
+++ b/src/main/java/net/minecraft/server/EntityAgeable.java
@@ -70,7 +70,7 @@ public abstract class EntityAgeable extends EntityCreature {
return true;
} else {
- return false;
+ return super.a(entityhuman, enumhand); // Purpur
}
}
diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java
index 4c283c33b..5344a6cf2 100644
--- a/src/main/java/net/minecraft/server/EntityBat.java
+++ b/src/main/java/net/minecraft/server/EntityBat.java
@@ -3,6 +3,7 @@ package net.minecraft.server;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import javax.annotation.Nullable;
+
import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
public class EntityBat extends EntityAmbient {
@@ -13,6 +14,10 @@ public class EntityBat extends EntityAmbient {
public EntityBat(EntityTypes<? extends EntityBat> entitytypes, World world) {
super(entitytypes, world);
+ // Purpur start
+ this.moveController = new net.pl3x.purpur.controller.ControllerMoveWASDFlyingWithSpacebar(this, 0.075F);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableBat;
+ // Purpur end
this.setAsleep(true);
}
@@ -94,6 +99,13 @@ public class EntityBat extends EntityAmbient {
@Override
protected void mobTick() {
+ // Purpur start
+ if (getRider() != null) {
+ Vec3D mot = getMot();
+ setMot(mot.x, mot.y + (getVertical() > 0 ? 0.07D : 0.0D), mot.z);
+ return;
+ }
+ // Purpur end
super.mobTick();
BlockPosition blockposition = new BlockPosition(this);
BlockPosition blockposition1 = blockposition.up();
@@ -229,4 +241,17 @@ public class EntityBat extends EntityAmbient {
protected float b(EntityPose entitypose, EntitySize entitysize) {
return entitysize.height / 2.0F;
}
+
+ // Purpur start
+ @Override
+ protected boolean a(EntityHuman entityhuman, EnumHand enumhand) {
+ if (isAsleep()) {
+ if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) {
+ setAsleep(false);
+ world.a(null, 1025, new BlockPosition(this).up(), 0);
+ }
+ }
+ return !isAsleep() && super.a(entityhuman, enumhand);
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java
index 15db67de0..2e418ee14 100644
--- a/src/main/java/net/minecraft/server/EntityBlaze.java
+++ b/src/main/java/net/minecraft/server/EntityBlaze.java
@@ -10,6 +10,7 @@ public class EntityBlaze extends EntityMonster {
public EntityBlaze(EntityTypes<? extends EntityBlaze> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableBlaze; // Purpur
this.a(PathType.WATER, -1.0F);
this.a(PathType.LAVA, 8.0F);
this.a(PathType.DANGER_FIRE, 0.0F);
@@ -24,7 +25,7 @@ public class EntityBlaze extends EntityMonster {
this.goalSelector.a(7, new PathfinderGoalRandomStrollLand(this, 1.0D, 0.0F));
this.goalSelector.a(8, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F));
this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this)).a(new Class[0])); // Purpur - decompile error
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
}
diff --git a/src/main/java/net/minecraft/server/EntityCat.java b/src/main/java/net/minecraft/server/EntityCat.java
index 719983077..4fa638b05 100644
--- a/src/main/java/net/minecraft/server/EntityCat.java
+++ b/src/main/java/net/minecraft/server/EntityCat.java
@@ -16,7 +16,7 @@ public class EntityCat extends EntityTameableAnimal {
private static final DataWatcherObject<Boolean> bG = DataWatcher.a(EntityCat.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Boolean> bH = DataWatcher.a(EntityCat.class, DataWatcherRegistry.i);
private static final DataWatcherObject<Integer> bI = DataWatcher.a(EntityCat.class, DataWatcherRegistry.b);
- public static final Map<Integer, MinecraftKey> bD = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
+ public static final Map<Integer, MinecraftKey> bD = SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error // Purpur - _really_ fix decompile error
hashmap.put(0, new MinecraftKey("textures/entity/cat/tabby.png"));
hashmap.put(1, new MinecraftKey("textures/entity/cat/black.png"));
hashmap.put(2, new MinecraftKey("textures/entity/cat/red.png"));
@@ -40,6 +40,7 @@ public class EntityCat extends EntityTameableAnimal {
public EntityCat(EntityTypes<? extends EntityCat> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableCat; // Purpur
}
public MinecraftKey ee() {
@@ -196,7 +197,7 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean C(Entity entity) {
- return entity.damageEntity(DamageSource.mobAttack(this), 3.0F);
+ return getRider() == null && entity.damageEntity(DamageSource.mobAttack(this), 3.0F); // Purpur
}
@Override
@@ -268,7 +269,7 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean mate(EntityAnimal entityanimal) {
- if (!this.isTamed()) {
+ if (getRider() != null || !this.isTamed()) { // Purpur
return false;
} else if (!(entityanimal instanceof EntityCat)) {
return false;
@@ -299,6 +300,7 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean a(EntityHuman entityhuman, EnumHand enumhand) {
+ if (getRider() != null) return false; // Purpur
ItemStack itemstack = entityhuman.b(enumhand);
Item item = itemstack.getItem();
@@ -322,7 +324,7 @@ public class EntityCat extends EntityTameableAnimal {
this.heal((float) item.getFoodInfo().getNutrition());
return true;
}
- } else if (!this.world.isClientSide) {
+ } else if (!entityhuman.isSneaking()) { // Purpur
this.goalSit.setSitting(!this.isSitting());
}
}
@@ -347,6 +349,13 @@ public class EntityCat extends EntityTameableAnimal {
boolean flag = super.a(entityhuman, enumhand);
if (flag) {
+ // Purpur start
+ if (getRider() != null) {
+ setSitting(false);
+ u(false); // setSleepingWithOwner
+ v(false); // setHeadDown
+ }
+ // Purpur end
this.setPersistent();
}
@@ -394,7 +403,7 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean a() {
- if (!this.a.isTamed()) {
+ if (this.a.getRider() != null || !this.a.isTamed()) { // Purpur
return false;
} else if (this.a.isSitting()) {
return false;
@@ -447,7 +456,7 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean b() {
- return this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g();
+ return this.a.getRider() == null && this.a.isTamed() && !this.a.isSitting() && this.b != null && this.b.isSleeping() && this.c != null && !this.g(); // Purpur
}
@Override
@@ -544,8 +553,15 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean a() {
- return super.a() && !this.d.isTamed();
+ return this.d.getRider() == null && super.a() && !this.d.isTamed(); // Purpur
+ }
+
+ // Purpur start
+ @Override
+ public boolean b() {
+ return this.d.getRider() == null && super.b();
}
+ // Purpur end
}
static class a<T extends EntityLiving> extends PathfinderGoalAvoidTarget<T> {
@@ -561,12 +577,12 @@ public class EntityCat extends EntityTameableAnimal {
@Override
public boolean a() {
- return !this.i.isTamed() && super.a();
+ return this.i.getRider() == null && !this.i.isTamed() && super.a(); // Purpur
}
@Override
public boolean b() {
- return !this.i.isTamed() && super.b();
+ return this.i.getRider() == null && !this.i.isTamed() && super.b(); // Purpur
}
}
}
diff --git a/src/main/java/net/minecraft/server/EntityCaveSpider.java b/src/main/java/net/minecraft/server/EntityCaveSpider.java
index 89c9306df..e9ec28362 100644
--- a/src/main/java/net/minecraft/server/EntityCaveSpider.java
+++ b/src/main/java/net/minecraft/server/EntityCaveSpider.java
@@ -6,6 +6,7 @@ public class EntityCaveSpider extends EntitySpider {
public EntityCaveSpider(EntityTypes<? extends EntityCaveSpider> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableCaveSpider; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java
index a374c3051..2ea87eee5 100644
--- a/src/main/java/net/minecraft/server/EntityChicken.java
+++ b/src/main/java/net/minecraft/server/EntityChicken.java
@@ -13,6 +13,7 @@ public class EntityChicken extends EntityAnimal {
public EntityChicken(EntityTypes<? extends EntityChicken> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableChicken; // Purpur
this.eggLayTime = this.random.nextInt(6000) + 6000;
this.a(PathType.WATER, 0.0F);
}
@@ -65,7 +66,7 @@ public class EntityChicken extends EntityAnimal {
}
this.bz += this.bE * 2.0F;
- if (!this.world.isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggLayTime <= 0) {
+ if (!this.world.isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggLayTime <= 0 && getRider() == null) { // Purpur
this.a(SoundEffects.ENTITY_CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
this.forceDrops = true; // CraftBukkit
this.a((IMaterial) Items.EGG);
diff --git a/src/main/java/net/minecraft/server/EntityCod.java b/src/main/java/net/minecraft/server/EntityCod.java
index 1e3782122..c0b066d18 100644
--- a/src/main/java/net/minecraft/server/EntityCod.java
+++ b/src/main/java/net/minecraft/server/EntityCod.java
@@ -4,6 +4,7 @@ public class EntityCod extends EntityFishSchool {
public EntityCod(EntityTypes<? extends EntityCod> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableCod; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java
index f053ff0e5..16a35418f 100644
--- a/src/main/java/net/minecraft/server/EntityCow.java
+++ b/src/main/java/net/minecraft/server/EntityCow.java
@@ -14,6 +14,7 @@ public class EntityCow extends EntityAnimal {
public EntityCow(EntityTypes<? extends EntityCow> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableCow; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java
index 0c2c3c730..f4b6f6846 100644
--- a/src/main/java/net/minecraft/server/EntityCreeper.java
+++ b/src/main/java/net/minecraft/server/EntityCreeper.java
@@ -20,6 +20,7 @@ public class EntityCreeper extends EntityMonster {
public EntityCreeper(EntityTypes<? extends EntityCreeper> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableCreeper; // Purpur
}
@Override
@@ -275,4 +276,53 @@ public class EntityCreeper extends EntityMonster {
public void setCausedHeadDrop() {
++this.bD;
}
+
+ // Purpur start
+ @Override
+ protected void mobTick() {
+ if (powerToggleDelay > 0) {
+ powerToggleDelay--;
+ }
+ if (getRider() != null) {
+ if (getRider().getForward() != 0 || getRider().getStrafe() != 0) {
+ spacebarCharge = 0;
+ setIgnited(false);
+ }
+ if (spacebarCharge == prevSpacebarCharge) {
+ spacebarCharge = 0;
+ }
+ prevSpacebarCharge = spacebarCharge;
+ }
+ super.mobTick();
+ }
+
+ private int spacebarCharge = 0;
+ private int prevSpacebarCharge = 0;
+ private int powerToggleDelay = 0;
+
+ @Override
+ public boolean onSpacebar() {
+ if (powerToggleDelay > 0) {
+ return true; // just toggled power, do not jump
+ }
+ spacebarCharge++;
+ if (spacebarCharge > maxFuseTicks - 2) {
+ spacebarCharge = 0;
+ if (getRider().getBukkitEntity().hasPermission("allow.powered.creeper")) {
+ powerToggleDelay = 20;
+ setPowered(!isPowered());
+ setIgnited(false);
+ return true;
+ }
+ }
+ if (!isIgnited()) {
+ if (getRider() != null && getRider().getForward() == 0 && getRider().getStrafe() == 0 &&
+ getRider().getBukkitEntity().hasPermission("allow.special.creeper")) {
+ setIgnited(true);
+ return true;
+ }
+ }
+ return getForward() == 0 && getStrafe() == 0; // do not jump if standing still
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityDolphin.java b/src/main/java/net/minecraft/server/EntityDolphin.java
index 04060bb3e..d13d3309c 100644
--- a/src/main/java/net/minecraft/server/EntityDolphin.java
+++ b/src/main/java/net/minecraft/server/EntityDolphin.java
@@ -17,6 +17,7 @@ public class EntityDolphin extends EntityWaterAnimal {
public EntityDolphin(EntityTypes<? extends EntityDolphin> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableDolphin; // Purpur
this.moveController = new EntityDolphin.a(this);
this.lookController = new ControllerLookDolphin(this, 10);
this.setCanPickupLoot(true);
@@ -524,7 +525,7 @@ public class EntityDolphin extends EntityWaterAnimal {
}
}
- static class a extends ControllerMove {
+ static class a extends net.pl3x.purpur.controller.ControllerMoveWASDWater { // Purpur
private final EntityDolphin i;
@@ -533,8 +534,21 @@ public class EntityDolphin extends EntityWaterAnimal {
this.i = entitydolphin;
}
+ // Purpur start
@Override
- public void a() {
+ public void tick(EntityHuman rider) {
+ if (this.i.getAirTicks() < 150) {
+ // if drowning override player WASD controls to find air
+ tick();
+ } else {
+ super.tick(rider);
+ this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
+ }
+ }
+
+ @Override
+ public void tick() {
+ // Purpur end
if (this.i.isInWater()) {
this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
}
diff --git a/src/main/java/net/minecraft/server/EntityDrowned.java b/src/main/java/net/minecraft/server/EntityDrowned.java
index 7f34cdbc3..542d828a9 100644
--- a/src/main/java/net/minecraft/server/EntityDrowned.java
+++ b/src/main/java/net/minecraft/server/EntityDrowned.java
@@ -12,6 +12,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
public EntityDrowned(EntityTypes<? extends EntityDrowned> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableDrowned; // Purpur
this.K = 1.0F;
this.moveController = new EntityDrowned.d(this);
this.a(PathType.WATER, 0.0F);
@@ -205,7 +206,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
this.bz = flag;
}
- static class d extends ControllerMove {
+ static class d extends net.pl3x.purpur.controller.ControllerMoveWASD { // Purpur
private final EntityDrowned i;
@@ -215,7 +216,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
}
@Override
- public void a() {
+ public void tick() { // Purpur
EntityLiving entityliving = this.i.getGoalTarget();
if (this.i.eg() && this.i.isInWater()) {
@@ -248,7 +249,7 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
this.i.setMot(this.i.getMot().add(0.0D, -0.008D, 0.0D));
}
- super.a();
+ super.tick(); // Purpur
}
}
diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java
index 29fa1d1df..484a4bc45 100644
--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java
@@ -46,6 +46,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
public EntityEnderDragon(EntityTypes<? extends EntityEnderDragon> entitytypes, World world) {
super(EntityTypes.ENDER_DRAGON, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableEnderDragon; // Purpur
this.children = new EntityComplexPart[]{this.bA, this.bB, this.bC, this.bD, this.bE, this.bF, this.bG, this.bH};
this.setHealth(this.getMaxHealth());
this.noclip = true;
diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java
index d4c4dc2fd..8c35b93d6 100644
--- a/src/main/java/net/minecraft/server/EntityEnderman.java
+++ b/src/main/java/net/minecraft/server/EntityEnderman.java
@@ -22,6 +22,7 @@ public class EntityEnderman extends EntityMonster {
public EntityEnderman(EntityTypes<? extends EntityEnderman> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableEnderman; // Purpur
this.K = 1.0F;
this.a(PathType.WATER, -1.0F);
}
diff --git a/src/main/java/net/minecraft/server/EntityEndermite.java b/src/main/java/net/minecraft/server/EntityEndermite.java
index 10b0f9653..b191539d7 100644
--- a/src/main/java/net/minecraft/server/EntityEndermite.java
+++ b/src/main/java/net/minecraft/server/EntityEndermite.java
@@ -8,6 +8,7 @@ public class EntityEndermite extends EntityMonster {
public EntityEndermite(EntityTypes<? extends EntityEndermite> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableEndermite; // Purpur
this.f = 3;
}
@@ -18,7 +19,7 @@ public class EntityEndermite extends EntityMonster {
this.goalSelector.a(3, new PathfinderGoalRandomStrollLand(this, 1.0D));
this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F));
this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(new Class[0])); // Purpur - decompile error?
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
}
diff --git a/src/main/java/net/minecraft/server/EntityEvoker.java b/src/main/java/net/minecraft/server/EntityEvoker.java
index 026847dff..bd143396a 100644
--- a/src/main/java/net/minecraft/server/EntityEvoker.java
+++ b/src/main/java/net/minecraft/server/EntityEvoker.java
@@ -9,6 +9,7 @@ public class EntityEvoker extends EntityIllagerWizard {
public EntityEvoker(EntityTypes<? extends EntityEvoker> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableEvoker; // Purpur
this.f = 10;
}
@@ -24,7 +25,7 @@ public class EntityEvoker extends EntityIllagerWizard {
this.goalSelector.a(8, new PathfinderGoalRandomStroll(this, 0.6D));
this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 3.0F, 1.0F));
this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
- this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityRaider.class})).a());
+ this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityRaider.class})).a(new Class[0])); // Purpur - decompile error
this.targetSelector.a(2, (new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)).a(300));
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)).a(300));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, false));
diff --git a/src/main/java/net/minecraft/server/EntityFish.java b/src/main/java/net/minecraft/server/EntityFish.java
index a28fbdf1e..36229a2c4 100644
--- a/src/main/java/net/minecraft/server/EntityFish.java
+++ b/src/main/java/net/minecraft/server/EntityFish.java
@@ -75,11 +75,7 @@ public abstract class EntityFish extends EntityWaterAnimal {
protected void initPathfinder() {
super.initPathfinder();
this.goalSelector.a(0, new PathfinderGoalPanic(this, 1.25D));
- PathfinderGoalSelector pathfindergoalselector = this.goalSelector;
- Predicate predicate = IEntitySelector.f;
-
- predicate.getClass();
- pathfindergoalselector.a(2, new PathfinderGoalAvoidTarget<>(this, EntityHuman.class, 8.0F, 1.6D, 1.4D, predicate::test));
+ this.goalSelector.a(2, new PathfinderGoalAvoidTarget<>(this, EntityHuman.class, 8.0F, 1.6D, 1.4D, IEntitySelector.f::test)); // Purpur - decompile error?
this.goalSelector.a(4, new EntityFish.b(this));
}
@@ -91,7 +87,7 @@ public abstract class EntityFish extends EntityWaterAnimal {
@Override
public void e(Vec3D vec3d) {
if (this.de() && this.isInWater()) {
- this.a(0.01F, vec3d);
+ this.a(getRider() == null ? 0.1F : getSpeed(), vec3d); // Purpur
this.move(EnumMoveType.SELF, this.getMot());
this.setMot(this.getMot().a(0.9D));
if (this.getGoalTarget() == null) {
@@ -162,7 +158,7 @@ public abstract class EntityFish extends EntityWaterAnimal {
return SoundEffects.ENTITY_FISH_SWIM;
}
- static class a extends ControllerMove {
+ static class a extends net.pl3x.purpur.controller.ControllerMoveWASDWater { // Purpur
private final EntityFish i;
@@ -171,8 +167,16 @@ public abstract class EntityFish extends EntityWaterAnimal {
this.i = entityfish;
}
+ // Purpur start
+ @Override
+ public void tick(EntityHuman rider) {
+ super.tick(rider);
+ this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
+ }
+
@Override
- public void a() {
+ public void tick() {
+ // Purpur end
if (this.i.a(TagsFluid.WATER)) {
this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
}
diff --git a/src/main/java/net/minecraft/server/EntityFox.java b/src/main/java/net/minecraft/server/EntityFox.java
index b363e9ce9..b9f0d1edb 100644
--- a/src/main/java/net/minecraft/server/EntityFox.java
+++ b/src/main/java/net/minecraft/server/EntityFox.java
@@ -48,6 +48,7 @@ public class EntityFox extends EntityAnimal {
public EntityFox(EntityTypes<? extends EntityFox> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableFox; // Purpur
this.lookController = new EntityFox.k();
this.moveController = new EntityFox.m();
this.a(PathType.DANGER_OTHER, 0.0F);
@@ -155,7 +156,7 @@ public class EntityFox extends EntityAnimal {
}
private boolean j(ItemStack itemstack) {
- return itemstack.getItem().isFood() && this.getGoalTarget() == null && this.onGround && !this.isSleeping();
+ return getRider() == null && itemstack.getItem().isFood() && this.getGoalTarget() == null && this.onGround && !this.isSleeping(); // Purpur
}
@Override
@@ -367,6 +368,7 @@ public class EntityFox extends EntityAnimal {
@Override
public boolean e(ItemStack itemstack) {
+ if (getRider() != null) return false; // Purpur - do not pickup items when being ridden
EnumItemSlot enumitemslot = EntityInsentient.h(itemstack);
return !this.getEquipment(enumitemslot).isEmpty() ? false : enumitemslot == EnumItemSlot.MAINHAND && super.e(itemstack);
@@ -374,12 +376,14 @@ public class EntityFox extends EntityAnimal {
@Override
protected boolean g(ItemStack itemstack) {
+ if (getRider() != null) return false; // Purpur - do not pickup items when being ridden
Item item = itemstack.getItem();
ItemStack itemstack1 = this.getEquipment(EnumItemSlot.MAINHAND);
return itemstack1.isEmpty() || this.bP > 0 && item.isFood() && !itemstack1.getItem().isFood();
}
+ public void spit(ItemStack itemstack) { k(itemstack); } // Purpur - OBFHELPER
private void k(ItemStack itemstack) {
if (!itemstack.isEmpty() && !this.world.isClientSide) {
EntityItem entityitem = new EntityItem(this.world, this.locX + this.getLookDirection().x, this.locY + 1.0D, this.locZ + this.getLookDirection().z, itemstack);
@@ -473,6 +477,7 @@ public class EntityFox extends EntityAnimal {
return this.r(16);
}
+ public void setChasing(boolean flag) { s(flag); } // Purpur - OBFHELPER
public void s(boolean flag) {
this.d(16, flag);
}
@@ -537,6 +542,7 @@ public class EntityFox extends EntityAnimal {
this.setSleeping(false);
}
+ public void stopActions() { en(); } // Purpur - OBFHELPER
private void en() {
this.u(false);
this.setCrouching(false);
@@ -547,7 +553,7 @@ public class EntityFox extends EntityAnimal {
}
private boolean eo() {
- return !this.isSleeping() && !this.isSitting() && !this.dX();
+ return getRider() == null && !this.isSleeping() && !this.isSitting() && !this.dX(); // Purpur
}
@Override
@@ -618,7 +624,30 @@ public class EntityFox extends EntityAnimal {
return deathEvent; // Paper
}
+ // Purpur start
+ @Override
+ public float cW() {
+ return getRider() == null ? super.cW() : 0.5F;
+ }
+
+ @Override
+ public void onMount(EntityHuman entityhuman) {
+ setCanPickupLoot(false);
+ stopActions();
+ setGoalTarget(null);
+ setChasing(false);
+ spit(getEquipment(EnumItemSlot.MAINHAND));
+
+ }
+
+ @Override
+ public void onDismount(EntityHuman entityhuman) {
+ setCanPickupLoot(true);
+ }
+ // Purpur end
+
public static boolean a(EntityFox entityfox, EntityLiving entityliving) {
+ if (entityfox.getRider() != null) return false; // Purpur - cannot jump chase while being ridden
double d0 = entityliving.locZ - entityfox.locZ;
double d1 = entityliving.locX - entityfox.locX;
double d2 = d0 / d1;
@@ -681,16 +710,16 @@ public class EntityFox extends EntityAnimal {
}
}
- public class k extends ControllerLook {
+ public class k extends net.pl3x.purpur.controller.ControllerLookWASD { // Purpur
public k() {
super(EntityFox.this);
}
@Override
- public void a() {
+ public void tick() { // Purpur
if (!EntityFox.this.isSleeping()) {
- super.a();
+ super.tick(); // Purpur
}
}
@@ -1004,12 +1033,12 @@ public class EntityFox extends EntityAnimal {
@Override
public boolean a() {
- return EntityFox.this.getLastDamager() == null && EntityFox.this.getRandom().nextFloat() < 0.02F && !EntityFox.this.isSleeping() && EntityFox.this.getGoalTarget() == null && EntityFox.this.getNavigation().n() && !this.h() && !EntityFox.this.dY() && !EntityFox.this.isCrouching();
+ return getRider() == null && EntityFox.this.getLastDamager() == null && EntityFox.this.getRandom().nextFloat() < 0.02F && !EntityFox.this.isSleeping() && EntityFox.this.getGoalTarget() == null && EntityFox.this.getNavigation().n() && !this.h() && !EntityFox.this.dY() && !EntityFox.this.isCrouching(); // Purpur
}
@Override
public boolean b() {
- return this.f > 0;
+ return getRider() == null && this.f > 0; // Purpur
}
@Override
@@ -1290,8 +1319,14 @@ public class EntityFox extends EntityAnimal {
@Override
public boolean a() {
- return !EntityFox.this.isSitting() && !EntityFox.this.isSleeping() && !EntityFox.this.isCrouching() && !EntityFox.this.dX() && super.a();
+ return getRider() == null && !EntityFox.this.isSitting() && !EntityFox.this.isSleeping() && !EntityFox.this.isCrouching() && !EntityFox.this.dX() && super.a(); // Purpur
+ }
+
+ // Purpur start
+ public boolean b() {
+ return getRider() == null && super.b();
}
+ // Purpur end
}
class u extends PathfinderGoal {
@@ -1349,16 +1384,16 @@ public class EntityFox extends EntityAnimal {
}
}
- class m extends ControllerMove {
+ class m extends net.pl3x.purpur.controller.ControllerMoveWASD { // Purpur
public m() {
super(EntityFox.this);
}
@Override
- public void a() {
+ public void tick() { // Purpur
if (EntityFox.this.eo()) {
- super.a();
+ super.tick(); // Purpur
}
}
diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java
index 55b96c4d2..a05c3916f 100644
--- a/src/main/java/net/minecraft/server/EntityGhast.java
+++ b/src/main/java/net/minecraft/server/EntityGhast.java
@@ -10,6 +10,7 @@ public class EntityGhast extends EntityFlying implements IMonster {
public EntityGhast(EntityTypes<? extends EntityGhast> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableGhast; // Purpur
this.f = 5;
this.moveController = new EntityGhast.ControllerGhast(this);
}
diff --git a/src/main/java/net/minecraft/server/EntityGiantZombie.java b/src/main/java/net/minecraft/server/EntityGiantZombie.java
index bcbade19e..b7e2022b1 100644
--- a/src/main/java/net/minecraft/server/EntityGiantZombie.java
+++ b/src/main/java/net/minecraft/server/EntityGiantZombie.java
@@ -5,7 +5,9 @@ public class EntityGiantZombie extends EntityMonster {
public EntityGiantZombie(EntityTypes<? extends EntityGiantZombie> entitytypes, World world) {
super(entitytypes, world);
// Purpur start
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableGiant;
this.safeFallDistance = 10.0F;
+ setStepHeight(2.0F);
// Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityGuardian.java b/src/main/java/net/minecraft/server/EntityGuardian.java
index 335416d96..7835154ed 100644
--- a/src/main/java/net/minecraft/server/EntityGuardian.java
+++ b/src/main/java/net/minecraft/server/EntityGuardian.java
@@ -22,8 +22,15 @@ public class EntityGuardian extends EntityMonster {
super(entitytypes, world);
this.f = 10;
this.moveController = new EntityGuardian.ControllerMoveGuardian(this);
- this.c = this.random.nextFloat();
- this.d = this.c;
+ // Purpur start
+ this.lookController = new net.pl3x.purpur.controller.ControllerLookWASD(this) {
+ @Override
+ public void setYawPitch(float yaw, float pitch) {
+ super.setYawPitch(yaw, pitch * 0.35F);
+ }
+ };
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableGuardian;
+ // Purpur end
}
@Override
@@ -77,6 +84,7 @@ public class EntityGuardian extends EntityMonster {
return (Boolean) this.datawatcher.get(EntityGuardian.b);
}
+ private void setMovingFlag(boolean movingFlag) { r(movingFlag); } // Purpur - OBFHELPER
private void r(boolean flag) {
this.datawatcher.set(EntityGuardian.b, flag);
}
@@ -302,7 +310,7 @@ public class EntityGuardian extends EntityMonster {
@Override
public void e(Vec3D vec3d) {
if (this.de() && this.isInWater()) {
- this.a(0.1F, vec3d);
+ this.a(getRider() == null ? 0.1F : getSpeed(), vec3d); // Purpur
this.move(EnumMoveType.SELF, this.getMot());
this.setMot(this.getMot().a(0.9D));
if (!this.dY() && this.getGoalTarget() == null) {
@@ -314,7 +322,7 @@ public class EntityGuardian extends EntityMonster {
}
- static class ControllerMoveGuardian extends ControllerMove {
+ static class ControllerMoveGuardian extends net.pl3x.purpur.controller.ControllerMoveWASDWater { // Purpur
private final EntityGuardian i;
@@ -324,7 +332,16 @@ public class EntityGuardian extends EntityMonster {
}
@Override
- public void a() {
+ // Purpur start
+ public void tick(EntityHuman rider) {
+ super.tick(rider);
+ this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
+ this.i.setMovingFlag(this.i.getForward() > 0.0F); // control tail speed
+ }
+
+ @Override
+ public void tick() {
+ // Purpur end
if (this.h == ControllerMove.Operation.MOVE_TO && !this.i.getNavigation().n()) {
Vec3D vec3d = new Vec3D(this.b - this.i.locX, this.c - this.i.locY, this.d - this.i.locZ);
double d0 = vec3d.f();
diff --git a/src/main/java/net/minecraft/server/EntityGuardianElder.java b/src/main/java/net/minecraft/server/EntityGuardianElder.java
index a85a7bf59..a32f6ee2a 100644
--- a/src/main/java/net/minecraft/server/EntityGuardianElder.java
+++ b/src/main/java/net/minecraft/server/EntityGuardianElder.java
@@ -9,6 +9,7 @@ public class EntityGuardianElder extends EntityGuardian {
public EntityGuardianElder(EntityTypes<? extends EntityGuardianElder> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableElderGuardian; // Purpur
this.setPersistent();
if (this.goalRandomStroll != null) {
this.goalRandomStroll.setTimeBetweenMovement(400);
diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java
index f727fb90c..3d6bab9fd 100644
--- a/src/main/java/net/minecraft/server/EntityHorse.java
+++ b/src/main/java/net/minecraft/server/EntityHorse.java
@@ -16,6 +16,7 @@ public class EntityHorse extends EntityHorseAbstract {
public EntityHorse(EntityTypes<? extends EntityHorse> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableHorse; // Purpur
}
@Override
@@ -201,7 +202,7 @@ public class EntityHorse extends EntityHorseAbstract {
}
}
- if (this.isBaby()) {
+ if (false && this.isBaby()) { // Purpur - allow riding babies
return super.a(entityhuman, enumhand);
} else {
this.g(entityhuman);
diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
index 686bca4f2..3cc908955 100644
--- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
@@ -81,7 +81,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven
}
public boolean isTamed() {
- return this.r(2);
+ return this.r(2) || isBaby(); // Purpur - allow riding babies
}
@Nullable
@@ -280,6 +280,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven
return true;
}
+ public boolean isSaddled() { return eq(); } // Purpur - OBFHELPER
public boolean eq() {
return this.r(4);
}
@@ -600,6 +601,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven
}
+ public void makeMad() { eu(); } // Purpur - OBFHELPER
public void eu() {
this.eB();
SoundEffect soundeffect = this.getSoundAngry();
diff --git a/src/main/java/net/minecraft/server/EntityHorseChestedAbstract.java b/src/main/java/net/minecraft/server/EntityHorseChestedAbstract.java
index e61d8f07d..17819fc92 100644
--- a/src/main/java/net/minecraft/server/EntityHorseChestedAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityHorseChestedAbstract.java
@@ -152,8 +152,12 @@ public abstract class EntityHorseChestedAbstract extends EntityHorseAbstract {
return true;
}
- this.eu();
- return true;
+ // Purpur start - don't make babies mad
+ if (!this.isBaby()) {
+ this.makeMad();
+ return true;
+ }
+ // Purpur end
}
if (!this.isCarryingChest() && itemstack.getItem() == Blocks.CHEST.getItem()) {
@@ -178,7 +182,7 @@ public abstract class EntityHorseChestedAbstract extends EntityHorseAbstract {
}
}
- if (this.isBaby()) {
+ if (false && this.isBaby()) { // Purpur - allow riding babies
return super.a(entityhuman, enumhand);
} else {
this.g(entityhuman);
diff --git a/src/main/java/net/minecraft/server/EntityHorseDonkey.java b/src/main/java/net/minecraft/server/EntityHorseDonkey.java
index 46338f0f8..0a5814fa5 100644
--- a/src/main/java/net/minecraft/server/EntityHorseDonkey.java
+++ b/src/main/java/net/minecraft/server/EntityHorseDonkey.java
@@ -4,6 +4,7 @@ public class EntityHorseDonkey extends EntityHorseChestedAbstract {
public EntityHorseDonkey(EntityTypes<? extends EntityHorseDonkey> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableDonkey; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityHorseMule.java b/src/main/java/net/minecraft/server/EntityHorseMule.java
index ef930d194..a5ce8e4cf 100644
--- a/src/main/java/net/minecraft/server/EntityHorseMule.java
+++ b/src/main/java/net/minecraft/server/EntityHorseMule.java
@@ -4,6 +4,7 @@ public class EntityHorseMule extends EntityHorseChestedAbstract {
public EntityHorseMule(EntityTypes<? extends EntityHorseMule> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableMule; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
index b96726456..d4ab18cf2 100644
--- a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
+++ b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
@@ -10,6 +10,7 @@ public class EntityHorseSkeleton extends EntityHorseAbstract {
public EntityHorseSkeleton(EntityTypes<? extends EntityHorseSkeleton> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSkeletonHorse; // Purpur
}
@Override
@@ -156,16 +157,16 @@ public class EntityHorseSkeleton extends EntityHorseAbstract {
return super.a(entityhuman, enumhand);
} else if (!this.isTamed()) {
return false;
- } else if (this.isBaby()) {
+ } else if (false && this.isBaby()) { // Purpur - allow riding babies
return super.a(entityhuman, enumhand);
- } else if (entityhuman.isSneaking()) {
+ } else if (!this.isBaby() && entityhuman.isSneaking()) { // Purpur - don't open inventory on babies
this.e(entityhuman);
return true;
} else if (this.isVehicle()) {
return super.a(entityhuman, enumhand);
} else {
if (!itemstack.isEmpty()) {
- if (itemstack.getItem() == Items.SADDLE && !this.eq()) {
+ if (!this.isBaby() && itemstack.getItem() == Items.SADDLE && !this.isSaddled()) { // Purpur - don't open inventory on babies
this.e(entityhuman);
return true;
}
diff --git a/src/main/java/net/minecraft/server/EntityHorseZombie.java b/src/main/java/net/minecraft/server/EntityHorseZombie.java
index 1160929e1..32b3c1c58 100644
--- a/src/main/java/net/minecraft/server/EntityHorseZombie.java
+++ b/src/main/java/net/minecraft/server/EntityHorseZombie.java
@@ -6,6 +6,7 @@ public class EntityHorseZombie extends EntityHorseAbstract {
public EntityHorseZombie(EntityTypes<? extends EntityHorseZombie> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableZombieHorse; // Purpur
}
@Override
@@ -53,16 +54,16 @@ public class EntityHorseZombie extends EntityHorseAbstract {
return super.a(entityhuman, enumhand);
} else if (!this.isTamed()) {
return false;
- } else if (this.isBaby()) {
+ } else if (false && this.isBaby()) { // Purpur - allow riding babies
return super.a(entityhuman, enumhand);
- } else if (entityhuman.isSneaking()) {
+ } else if (!this.isBaby() && entityhuman.isSneaking()) { // Purpur - don't open inventory on babies
this.e(entityhuman);
return true;
} else if (this.isVehicle()) {
return super.a(entityhuman, enumhand);
} else {
if (!itemstack.isEmpty()) {
- if (!this.eq() && itemstack.getItem() == Items.SADDLE) {
+ if (!this.isBaby() && itemstack.getItem() == Items.SADDLE && !this.isSaddled()) { // Purpur - don't open inventory on babies
this.e(entityhuman);
return true;
}
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index f709e7d87..b487f37ad 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -347,9 +347,21 @@ public abstract class EntityHuman extends EntityLiving {
this.activeContainer = this.defaultContainer;
}
+ // Purpur start
+ boolean mounting = false;
+
+ @Override
+ public void setSneaking(boolean sneaking) {
+ if (this.mounting && !sneaking) {
+ this.mounting = false;
+ }
+ super.setSneaking(sneaking);
+ }
+ // Purpur end
+
@Override
public void passengerTick() {
- if (!this.world.isClientSide && this.isSneaking() && this.isPassenger()) {
+ if (this.isSneaking() && this.isPassenger() && !this.mounting) { // Purpur
this.stopRiding();
this.setSneaking(false);
} else {
diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
index 76641682b..bab9431b3 100644
--- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
+++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
@@ -9,6 +9,7 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan
public EntityIllagerIllusioner(EntityTypes<? extends EntityIllagerIllusioner> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableIllusioner; // Purpur
this.f = 5;
this.bA = new Vec3D[2][4];
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
index 48ce15484..e1560c535 100644
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
@@ -9,6 +9,7 @@ import java.util.UUID;
import javax.annotation.Nullable;
// CraftBukkit start
+import net.pl3x.purpur.PurpurConfig;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.craftbukkit.entity.CraftLivingEntity;
import org.bukkit.entity.LivingEntity;
@@ -27,6 +28,7 @@ public abstract class EntityInsentient extends EntityLiving {
protected int f;
protected ControllerLook lookController;
protected ControllerMove moveController;
+ public boolean isRidable = false;// Purpur
protected ControllerJump bt;
private final EntityAIBodyControl c;
protected NavigationAbstract navigation;
@@ -63,8 +65,11 @@ public abstract class EntityInsentient extends EntityLiving {
this.bL = -1.0F;
this.goalSelector = new PathfinderGoalSelector(world != null && world.getMethodProfiler() != null ? world.getMethodProfiler() : null);
this.targetSelector = new PathfinderGoalSelector(world != null && world.getMethodProfiler() != null ? world.getMethodProfiler() : null);
- this.lookController = new ControllerLook(this);
- this.moveController = new ControllerMove(this);
+ // Purpur start
+ this.moveController = new net.pl3x.purpur.controller.ControllerMoveWASD(this);
+ this.lookController = new net.pl3x.purpur.controller.ControllerLookWASD(this);
+ this.canBeRiddenInWater = true;
+ // Purpur end
this.bt = new ControllerJump(this);
this.c = this.o();
this.navigation = this.b(world);
@@ -492,6 +497,7 @@ public abstract class EntityInsentient extends EntityLiving {
this.bb = f;
}
+ public void setSpeed(float speed) { o(speed); } // Purpur - OBFHELPER
@Override
public void o(float f) {
super.o(f);
@@ -1057,7 +1063,7 @@ public abstract class EntityInsentient extends EntityLiving {
}
protected boolean a(EntityHuman entityhuman, EnumHand enumhand) {
- return false;
+ return tryRide(entityhuman, enumhand); // Purpur
}
public boolean dH() {
@@ -1355,4 +1361,43 @@ public abstract class EntityInsentient extends EntityLiving {
public boolean a(Item item) {
return this.getItemInMainHand().getItem() == item || this.getItemInOffHand().getItem() == item;
}
+
+ // Purpur start
+ public boolean hasRidePermission(EntityHuman entityhuman) {
+ return entityhuman.getBukkitEntity().hasPermission("allow.ride." + getEntityType().getName());
+ }
+
+ public boolean tryRide(EntityHuman entityhuman, EnumHand enumhand) {
+ if (!isRidable) {
+ return false;
+ }
+ if (enumhand != EnumHand.MAIN_HAND) {
+ return false;
+ }
+ if (PurpurConfig.requireShiftToMount && !entityhuman.isSneaking()) {
+ return false;
+ }
+ if (!passengers.isEmpty() || entityhuman.isPassenger()) {
+ return false;
+ }
+ if (this instanceof EntityTameableAnimal) {
+ EntityTameableAnimal tameable = (EntityTameableAnimal) this;
+ if (tameable.isTamed() && !tameable.isOwner(entityhuman)) {
+ return false;
+ }
+ }
+ if (!hasRidePermission(entityhuman)) {
+ entityhuman.getBukkitEntity().sendMessage("You cannot mount that mob");
+ return false;
+ }
+ return mountTo(entityhuman);
+ }
+
+ public boolean mountTo(EntityHuman entityhuman) {
+ entityhuman.mounting = true;
+ entityhuman.yaw = this.yaw;
+ entityhuman.pitch = this.pitch;
+ return entityhuman.startRiding(this) || (entityhuman.mounting = false);
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java
index bb06d12f6..41ad48c96 100644
--- a/src/main/java/net/minecraft/server/EntityIronGolem.java
+++ b/src/main/java/net/minecraft/server/EntityIronGolem.java
@@ -8,6 +8,7 @@ public class EntityIronGolem extends EntityGolem {
public EntityIronGolem(EntityTypes<? extends EntityIronGolem> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableIronGolem; // Purpur
this.K = 1.0F;
}
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 66813756d..08642e924 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -87,10 +87,10 @@ public abstract class EntityLiving extends Entity {
protected float aX;
protected int aY; protected int getKillCount() { return this.aY; } // Paper - OBFHELPER
public float lastDamage;
- protected boolean jumping;
- public float bb;
- public float bc;
- public float bd;
+ protected boolean jumping; public boolean isJumping() { return jumping; } // Purpur - OBFHELPER
+ public float bb; public float getStrafe() { return bb; } public void setStrafe(float strafe) { bb = strafe; } // Purpur - OBFHELPER
+ public float bc; public float getVertical() { return bc; } public void setVertical(float vertical) { bc = vertical; } // Purpur - OBFHELPER
+ public float bd; public float getForward() { return bd; } public void setForward(float forward) { bd = forward; } // Purpur - OBFHELPER
public float be;
protected int bf;
protected double bg;
@@ -373,9 +373,18 @@ public abstract class EntityLiving extends Entity {
return this.isBaby() ? 0.5F : 1.0F;
}
+ // Purpur start
+ protected boolean canBeRiddenInWater = false;
+
+ public void setCanBeRiddenInWater(boolean canBeRiddenInWater) {
+ this.canBeRiddenInWater = canBeRiddenInWater;
+ }
+ // Purpur end
+
+ public boolean canBeRiddenInWater() { return be(); } // Purpur - OBFHELPER
@Override
public boolean be() {
- return false;
+ return canBeRiddenInWater; // Purpur
}
protected void cn() {
@@ -2033,7 +2042,7 @@ public abstract class EntityLiving extends Entity {
return 0.42F;
}
- protected void jump() {
+ public void jump() { // Purpur - protected -> public
float f;
if (this.hasEffect(MobEffects.JUMP)) {
@@ -2044,6 +2053,7 @@ public abstract class EntityLiving extends Entity {
Vec3D vec3d = this.getMot();
+ if (getRider() != null) setMot(vec3d.x * 2D, (double) f, vec3d.z * 2D); else // Purpur - add small boost to velocity when jumping while being ridden
this.setMot(vec3d.x, (double) f, vec3d.z);
if (this.isSprinting()) {
float f1 = this.yaw * 0.017453292F;
@@ -2262,10 +2272,12 @@ public abstract class EntityLiving extends Entity {
return this.onGround ? this.da() * (0.21600002F / (f * f * f)) : this.aO;
}
+ public float getSpeed() { return da(); } // Purpur - OBFHELPER
public float da() {
return this.bD;
}
+ public void setSpeed(float speed) { o(speed); } // Purpur - OBFHELPER
public void o(float f) {
this.bD = f;
}
@@ -2741,6 +2753,7 @@ public abstract class EntityLiving extends Entity {
this.aM = f;
}
+ public void setRenderYawOffset(float renderYawOffset) { l(renderYawOffset); } // Purpur - OBFHELPER
@Override
public void l(float f) {
this.aK = f;
diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java
index f8a8da637..b782bda60 100644
--- a/src/main/java/net/minecraft/server/EntityLlama.java
+++ b/src/main/java/net/minecraft/server/EntityLlama.java
@@ -16,6 +16,29 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
public EntityLlama(EntityTypes<? extends EntityLlama> entitytypes, World world) {
super(entitytypes, world);
+ // Purpur start
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableLlama;
+ this.moveController = new net.pl3x.purpur.controller.ControllerMoveWASD(this) {
+ @Override
+ protected void tick(EntityHuman rider) {
+ if (EntityLlama.this.isSaddled()) {
+ super.tick(rider);
+ } else {
+ super.tick();
+ }
+ }
+ };
+ this.lookController = new net.pl3x.purpur.controller.ControllerLookWASD(this) {
+ @Override
+ protected void tick(EntityHuman rider) {
+ if (EntityLlama.this.isSaddled()) {
+ super.tick(rider);
+ } else {
+ super.tick();
+ }
+ }
+ };
+ // Purpur end
}
public void setStrength(int i) {
@@ -371,6 +394,18 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
}
}
+ // Purpur start
+ @Override
+ public boolean isLeashed() {
+ return (getRider() != null && isSaddled()) || super.isLeashed();
+ }
+
+ @Override
+ public Entity getLeashHolder() {
+ return (getRider() != null && isSaddled()) ? getRider() : super.getLeashHolder();
+ }
+ // Purpur end
+
public void eG() {
if (this.bN != null) {
this.bN.bO = null;
@@ -385,7 +420,7 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
}
public boolean eH() {
- return this.bO != null;
+ return (getRider() != null && isSaddled()) || this.bO != null; // Purpur
}
public boolean eI() {
diff --git a/src/main/java/net/minecraft/server/EntityLlamaTrader.java b/src/main/java/net/minecraft/server/EntityLlamaTrader.java
index b22221e3f..78d41e763 100644
--- a/src/main/java/net/minecraft/server/EntityLlamaTrader.java
+++ b/src/main/java/net/minecraft/server/EntityLlamaTrader.java
@@ -9,6 +9,7 @@ public class EntityLlamaTrader extends EntityLlama {
public EntityLlamaTrader(EntityTypes<? extends EntityLlamaTrader> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableLlamaTrader; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityMagmaCube.java b/src/main/java/net/minecraft/server/EntityMagmaCube.java
index 595884e37..113734bae 100644
--- a/src/main/java/net/minecraft/server/EntityMagmaCube.java
+++ b/src/main/java/net/minecraft/server/EntityMagmaCube.java
@@ -4,6 +4,7 @@ public class EntityMagmaCube extends EntitySlime {
public EntityMagmaCube(EntityTypes<? extends EntityMagmaCube> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableMagmaCube; // Purpur
}
@Override
@@ -59,7 +60,7 @@ public class EntityMagmaCube extends EntitySlime {
}
@Override
- protected void jump() {
+ public void jump() { // Purpur - protected -> public
Vec3D vec3d = this.getMot();
this.setMot(vec3d.x, (double) (0.42F + (float) this.getSize() * 0.1F), vec3d.z);
diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java
index 31b306211..c918288e0 100644
--- a/src/main/java/net/minecraft/server/EntityMushroomCow.java
+++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java
@@ -17,6 +17,7 @@ public class EntityMushroomCow extends EntityCow {
public EntityMushroomCow(EntityTypes<? extends EntityMushroomCow> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableMooshroom; // Purpur
this.bC = Blocks.MYCELIUM;
}
diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java
index 1713bead2..984121969 100644
--- a/src/main/java/net/minecraft/server/EntityOcelot.java
+++ b/src/main/java/net/minecraft/server/EntityOcelot.java
@@ -13,6 +13,7 @@ public class EntityOcelot extends EntityAnimal {
public EntityOcelot(EntityTypes<? extends EntityOcelot> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableOcelot; // Purpur
this.dV();
}
diff --git a/src/main/java/net/minecraft/server/EntityPanda.java b/src/main/java/net/minecraft/server/EntityPanda.java
index b46ca388e..2c25439ab 100644
--- a/src/main/java/net/minecraft/server/EntityPanda.java
+++ b/src/main/java/net/minecraft/server/EntityPanda.java
@@ -37,6 +37,7 @@ public class EntityPanda extends EntityAnimal {
public EntityPanda(EntityTypes<? extends EntityPanda> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePanda; // Purpur
this.moveController = new EntityPanda.i(this);
if (!this.isBaby()) {
this.setCanPickupLoot(true);
diff --git a/src/main/java/net/minecraft/server/EntityParrot.java b/src/main/java/net/minecraft/server/EntityParrot.java
index 6173a86e0..a795047b6 100644
--- a/src/main/java/net/minecraft/server/EntityParrot.java
+++ b/src/main/java/net/minecraft/server/EntityParrot.java
@@ -21,7 +21,7 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
};
private static final Item bK = Items.COOKIE;
private static final Set<Item> bL = Sets.newHashSet(new Item[]{Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS});
- private static final Map<EntityTypes<?>, SoundEffect> bM = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
+ private static final Map<EntityTypes<?>, SoundEffect> bM = SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error // Purpur - _really_ fix decompile error
hashmap.put(EntityTypes.BLAZE, SoundEffects.ENTITY_PARROT_IMITATE_BLAZE);
hashmap.put(EntityTypes.CAVE_SPIDER, SoundEffects.ENTITY_PARROT_IMITATE_SPIDER);
hashmap.put(EntityTypes.CREEPER, SoundEffects.ENTITY_PARROT_IMITATE_CREEPER);
@@ -67,6 +67,7 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
public EntityParrot(EntityTypes<? extends EntityParrot> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableParrot; // Purpur
this.moveController = new ControllerMoveFlying(this);
}
diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java
index 6aa116f4b..238c68edf 100644
--- a/src/main/java/net/minecraft/server/EntityPhantom.java
+++ b/src/main/java/net/minecraft/server/EntityPhantom.java
@@ -16,12 +16,14 @@ public class EntityPhantom extends EntityFlying implements IMonster {
public EntityPhantom(EntityTypes<? extends EntityPhantom> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePhantom; // Purpur
this.c = Vec3D.a;
this.d = BlockPosition.ZERO;
this.bz = EntityPhantom.AttackPhase.CIRCLE;
this.f = 5;
this.moveController = new EntityPhantom.g(this);
this.lookController = new EntityPhantom.f(this);
+ this.canBeRiddenInWater = false; // Purpur
}
@Override
@@ -106,7 +108,7 @@ public class EntityPhantom extends EntityFlying implements IMonster {
@Override
public void movementTick() {
- if (this.isAlive() && this.dS()) {
+ if (this.isAlive() && getRider() == null && this.isInDaylight()) { // Purpur - do not set fire if being ridden
this.setOnFire(8);
}
@@ -605,14 +607,23 @@ public class EntityPhantom extends EntityFlying implements IMonster {
}
}
- class f extends ControllerLook {
+ class f extends net.pl3x.purpur.controller.ControllerLookWASD { // Purpur
public f(EntityInsentient entityinsentient) {
super(entityinsentient);
}
@Override
- public void a() {}
+ // Purpur start
+ public void tick(EntityHuman rider) {
+ setYawPitch(rider.yaw, -rider.pitch * 0.75F);
+ }
+
+ @Override
+ public void tick() {
+ // do nothing
+ }
+ // Purpur end
}
class d extends EntityAIBodyControl {
@@ -628,7 +639,7 @@ public class EntityPhantom extends EntityFlying implements IMonster {
}
}
- class g extends ControllerMove {
+ class g extends net.pl3x.purpur.controller.ControllerMoveWASDFlying { // Purpur
private float j = 0.1F;
@@ -636,8 +647,19 @@ public class EntityPhantom extends EntityFlying implements IMonster {
super(entityinsentient);
}
+ // Purpur start
@Override
- public void a() {
+ public void tick(EntityHuman rider) {
+ if (!EntityPhantom.this.onGround) {
+ // phantom is always in motion when flying
+ // TODO - FIX THIS - rider.setForward(1.0F);
+ }
+ super.tick(rider);
+ }
+
+ @Override
+ public void tick() {
+ // Purpur end
if (EntityPhantom.this.positionChanged) {
EntityPhantom.this.yaw += 180.0F;
this.j = 0.1F;
diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java
index 616075569..fd57e5bde 100644
--- a/src/main/java/net/minecraft/server/EntityPig.java
+++ b/src/main/java/net/minecraft/server/EntityPig.java
@@ -18,6 +18,7 @@ public class EntityPig extends EntityAnimal {
public EntityPig(EntityTypes<? extends EntityPig> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePig; // Purpur
}
@Override
@@ -111,27 +112,22 @@ public class EntityPig extends EntityAnimal {
@Override
public boolean a(EntityHuman entityhuman, EnumHand enumhand) {
- if (!super.a(entityhuman, enumhand)) {
- ItemStack itemstack = entityhuman.b(enumhand);
-
- if (itemstack.getItem() == Items.NAME_TAG) {
- itemstack.a(entityhuman, (EntityLiving) this, enumhand);
- return true;
- } else if (this.hasSaddle() && !this.isVehicle()) {
- if (!this.world.isClientSide) {
- entityhuman.startRiding(this);
- }
-
- return true;
- } else if (itemstack.getItem() == Items.SADDLE) {
- itemstack.a(entityhuman, (EntityLiving) this, enumhand);
- return true;
- } else {
- return false;
- }
- } else {
+ // Purpur start - reorder logic so super is last (so tryRide is last)
+ ItemStack itemstack = entityhuman.b(enumhand);
+ if (itemstack.getItem() == Items.NAME_TAG) {
+ itemstack.a(entityhuman, this, enumhand);
+ return true;
+ }
+ if (hasSaddle() && !isVehicle()) {
+ entityhuman.startRiding(this);
+ return true;
+ }
+ if (itemstack.getItem() == Items.SADDLE) {
+ itemstack.a(entityhuman, this, enumhand);
return true;
}
+ return super.a(entityhuman, enumhand);
+ // Purpur end
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java
index dc08a7c57..07504f736 100644
--- a/src/main/java/net/minecraft/server/EntityPigZombie.java
+++ b/src/main/java/net/minecraft/server/EntityPigZombie.java
@@ -13,6 +13,7 @@ public class EntityPigZombie extends EntityZombie {
public EntityPigZombie(EntityTypes<? extends EntityPigZombie> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableZombiePigman; // Purpur
this.a(PathType.LAVA, 8.0F);
}
diff --git a/src/main/java/net/minecraft/server/EntityPillager.java b/src/main/java/net/minecraft/server/EntityPillager.java
index 845f7ac32..c945f52f2 100644
--- a/src/main/java/net/minecraft/server/EntityPillager.java
+++ b/src/main/java/net/minecraft/server/EntityPillager.java
@@ -11,6 +11,7 @@ public class EntityPillager extends EntityIllagerAbstract implements ICrossbow,
public EntityPillager(EntityTypes<? extends EntityPillager> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePillager; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityPolarBear.java b/src/main/java/net/minecraft/server/EntityPolarBear.java
index 182a3195e..8ecd2a6f2 100644
--- a/src/main/java/net/minecraft/server/EntityPolarBear.java
+++ b/src/main/java/net/minecraft/server/EntityPolarBear.java
@@ -1,5 +1,8 @@
package net.minecraft.server;
+import net.pl3x.purpur.controller.ControllerMoveWASD;
+import org.bukkit.scheduler.BukkitRunnable;
+
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
@@ -14,6 +17,7 @@ public class EntityPolarBear extends EntityAnimal {
public EntityPolarBear(EntityTypes<? extends EntityPolarBear> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePolarBear; // Purpur
}
@Override
@@ -116,6 +120,11 @@ public class EntityPolarBear extends EntityAnimal {
--this.bD;
}
+ // Purpur start
+ if (isStanding() && --standTimer <= 0) {
+ setStanding(false);
+ }
+ // Purpur end
}
@Override
@@ -141,11 +150,14 @@ public class EntityPolarBear extends EntityAnimal {
return flag;
}
+ public boolean isStanding() { return dW(); } // Purpur - OBFHELPER
public boolean dW() {
return (Boolean) this.datawatcher.get(EntityPolarBear.bz);
}
+ public void setStanding(boolean standing) { r(standing); } // Purpur - OBFHELPER
public void r(boolean flag) {
+ standTimer = flag ? 20 : -1; // Purpur
this.datawatcher.set(EntityPolarBear.bz, flag);
}
@@ -165,6 +177,23 @@ public class EntityPolarBear extends EntityAnimal {
return (GroupDataEntity) groupdataentity;
}
+ // Purpur start
+ private int standTimer = 0;
+
+ @Override
+ public boolean onSpacebar() {
+ if (!isStanding()) {
+ EntityHuman rider = getRider();
+ if (rider != null && rider.getForward() == 0 && rider.getStrafe() == 0) {
+ setStanding(true);
+ a(SoundEffects.ENTITY_POLAR_BEAR_WARNING, 1.0F, 1.0F); // playSound
+ }
+ }
+ return false;
+ }
+
+ // Purpur end
+
class e extends PathfinderGoalPanic {
public e() {
diff --git a/src/main/java/net/minecraft/server/EntityPufferFish.java b/src/main/java/net/minecraft/server/EntityPufferFish.java
index 153d34120..7a008627b 100644
--- a/src/main/java/net/minecraft/server/EntityPufferFish.java
+++ b/src/main/java/net/minecraft/server/EntityPufferFish.java
@@ -15,6 +15,7 @@ public class EntityPufferFish extends EntityFish {
public EntityPufferFish(EntityTypes<? extends EntityPufferFish> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridablePufferfish; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityRabbit.java b/src/main/java/net/minecraft/server/EntityRabbit.java
index f6fa87158..ffdb39725 100644
--- a/src/main/java/net/minecraft/server/EntityRabbit.java
+++ b/src/main/java/net/minecraft/server/EntityRabbit.java
@@ -14,6 +14,7 @@ public class EntityRabbit extends EntityAnimal {
public EntityRabbit(EntityTypes<? extends EntityRabbit> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableRabbit; // Purpur
this.bt = new EntityRabbit.ControllerJumpRabbit(this);
this.moveController = new EntityRabbit.ControllerMoveRabbit(this);
this.initializePathFinderGoals(); // CraftBukkit - moved code
@@ -59,7 +60,7 @@ public class EntityRabbit extends EntityAnimal {
}
@Override
- protected void jump() {
+ public void jump() { // Purpur - protected -> public
super.jump();
double d0 = this.moveController.c();
diff --git a/src/main/java/net/minecraft/server/EntityRavager.java b/src/main/java/net/minecraft/server/EntityRavager.java
index 9c22323c4..9162049c1 100644
--- a/src/main/java/net/minecraft/server/EntityRavager.java
+++ b/src/main/java/net/minecraft/server/EntityRavager.java
@@ -16,6 +16,7 @@ public class EntityRavager extends EntityRaider {
public EntityRavager(EntityTypes<? extends EntityRavager> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableRavager; // Purpur
this.K = 1.0F;
this.f = 20;
}
diff --git a/src/main/java/net/minecraft/server/EntitySalmon.java b/src/main/java/net/minecraft/server/EntitySalmon.java
index b600f30eb..8c60e26c7 100644
--- a/src/main/java/net/minecraft/server/EntitySalmon.java
+++ b/src/main/java/net/minecraft/server/EntitySalmon.java
@@ -4,6 +4,7 @@ public class EntitySalmon extends EntityFishSchool {
public EntitySalmon(EntityTypes<? extends EntitySalmon> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSalmon; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java
index df1bfc94e..f7d7f417c 100644
--- a/src/main/java/net/minecraft/server/EntitySheep.java
+++ b/src/main/java/net/minecraft/server/EntitySheep.java
@@ -18,7 +18,7 @@ import org.bukkit.inventory.InventoryView;
public class EntitySheep extends EntityAnimal {
private static final DataWatcherObject<Byte> bz = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a);
- private static final Map<EnumColor, IMaterial> bA = (Map) SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error
+ private static final Map<EnumColor, IMaterial> bA = SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error // Purpur - _really_ fix decompile error
enummap.put(EnumColor.WHITE, Blocks.WHITE_WOOL);
enummap.put(EnumColor.ORANGE, Blocks.ORANGE_WOOL);
enummap.put(EnumColor.MAGENTA, Blocks.MAGENTA_WOOL);
@@ -36,9 +36,7 @@ public class EntitySheep extends EntityAnimal {
enummap.put(EnumColor.RED, Blocks.RED_WOOL);
enummap.put(EnumColor.BLACK, Blocks.BLACK_WOOL);
});
- private static final Map<EnumColor, float[]> bB = Maps.newEnumMap((Map) Arrays.stream(EnumColor.values()).collect(Collectors.toMap((enumcolor) -> {
- return enumcolor;
- }, EntitySheep::c)));
+ private static final Map<EnumColor, float[]> bB = Arrays.stream(EnumColor.values()).collect(Collectors.toMap((enumcolor) -> enumcolor, EntitySheep::c)); // Purpur - fix decompile error
private int bD;
private PathfinderGoalEatTile bE;
@@ -55,6 +53,7 @@ public class EntitySheep extends EntityAnimal {
public EntitySheep(EntityTypes<? extends EntitySheep> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSheep; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityShulker.java b/src/main/java/net/minecraft/server/EntityShulker.java
index 1df311d85..e821efe62 100644
--- a/src/main/java/net/minecraft/server/EntityShulker.java
+++ b/src/main/java/net/minecraft/server/EntityShulker.java
@@ -26,6 +26,7 @@ public class EntityShulker extends EntityGolem implements IMonster {
public EntityShulker(EntityTypes<? extends EntityShulker> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableShulker; // Purpur
this.aL = 180.0F;
this.aK = 180.0F;
this.bE = null;
diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java
index d823c6b6d..0a7ec94d3 100644
--- a/src/main/java/net/minecraft/server/EntitySilverfish.java
+++ b/src/main/java/net/minecraft/server/EntitySilverfish.java
@@ -10,6 +10,7 @@ public class EntitySilverfish extends EntityMonster {
public EntitySilverfish(EntityTypes<? extends EntitySilverfish> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSilverfish; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java
index 0e78d5c62..908e51b63 100644
--- a/src/main/java/net/minecraft/server/EntitySkeleton.java
+++ b/src/main/java/net/minecraft/server/EntitySkeleton.java
@@ -4,6 +4,7 @@ public class EntitySkeleton extends EntitySkeletonAbstract {
public EntitySkeleton(EntityTypes<? extends EntitySkeleton> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSkeleton; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonStray.java b/src/main/java/net/minecraft/server/EntitySkeletonStray.java
index 4ca5024f3..57c7432ab 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonStray.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonStray.java
@@ -4,6 +4,7 @@ public class EntitySkeletonStray extends EntitySkeletonAbstract {
public EntitySkeletonStray(EntityTypes<? extends EntitySkeletonStray> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableStray; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonWither.java b/src/main/java/net/minecraft/server/EntitySkeletonWither.java
index 872f79cc6..ed03d3122 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonWither.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonWither.java
@@ -6,6 +6,7 @@ public class EntitySkeletonWither extends EntitySkeletonAbstract {
public EntitySkeletonWither(EntityTypes<? extends EntitySkeletonWither> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableWitherSkeleton; // Purpur
this.a(PathType.LAVA, 8.0F);
}
diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java
index e28c0673d..bf0819e2e 100644
--- a/src/main/java/net/minecraft/server/EntitySlime.java
+++ b/src/main/java/net/minecraft/server/EntitySlime.java
@@ -28,6 +28,7 @@ public class EntitySlime extends EntityInsentient implements IMonster {
public EntitySlime(EntityTypes<? extends EntitySlime> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSlime; // Purpur
this.moveController = new EntitySlime.ControllerMoveSlime(this);
}
@@ -316,7 +317,7 @@ public class EntitySlime extends EntityInsentient implements IMonster {
}
@Override
- protected void jump() {
+ public void jump() { // Purpur - protected -> public
Vec3D vec3d = this.getMot();
this.setMot(vec3d.x, 0.41999998688697815D, vec3d.z);
diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java
index fb36306b9..271b952b2 100644
--- a/src/main/java/net/minecraft/server/EntitySnowman.java
+++ b/src/main/java/net/minecraft/server/EntitySnowman.java
@@ -14,6 +14,7 @@ public class EntitySnowman extends EntityGolem implements IRangedEntity {
public EntitySnowman(EntityTypes<? extends EntitySnowman> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSnowGolem; // Purpur
}
@Override
@@ -75,6 +76,7 @@ public class EntitySnowman extends EntityGolem implements IRangedEntity {
return;
}
+ if (getRider() != null) return; // Purpur - don't leave snow trail when being ridden
IBlockData iblockdata = Blocks.SNOW.getBlockData();
for (int l = 0; l < 4; ++l) {
diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java
index b560a8969..aa46cb7ea 100644
--- a/src/main/java/net/minecraft/server/EntitySpider.java
+++ b/src/main/java/net/minecraft/server/EntitySpider.java
@@ -9,6 +9,7 @@ public class EntitySpider extends EntityMonster {
public EntitySpider(EntityTypes<? extends EntitySpider> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSpider; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java
index 77c0ed42f..e06282fdf 100644
--- a/src/main/java/net/minecraft/server/EntitySquid.java
+++ b/src/main/java/net/minecraft/server/EntitySquid.java
@@ -19,6 +19,7 @@ public class EntitySquid extends EntityWaterAnimal {
public EntitySquid(EntityTypes<? extends EntitySquid> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableSquid; // Purpur
//this.random.setSeed((long) this.getId()); // Paper
this.bF = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
}
@@ -174,6 +175,7 @@ public class EntitySquid extends EntityWaterAnimal {
return this.locY > this.world.spigotConfig.squidSpawnRangeMin && this.locY < maxHeight; // Spigot // Paper
}
+ public void setMovementVector(float x, float y, float z) { a(x, y, z); } // Purpur - OBFHELPER
public void a(float f, float f1, float f2) {
this.bH = f;
this.bI = f1;
@@ -258,6 +260,39 @@ public class EntitySquid extends EntityWaterAnimal {
@Override
public void e() {
+ // Purpur start
+ EntityHuman rider = this.b.getRider();
+ if (rider != null) {
+ EntitySquid squid = this.b;
+ if (rider.isJumping()) {
+ squid.onSpacebar();
+ }
+ float forward = rider.getForward();
+ float strafe = rider.getStrafe();
+ float speed = (float) squid.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue() * 5F;
+ if (forward < 0.0F) {
+ speed *= -0.5;
+ }
+ org.bukkit.util.Vector dir = rider.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(speed / 20.0F);
+ if (strafe != 0.0F) {
+ if (forward == 0.0F) {
+ dir.setY(0);
+ rotateVectorAroundY(dir, strafe > 0.0F ? -90 : 90);
+ } else if (forward < 0.0F) {
+ rotateVectorAroundY(dir, strafe > 0.0F ? 45 : -45);
+ } else {
+ rotateVectorAroundY(dir, strafe > 0.0F ? -45 : 45);
+ }
+ }
+ if (forward != 0.0F || strafe != 0.0F) {
+ squid.setMovementVector((float) dir.getX(), (float) dir.getY(), (float) dir.getZ());
+ } else {
+ squid.setMovementVector(0.0F, 0.0F, 0.0F);
+ }
+ return;
+ }
+ // Purpur end
+
int i = this.b.cv();
if (i > 100) {
@@ -272,5 +307,17 @@ public class EntitySquid extends EntityWaterAnimal {
}
}
+
+ // Purpur start
+ private void rotateVectorAroundY(org.bukkit.util.Vector vector, double degrees) {
+ double rad = Math.toRadians(degrees);
+ double cos = Math.cos(rad);
+ double sine = Math.sin(rad);
+ double x = vector.getX();
+ double z = vector.getZ();
+ vector.setX(cos * x - sine * z);
+ vector.setZ(sine * x + cos * z);
+ }
+ // Purpur end
}
}
diff --git a/src/main/java/net/minecraft/server/EntityTameableAnimal.java b/src/main/java/net/minecraft/server/EntityTameableAnimal.java
index 70bf06b94..2f41d8ade 100644
--- a/src/main/java/net/minecraft/server/EntityTameableAnimal.java
+++ b/src/main/java/net/minecraft/server/EntityTameableAnimal.java
@@ -127,6 +127,12 @@ public abstract class EntityTameableAnimal extends EntityAnimal {
this.datawatcher.set(EntityTameableAnimal.bA, Optional.ofNullable(uuid));
}
+ // Purpur start
+ public boolean isOwner(EntityHuman entityhuman) {
+ return entityhuman != null && entityhuman.getUniqueID() == getOwnerUUID();
+ }
+ // Purpur end
+
public void tame(EntityHuman entityhuman) {
this.setTamed(true);
this.setOwnerUUID(entityhuman.getUniqueID());
diff --git a/src/main/java/net/minecraft/server/EntityTropicalFish.java b/src/main/java/net/minecraft/server/EntityTropicalFish.java
index 2e537c203..03b49a7c7 100644
--- a/src/main/java/net/minecraft/server/EntityTropicalFish.java
+++ b/src/main/java/net/minecraft/server/EntityTropicalFish.java
@@ -17,6 +17,7 @@ public class EntityTropicalFish extends EntityFishSchool {
public EntityTropicalFish(EntityTypes<? extends EntityTropicalFish> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableTropicalFish; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityTurtle.java b/src/main/java/net/minecraft/server/EntityTurtle.java
index e4eecf568..80bd32b79 100644
--- a/src/main/java/net/minecraft/server/EntityTurtle.java
+++ b/src/main/java/net/minecraft/server/EntityTurtle.java
@@ -22,6 +22,7 @@ public class EntityTurtle extends EntityAnimal {
public EntityTurtle(EntityTypes<? extends EntityTurtle> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableTurtle; // Purpur
this.moveController = new EntityTurtle.e(this);
this.bC = Blocks.SAND;
this.K = 1.0F;
diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java
index 759e8b443..3fd1f8f49 100644
--- a/src/main/java/net/minecraft/server/EntityTypes.java
+++ b/src/main/java/net/minecraft/server/EntityTypes.java
@@ -262,6 +262,10 @@ public class EntityTypes<T extends Entity> {
}
// Purpur start
+ public String getName() {
+ return IRegistry.ENTITY_TYPE.getKey(this).getKey();
+ }
+
public String getTranslatedName() {
return getNameComponent().getString();
}
diff --git a/src/main/java/net/minecraft/server/EntityVex.java b/src/main/java/net/minecraft/server/EntityVex.java
index bcda21ba7..0fc3bce6f 100644
--- a/src/main/java/net/minecraft/server/EntityVex.java
+++ b/src/main/java/net/minecraft/server/EntityVex.java
@@ -15,6 +15,7 @@ public class EntityVex extends EntityMonster {
public EntityVex(EntityTypes<? extends EntityVex> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableVex; // Purpur
this.moveController = new EntityVex.c(this);
this.f = 3;
}
diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
index fe9efa9da..6e6f9180c 100644
--- a/src/main/java/net/minecraft/server/EntityVillager.java
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
@@ -61,6 +61,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
public EntityVillager(EntityTypes<? extends EntityVillager> entitytypes, World world, VillagerType villagertype) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableVillager; // Purpur
this.bI = Long.MIN_VALUE;
this.bL = new Reputation();
((Navigation) this.getNavigation()).a(true);
diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java
index 46a349e73..b029c38d2 100644
--- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java
+++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java
@@ -17,6 +17,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
public EntityVillagerTrader(EntityTypes<? extends EntityVillagerTrader> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableWanderingTrader; // Purpur
this.attachedToPlayer = true;
}
diff --git a/src/main/java/net/minecraft/server/EntityVindicator.java b/src/main/java/net/minecraft/server/EntityVindicator.java
index 130a2e4ff..88a2ace08 100644
--- a/src/main/java/net/minecraft/server/EntityVindicator.java
+++ b/src/main/java/net/minecraft/server/EntityVindicator.java
@@ -15,6 +15,7 @@ public class EntityVindicator extends EntityIllagerAbstract {
public EntityVindicator(EntityTypes<? extends EntityVindicator> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableVindicator; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityWitch.java b/src/main/java/net/minecraft/server/EntityWitch.java
index f30ce9568..6a0d7a82f 100644
--- a/src/main/java/net/minecraft/server/EntityWitch.java
+++ b/src/main/java/net/minecraft/server/EntityWitch.java
@@ -22,6 +22,7 @@ public class EntityWitch extends EntityRaider implements IRangedEntity {
public EntityWitch(EntityTypes<? extends EntityWitch> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableWitch; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java
index 5609fcfe0..51624ac8a 100644
--- a/src/main/java/net/minecraft/server/EntityWither.java
+++ b/src/main/java/net/minecraft/server/EntityWither.java
@@ -35,6 +35,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
public EntityWither(EntityTypes<? extends EntityWither> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableWither; // Purpur
this.bossBattle = (BossBattleServer) (new BossBattleServer(this.getScoreboardDisplayName(), BossBattle.BarColor.PURPLE, BossBattle.BarStyle.PROGRESS)).setDarkenSky(true);
this.setHealth(this.getMaxHealth());
this.getNavigation().d(true);
diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java
index 0f4554c39..dd213c7d9 100644
--- a/src/main/java/net/minecraft/server/EntityWolf.java
+++ b/src/main/java/net/minecraft/server/EntityWolf.java
@@ -28,6 +28,7 @@ public class EntityWolf extends EntityTameableAnimal {
public EntityWolf(EntityTypes<? extends EntityWolf> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableWolf; // Purpur
this.setTamed(false);
}
diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java
index 40a796384..a131d57b5 100644
--- a/src/main/java/net/minecraft/server/EntityZombie.java
+++ b/src/main/java/net/minecraft/server/EntityZombie.java
@@ -35,6 +35,7 @@ public class EntityZombie extends EntityMonster {
public EntityZombie(EntityTypes<? extends EntityZombie> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableZombie; // Purpur
this.bD = new PathfinderGoalBreakDoor(this, EntityZombie.bC);
}
diff --git a/src/main/java/net/minecraft/server/EntityZombieHusk.java b/src/main/java/net/minecraft/server/EntityZombieHusk.java
index 1c0787429..0b5875e93 100644
--- a/src/main/java/net/minecraft/server/EntityZombieHusk.java
+++ b/src/main/java/net/minecraft/server/EntityZombieHusk.java
@@ -4,6 +4,7 @@ public class EntityZombieHusk extends EntityZombie {
public EntityZombieHusk(EntityTypes<? extends EntityZombieHusk> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableHusk; // Purpur
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java
index 5cfda3160..ac460de59 100644
--- a/src/main/java/net/minecraft/server/EntityZombieVillager.java
+++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java
@@ -20,6 +20,7 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHo
public EntityZombieVillager(EntityTypes<? extends EntityZombieVillager> entitytypes, World world) {
super(entitytypes, world);
+ this.isRidable = net.pl3x.purpur.PurpurConfig.ridableZombieVillager; // Purpur
this.setVillagerData(this.getVillagerData().withProfession((VillagerProfession) IRegistry.VILLAGER_PROFESSION.a(this.random)));
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalAvoidTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalAvoidTarget.java
index 6e299144c..3571db9aa 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalAvoidTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalAvoidTarget.java
@@ -18,12 +18,7 @@ public class PathfinderGoalAvoidTarget<T extends EntityLiving> extends Pathfinde
private final PathfinderTargetCondition k;
public PathfinderGoalAvoidTarget(EntityCreature entitycreature, Class<T> oclass, float f, double d0, double d1) {
- Predicate predicate = (entityliving) -> {
- return true;
- };
- Predicate predicate1 = IEntitySelector.e;
-
- this(entitycreature, oclass, predicate, f, d0, d1, predicate1::test);
+ this(entitycreature, oclass, (entityliving) -> true, f, d0, d1, IEntitySelector.e::test); // Purpur - fix decompile error
}
public PathfinderGoalAvoidTarget(EntityCreature entitycreature, Class<T> oclass, Predicate<EntityLiving> predicate, float f, double d0, double d1, Predicate<EntityLiving> predicate1) {
@@ -47,6 +42,7 @@ public class PathfinderGoalAvoidTarget<T extends EntityLiving> extends Pathfinde
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
this.b = this.a.world.a(this.f, this.k, this.a, this.a.locX, this.a.locY, this.a.locZ, this.a.getBoundingBox().grow((double) this.c, 3.0D, (double) this.c));
if (this.b == null) {
return false;
@@ -66,6 +62,7 @@ public class PathfinderGoalAvoidTarget<T extends EntityLiving> extends Pathfinde
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return !this.e.n();
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java
index 9d0b1ffef..88fcf4123 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java
@@ -29,16 +29,18 @@ public class PathfinderGoalBreed extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.animal.getRider() != null) return false; // Purpur
if (!this.animal.isInLove()) {
return false;
} else {
this.partner = this.h();
- return this.partner != null;
+ return this.partner != null && this.partner.getRider() == null; // Purpur
}
}
@Override
public boolean b() {
+ if (this.animal.getRider() != null || this.partner.getRider() != null) return false; // Purpur
return this.partner.isAlive() && this.partner.isInLove() && this.f < 60;
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalCatSitOnBed.java b/src/main/java/net/minecraft/server/PathfinderGoalCatSitOnBed.java
index 8a251cb00..d4754a8c0 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalCatSitOnBed.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalCatSitOnBed.java
@@ -15,6 +15,7 @@ public class PathfinderGoalCatSitOnBed extends PathfinderGoalGotoTarget {
@Override
public boolean a() {
+ if (this.g.getRider() != null) return false; // Purpur
return this.g.isTamed() && !this.g.isSitting() && !this.g.eg() && super.a();
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalFollowOwner.java b/src/main/java/net/minecraft/server/PathfinderGoalFollowOwner.java
index 896d2d56a..55318e137 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalFollowOwner.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalFollowOwner.java
@@ -34,6 +34,7 @@ public class PathfinderGoalFollowOwner extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
EntityLiving entityliving = this.a.getOwner();
if (entityliving == null) {
@@ -52,6 +53,7 @@ public class PathfinderGoalFollowOwner extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return !this.e.n() && this.a.h((Entity) this.c) > (double) (this.g * this.g) && !this.a.isSitting();
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalGotoTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalGotoTarget.java
index 5c2b7b0a5..6f2d0ce7b 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalGotoTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalGotoTarget.java
@@ -31,6 +31,7 @@ public abstract class PathfinderGoalGotoTarget extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
if (this.c > 0) {
--this.c;
return false;
@@ -46,6 +47,7 @@ public abstract class PathfinderGoalGotoTarget extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return this.d >= -this.g && this.d <= 1200 && this.a(this.a.world, this.e);
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java
index dc9652a5e..3b5989ddb 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java
@@ -20,6 +20,7 @@ public class PathfinderGoalHurtByTarget extends PathfinderGoalTarget {
@Override
public boolean a() {
+ if (this.e.getRider() != null) return false; // Purpur
int i = this.e.cs();
EntityLiving entityliving = this.e.getLastDamager();
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java b/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java
index 84d2cf8df..856a79653 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalJumpOnBlock.java
@@ -11,6 +11,7 @@ public class PathfinderGoalJumpOnBlock extends PathfinderGoalGotoTarget {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
return this.g.isTamed() && !this.g.isSitting() && super.a();
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalLeapAtTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalLeapAtTarget.java
index b89d16136..08767e28b 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalLeapAtTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalLeapAtTarget.java
@@ -16,6 +16,7 @@ public class PathfinderGoalLeapAtTarget extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
if (this.a.isVehicle()) {
return false;
} else {
@@ -32,6 +33,7 @@ public class PathfinderGoalLeapAtTarget extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return !this.a.onGround;
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalLookAtPlayer.java b/src/main/java/net/minecraft/server/PathfinderGoalLookAtPlayer.java
index 614a8471d..a57752bd2 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalLookAtPlayer.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalLookAtPlayer.java
@@ -34,6 +34,7 @@ public class PathfinderGoalLookAtPlayer extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
if (this.a.getRandom().nextFloat() >= this.g) {
return false;
} else {
@@ -53,6 +54,7 @@ public class PathfinderGoalLookAtPlayer extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return !this.b.isAlive() ? false : (this.a.h(this.b) > (double) (this.c * this.c) ? false : this.f > 0);
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java
index 702a75087..6d49d8437 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java
@@ -25,6 +25,7 @@ public class PathfinderGoalMeleeAttack extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
long i = this.a.world.getTime();
if (i - this.k < 20L) {
@@ -46,6 +47,7 @@ public class PathfinderGoalMeleeAttack extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
EntityLiving entityliving = this.a.getGoalTarget();
return entityliving == null ? false : (!entityliving.isAlive() ? false : (!this.e ? !this.a.getNavigation().n() : (!this.a.a(new BlockPosition(entityliving)) ? false : !(entityliving instanceof EntityHuman) || !entityliving.isSpectator() && !((EntityHuman) entityliving).isCreative())));
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java
index 53399e311..d03130fcf 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java
@@ -29,6 +29,7 @@ public class PathfinderGoalNearestAttackableTarget<T extends EntityLiving> exten
@Override
public boolean a() {
+ if (this.e.getRider() != null) return false; // Purpur
if (this.b > 0 && this.e.getRandom().nextInt(this.b) != 0) {
return false;
} else {
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java
index bf52ecc40..2bb7e0c1e 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java
@@ -17,6 +17,7 @@ public class PathfinderGoalOcelotAttack extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.b.getRider() != null) return false; // Purpur
EntityLiving entityliving = this.b.getGoalTarget();
if (entityliving == null) {
@@ -29,6 +30,7 @@ public class PathfinderGoalOcelotAttack extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.b.getRider() != null) return false; // Purpur
return !this.c.isAlive() ? false : (this.b.h((Entity) this.c) > 225.0D ? false : !this.b.getNavigation().n() || this.a());
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRandomLookaround.java b/src/main/java/net/minecraft/server/PathfinderGoalRandomLookaround.java
index 316205ebf..8cc9f4fe1 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalRandomLookaround.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRandomLookaround.java
@@ -16,11 +16,13 @@ public class PathfinderGoalRandomLookaround extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
return this.a.getRandom().nextFloat() < 0.02F;
}
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return this.d >= 0;
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java b/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java
index e92eb3019..4b7c33af5 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRandomStroll.java
@@ -26,6 +26,7 @@ public class PathfinderGoalRandomStroll extends PathfinderGoal {
@Override
public boolean a() {
+ if (this.a.getRider() != null) return false; // Purpur
if (this.a.isVehicle()) {
return false;
} else {
@@ -60,6 +61,7 @@ public class PathfinderGoalRandomStroll extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.a.getRider() != null) return false; // Purpur
return !this.a.getNavigation().n();
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalRandomTargetNonTamed.java b/src/main/java/net/minecraft/server/PathfinderGoalRandomTargetNonTamed.java
index f572f3367..218c35bf7 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalRandomTargetNonTamed.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalRandomTargetNonTamed.java
@@ -14,11 +14,13 @@ public class PathfinderGoalRandomTargetNonTamed<T extends EntityLiving> extends
@Override
public boolean a() {
+ if (this.i.getRider() != null) return false; // Purpur
return !this.i.isTamed() && super.a();
}
@Override
public boolean b() {
+ if (this.i.getRider() != null) return false; // Purpur
return this.d != null ? this.d.a(this.e, this.c) : super.b();
}
}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSit.java b/src/main/java/net/minecraft/server/PathfinderGoalSit.java
index 211602083..cdb1393bf 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalSit.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalSit.java
@@ -14,11 +14,13 @@ public class PathfinderGoalSit extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.entity.getRider() != null) return false; // Purpur
return this.willSit;
}
@Override
public boolean a() {
+ if (this.entity.getRider() != null) return false; // Purpur
if (!this.entity.isTamed()) {
return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals
} else if (this.entity.au()) {
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalTarget.java
index 95afc8eee..59a50e549 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalTarget.java
@@ -27,6 +27,7 @@ public abstract class PathfinderGoalTarget extends PathfinderGoal {
@Override
public boolean b() {
+ if (this.e.getRider() != null) return false; // Purpur
EntityLiving entityliving = this.e.getGoalTarget();
if (entityliving == null) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 8f3367ae1..1f8e83110 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -103,6 +103,11 @@ public class PurpurConfig {
return config.getString(path, config.getString(path));
}
+ public static boolean requireShiftToMount = true;
+ private static void requireShiftToMount() {
+ requireShiftToMount = getBoolean("settings.mobs.require-shift-to-mount", requireShiftToMount);
+ }
+
public static int feedMushroomsToCows = 5;
private static void cowsSettings() {
feedMushroomsToCows = getInt("settings.mobs.cow.feed-mushrooms-for-mooshroom", feedMushroomsToCows);
@@ -114,4 +119,135 @@ public class PurpurConfig {
snowmanDropsPumpkin = getBoolean("settings.mobs.snow_golem.drops-pumpkin-when-sheared", snowmanDropsPumpkin);
snowmanPumpkinPutBack = getBoolean("settings.mobs.snow_golem.pumpkin-can-be-added-back", snowmanPumpkinPutBack);
}
+
+ public static boolean ridableBat = true;
+ public static boolean ridableBlaze = true;
+ public static boolean ridableCat = true;
+ public static boolean ridableCaveSpider = true;
+ public static boolean ridableChicken = true;
+ public static boolean ridableCod = true;
+ public static boolean ridableCow = true;
+ public static boolean ridableCreeper = true;
+ public static boolean ridableDolphin = true;
+ public static boolean ridableDonkey = true;
+ public static boolean ridableDrowned = true;
+ public static boolean ridableEnderDragon = true;
+ public static boolean ridableEnderman = true;
+ public static boolean ridableEndermite = true;
+ public static boolean ridableEvoker = true;
+ public static boolean ridableFox = true;
+ public static boolean ridableGhast = true;
+ public static boolean ridableGiant = true;
+ public static boolean ridableGuardian = true;
+ public static boolean ridableElderGuardian = true;
+ public static boolean ridableHorse = true;
+ public static boolean ridableIllusioner = true;
+ public static boolean ridableIronGolem = true;
+ public static boolean ridableLlama = true;
+ public static boolean ridableLlamaTrader = true;
+ public static boolean ridableMagmaCube = true;
+ public static boolean ridableMooshroom = true;
+ public static boolean ridableMule = true;
+ public static boolean ridableOcelot = true;
+ public static boolean ridablePanda = true;
+ public static boolean ridableParrot = true;
+ public static boolean ridablePhantom = true;
+ public static boolean ridablePig = true;
+ public static boolean ridableZombiePigman = true;
+ public static boolean ridablePillager = true;
+ public static boolean ridablePolarBear = true;
+ public static boolean ridablePufferfish = true;
+ public static boolean ridableRabbit = true;
+ public static boolean ridableRavager = true;
+ public static boolean ridableSalmon = true;
+ public static boolean ridableSheep = true;
+ public static boolean ridableShulker = true;
+ public static boolean ridableSilverfish = true;
+ public static boolean ridableSkeleton = true;
+ public static boolean ridableSkeletonHorse = true;
+ public static boolean ridableStray = true;
+ public static boolean ridableSlime = true;
+ public static boolean ridableSnowGolem = true;
+ public static boolean ridableSpider = true;
+ public static boolean ridableSquid = true;
+ public static boolean ridableTropicalFish = true;
+ public static boolean ridableTurtle = true;
+ public static boolean ridableVex = true;
+ public static boolean ridableVillager = true;
+ public static boolean ridableVindicator = true;
+ public static boolean ridableWanderingTrader = true;
+ public static boolean ridableWitch = true;
+ public static boolean ridableWither = true;
+ public static boolean ridableWitherSkeleton = true;
+ public static boolean ridableWolf = true;
+ public static boolean ridableZombie = true;
+ public static boolean ridableZombieHorse = true;
+ public static boolean ridableHusk = true;
+ public static boolean ridableZombieVillager = true;
+ private static void enableRidableMobs() {
+ ridableBat = getBoolean("settings.ridable.bat", ridableBat);
+ ridableBlaze = getBoolean("settings.ridable.blaze", ridableBlaze);
+ ridableCat = getBoolean("settings.ridable.cat", ridableCat);
+ ridableCaveSpider = getBoolean("settings.ridable.cave_spider", ridableCaveSpider);
+ ridableChicken = getBoolean("settings.ridable.chicken", ridableChicken);
+ ridableCod = getBoolean("settings.ridable.cod", ridableCod);
+ ridableCow = getBoolean("settings.ridable.cow", ridableCow);
+ ridableCreeper = getBoolean("settings.ridable.creeper", ridableCreeper);
+ ridableDolphin = getBoolean("settings.ridable.dolphin", ridableDolphin);
+ ridableDonkey = getBoolean("settings.ridable.donkey", ridableDonkey);
+ ridableDrowned = getBoolean("settings.ridable.drowned", ridableDrowned);
+ ridableElderGuardian = getBoolean("settings.ridable.elder_guardian", ridableElderGuardian);
+ ridableEnderDragon = getBoolean("settings.ridable.ender_dragon", ridableEnderDragon);
+ ridableEnderman = getBoolean("settings.ridable.enderman", ridableEnderman);
+ ridableEndermite = getBoolean("settings.ridable.endermite", ridableEndermite);
+ ridableEvoker = getBoolean("settings.ridable.evoker", ridableEvoker);
+ ridableFox = getBoolean("settings.ridable.fox", ridableFox);
+ ridableGhast = getBoolean("settings.ridable.ghast", ridableGhast);
+ ridableGiant = getBoolean("settings.ridable.giant", ridableGiant);
+ ridableGuardian = getBoolean("settings.ridable.guardian", ridableGuardian);
+ ridableHorse = getBoolean("settings.ridable.horse", ridableHorse);
+ ridableHusk = getBoolean("settings.ridable.husk", ridableHusk);
+ ridableIllusioner = getBoolean("settings.ridable.illusioner", ridableIllusioner);
+ ridableIronGolem = getBoolean("settings.ridable.iron_golem", ridableIronGolem);
+ ridableLlama = getBoolean("settings.ridable.llama", ridableLlama);
+ ridableLlamaTrader = getBoolean("settings.ridable.trader_llama", ridableLlamaTrader);
+ ridableMagmaCube = getBoolean("settings.ridable.magma_cube", ridableMagmaCube);
+ ridableMooshroom = getBoolean("settings.ridable.mooshroom", ridableMooshroom);
+ ridableMule = getBoolean("settings.ridable.mule", ridableMule);
+ ridableOcelot = getBoolean("settings.ridable.ocelot", ridableOcelot);
+ ridablePanda = getBoolean("settings.ridable.panda", ridablePanda);
+ ridableParrot = getBoolean("settings.ridable.parrot", ridableParrot);
+ ridablePhantom = getBoolean("settings.ridable.phantom", ridablePhantom);
+ ridablePig = getBoolean("settings.ridable.pig", ridablePig);
+ ridablePillager = getBoolean("settings.ridable.pillager", ridablePillager);
+ ridablePolarBear = getBoolean("settings.ridable.polar_bear", ridablePolarBear);
+ ridablePufferfish = getBoolean("settings.ridable.pufferfish", ridablePufferfish);
+ ridableRabbit = getBoolean("settings.ridable.rabbit", ridableRabbit);
+ ridableRavager = getBoolean("settings.ridable.ravager", ridableRavager);
+ ridableSalmon = getBoolean("settings.ridable.salmon", ridableSalmon);
+ ridableSheep = getBoolean("settings.ridable.sheep", ridableSheep);
+ ridableShulker = getBoolean("settings.ridable.shulker", ridableShulker);
+ ridableSilverfish = getBoolean("settings.ridable.silverfish", ridableSilverfish);
+ ridableSkeleton = getBoolean("settings.ridable.skeleton", ridableSkeleton);
+ ridableSkeletonHorse = getBoolean("settings.ridable.skeleton_horse", ridableSkeletonHorse);
+ ridableSlime = getBoolean("settings.ridable.slime", ridableSlime);
+ ridableSnowGolem = getBoolean("settings.ridable.snow_golem", ridableSnowGolem);
+ ridableSpider = getBoolean("settings.ridable.spider", ridableSpider);
+ ridableSquid = getBoolean("settings.ridable.squid", ridableSquid);
+ ridableStray = getBoolean("settings.ridable.stray", ridableStray);
+ ridableTropicalFish = getBoolean("settings.ridable.tropical_fish", ridableTropicalFish);
+ ridableTurtle = getBoolean("settings.ridable.turtle", ridableTurtle);
+ ridableVex = getBoolean("settings.ridable.vex", ridableVex);
+ ridableVillager = getBoolean("settings.ridable.villager", ridableVillager);
+ ridableVindicator = getBoolean("settings.ridable.vindicator", ridableVindicator);
+ ridableWanderingTrader = getBoolean("settings.ridable.wandering_trader", ridableWanderingTrader);
+ ridableWitch = getBoolean("settings.ridable.witch", ridableWitch);
+ ridableWither = getBoolean("settings.ridable.wither", ridableWither);
+ ridableWitherSkeleton = getBoolean("settings.ridable.skeleton", ridableWitherSkeleton);
+ ridableWolf = getBoolean("settings.ridable.wolf", ridableWolf);
+ ridableZombie = getBoolean("settings.ridable.zombie", ridableZombie);
+ ridableZombieHorse = getBoolean("settings.ridable.zombie_horse", ridableZombieHorse);
+ ridableZombiePigman = getBoolean("settings.ridable.zombie_pigman", ridableZombiePigman);
+ ridableZombieVillager = getBoolean("settings.ridable.zombie_villager", ridableZombieVillager);
+ }
}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
new file mode 100644
index 000000000..99e184d36
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
@@ -0,0 +1,74 @@
+package net.pl3x.purpur.controller;
+
+import net.minecraft.server.ControllerLook;
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityInsentient;
+import net.minecraft.server.MathHelper;
+import net.minecraft.server.PacketPlayOutEntity;
+
+public class ControllerLookWASD extends ControllerLook {
+ protected final EntityInsentient entity;
+ private float yawOffset = 0;
+ private float pitchOffset = 0;
+
+ public ControllerLookWASD(EntityInsentient entity) {
+ super(entity);
+ this.entity = entity;
+ }
+
+ // tick
+ @Override
+ public void a() {
+ if (entity.getRider() != null) {
+ tick(entity.getRider());
+ } else {
+ tick();
+ }
+ }
+
+ protected void tick() {
+ super.a(); // tick
+ }
+
+ protected void tick(EntityHuman rider) {
+ setYawPitch(rider.yaw, rider.pitch);
+ }
+
+ public void setYawPitch(float yaw, float pitch) {
+ entity.yaw = normalizeYaw(yaw + yawOffset);
+ entity.lastYaw = entity.yaw;
+ entity.setRenderYawOffset(entity.yaw);
+ entity.setHeadRotation(entity.yaw);
+ entity.pitch = normalizePitch(pitch + pitchOffset);
+
+ entity.getTracker().broadcast(new PacketPlayOutEntity
+ .PacketPlayOutEntityLook(entity.getId(),
+ (byte) MathHelper.d(entity.yaw * 256.0F / 360.0F),
+ (byte) MathHelper.d(entity.pitch * 256.0F / 360.0F),
+ entity.onGround));
+ }
+
+ public void setOffsets(float yaw, float pitch) {
+ yawOffset = yaw;
+ pitchOffset = pitch;
+ }
+
+ public float normalizeYaw(float yaw) {
+ yaw %= 360.0f;
+ if (yaw >= 180.0f) {
+ yaw -= 360.0f;
+ } else if (yaw < -180.0f) {
+ yaw += 360.0f;
+ }
+ return yaw;
+ }
+
+ public float normalizePitch(float pitch) {
+ if (pitch > 90.0f) {
+ pitch = 90.0f;
+ } else if (pitch < -90.0f) {
+ pitch = -90.0f;
+ }
+ return pitch;
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
new file mode 100644
index 000000000..d64a66274
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
@@ -0,0 +1,77 @@
+package net.pl3x.purpur.controller;
+
+import net.minecraft.server.ControllerMove;
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityInsentient;
+import net.minecraft.server.GenericAttributes;
+
+public class ControllerMoveWASD extends ControllerMove {
+ protected final EntityInsentient entity;
+
+ public ControllerMoveWASD(EntityInsentient entity) {
+ super(entity);
+ this.entity = entity;
+ }
+
+ // isUpdating
+ @Override
+ public boolean b() {
+ return entity.getRider() != null || super.b();
+ }
+
+ // tick
+ @Override
+ public void a() {
+ if (entity.getRider() != null) {
+ tick(entity.getRider());
+ } else {
+ tick();
+ }
+ }
+
+ protected void tick() {
+ super.a(); // tick
+ }
+
+ protected void tick(EntityHuman rider) {
+ float forward = rider.getForward() * 0.5F;
+ float strafe = rider.getStrafe() * 0.25F;
+
+ if (forward <= 0.0F) {
+ forward *= 0.5F;
+ }
+
+ float yawOffset = 0;
+ if (strafe != 0) {
+ if (forward == 0) {
+ yawOffset += strafe > 0 ? -90 : 90;
+ forward = Math.abs(strafe * 2);
+ } else {
+ yawOffset += strafe > 0 ? -30 : 30;
+ strafe /= 2;
+ if (forward < 0) {
+ yawOffset += strafe > 0 ? -110 : 110;
+ forward *= -1;
+ }
+ }
+ } else if (forward < 0) {
+ yawOffset -= 180;
+ forward *= -1;
+ }
+
+ ((ControllerLookWASD) entity.getControllerLook()).setOffsets(yawOffset, 0);
+
+ if (rider.isJumping()) {
+ //RidableSpacebarEvent event = new RidableSpacebarEvent(entity);
+ if (/*event.callEvent() && !event.isHandled() &&*/ !entity.onSpacebar() && entity.onGround) {
+ entity.jump();
+ }
+ }
+
+ entity.setSpeed((float) (e = entity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue()));
+ entity.setForward(forward);
+
+ f = entity.getForward();
+ g = entity.getStrafe();
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java
new file mode 100644
index 000000000..b0b504c7d
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java
@@ -0,0 +1,62 @@
+package net.pl3x.purpur.controller;
+
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityInsentient;
+import net.minecraft.server.GenericAttributes;
+
+public class ControllerMoveWASDFlying extends ControllerMoveWASD {
+ protected final float groundSpeedModifier;
+ protected final double maxY;
+ protected int tooHighCooldown = 0;
+
+ public ControllerMoveWASDFlying(EntityInsentient entity) {
+ this(entity, 1.0F, 256D);
+ }
+
+ public ControllerMoveWASDFlying(EntityInsentient entity, float groundSpeedModifier) {
+ this(entity, groundSpeedModifier, 256D);
+ }
+
+ public ControllerMoveWASDFlying(EntityInsentient entity, float groundSpeedModifier, double maxY) {
+ super(entity);
+ this.groundSpeedModifier = groundSpeedModifier;
+ this.maxY = maxY;
+ }
+
+ @Override
+ public void tick(EntityHuman rider) {
+ float forward = Math.max(0.0F, rider.getForward());
+ float vertical = forward == 0.0F ? 0.0F : -(rider.pitch / 45.0F);
+ float strafe = rider.getStrafe();
+
+ if (rider.isJumping()) {
+ //RidableSpacebarEvent event = new RidableSpacebarEvent(ridable);
+ //Bukkit.getPluginManager().callEvent(event);
+ //if (!event.isCancelled() && !event.isHandled()) {
+ entity.onSpacebar();
+ //}
+ }
+
+ if (entity.locY >= maxY || --tooHighCooldown > 0) {
+ tooHighCooldown = 60;
+ entity.setMot(entity.getMot().add(0.0D, -0.05D, 0.0D));
+ vertical = 0.0F;
+ }
+
+ float speed = (float) (e = entity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue());
+
+ if (entity.onGround) {
+ speed *= groundSpeedModifier; // TODO = fix this!
+ }
+
+ entity.setNoGravity(forward > 0);
+
+ entity.setSpeed(speed);
+ entity.setVertical(vertical);
+ entity.setStrafe(strafe);
+ entity.setForward(forward);
+
+ f = entity.getForward();
+ g = entity.getStrafe();
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java
new file mode 100644
index 000000000..a353069b7
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java
@@ -0,0 +1,65 @@
+package net.pl3x.purpur.controller;
+
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityInsentient;
+import net.minecraft.server.GenericAttributes;
+import net.minecraft.server.Vec3D;
+
+public class ControllerMoveWASDFlyingWithSpacebar extends ControllerMoveWASDFlying {
+ public ControllerMoveWASDFlyingWithSpacebar(EntityInsentient entity) {
+ super(entity);
+ }
+
+ public ControllerMoveWASDFlyingWithSpacebar(EntityInsentient entity, float groundSpeedModifier) {
+ super(entity, groundSpeedModifier);
+ }
+
+ public ControllerMoveWASDFlyingWithSpacebar(EntityInsentient entity, float groundSpeedModifier, double maxY) {
+ super(entity, groundSpeedModifier, maxY);
+ }
+
+ @Override
+ public void tick(EntityHuman rider) {
+ float forward = rider.getForward();
+ float strafe = rider.getStrafe() * 0.5F;
+ float vertical = 0;
+
+ if (forward < 0.0F) {
+ forward *= 0.5F;
+ strafe *= 0.5F;
+ }
+
+ float speed = (float) entity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue();
+
+ if (entity.onGround) {
+ speed *= groundSpeedModifier;
+ }
+
+ //RidableSpacebarEvent event = new RidableSpacebarEvent(ridable);
+ if (rider.isJumping() /*&& event.callEvent() && !event.isHandled()*/ && !entity.onSpacebar()) {
+ entity.setNoGravity(true);
+ vertical = 1.0F;
+ } else {
+ entity.setNoGravity(false);
+ }
+
+ if (entity.locY >= maxY || --tooHighCooldown > 0) {
+ tooHighCooldown = 60;
+ entity.setMot(entity.getMot().add(0.0D, -0.2D, 0.0D));
+ vertical = 0.0F;
+ }
+
+ entity.setSpeed((float) (e = speed));
+ entity.setVertical(vertical);
+ entity.setStrafe(strafe);
+ entity.setForward(forward);
+
+ f = entity.getForward();
+ g = entity.getStrafe();
+
+ Vec3D mot = entity.getMot();
+ if (mot.y > 0.2D) {
+ entity.setMot(mot.x, 0.2D, mot.z);
+ }
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java
new file mode 100644
index 000000000..74ff48259
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java
@@ -0,0 +1,42 @@
+package net.pl3x.purpur.controller;
+
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityInsentient;
+import net.minecraft.server.GenericAttributes;
+
+public class ControllerMoveWASDWater extends ControllerMoveWASD {
+ public ControllerMoveWASDWater(EntityInsentient entity) {
+ super(entity);
+ }
+
+ @Override
+ protected void tick(EntityHuman rider) {
+ float forward = rider.getForward();
+ float strafe = rider.getStrafe() * 0.5F; // strafe slower by default
+ float vertical = -(rider.pitch / 90);
+
+ if (forward == 0.0F) {
+ // strafe slower if not moving forward
+ strafe *= 0.5F;
+ // do not move vertically if not moving forward
+ vertical = 0.0F;
+ } else if (forward < 0.0F) {
+ // water animals can't swim backwards
+ forward = 0.0F;
+ vertical = 0.0F;
+ }
+
+ if (rider.isJumping()) {
+ entity.onSpacebar();
+ }
+
+ entity.setSpeed((float) (e = entity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue()) * 0.1F);
+
+ entity.setForward(forward);
+ entity.setStrafe(strafe);
+ entity.setVertical(vertical);
+
+ f = entity.getForward();
+ g = entity.getStrafe();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 98f62d776..83eeab5c3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -710,5 +710,15 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
public void setSafeFallDistance(float safeFallDistance) {
getHandle().safeFallDistance = safeFallDistance;
}
+
+ @Override
+ public boolean canBeRiddenInWater() {
+ return getHandle().canBeRiddenInWater();
+ }
+
+ @Override
+ public void setCanBeRiddenInWater(boolean canBeRiddenInWater) {
+ getHandle().setCanBeRiddenInWater(canBeRiddenInWater);
+ }
// Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
index 56c233872..b19970c88 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
@@ -75,4 +75,16 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob {
return getHandle().isInDaylight();
}
// Paper end
+
+ // Purpur start
+ @Override
+ public boolean isRidable() {
+ return getHandle().isRidable;
+ }
+
+ @Override
+ public void setRidable(boolean ridable) {
+ getHandle().isRidable = ridable;
+ }
+ // Purpur end
}
--
2.20.1