From e261141247617e84718092a276f296f71297ed60 Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Sat, 1 Jan 2022 15:00:15 +0800 Subject: [PATCH 1/9] Create v1_18_R1 --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 @@ -0,0 +1 @@ + From 491a6f10dc7df08ba74e959592b65c1a84f1bbec Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Sat, 1 Jan 2022 15:00:37 +0800 Subject: [PATCH 2/9] Delete v1_18_R1 --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 deleted file mode 100644 index 8b13789..0000000 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 +++ /dev/null @@ -1 +0,0 @@ - From eda6bebfc7152677e6c5d1ea90c48036d0edf0fe Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Sat, 1 Jan 2022 15:01:21 +0800 Subject: [PATCH 3/9] Create v1_18_R1 --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 @@ -0,0 +1 @@ + From d3b5237105a71e3c6adfc3dd145ca79746e2025d Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Sat, 1 Jan 2022 15:01:44 +0800 Subject: [PATCH 4/9] Delete v1_18_R1 --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 deleted file mode 100644 index 8b13789..0000000 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 +++ /dev/null @@ -1 +0,0 @@ - From 9ef3ac24b1ada037d858cae4dc543da1ea6a51b1 Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Wed, 5 Jan 2022 17:24:37 +0800 Subject: [PATCH 5/9] Revert "Delete v1_18_R1" This reverts commit d3b5237105a71e3c6adfc3dd145ca79746e2025d. --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 @@ -0,0 +1 @@ + From 168b59790628417f5808d0aed3f17aeb13628cd4 Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Wed, 5 Jan 2022 17:26:50 +0800 Subject: [PATCH 6/9] Delete v1_18_R1 --- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 deleted file mode 100644 index 8b13789..0000000 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1 +++ /dev/null @@ -1 +0,0 @@ - From 797bf17d1b4961446e291ad2a25c2c7e7648065d Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Wed, 5 Jan 2022 17:29:21 +0800 Subject: [PATCH 7/9] update to '1.18 R1' update nms v1_18_R1 --- .../nms/v1_18_R1/CustomEntityRegistry.java | 250 ++++++++ .../nms/v1_18_R1/EntityRegister.java | 52 ++ .../dragontravel/nms/v1_18_R1/RyeDragon.java | 544 ++++++++++++++++++ 3 files changed, 846 insertions(+) create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java new file mode 100644 index 0000000..02c8cd3 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java @@ -0,0 +1,250 @@ +/* +This is just a copy/paste of NMS for v1_17_R1. +*/ + +package eu.phiwa.dragontravel.nms.v1_18_R1; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; +import net.minecraft.core.RegistryBlocks; +import net.minecraft.core.RegistryMaterials; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ambient.EntityBat; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.axolotl.Axolotl; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.entity.animal.horse.*; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderCrystal; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.entity.boss.wither.EntityWither; +import net.minecraft.world.entity.decoration.*; +import net.minecraft.world.entity.item.EntityFallingBlock; +import net.minecraft.world.entity.item.EntityItem; +import net.minecraft.world.entity.item.EntityTNTPrimed; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.entity.monster.hoglin.EntityHoglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglinBrute; +import net.minecraft.world.entity.npc.EntityVillager; +import net.minecraft.world.entity.npc.EntityVillagerTrader; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.entity.vehicle.*; + +import java.util.*; + +@SuppressWarnings("rawtypes") +public class CustomEntityRegistry extends RegistryBlocks { + private final BiMap entities = HashBiMap.create(); + private final BiMap entityClasses = this.entities.inverse(); + private final Map entityIds = Maps.newHashMap(); + private final RegistryMaterials> wrapped; + + public CustomEntityRegistry(RegistryBlocks> original) { + //super(original.a().getNamespace(), null, null); + super(original.a().b(), null, null); + this.wrapped = original; + } + + public int a(Object key) { + if (entityIds.containsKey(key)) { + return entityIds.get(key); + } + return key.hashCode(); + } + + @Override + public Object a(Random paramRandom) { + return wrapped.a(paramRandom); + } + + public EntityTypes findType(Class search) { + return minecraftClassMap.inverse().get(search); + /* + for (Object type : wrapped) { + if (minecraftClassMap.get(type) == search) { + return (EntityTypes) type; + } + } + return null; + */ + } + + //@Override + public Object fromId(int var0) { + //return this.wrapped.fromId(var0); + return this.wrapped.a(var0); + } + + //@Override + public EntityTypes get(MinecraftKey key) { + if (entities.containsKey(key)) { + return entities.get(key); + } + + //return wrapped.get(key); + return wrapped.a(key); + } + + //@Override + public MinecraftKey getKey(Object value) { + if (entityClasses.containsKey(value)) { + return entityClasses.get(value); + } + + //return wrapped.getKey((EntityTypes) value); + return wrapped.b((EntityTypes) value); + } + + //@Override + public Optional getOptional(MinecraftKey var0) { + if (entities.containsKey(var0)) { + return Optional.of(entities.get(var0)); + } + + //return this.wrapped.getOptional(var0); + return this.wrapped.b(var0); + } + + public RegistryMaterials> getWrapped() { + return wrapped; + } + + @Override + public Iterator iterator() { + return (Iterator) wrapped.iterator(); + } + + //@Override + public Set keySet() { + //return (Set) wrapped.keySet(); + return (Set) wrapped.d(); + } + + public void put(int entityId, MinecraftKey key, EntityTypes entityClass) { + entities.put(key, entityClass); + entityIds.put(entityClass, entityId); + } + + // replace regex + // ([A-Z_]+).*?a\(E(.*?)::new.*?$ + // minecraftClassMap.put(EntityTypes.\1, E\2.class); + private static final BiMap> minecraftClassMap = HashBiMap.create(); + static { + minecraftClassMap.put(EntityTypes.b, EntityAreaEffectCloud.class); + minecraftClassMap.put(EntityTypes.c, EntityArmorStand.class); + minecraftClassMap.put(EntityTypes.d, EntityTippedArrow.class); + minecraftClassMap.put(EntityTypes.e, Axolotl.class); + minecraftClassMap.put(EntityTypes.f, EntityBat.class); + minecraftClassMap.put(EntityTypes.g, EntityBee.class); + minecraftClassMap.put(EntityTypes.h, EntityBlaze.class); + minecraftClassMap.put(EntityTypes.i, EntityBoat.class); + minecraftClassMap.put(EntityTypes.j, EntityCat.class); + minecraftClassMap.put(EntityTypes.k, EntityCaveSpider.class); + minecraftClassMap.put(EntityTypes.l, EntityChicken.class); + minecraftClassMap.put(EntityTypes.m, EntityCod.class); + minecraftClassMap.put(EntityTypes.n, EntityCow.class); + minecraftClassMap.put(EntityTypes.o, EntityCreeper.class); + minecraftClassMap.put(EntityTypes.p, EntityDolphin.class); + minecraftClassMap.put(EntityTypes.q, EntityHorseDonkey.class); + minecraftClassMap.put(EntityTypes.r, EntityDragonFireball.class); + minecraftClassMap.put(EntityTypes.s, EntityDrowned.class); + minecraftClassMap.put(EntityTypes.t, EntityGuardianElder.class); + minecraftClassMap.put(EntityTypes.u, EntityEnderCrystal.class); + minecraftClassMap.put(EntityTypes.v, EntityEnderDragon.class); + minecraftClassMap.put(EntityTypes.w, EntityEnderman.class); + minecraftClassMap.put(EntityTypes.x, EntityEndermite.class); + minecraftClassMap.put(EntityTypes.y, EntityEvoker.class); + minecraftClassMap.put(EntityTypes.z, EntityEvokerFangs.class); + minecraftClassMap.put(EntityTypes.A, EntityExperienceOrb.class); + minecraftClassMap.put(EntityTypes.B, EntityEnderSignal.class); + minecraftClassMap.put(EntityTypes.C, EntityFallingBlock.class); + minecraftClassMap.put(EntityTypes.D, EntityFireworks.class); + minecraftClassMap.put(EntityTypes.E, EntityFox.class); + minecraftClassMap.put(EntityTypes.F, EntityGhast.class); + minecraftClassMap.put(EntityTypes.G, EntityGiantZombie.class); + minecraftClassMap.put(EntityTypes.H, GlowItemFrame.class); + minecraftClassMap.put(EntityTypes.I, GlowSquid.class); + minecraftClassMap.put(EntityTypes.J, Goat.class); + minecraftClassMap.put(EntityTypes.K, EntityGuardian.class); + minecraftClassMap.put(EntityTypes.L, EntityHoglin.class); + minecraftClassMap.put(EntityTypes.M, EntityHorse.class); + minecraftClassMap.put(EntityTypes.N, EntityZombieHusk.class); + minecraftClassMap.put(EntityTypes.O, EntityIllagerIllusioner.class); + minecraftClassMap.put(EntityTypes.P, EntityIronGolem.class); + minecraftClassMap.put(EntityTypes.Q, EntityItem.class); + minecraftClassMap.put(EntityTypes.R, EntityItemFrame.class); + minecraftClassMap.put(EntityTypes.S, EntityLargeFireball.class); + minecraftClassMap.put(EntityTypes.T, EntityLeash.class); + minecraftClassMap.put(EntityTypes.U, EntityLightning.class); + minecraftClassMap.put(EntityTypes.V, EntityLlama.class); + minecraftClassMap.put(EntityTypes.W, EntityLlamaSpit.class); + minecraftClassMap.put(EntityTypes.X, EntityMagmaCube.class); + minecraftClassMap.put(EntityTypes.Y, Marker.class); + minecraftClassMap.put(EntityTypes.Z, EntityMinecartRideable.class); + minecraftClassMap.put(EntityTypes.aa, EntityMinecartChest.class); + minecraftClassMap.put(EntityTypes.ab, EntityMinecartCommandBlock.class); + minecraftClassMap.put(EntityTypes.ac, EntityMinecartFurnace.class); + minecraftClassMap.put(EntityTypes.ad, EntityMinecartHopper.class); + minecraftClassMap.put(EntityTypes.ae, EntityMinecartMobSpawner.class); + minecraftClassMap.put(EntityTypes.af, EntityMinecartTNT.class); + minecraftClassMap.put(EntityTypes.ag, EntityHorseMule.class); + minecraftClassMap.put(EntityTypes.ah, EntityMushroomCow.class); + minecraftClassMap.put(EntityTypes.ai, EntityOcelot.class); + minecraftClassMap.put(EntityTypes.aj, EntityPainting.class); + minecraftClassMap.put(EntityTypes.ak, EntityPanda.class); + minecraftClassMap.put(EntityTypes.al, EntityParrot.class); + minecraftClassMap.put(EntityTypes.am, EntityPhantom.class); + minecraftClassMap.put(EntityTypes.an, EntityPig.class); + minecraftClassMap.put(EntityTypes.ao, EntityPiglin.class); + minecraftClassMap.put(EntityTypes.ap, EntityPiglinBrute.class); + minecraftClassMap.put(EntityTypes.aq, EntityPillager.class); + minecraftClassMap.put(EntityTypes.ar, EntityPolarBear.class); + minecraftClassMap.put(EntityTypes.as, EntityTNTPrimed.class); + minecraftClassMap.put(EntityTypes.at, EntityPufferFish.class); + minecraftClassMap.put(EntityTypes.au, EntityRabbit.class); + minecraftClassMap.put(EntityTypes.av, EntityRavager.class); + minecraftClassMap.put(EntityTypes.aw, EntitySalmon.class); + minecraftClassMap.put(EntityTypes.ax, EntitySheep.class); + minecraftClassMap.put(EntityTypes.ay, EntityShulker.class); + minecraftClassMap.put(EntityTypes.az, EntityShulkerBullet.class); + minecraftClassMap.put(EntityTypes.aA, EntitySilverfish.class); + minecraftClassMap.put(EntityTypes.aB, EntitySkeleton.class); + minecraftClassMap.put(EntityTypes.aC, EntityHorseSkeleton.class); + minecraftClassMap.put(EntityTypes.aD, EntitySlime.class); + minecraftClassMap.put(EntityTypes.aE, EntitySmallFireball.class); + minecraftClassMap.put(EntityTypes.aF, EntitySnowman.class); + minecraftClassMap.put(EntityTypes.aG, EntitySnowball.class); + minecraftClassMap.put(EntityTypes.aH, EntitySpectralArrow.class); + minecraftClassMap.put(EntityTypes.aI, EntitySpider.class); + minecraftClassMap.put(EntityTypes.aJ, EntitySquid.class); + minecraftClassMap.put(EntityTypes.aK, EntitySkeletonStray.class); + minecraftClassMap.put(EntityTypes.aL, EntityStrider.class); + minecraftClassMap.put(EntityTypes.aM, EntityEgg.class); + minecraftClassMap.put(EntityTypes.aN, EntityEnderPearl.class); + minecraftClassMap.put(EntityTypes.aO, EntityThrownExpBottle.class); + minecraftClassMap.put(EntityTypes.aP, EntityPotion.class); + minecraftClassMap.put(EntityTypes.aQ, EntityThrownTrident.class); + minecraftClassMap.put(EntityTypes.aR, EntityLlamaTrader.class); + minecraftClassMap.put(EntityTypes.aS, EntityTropicalFish.class); + minecraftClassMap.put(EntityTypes.aT, EntityTurtle.class); + minecraftClassMap.put(EntityTypes.aU, EntityVex.class); + minecraftClassMap.put(EntityTypes.aV, EntityVillager.class); + minecraftClassMap.put(EntityTypes.aW, EntityVindicator.class); + minecraftClassMap.put(EntityTypes.aX, EntityVillagerTrader.class); + minecraftClassMap.put(EntityTypes.aY, EntityWitch.class); + minecraftClassMap.put(EntityTypes.aZ, EntityWither.class); + minecraftClassMap.put(EntityTypes.ba, EntitySkeletonWither.class); + minecraftClassMap.put(EntityTypes.bb, EntityWitherSkull.class); + minecraftClassMap.put(EntityTypes.bc, EntityWolf.class); + minecraftClassMap.put(EntityTypes.bd, EntityZoglin.class); + minecraftClassMap.put(EntityTypes.be, EntityZombie.class); + minecraftClassMap.put(EntityTypes.bf, EntityHorseZombie.class); + minecraftClassMap.put(EntityTypes.bg, EntityZombieVillager.class); + minecraftClassMap.put(EntityTypes.bh, EntityPigZombie.class); + minecraftClassMap.put(EntityTypes.bi, EntityHuman.class); + minecraftClassMap.put(EntityTypes.bj, EntityFishingHook.class); + } +} \ No newline at end of file diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java new file mode 100644 index 0000000..71480d0 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java @@ -0,0 +1,52 @@ +/* +This is just a copy/paste of NMS for v1_17_R1. +*/ + + +package eu.phiwa.dragontravel.nms.v1_18_R1; + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IEntityRegister; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityTypes; +import org.bukkit.Bukkit; + +import java.util.HashMap; +import java.util.Map; + +public class EntityRegister implements IEntityRegister { + private static CustomEntityRegistry ENTITY_REGISTRY; + private static final Map, EntityTypes> DRAGONTRAVEL_ENTITY_TYPES = new HashMap, EntityTypes>(); + + public void registerEntityClass(Class clazz) { + if (ENTITY_REGISTRY == null) + return; + + Class search = clazz; + while ((search = search.getSuperclass()) != null && Entity.class.isAssignableFrom(search)) { + EntityTypes type = ENTITY_REGISTRY.findType(search); + MinecraftKey key = ENTITY_REGISTRY.getKey(type); + if (key == null || type == null) + continue; + DRAGONTRAVEL_ENTITY_TYPES.put(clazz, type); + int code = ENTITY_REGISTRY.a(type); + ENTITY_REGISTRY.put(code, key, type); + return; + } + throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz); + } + + @Override + public boolean registerEntity() { + try { + registerEntityClass( RyeDragon.class ); + return true; + } catch (Exception e) { + Bukkit.getLogger().info("[DragonTravel] [Error] Could not register the RyeDragon-entity!"); + e.printStackTrace(); + Bukkit.getPluginManager().disablePlugin(DragonTravel.getInstance()); + } + return false; + } +} diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java new file mode 100644 index 0000000..f2e45b8 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java @@ -0,0 +1,544 @@ +/* +This is just a copy/paste of NMS for v1_17_R1. +*/ + + +package eu.phiwa.dragontravel.nms.v1_18_R1; + + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IRyeDragon; +import eu.phiwa.dragontravel.core.movement.DragonType; +import eu.phiwa.dragontravel.core.movement.flight.Flight; +import net.minecraft.core.BlockPosition; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.level.World; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.util.CraftChatMessage; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.material.MaterialData; +import org.bukkit.util.Vector; + +public class RyeDragon extends EntityEnderDragon implements IRyeDragon { + + private final int wingCoolDown = 10; + private final int travelY = DragonTravel.getInstance().getConfigHandler().getTravelHeight(); + + private DragonType dragonType = DragonType.STATIONARY; + + private Player rider; + + // Source location + private Location fromLoc; + + // Target location + private Location toLoc; + + // Flight + private Flight flight; + private int currentWayPointIndex; + + // Travel + private Location midLocA; // Middle location source world + private Location midLocB; // Middle location target world + private boolean finalMove = false; + + private double xPerTick; + private double yPerTick; + private double zPerTick; + + public RyeDragon(Location loc) { + this(loc, ((CraftWorld) loc.getWorld()).getHandle()); + } + + public RyeDragon(Location loc, World notchWorld) { + super(EntityTypes.v, notchWorld); + e(loc.getX(), loc.getY(), loc.getZ()); + float yaw = loc.getYaw() + 180; + float pitch = 0f; + while (yaw > 360) + yaw -= 360; + while (yaw < 0) + yaw += 360; + notchWorld.b(this); + //notchWorld.addEntity(this); IWorldWriter.class + } + + public RyeDragon(World notchWorld) { + super(EntityTypes.v, notchWorld); + } + + + /** + * This method is a natural method of the Enderdragon extended by the RyeDragon. + * It's fired when the dragon moves and fires the travel-method again to keep the dragon flying. + */ + //public void tick() { + @Override + public void k() { + if (getEntity() != null && rider != null) { + if (getEntity().getPassenger() != null) { + //getEntity().setPassenger(rider); //TODO: Reenable + } + rider.teleport(getEntity()); + } + + if (midLocA != null || toLoc != null) { + Vector a = fromLoc.toVector(); + Vector b = midLocA != null ? midLocA.toVector() : toLoc.toVector(); + double distX = b.getX() - a.getX(); + double distY = b.getY() - a.getY(); + double distZ = b.getZ() - a.getZ(); + + //vector trig functions have to be in rads... + float yaw = 0f, pitch = (float) -Math.atan(distY / Math.sqrt(distX * distX + distZ * distZ)); + + if (distX != 0) { + if (distX < 0) { + yaw = (float) (1.5 * Math.PI); + } else { + yaw = (float) (0.5 * Math.PI); + } + yaw = yaw - (float) Math.atan(distZ / distX); + } else if (distZ < 0) { + yaw = (float) Math.PI; + } + //back to degrees + //setYawPitch(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + a(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + } + + switch (dragonType) { + case LOC_TRAVEL: + case HOME_TRAVEL: + case FACTION_TRAVEL: + case PLAYER_TRAVEL: + case STATION_TRAVEL: + travel(); + break; + case MANNED_FLIGHT: + case TIMED_FLIGHT: + flight(); + break; + default: + break; + } + } + + //1.17-> 1.18 history + //locY() = de() + //locZ() = di() + //locX() = dc() + private void setX( double x ) { + e( x, de(), di() ); + } + private void setY( double y ) { + e( dc(), y, di() ); + } + private void setZ( double z ) { + e( dc(), de(), z ); + } + + /** + * Controls the dragon + */ + @Override + public void flight() { + if ((int) dc() != flight.getWaypoints().get(currentWayPointIndex).getX()) + if (dc() < flight.getWaypoints().get(currentWayPointIndex).getX()) + setX( dc() + xPerTick ); + else + setX( dc() - xPerTick ); + if ((int) de() != flight.getWaypoints().get(currentWayPointIndex).getY()) + if ((int) de() < flight.getWaypoints().get(currentWayPointIndex).getY()) + setY( de() + yPerTick ); + else + setY( de() - yPerTick ); + if ((int) di() != flight.getWaypoints().get(currentWayPointIndex).getZ()) + if (di() < flight.getWaypoints().get(currentWayPointIndex).getZ()) + setZ( di() + zPerTick ); + else + setZ( di() - zPerTick ); + + if ((Math.abs((int) di() - flight.getWaypoints().get(currentWayPointIndex).getZ()) <= 3) && Math.abs((int) dc() - flight.getWaypoints().get(currentWayPointIndex).getX()) <= 3 && (Math.abs((int) de() - flight.getWaypoints().get(currentWayPointIndex).getY()) <= 5)) { + if (currentWayPointIndex == flight.getWaypoints().size() - 1) { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), flight.getWaypoints().get(currentWayPointIndex).getAsLocation()); + return; + } + + this.currentWayPointIndex++; + + this.fromLoc = getEntity().getLocation(); + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + + if (!flight.getWaypoints().get(currentWayPointIndex).getWorldName().equals(this.getEntity().getWorld().getName())) { + Location loc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + BlockPosition pos = new BlockPosition( loc.getX(), loc.getY(), loc.getZ() ); + // [1.15] this.teleportTo(this.dimension, pos); + // [1.16 (1)] this.teleportTo(this.world.getDimensionManager(), pos); + // [1.16 (2)] this.teleportTo((WorldServer)this.world), pos); + this.currentWayPointIndex++; + } + + setMoveFlight(); + } + } + + /** + * Sets the x,y,z move for each tick + */ + @Override + public void setMoveFlight() { + double distX = fromLoc.getX() - flight.getWaypoints().get(currentWayPointIndex).getX(); + double distY = fromLoc.getY() - flight.getWaypoints().get(currentWayPointIndex).getY(); + double distZ = fromLoc.getZ() - flight.getWaypoints().get(currentWayPointIndex).getZ(); + double tick = Math.sqrt((distX * distX) + (distY * distY) + + (distZ * distZ)) / DragonTravel.getInstance().getConfigHandler().getSpeed(); + this.xPerTick = Math.abs(distX) / tick; + this.yPerTick = Math.abs(distY) / tick; + this.zPerTick = Math.abs(distZ) / tick; + } + + /** + * Starts the specified flight + * + * @param flight Flight to start + */ + @Override + public void startFlight(Flight flight, DragonType dragonType) { + this.flight = flight; + this.currentWayPointIndex = 0; + this.dragonType = dragonType; + + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + this.fromLoc = getEntity().getLocation(); + + setMoveFlight(); + } + + /** + * Normal Travel + */ + @Override + public void travel() { + if (getEntity().getPassenger() == null) + return; + + double myX = dc(); + double myY = de(); + double myZ = di(); + + if (finalMove) { + // Go down to destination + if ((int) de() > (int) toLoc.getY()) + myY -= DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Go up to destination + else if ((int) de() < (int) toLoc.getY()) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Reached destination + else { + // Interworld travel, dragon reached temporary destination in target world + if (!getEntity().getWorld().getName().equals(toLoc.getWorld().getName())) { + this.rider = (Player) getEntity().getPassenger(); + midLocB.getChunk().load(); + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + DragonTravel.getInstance().getDragonManager().dismount(rider, true); + if (midLocB.getZ() < toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ()))))); + else if (midLocB.getZ() > toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ())))) + 180.0F); + rider.teleport(midLocB); + if (!DragonTravel.getInstance().getDragonManager().mount(rider, false, dragonType)) + return; + if (!DragonTravel.getInstance().getDragonManager().getRiderDragons().containsKey(rider)) + return; + IRyeDragon dragon = DragonTravel.getInstance().getDragonManager().getRiderDragons().get(rider); + dragon.startTravel(toLoc, false, dragonType); + getEntity().remove(); + } + }, 1L); + } + // Dragon reached final destination + else { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), true); + return; + } + } + + // Move player to new location on tick + e(myX, myY, myZ); + + return; + } + + if ((int) de() < travelY) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + + if (myX < toLoc.getX()) + myX += xPerTick; + else + myX -= xPerTick; + + if (myZ < toLoc.getZ()) + myZ += zPerTick; + else + myZ -= zPerTick; + + // For higher travel speeds the accuracy for dismounts needs + // to be decreased to prevent dragons from getting stuck + double maxDiff = DragonTravel.getInstance().getConfigHandler().getSpeed() + 1; + if (Math.abs(myZ - (int) toLoc.getZ()) <= maxDiff + && Math.abs(myX - (int) toLoc.getX()) <= maxDiff) { + finalMove = true; + } + e(myX, myY, myZ); + } + + /** + * ⒉setMoveTravel()->/dt travel + * Sets the x,z move for each tick + */ + @Override + public void setMoveTravel() { + double dist; + double distX; + double distY; + double distZ; + if (midLocA != null) { + dist = fromLoc.distance(midLocA); + distX = fromLoc.getX() - midLocA.getX(); + distY = fromLoc.getY() - midLocA.getY(); + distZ = fromLoc.getZ() - midLocA.getZ(); + } else { + dist = fromLoc.distance(toLoc); + distX = fromLoc.getX() - toLoc.getX(); + distY = fromLoc.getY() - toLoc.getY(); + distZ = fromLoc.getZ() - toLoc.getZ(); + } + double tick = dist / DragonTravel.getInstance().getConfigHandler().getSpeed(); + xPerTick = Math.abs(distX) / tick; + zPerTick = Math.abs(distZ) / tick; + yPerTick = Math.abs(distY) / tick; + } + + /** + * ⒈startTravel()->/dt travel + * Starts a travel to the specified location + * + * @param destLoc Location to start a travel to + */ + @Override + public void startTravel(Location destLoc, boolean interWorld, DragonType dragonType) { + this.dragonType = dragonType; + this.rider = (Player) getEntity().getPassenger(); + this.fromLoc = getEntity().getLocation(); + if (interWorld) { + this.midLocA = new Location(getEntity().getWorld(), dc() + 50 + Math.random() * 100, travelY, di() + 50 + Math.random() * 100); + int scatter = 80; + this.midLocB = destLoc.clone().add(scatter, scatter, scatter); + this.toLoc = destLoc; + } else { + this.toLoc = destLoc; + } + setMoveTravel(); + } + + @Override + public DragonType getDragonType() { + return dragonType; + } + + @Override + public Entity getEntity() { + if (getBukkitEntity() != null) + return getBukkitEntity(); + return null; + } + + /*@Override + public boolean x() { + return super.x(); + }*/ + + + @Override + public boolean d_() { + return super.d_(); + } + + public void fixWings() { + // Artifact of old workaround for wings flipping really fast. + // Method stub is required for interface. + } + + public void setDragonType(DragonType dragonType) { + this.dragonType = dragonType; + } + + public int getWingCoolDown() { + return wingCoolDown; + } + + public Player getRider() { + return rider; + } + + public void setRider(Player rider) { + this.rider = rider; + } + + public Flight getFlight() { + return flight; + } + + public void setFlight(Flight flight) { + this.flight = flight; + } + + public int getCurrentWayPointIndex() { + return currentWayPointIndex; + } + + public void setCurrentWayPointIndex(int currentWayPointIndex) { + this.currentWayPointIndex = currentWayPointIndex; + } + + public boolean isFinalMove() { + return finalMove; + } + + public void setFinalMove(boolean finalMove) { + this.finalMove = finalMove; + } + + public int getTravelY() { + return travelY; + } + + public double getxPerTick() { + return xPerTick; + } + + public void setxPerTick(double xPerTick) { + this.xPerTick = xPerTick; + } + + public double getyPerTick() { + return yPerTick; + } + + public void setyPerTick(double yPerTick) { + this.yPerTick = yPerTick; + } + + public double getzPerTick() { + return zPerTick; + } + + public void setzPerTick(double zPerTick) { + this.zPerTick = zPerTick; + } + + private class WingFixerTask implements Runnable { + + private int id; + private int cooldown; + + public void setId(int id) { + this.id = id; + this.cooldown = wingCoolDown; + } + + @Override + public void run() { + cooldown -= 1; + if (cooldown <= 0) + Bukkit.getScheduler().cancelTask(id); + final Location loc = getEntity().getLocation().add(0, 2, 0); + final Material m[] = new Material[15]; + final MaterialData md[] = new MaterialData[15]; + + int counter = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + m[counter] = loc.clone().add(x, -y, 0).getBlock().getType(); + md[counter] = loc.clone().add(x, -y, 0).getBlock().getState().getData(); + loc.clone().add(x, -y, 0).getBlock().setType(Material.BARRIER); + counter++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0 && y == 0) continue; + m[counter] = loc.clone().add(0, -y, z).getBlock().getType(); + md[counter] = loc.clone().add(0, -y, z).getBlock().getState().getData(); + loc.clone().add(0, -y, z).getBlock().setType(Material.BARRIER); + counter++; + } + if (y == 0) { + loc.getBlock().setType(Material.WATER); + } + if (y == 1) { + loc.clone().add(0, -1, 0).getBlock().setType(Material.AIR); + } + } + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + int count = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + loc.clone().add(x, -y, 0).getBlock().setType(m[count]); + loc.clone().add(x, -y, 0).getBlock().getState().setData(md[count]); + count++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0) continue; + loc.clone().add(0, -y, z).getBlock().setType(m[count]); + loc.clone().add(0, -y, z).getBlock().getState().setData(md[count]); + count++; + } + } + } + }, 20L); + } + } + + @Override + public void setCustomNameVisible(boolean b) { + + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public void setCustomDragonName(String name) { + net.minecraft.network.chat.IChatBaseComponent nameInNewType = CraftChatMessage.fromString(name)[0]; // convert from "name" + + // Call new method + setCustomName(nameInNewType); + } + + // New (in CB 1_13_R1) + public void setCustomName(net.minecraft.network.chat.IChatBaseComponent name) { + super.a(name); + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public String getCustomDragonName() { + // Call new method + net.minecraft.network.chat.IChatBaseComponent nameInNewType = getCustomName(); + return CraftChatMessage.fromComponent(nameInNewType); + } + + // New (in CB 1_13_R1) + public net.minecraft.network.chat.IChatBaseComponent getCustomName() { + return super.Z(); + } + +} From e3090b53df70d74137bb089e1477c34778f69f59 Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Wed, 5 Jan 2022 17:32:10 +0800 Subject: [PATCH 8/9] Modify comments --- .../phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java | 2 +- .../java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java | 2 +- src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java index 02c8cd3..67cd000 100644 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/CustomEntityRegistry.java @@ -1,5 +1,5 @@ /* -This is just a copy/paste of NMS for v1_17_R1. +This is just a copy/paste of NMS for v1_18_R1. */ package eu.phiwa.dragontravel.nms.v1_18_R1; diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java index 71480d0..fe7c1ca 100644 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/EntityRegister.java @@ -1,5 +1,5 @@ /* -This is just a copy/paste of NMS for v1_17_R1. +This is just a copy/paste of NMS for v1_18_R1. */ diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java index f2e45b8..af17149 100644 --- a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R1/RyeDragon.java @@ -1,5 +1,5 @@ /* -This is just a copy/paste of NMS for v1_17_R1. +This is just a copy/paste of NMS for v1_18_R1. */ From 03225f8eb4e7c1e82df531cc55fe73d27c361638 Mon Sep 17 00:00:00 2001 From: Howar <1445570795@qq.com> Date: Thu, 7 Jul 2022 18:22:33 +0800 Subject: [PATCH 9/9] v1_18_R2 and v1_19_R1 NMS update Just for compatibility with 1.18.2 and 1.19, no other changes! --- .../nms/v1_18_R2/CustomEntityRegistry.java | 253 ++++++++ .../nms/v1_18_R2/EntityRegister.java | 52 ++ .../dragontravel/nms/v1_18_R2/RyeDragon.java | 544 ++++++++++++++++++ .../nms/v1_19_R1/CustomEntityRegistry.java | 263 +++++++++ .../nms/v1_19_R1/EntityRegister.java | 52 ++ .../dragontravel/nms/v1_19_R1/RyeDragon.java | 543 +++++++++++++++++ 6 files changed, 1707 insertions(+) create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/CustomEntityRegistry.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/EntityRegister.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/RyeDragon.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/CustomEntityRegistry.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/EntityRegister.java create mode 100644 src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/RyeDragon.java diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/CustomEntityRegistry.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/CustomEntityRegistry.java new file mode 100644 index 0000000..f31e9d1 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/CustomEntityRegistry.java @@ -0,0 +1,253 @@ +/* +This is just a copy/paste of NMS for v1_18_R2. +*/ + +package eu.phiwa.dragontravel.nms.v1_18_R2; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; +import net.minecraft.core.RegistryBlocks; +import net.minecraft.core.RegistryMaterials; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ambient.EntityBat; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.axolotl.Axolotl; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.entity.animal.horse.*; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderCrystal; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.entity.boss.wither.EntityWither; +import net.minecraft.world.entity.decoration.*; +import net.minecraft.world.entity.item.EntityFallingBlock; +import net.minecraft.world.entity.item.EntityItem; +import net.minecraft.world.entity.item.EntityTNTPrimed; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.entity.monster.hoglin.EntityHoglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglinBrute; +import net.minecraft.world.entity.npc.EntityVillager; +import net.minecraft.world.entity.npc.EntityVillagerTrader; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.entity.vehicle.*; + +import java.util.*; + +@SuppressWarnings("rawtypes") +public class CustomEntityRegistry extends RegistryBlocks { + private final BiMap entities = HashBiMap.create(); + private final BiMap entityClasses = this.entities.inverse(); + private final Map entityIds = Maps.newHashMap(); + private final RegistryMaterials> wrapped; + + public CustomEntityRegistry(RegistryBlocks> original) { + //super(original.a().getNamespace(), null, null); + //super(original.a().b(), null, null); + super(original.a().b(), null, null, null); + this.wrapped = original; + } + + @Override + public int a(Object key) { + if (entityIds.containsKey(key)) { + return entityIds.get(key); + } + //return key.hashCode(); + return wrapped.a((EntityTypes) key); + } + + @Override + public Optional a(Random paramRandom) { + return wrapped.a(paramRandom); + } + + public EntityTypes findType(Class search) { + return minecraftClassMap.inverse().get(search); + /* + for (Object type : wrapped) { + if (minecraftClassMap.get(type) == search) { + return (EntityTypes) type; + } + } + return null; + */ + } + + //@Override + public Object fromId(int var0) { + //return this.wrapped.fromId(var0); + return this.wrapped.a(var0); + } + + //@Override + public EntityTypes get(MinecraftKey key) { + if (entities.containsKey(key)) { + return entities.get(key); + } + + //return wrapped.get(key); + return wrapped.a(key); + } + + //@Override + public MinecraftKey getKey(Object value) { + if (entityClasses.containsKey(value)) { + return entityClasses.get(value); + } + + //return wrapped.getKey((EntityTypes) value); + return wrapped.b((EntityTypes) value); + } + + //@Override + public Optional getOptional(MinecraftKey var0) { + if (entities.containsKey(var0)) { + return Optional.of(entities.get(var0)); + } + + //return this.wrapped.getOptional(var0); + return this.wrapped.b(var0); + } + + public RegistryMaterials> getWrapped() { + return wrapped; + } + + @Override + public Iterator iterator() { + return (Iterator) wrapped.iterator(); + } + + //@Override + public Set keySet() { + //return (Set) wrapped.keySet(); + return (Set) wrapped.d(); + } + + public void put(int entityId, MinecraftKey key, EntityTypes entityClass) { + entities.put(key, entityClass); + entityIds.put(entityClass, entityId); + } + + // replace regex + // ([A-Z_]+).*?a\(E(.*?)::new.*?$ + // minecraftClassMap.put(EntityTypes.\1, E\2.class); + private static final BiMap> minecraftClassMap = HashBiMap.create(); + static { + minecraftClassMap.put(EntityTypes.b, EntityAreaEffectCloud.class); + minecraftClassMap.put(EntityTypes.c, EntityArmorStand.class); + minecraftClassMap.put(EntityTypes.d, EntityTippedArrow.class); + minecraftClassMap.put(EntityTypes.e, Axolotl.class); + minecraftClassMap.put(EntityTypes.f, EntityBat.class); + minecraftClassMap.put(EntityTypes.g, EntityBee.class); + minecraftClassMap.put(EntityTypes.h, EntityBlaze.class); + minecraftClassMap.put(EntityTypes.i, EntityBoat.class); + minecraftClassMap.put(EntityTypes.j, EntityCat.class); + minecraftClassMap.put(EntityTypes.k, EntityCaveSpider.class); + minecraftClassMap.put(EntityTypes.l, EntityChicken.class); + minecraftClassMap.put(EntityTypes.m, EntityCod.class); + minecraftClassMap.put(EntityTypes.n, EntityCow.class); + minecraftClassMap.put(EntityTypes.o, EntityCreeper.class); + minecraftClassMap.put(EntityTypes.p, EntityDolphin.class); + minecraftClassMap.put(EntityTypes.q, EntityHorseDonkey.class); + minecraftClassMap.put(EntityTypes.r, EntityDragonFireball.class); + minecraftClassMap.put(EntityTypes.s, EntityDrowned.class); + minecraftClassMap.put(EntityTypes.t, EntityGuardianElder.class); + minecraftClassMap.put(EntityTypes.u, EntityEnderCrystal.class); + minecraftClassMap.put(EntityTypes.v, EntityEnderDragon.class); + minecraftClassMap.put(EntityTypes.w, EntityEnderman.class); + minecraftClassMap.put(EntityTypes.x, EntityEndermite.class); + minecraftClassMap.put(EntityTypes.y, EntityEvoker.class); + minecraftClassMap.put(EntityTypes.z, EntityEvokerFangs.class); + minecraftClassMap.put(EntityTypes.A, EntityExperienceOrb.class); + minecraftClassMap.put(EntityTypes.B, EntityEnderSignal.class); + minecraftClassMap.put(EntityTypes.C, EntityFallingBlock.class); + minecraftClassMap.put(EntityTypes.D, EntityFireworks.class); + minecraftClassMap.put(EntityTypes.E, EntityFox.class); + minecraftClassMap.put(EntityTypes.F, EntityGhast.class); + minecraftClassMap.put(EntityTypes.G, EntityGiantZombie.class); + minecraftClassMap.put(EntityTypes.H, GlowItemFrame.class); + minecraftClassMap.put(EntityTypes.I, GlowSquid.class); + minecraftClassMap.put(EntityTypes.J, Goat.class); + minecraftClassMap.put(EntityTypes.K, EntityGuardian.class); + minecraftClassMap.put(EntityTypes.L, EntityHoglin.class); + minecraftClassMap.put(EntityTypes.M, EntityHorse.class); + minecraftClassMap.put(EntityTypes.N, EntityZombieHusk.class); + minecraftClassMap.put(EntityTypes.O, EntityIllagerIllusioner.class); + minecraftClassMap.put(EntityTypes.P, EntityIronGolem.class); + minecraftClassMap.put(EntityTypes.Q, EntityItem.class); + minecraftClassMap.put(EntityTypes.R, EntityItemFrame.class); + minecraftClassMap.put(EntityTypes.S, EntityLargeFireball.class); + minecraftClassMap.put(EntityTypes.T, EntityLeash.class); + minecraftClassMap.put(EntityTypes.U, EntityLightning.class); + minecraftClassMap.put(EntityTypes.V, EntityLlama.class); + minecraftClassMap.put(EntityTypes.W, EntityLlamaSpit.class); + minecraftClassMap.put(EntityTypes.X, EntityMagmaCube.class); + minecraftClassMap.put(EntityTypes.Y, Marker.class); + minecraftClassMap.put(EntityTypes.Z, EntityMinecartRideable.class); + minecraftClassMap.put(EntityTypes.aa, EntityMinecartChest.class); + minecraftClassMap.put(EntityTypes.ab, EntityMinecartCommandBlock.class); + minecraftClassMap.put(EntityTypes.ac, EntityMinecartFurnace.class); + minecraftClassMap.put(EntityTypes.ad, EntityMinecartHopper.class); + minecraftClassMap.put(EntityTypes.ae, EntityMinecartMobSpawner.class); + minecraftClassMap.put(EntityTypes.af, EntityMinecartTNT.class); + minecraftClassMap.put(EntityTypes.ag, EntityHorseMule.class); + minecraftClassMap.put(EntityTypes.ah, EntityMushroomCow.class); + minecraftClassMap.put(EntityTypes.ai, EntityOcelot.class); + minecraftClassMap.put(EntityTypes.aj, EntityPainting.class); + minecraftClassMap.put(EntityTypes.ak, EntityPanda.class); + minecraftClassMap.put(EntityTypes.al, EntityParrot.class); + minecraftClassMap.put(EntityTypes.am, EntityPhantom.class); + minecraftClassMap.put(EntityTypes.an, EntityPig.class); + minecraftClassMap.put(EntityTypes.ao, EntityPiglin.class); + minecraftClassMap.put(EntityTypes.ap, EntityPiglinBrute.class); + minecraftClassMap.put(EntityTypes.aq, EntityPillager.class); + minecraftClassMap.put(EntityTypes.ar, EntityPolarBear.class); + minecraftClassMap.put(EntityTypes.as, EntityTNTPrimed.class); + minecraftClassMap.put(EntityTypes.at, EntityPufferFish.class); + minecraftClassMap.put(EntityTypes.au, EntityRabbit.class); + minecraftClassMap.put(EntityTypes.av, EntityRavager.class); + minecraftClassMap.put(EntityTypes.aw, EntitySalmon.class); + minecraftClassMap.put(EntityTypes.ax, EntitySheep.class); + minecraftClassMap.put(EntityTypes.ay, EntityShulker.class); + minecraftClassMap.put(EntityTypes.az, EntityShulkerBullet.class); + minecraftClassMap.put(EntityTypes.aA, EntitySilverfish.class); + minecraftClassMap.put(EntityTypes.aB, EntitySkeleton.class); + minecraftClassMap.put(EntityTypes.aC, EntityHorseSkeleton.class); + minecraftClassMap.put(EntityTypes.aD, EntitySlime.class); + minecraftClassMap.put(EntityTypes.aE, EntitySmallFireball.class); + minecraftClassMap.put(EntityTypes.aF, EntitySnowman.class); + minecraftClassMap.put(EntityTypes.aG, EntitySnowball.class); + minecraftClassMap.put(EntityTypes.aH, EntitySpectralArrow.class); + minecraftClassMap.put(EntityTypes.aI, EntitySpider.class); + minecraftClassMap.put(EntityTypes.aJ, EntitySquid.class); + minecraftClassMap.put(EntityTypes.aK, EntitySkeletonStray.class); + minecraftClassMap.put(EntityTypes.aL, EntityStrider.class); + minecraftClassMap.put(EntityTypes.aM, EntityEgg.class); + minecraftClassMap.put(EntityTypes.aN, EntityEnderPearl.class); + minecraftClassMap.put(EntityTypes.aO, EntityThrownExpBottle.class); + minecraftClassMap.put(EntityTypes.aP, EntityPotion.class); + minecraftClassMap.put(EntityTypes.aQ, EntityThrownTrident.class); + minecraftClassMap.put(EntityTypes.aR, EntityLlamaTrader.class); + minecraftClassMap.put(EntityTypes.aS, EntityTropicalFish.class); + minecraftClassMap.put(EntityTypes.aT, EntityTurtle.class); + minecraftClassMap.put(EntityTypes.aU, EntityVex.class); + minecraftClassMap.put(EntityTypes.aV, EntityVillager.class); + minecraftClassMap.put(EntityTypes.aW, EntityVindicator.class); + minecraftClassMap.put(EntityTypes.aX, EntityVillagerTrader.class); + minecraftClassMap.put(EntityTypes.aY, EntityWitch.class); + minecraftClassMap.put(EntityTypes.aZ, EntityWither.class); + minecraftClassMap.put(EntityTypes.ba, EntitySkeletonWither.class); + minecraftClassMap.put(EntityTypes.bb, EntityWitherSkull.class); + minecraftClassMap.put(EntityTypes.bc, EntityWolf.class); + minecraftClassMap.put(EntityTypes.bd, EntityZoglin.class); + minecraftClassMap.put(EntityTypes.be, EntityZombie.class); + minecraftClassMap.put(EntityTypes.bf, EntityHorseZombie.class); + minecraftClassMap.put(EntityTypes.bg, EntityZombieVillager.class); + minecraftClassMap.put(EntityTypes.bh, EntityPigZombie.class); + minecraftClassMap.put(EntityTypes.bi, EntityHuman.class); + minecraftClassMap.put(EntityTypes.bj, EntityFishingHook.class); + } +} \ No newline at end of file diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/EntityRegister.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/EntityRegister.java new file mode 100644 index 0000000..aa97dae --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/EntityRegister.java @@ -0,0 +1,52 @@ +/* +This is just a copy/paste of NMS for v1_18_R2. +*/ + + +package eu.phiwa.dragontravel.nms.v1_18_R2; + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IEntityRegister; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityTypes; +import org.bukkit.Bukkit; + +import java.util.HashMap; +import java.util.Map; + +public class EntityRegister implements IEntityRegister { + private static CustomEntityRegistry ENTITY_REGISTRY; + private static final Map, EntityTypes> DRAGONTRAVEL_ENTITY_TYPES = new HashMap, EntityTypes>(); + + public void registerEntityClass(Class clazz) { + if (ENTITY_REGISTRY == null) + return; + + Class search = clazz; + while ((search = search.getSuperclass()) != null && Entity.class.isAssignableFrom(search)) { + EntityTypes type = ENTITY_REGISTRY.findType(search); + MinecraftKey key = ENTITY_REGISTRY.getKey(type); + if (key == null || type == null) + continue; + DRAGONTRAVEL_ENTITY_TYPES.put(clazz, type); + int code = ENTITY_REGISTRY.a(type); + ENTITY_REGISTRY.put(code, key, type); + return; + } + throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz); + } + + @Override + public boolean registerEntity() { + try { + registerEntityClass( RyeDragon.class ); + return true; + } catch (Exception e) { + Bukkit.getLogger().info("[DragonTravel] [Error] Could not register the RyeDragon-entity!"); + e.printStackTrace(); + Bukkit.getPluginManager().disablePlugin(DragonTravel.getInstance()); + } + return false; + } +} diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/RyeDragon.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/RyeDragon.java new file mode 100644 index 0000000..2997e8f --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_18_R2/RyeDragon.java @@ -0,0 +1,544 @@ +/* +This is just a copy/paste of NMS for v1_18_R2. +*/ + + +package eu.phiwa.dragontravel.nms.v1_18_R2; + + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IRyeDragon; +import eu.phiwa.dragontravel.core.movement.DragonType; +import eu.phiwa.dragontravel.core.movement.flight.Flight; +import net.minecraft.core.BlockPosition; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.level.World; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftChatMessage; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.material.MaterialData; +import org.bukkit.util.Vector; + +public class RyeDragon extends EntityEnderDragon implements IRyeDragon { + + private final int wingCoolDown = 10; + private final int travelY = DragonTravel.getInstance().getConfigHandler().getTravelHeight(); + + private DragonType dragonType = DragonType.STATIONARY; + + private Player rider; + + // Source location + private Location fromLoc; + + // Target location + private Location toLoc; + + // Flight + private Flight flight; + private int currentWayPointIndex; + + // Travel + private Location midLocA; // Middle location source world + private Location midLocB; // Middle location target world + private boolean finalMove = false; + + private double xPerTick; + private double yPerTick; + private double zPerTick; + + public RyeDragon(Location loc) { + this(loc, ((CraftWorld) loc.getWorld()).getHandle()); + } + + public RyeDragon(Location loc, World notchWorld) { + super(EntityTypes.v, notchWorld); + e(loc.getX(), loc.getY(), loc.getZ()); + float yaw = loc.getYaw() + 180; + float pitch = 0f; + while (yaw > 360) + yaw -= 360; + while (yaw < 0) + yaw += 360; + notchWorld.b(this); + //notchWorld.addEntity(this); IWorldWriter.class + } + + public RyeDragon(World notchWorld) { + super(EntityTypes.v, notchWorld); + } + + + /** + * This method is a natural method of the Enderdragon extended by the RyeDragon. + * It's fired when the dragon moves and fires the travel-method again to keep the dragon flying. + */ + //public void tick() { + @Override + public void k() { + if (getEntity() != null && rider != null) { + if (getEntity().getPassenger() != null) { + //getEntity().setPassenger(rider); //TODO: Reenable + } + rider.teleport(getEntity()); + } + + if (midLocA != null || toLoc != null) { + Vector a = fromLoc.toVector(); + Vector b = midLocA != null ? midLocA.toVector() : toLoc.toVector(); + double distX = b.getX() - a.getX(); + double distY = b.getY() - a.getY(); + double distZ = b.getZ() - a.getZ(); + + //vector trig functions have to be in rads... + float yaw = 0f, pitch = (float) -Math.atan(distY / Math.sqrt(distX * distX + distZ * distZ)); + + if (distX != 0) { + if (distX < 0) { + yaw = (float) (1.5 * Math.PI); + } else { + yaw = (float) (0.5 * Math.PI); + } + yaw = yaw - (float) Math.atan(distZ / distX); + } else if (distZ < 0) { + yaw = (float) Math.PI; + } + //back to degrees + //setYawPitch(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + a(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + } + + switch (dragonType) { + case LOC_TRAVEL: + case HOME_TRAVEL: + case FACTION_TRAVEL: + case PLAYER_TRAVEL: + case STATION_TRAVEL: + travel(); + break; + case MANNED_FLIGHT: + case TIMED_FLIGHT: + flight(); + break; + default: + break; + } + } + + //1.17-> 1.18 history + //locY() = de() + //locZ() = di() + //locX() = dc() + private void setX( double x ) { + e( x, de(), di() ); + } + private void setY( double y ) { + e( dc(), y, di() ); + } + private void setZ( double z ) { + e( dc(), de(), z ); + } + + /** + * Controls the dragon + */ + @Override + public void flight() { + if ((int) dc() != flight.getWaypoints().get(currentWayPointIndex).getX()) + if (dc() < flight.getWaypoints().get(currentWayPointIndex).getX()) + setX( dc() + xPerTick ); + else + setX( dc() - xPerTick ); + if ((int) de() != flight.getWaypoints().get(currentWayPointIndex).getY()) + if ((int) de() < flight.getWaypoints().get(currentWayPointIndex).getY()) + setY( de() + yPerTick ); + else + setY( de() - yPerTick ); + if ((int) di() != flight.getWaypoints().get(currentWayPointIndex).getZ()) + if (di() < flight.getWaypoints().get(currentWayPointIndex).getZ()) + setZ( di() + zPerTick ); + else + setZ( di() - zPerTick ); + + if ((Math.abs((int) di() - flight.getWaypoints().get(currentWayPointIndex).getZ()) <= 3) && Math.abs((int) dc() - flight.getWaypoints().get(currentWayPointIndex).getX()) <= 3 && (Math.abs((int) de() - flight.getWaypoints().get(currentWayPointIndex).getY()) <= 5)) { + if (currentWayPointIndex == flight.getWaypoints().size() - 1) { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), flight.getWaypoints().get(currentWayPointIndex).getAsLocation()); + return; + } + + this.currentWayPointIndex++; + + this.fromLoc = getEntity().getLocation(); + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + + if (!flight.getWaypoints().get(currentWayPointIndex).getWorldName().equals(this.getEntity().getWorld().getName())) { + Location loc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + BlockPosition pos = new BlockPosition( loc.getX(), loc.getY(), loc.getZ() ); + // [1.15] this.teleportTo(this.dimension, pos); + // [1.16 (1)] this.teleportTo(this.world.getDimensionManager(), pos); + // [1.16 (2)] this.teleportTo((WorldServer)this.world), pos); + this.currentWayPointIndex++; + } + + setMoveFlight(); + } + } + + /** + * Sets the x,y,z move for each tick + */ + @Override + public void setMoveFlight() { + double distX = fromLoc.getX() - flight.getWaypoints().get(currentWayPointIndex).getX(); + double distY = fromLoc.getY() - flight.getWaypoints().get(currentWayPointIndex).getY(); + double distZ = fromLoc.getZ() - flight.getWaypoints().get(currentWayPointIndex).getZ(); + double tick = Math.sqrt((distX * distX) + (distY * distY) + + (distZ * distZ)) / DragonTravel.getInstance().getConfigHandler().getSpeed(); + this.xPerTick = Math.abs(distX) / tick; + this.yPerTick = Math.abs(distY) / tick; + this.zPerTick = Math.abs(distZ) / tick; + } + + /** + * Starts the specified flight + * + * @param flight Flight to start + */ + @Override + public void startFlight(Flight flight, DragonType dragonType) { + this.flight = flight; + this.currentWayPointIndex = 0; + this.dragonType = dragonType; + + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + this.fromLoc = getEntity().getLocation(); + + setMoveFlight(); + } + + /** + * Normal Travel + */ + @Override + public void travel() { + if (getEntity().getPassenger() == null) + return; + + double myX = dc(); + double myY = de(); + double myZ = di(); + + if (finalMove) { + // Go down to destination + if ((int) de() > (int) toLoc.getY()) + myY -= DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Go up to destination + else if ((int) de() < (int) toLoc.getY()) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Reached destination + else { + // Interworld travel, dragon reached temporary destination in target world + if (!getEntity().getWorld().getName().equals(toLoc.getWorld().getName())) { + this.rider = (Player) getEntity().getPassenger(); + midLocB.getChunk().load(); + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + DragonTravel.getInstance().getDragonManager().dismount(rider, true); + if (midLocB.getZ() < toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ()))))); + else if (midLocB.getZ() > toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ())))) + 180.0F); + rider.teleport(midLocB); + if (!DragonTravel.getInstance().getDragonManager().mount(rider, false, dragonType)) + return; + if (!DragonTravel.getInstance().getDragonManager().getRiderDragons().containsKey(rider)) + return; + IRyeDragon dragon = DragonTravel.getInstance().getDragonManager().getRiderDragons().get(rider); + dragon.startTravel(toLoc, false, dragonType); + getEntity().remove(); + } + }, 1L); + } + // Dragon reached final destination + else { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), true); + return; + } + } + + // Move player to new location on tick + e(myX, myY, myZ); + + return; + } + + if ((int) de() < travelY) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + + if (myX < toLoc.getX()) + myX += xPerTick; + else + myX -= xPerTick; + + if (myZ < toLoc.getZ()) + myZ += zPerTick; + else + myZ -= zPerTick; + + // For higher travel speeds the accuracy for dismounts needs + // to be decreased to prevent dragons from getting stuck + double maxDiff = DragonTravel.getInstance().getConfigHandler().getSpeed() + 1; + if (Math.abs(myZ - (int) toLoc.getZ()) <= maxDiff + && Math.abs(myX - (int) toLoc.getX()) <= maxDiff) { + finalMove = true; + } + e(myX, myY, myZ); + } + + /** + * ⒉setMoveTravel()->/dt travel + * Sets the x,z move for each tick + */ + @Override + public void setMoveTravel() { + double dist; + double distX; + double distY; + double distZ; + if (midLocA != null) { + dist = fromLoc.distance(midLocA); + distX = fromLoc.getX() - midLocA.getX(); + distY = fromLoc.getY() - midLocA.getY(); + distZ = fromLoc.getZ() - midLocA.getZ(); + } else { + dist = fromLoc.distance(toLoc); + distX = fromLoc.getX() - toLoc.getX(); + distY = fromLoc.getY() - toLoc.getY(); + distZ = fromLoc.getZ() - toLoc.getZ(); + } + double tick = dist / DragonTravel.getInstance().getConfigHandler().getSpeed(); + xPerTick = Math.abs(distX) / tick; + zPerTick = Math.abs(distZ) / tick; + yPerTick = Math.abs(distY) / tick; + } + + /** + * ⒈startTravel()->/dt travel + * Starts a travel to the specified location + * + * @param destLoc Location to start a travel to + */ + @Override + public void startTravel(Location destLoc, boolean interWorld, DragonType dragonType) { + this.dragonType = dragonType; + this.rider = (Player) getEntity().getPassenger(); + this.fromLoc = getEntity().getLocation(); + if (interWorld) { + this.midLocA = new Location(getEntity().getWorld(), dc() + 50 + Math.random() * 100, travelY, di() + 50 + Math.random() * 100); + int scatter = 80; + this.midLocB = destLoc.clone().add(scatter, scatter, scatter); + this.toLoc = destLoc; + } else { + this.toLoc = destLoc; + } + setMoveTravel(); + } + + @Override + public DragonType getDragonType() { + return dragonType; + } + + @Override + public Entity getEntity() { + if (getBukkitEntity() != null) + return getBukkitEntity(); + return null; + } + + /*@Override + public boolean x() { + return super.x(); + }*/ + + + @Override + public boolean d_() { + return super.d_(); + } + + public void fixWings() { + // Artifact of old workaround for wings flipping really fast. + // Method stub is required for interface. + } + + public void setDragonType(DragonType dragonType) { + this.dragonType = dragonType; + } + + public int getWingCoolDown() { + return wingCoolDown; + } + + public Player getRider() { + return rider; + } + + public void setRider(Player rider) { + this.rider = rider; + } + + public Flight getFlight() { + return flight; + } + + public void setFlight(Flight flight) { + this.flight = flight; + } + + public int getCurrentWayPointIndex() { + return currentWayPointIndex; + } + + public void setCurrentWayPointIndex(int currentWayPointIndex) { + this.currentWayPointIndex = currentWayPointIndex; + } + + public boolean isFinalMove() { + return finalMove; + } + + public void setFinalMove(boolean finalMove) { + this.finalMove = finalMove; + } + + public int getTravelY() { + return travelY; + } + + public double getxPerTick() { + return xPerTick; + } + + public void setxPerTick(double xPerTick) { + this.xPerTick = xPerTick; + } + + public double getyPerTick() { + return yPerTick; + } + + public void setyPerTick(double yPerTick) { + this.yPerTick = yPerTick; + } + + public double getzPerTick() { + return zPerTick; + } + + public void setzPerTick(double zPerTick) { + this.zPerTick = zPerTick; + } + + private class WingFixerTask implements Runnable { + + private int id; + private int cooldown; + + public void setId(int id) { + this.id = id; + this.cooldown = wingCoolDown; + } + + @Override + public void run() { + cooldown -= 1; + if (cooldown <= 0) + Bukkit.getScheduler().cancelTask(id); + final Location loc = getEntity().getLocation().add(0, 2, 0); + final Material m[] = new Material[15]; + final MaterialData md[] = new MaterialData[15]; + + int counter = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + m[counter] = loc.clone().add(x, -y, 0).getBlock().getType(); + md[counter] = loc.clone().add(x, -y, 0).getBlock().getState().getData(); + loc.clone().add(x, -y, 0).getBlock().setType(Material.BARRIER); + counter++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0 && y == 0) continue; + m[counter] = loc.clone().add(0, -y, z).getBlock().getType(); + md[counter] = loc.clone().add(0, -y, z).getBlock().getState().getData(); + loc.clone().add(0, -y, z).getBlock().setType(Material.BARRIER); + counter++; + } + if (y == 0) { + loc.getBlock().setType(Material.WATER); + } + if (y == 1) { + loc.clone().add(0, -1, 0).getBlock().setType(Material.AIR); + } + } + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + int count = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + loc.clone().add(x, -y, 0).getBlock().setType(m[count]); + loc.clone().add(x, -y, 0).getBlock().getState().setData(md[count]); + count++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0) continue; + loc.clone().add(0, -y, z).getBlock().setType(m[count]); + loc.clone().add(0, -y, z).getBlock().getState().setData(md[count]); + count++; + } + } + } + }, 20L); + } + } + + @Override + public void setCustomNameVisible(boolean b) { + + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public void setCustomDragonName(String name) { + net.minecraft.network.chat.IChatBaseComponent nameInNewType = CraftChatMessage.fromString(name)[0]; // convert from "name" + + // Call new method + setCustomName(nameInNewType); + } + + // New (in CB 1_13_R1) + public void setCustomName(net.minecraft.network.chat.IChatBaseComponent name) { + super.a(name); + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public String getCustomDragonName() { + // Call new method + net.minecraft.network.chat.IChatBaseComponent nameInNewType = getCustomName(); + return CraftChatMessage.fromComponent(nameInNewType); + } + + // New (in CB 1_13_R1) + public net.minecraft.network.chat.IChatBaseComponent getCustomName() { + return super.Z(); + } + +} diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/CustomEntityRegistry.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/CustomEntityRegistry.java new file mode 100644 index 0000000..4977927 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/CustomEntityRegistry.java @@ -0,0 +1,263 @@ +/* +This is just a copy/paste of NMS for v1_19_R1. +*/ + +package eu.phiwa.dragontravel.nms.v1_19_R1; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; +import net.minecraft.core.RegistryBlocks; +import net.minecraft.core.RegistryMaterials; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ambient.EntityBat; +import net.minecraft.world.entity.animal.*; +import net.minecraft.world.entity.animal.allay.Allay; +import net.minecraft.world.entity.animal.axolotl.Axolotl; +import net.minecraft.world.entity.animal.frog.Frog; +import net.minecraft.world.entity.animal.frog.Tadpole; +import net.minecraft.world.entity.animal.goat.Goat; +import net.minecraft.world.entity.animal.horse.*; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderCrystal; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.entity.boss.wither.EntityWither; +import net.minecraft.world.entity.decoration.*; +import net.minecraft.world.entity.item.EntityFallingBlock; +import net.minecraft.world.entity.item.EntityItem; +import net.minecraft.world.entity.item.EntityTNTPrimed; +import net.minecraft.world.entity.monster.*; +import net.minecraft.world.entity.monster.hoglin.EntityHoglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglin; +import net.minecraft.world.entity.monster.piglin.EntityPiglinBrute; +import net.minecraft.world.entity.monster.warden.Warden; +import net.minecraft.world.entity.npc.EntityVillager; +import net.minecraft.world.entity.npc.EntityVillagerTrader; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.entity.vehicle.*; + +import java.util.*; + +@SuppressWarnings("rawtypes") +public class CustomEntityRegistry extends RegistryBlocks { + private final BiMap entities = HashBiMap.create(); + private final BiMap entityClasses = this.entities.inverse(); + private final Map entityIds = Maps.newHashMap(); + private final RegistryMaterials> wrapped; + + public CustomEntityRegistry(RegistryBlocks> original) { + //super(original.a().getNamespace(), null, null); + //super(original.a().b(), null, null); + super(original.a().b(), null, null, null); + this.wrapped = original; + } + + @Override + public int a(Object key) { + if (entityIds.containsKey(key)) { + return entityIds.get(key); + } + //return key.hashCode(); + return wrapped.a((EntityTypes) key); + } + + @Override + public Optional a(RandomSource paramRandom) { + return wrapped.a(paramRandom); + } + + public EntityTypes findType(Class search) { + return minecraftClassMap.inverse().get(search); + /* + for (Object type : wrapped) { + if (minecraftClassMap.get(type) == search) { + return (EntityTypes) type; + } + } + return null; + */ + } + + //@Override + public Object fromId(int var0) { + //return this.wrapped.fromId(var0); + return this.wrapped.a(var0); + } + + //@Override + public EntityTypes get(MinecraftKey key) { + if (entities.containsKey(key)) { + return entities.get(key); + } + + //return wrapped.get(key); + return wrapped.a(key); + } + + //@Override + public MinecraftKey getKey(Object value) { + if (entityClasses.containsKey(value)) { + return entityClasses.get(value); + } + + //return wrapped.getKey((EntityTypes) value); + return wrapped.b((EntityTypes) value); + } + + //@Override + public Optional getOptional(MinecraftKey var0) { + if (entities.containsKey(var0)) { + return Optional.of(entities.get(var0)); + } + + //return this.wrapped.getOptional(var0); + return this.wrapped.b(var0); + } + + public RegistryMaterials> getWrapped() { + return wrapped; + } + + @Override + public Iterator iterator() { + return (Iterator) wrapped.iterator(); + } + + //@Override + public Set keySet() { + //return (Set) wrapped.keySet(); + return (Set) wrapped.d(); + } + + public void put(int entityId, MinecraftKey key, EntityTypes entityClass) { + entities.put(key, entityClass); + entityIds.put(entityClass, entityId); + } + + // replace regex + // ([A-Z_]+).*?a\(E(.*?)::new.*?$ + // minecraftClassMap.put(EntityTypes.\1, E\2.class); + private static final BiMap> minecraftClassMap = HashBiMap.create(); + static { + minecraftClassMap.put(EntityTypes.b, Allay.class); + minecraftClassMap.put(EntityTypes.c, EntityAreaEffectCloud.class); + minecraftClassMap.put(EntityTypes.d, EntityArmorStand.class); + minecraftClassMap.put(EntityTypes.e, EntityTippedArrow.class); + minecraftClassMap.put(EntityTypes.f, Axolotl.class); + minecraftClassMap.put(EntityTypes.g, EntityBat.class); + minecraftClassMap.put(EntityTypes.h, EntityBee.class); + minecraftClassMap.put(EntityTypes.i, EntityBlaze.class); + minecraftClassMap.put(EntityTypes.j, EntityBoat.class); + minecraftClassMap.put(EntityTypes.k, ChestBoat.class); + minecraftClassMap.put(EntityTypes.l, EntityCat.class); + minecraftClassMap.put(EntityTypes.m, EntityCaveSpider.class); + minecraftClassMap.put(EntityTypes.n, EntityChicken.class); + minecraftClassMap.put(EntityTypes.o, EntityCod.class); + minecraftClassMap.put(EntityTypes.p, EntityCow.class); + minecraftClassMap.put(EntityTypes.q, EntityCreeper.class); + minecraftClassMap.put(EntityTypes.r, EntityDolphin.class); + minecraftClassMap.put(EntityTypes.s, EntityHorseDonkey.class); + minecraftClassMap.put(EntityTypes.t, EntityDragonFireball.class); + minecraftClassMap.put(EntityTypes.u, EntityDrowned.class); + minecraftClassMap.put(EntityTypes.v, EntityGuardianElder.class); + minecraftClassMap.put(EntityTypes.w, EntityEnderCrystal.class); + minecraftClassMap.put(EntityTypes.x, EntityEnderDragon.class); + minecraftClassMap.put(EntityTypes.y, EntityEnderman.class); + minecraftClassMap.put(EntityTypes.z, EntityEndermite.class); + minecraftClassMap.put(EntityTypes.A, EntityEvoker.class); + minecraftClassMap.put(EntityTypes.B, EntityEvokerFangs.class); + minecraftClassMap.put(EntityTypes.C, EntityExperienceOrb.class); + minecraftClassMap.put(EntityTypes.D, EntityEnderSignal.class); + minecraftClassMap.put(EntityTypes.E, EntityFallingBlock.class); + minecraftClassMap.put(EntityTypes.F, EntityFireworks.class); + minecraftClassMap.put(EntityTypes.G, EntityFox.class); + minecraftClassMap.put(EntityTypes.H, Frog.class); + minecraftClassMap.put(EntityTypes.I, EntityGhast.class); + minecraftClassMap.put(EntityTypes.J, EntityGiantZombie.class); + minecraftClassMap.put(EntityTypes.K, GlowItemFrame.class); + minecraftClassMap.put(EntityTypes.L, GlowSquid.class); + minecraftClassMap.put(EntityTypes.M, Goat.class); + minecraftClassMap.put(EntityTypes.N, EntityGuardian.class); + minecraftClassMap.put(EntityTypes.O, EntityHoglin.class); + minecraftClassMap.put(EntityTypes.P, EntityHorse.class); + minecraftClassMap.put(EntityTypes.Q, EntityZombieHusk.class); + minecraftClassMap.put(EntityTypes.R, EntityIllagerIllusioner.class); + minecraftClassMap.put(EntityTypes.S, EntityIronGolem.class); + minecraftClassMap.put(EntityTypes.T, EntityItem.class); + minecraftClassMap.put(EntityTypes.U, EntityItemFrame.class); + minecraftClassMap.put(EntityTypes.V, EntityLargeFireball.class); + minecraftClassMap.put(EntityTypes.W, EntityLeash.class); + minecraftClassMap.put(EntityTypes.X, EntityLightning.class); + minecraftClassMap.put(EntityTypes.Y, EntityLlama.class); + minecraftClassMap.put(EntityTypes.Z, EntityLlamaSpit.class); + minecraftClassMap.put(EntityTypes.aa, EntityMagmaCube.class); + minecraftClassMap.put(EntityTypes.ab, Marker.class); + minecraftClassMap.put(EntityTypes.ac, EntityMinecartRideable.class); + minecraftClassMap.put(EntityTypes.ad, EntityMinecartChest.class); + minecraftClassMap.put(EntityTypes.ae, EntityMinecartCommandBlock.class); + minecraftClassMap.put(EntityTypes.af, EntityMinecartFurnace.class); + minecraftClassMap.put(EntityTypes.ag, EntityMinecartHopper.class); + minecraftClassMap.put(EntityTypes.ah, EntityMinecartMobSpawner.class); + minecraftClassMap.put(EntityTypes.ai, EntityMinecartTNT.class); + minecraftClassMap.put(EntityTypes.aj, EntityHorseMule.class); + minecraftClassMap.put(EntityTypes.ak, EntityMushroomCow.class); + minecraftClassMap.put(EntityTypes.al, EntityOcelot.class); + minecraftClassMap.put(EntityTypes.am, EntityPainting.class); + minecraftClassMap.put(EntityTypes.an, EntityPanda.class); + minecraftClassMap.put(EntityTypes.ao, EntityParrot.class); + minecraftClassMap.put(EntityTypes.ap, EntityPhantom.class); + minecraftClassMap.put(EntityTypes.aq, EntityPig.class); + minecraftClassMap.put(EntityTypes.ar, EntityPiglin.class); + minecraftClassMap.put(EntityTypes.as, EntityPiglinBrute.class); + minecraftClassMap.put(EntityTypes.at, EntityPillager.class); + minecraftClassMap.put(EntityTypes.au, EntityPolarBear.class); + minecraftClassMap.put(EntityTypes.av, EntityTNTPrimed.class); + minecraftClassMap.put(EntityTypes.aw, EntityPufferFish.class); + minecraftClassMap.put(EntityTypes.ax, EntityRabbit.class); + minecraftClassMap.put(EntityTypes.ay, EntityRavager.class); + minecraftClassMap.put(EntityTypes.az, EntitySalmon.class); + minecraftClassMap.put(EntityTypes.aA, EntitySheep.class); + minecraftClassMap.put(EntityTypes.aB, EntityShulker.class); + minecraftClassMap.put(EntityTypes.aC, EntityShulkerBullet.class); + minecraftClassMap.put(EntityTypes.aD, EntitySilverfish.class); + minecraftClassMap.put(EntityTypes.aE, EntitySkeleton.class); + minecraftClassMap.put(EntityTypes.aF, EntityHorseSkeleton.class); + minecraftClassMap.put(EntityTypes.aG, EntitySlime.class); + minecraftClassMap.put(EntityTypes.aH, EntitySmallFireball.class); + minecraftClassMap.put(EntityTypes.aI, EntitySnowman.class); + minecraftClassMap.put(EntityTypes.aJ, EntitySnowball.class); + minecraftClassMap.put(EntityTypes.aK, EntitySpectralArrow.class); + minecraftClassMap.put(EntityTypes.aL, EntitySpider.class); + minecraftClassMap.put(EntityTypes.aM, EntitySquid.class); + minecraftClassMap.put(EntityTypes.aN, EntitySkeletonStray.class); + minecraftClassMap.put(EntityTypes.aO, EntityStrider.class); + minecraftClassMap.put(EntityTypes.aP, Tadpole.class); + minecraftClassMap.put(EntityTypes.aQ, EntityEgg.class); + minecraftClassMap.put(EntityTypes.aR, EntityEnderPearl.class); + minecraftClassMap.put(EntityTypes.aS, EntityThrownExpBottle.class); + minecraftClassMap.put(EntityTypes.aT, EntityPotion.class); + minecraftClassMap.put(EntityTypes.aU, EntityThrownTrident.class); + minecraftClassMap.put(EntityTypes.aV, EntityLlamaTrader.class); + minecraftClassMap.put(EntityTypes.aW, EntityTropicalFish.class); + minecraftClassMap.put(EntityTypes.aX, EntityTurtle.class); + minecraftClassMap.put(EntityTypes.aY, EntityVex.class); + minecraftClassMap.put(EntityTypes.aZ, EntityVillager.class); + minecraftClassMap.put(EntityTypes.ba, EntityVindicator.class); + minecraftClassMap.put(EntityTypes.bb, EntityVillagerTrader.class); + minecraftClassMap.put(EntityTypes.bc, Warden.class); + minecraftClassMap.put(EntityTypes.bd, EntityWitch.class); + minecraftClassMap.put(EntityTypes.be, EntityWither.class); + minecraftClassMap.put(EntityTypes.bf, EntitySkeletonWither.class); + minecraftClassMap.put(EntityTypes.bg, EntityWitherSkull.class); + minecraftClassMap.put(EntityTypes.bh, EntityWolf.class); + minecraftClassMap.put(EntityTypes.bi, EntityZoglin.class); + minecraftClassMap.put(EntityTypes.bj, EntityZombie.class); + minecraftClassMap.put(EntityTypes.bk, EntityHorseZombie.class); + minecraftClassMap.put(EntityTypes.bl, EntityZombieVillager.class); + minecraftClassMap.put(EntityTypes.bm, EntityPigZombie.class); + minecraftClassMap.put(EntityTypes.bn, EntityHuman.class); + minecraftClassMap.put(EntityTypes.bo, EntityFishingHook.class); + } +} \ No newline at end of file diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/EntityRegister.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/EntityRegister.java new file mode 100644 index 0000000..752bba4 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/EntityRegister.java @@ -0,0 +1,52 @@ +/* +This is just a copy/paste of NMS for v1_19_R1. +*/ + + +package eu.phiwa.dragontravel.nms.v1_19_R1; + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IEntityRegister; +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityTypes; +import org.bukkit.Bukkit; + +import java.util.HashMap; +import java.util.Map; + +public class EntityRegister implements IEntityRegister { + private static CustomEntityRegistry ENTITY_REGISTRY; + private static final Map, EntityTypes> DRAGONTRAVEL_ENTITY_TYPES = new HashMap, EntityTypes>(); + + public void registerEntityClass(Class clazz) { + if (ENTITY_REGISTRY == null) + return; + + Class search = clazz; + while ((search = search.getSuperclass()) != null && Entity.class.isAssignableFrom(search)) { + EntityTypes type = ENTITY_REGISTRY.findType(search); + MinecraftKey key = ENTITY_REGISTRY.getKey(type); + if (key == null || type == null) + continue; + DRAGONTRAVEL_ENTITY_TYPES.put(clazz, type); + int code = ENTITY_REGISTRY.a(type); + ENTITY_REGISTRY.put(code, key, type); + return; + } + throw new IllegalArgumentException("unable to find valid entity superclass for class " + clazz); + } + + @Override + public boolean registerEntity() { + try { + registerEntityClass( RyeDragon.class ); + return true; + } catch (Exception e) { + Bukkit.getLogger().info("[DragonTravel] [Error] Could not register the RyeDragon-entity!"); + e.printStackTrace(); + Bukkit.getPluginManager().disablePlugin(DragonTravel.getInstance()); + } + return false; + } +} diff --git a/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/RyeDragon.java b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/RyeDragon.java new file mode 100644 index 0000000..18731b8 --- /dev/null +++ b/src/main/java/eu/phiwa/dragontravel/nms/v1_19_R1/RyeDragon.java @@ -0,0 +1,543 @@ +/* +This is just a copy/paste of NMS for v1_19_R1. +*/ + + +package eu.phiwa.dragontravel.nms.v1_19_R1; + + +import eu.phiwa.dragontravel.core.DragonTravel; +import eu.phiwa.dragontravel.core.hooks.server.IRyeDragon; +import eu.phiwa.dragontravel.core.movement.DragonType; +import eu.phiwa.dragontravel.core.movement.flight.Flight; +import net.minecraft.core.BlockPosition; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; +import net.minecraft.world.level.World; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.util.CraftChatMessage; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.material.MaterialData; +import org.bukkit.util.Vector; + +public class RyeDragon extends EntityEnderDragon implements IRyeDragon { + + private final int wingCoolDown = 10; + private final int travelY = DragonTravel.getInstance().getConfigHandler().getTravelHeight(); + + private DragonType dragonType = DragonType.STATIONARY; + + private Player rider; + + // Source location + private Location fromLoc; + + // Target location + private Location toLoc; + + // Flight + private Flight flight; + private int currentWayPointIndex; + + // Travel + private Location midLocA; // Middle location source world + private Location midLocB; // Middle location target world + private boolean finalMove = false; + + private double xPerTick; + private double yPerTick; + private double zPerTick; + + public RyeDragon(Location loc) { + this(loc, ((CraftWorld) loc.getWorld()).getHandle()); + } + + public RyeDragon(Location loc, World notchWorld) { + super(EntityTypes.x, notchWorld); + e(loc.getX(), loc.getY(), loc.getZ()); + float yaw = loc.getYaw() + 180; + float pitch = 0f; + while (yaw > 360) + yaw -= 360; + while (yaw < 0) + yaw += 360; + notchWorld.b(this); + //notchWorld.addEntity(this); IWorldWriter.class + } + + public RyeDragon(World notchWorld) { + super(EntityTypes.x, notchWorld); + } + + + /** + * This method is a natural method of the Enderdragon extended by the RyeDragon. + * It's fired when the dragon moves and fires the travel-method again to keep the dragon flying. + */ + //public void tick() { + @Override + public void k() { + if (getEntity() != null && rider != null) { + if (getEntity().getPassenger() != null) { + //getEntity().setPassenger(rider); //TODO: Reenable + } + rider.teleport(getEntity()); + } + + if (midLocA != null || toLoc != null) { + Vector a = fromLoc.toVector(); + Vector b = midLocA != null ? midLocA.toVector() : toLoc.toVector(); + double distX = b.getX() - a.getX(); + double distY = b.getY() - a.getY(); + double distZ = b.getZ() - a.getZ(); + + //vector trig functions have to be in rads... + float yaw = 0f, pitch = (float) -Math.atan(distY / Math.sqrt(distX * distX + distZ * distZ)); + + if (distX != 0) { + if (distX < 0) { + yaw = (float) (1.5 * Math.PI); + } else { + yaw = (float) (0.5 * Math.PI); + } + yaw = yaw - (float) Math.atan(distZ / distX); + } else if (distZ < 0) { + yaw = (float) Math.PI; + } + //back to degrees + //setYawPitch(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + a(-yaw * 180F / (float) Math.PI - 180F, pitch * 180F / (float) Math.PI - 180F); + } + + switch (dragonType) { + case LOC_TRAVEL: + case HOME_TRAVEL: + case FACTION_TRAVEL: + case PLAYER_TRAVEL: + case STATION_TRAVEL: + travel(); + break; + case MANNED_FLIGHT: + case TIMED_FLIGHT: + flight(); + break; + default: + break; + } + } + + //locY() = di() + //locZ() = dm() + //locX() = dg() + private void setX( double x ) { + e( x, di(), dm() ); + } + private void setY( double y ) { + e( dg(), y, dm() ); + } + private void setZ( double z ) { + e( dg(), di(), z ); + } + + /** + * Controls the dragon + */ + @Override + public void flight() { + if ((int) dg() != flight.getWaypoints().get(currentWayPointIndex).getX()) + if (dg() < flight.getWaypoints().get(currentWayPointIndex).getX()) + setX( dg() + xPerTick ); + else + setX( dg() - xPerTick ); + if ((int) di() != flight.getWaypoints().get(currentWayPointIndex).getY()) + if ((int) di() < flight.getWaypoints().get(currentWayPointIndex).getY()) + setY( di() + yPerTick ); + else + setY( di() - yPerTick ); + if ((int) dm() != flight.getWaypoints().get(currentWayPointIndex).getZ()) + if (dm() < flight.getWaypoints().get(currentWayPointIndex).getZ()) + setZ( dm() + zPerTick ); + else + setZ( dm() - zPerTick ); + + if ((Math.abs((int) dm() - flight.getWaypoints().get(currentWayPointIndex).getZ()) <= 3) && Math.abs((int) dg() - flight.getWaypoints().get(currentWayPointIndex).getX()) <= 3 && (Math.abs((int) di() - flight.getWaypoints().get(currentWayPointIndex).getY()) <= 5)) { + if (currentWayPointIndex == flight.getWaypoints().size() - 1) { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), flight.getWaypoints().get(currentWayPointIndex).getAsLocation()); + return; + } + + this.currentWayPointIndex++; + + this.fromLoc = getEntity().getLocation(); + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + + if (!flight.getWaypoints().get(currentWayPointIndex).getWorldName().equals(this.getEntity().getWorld().getName())) { + Location loc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + BlockPosition pos = new BlockPosition( loc.getX(), loc.getY(), loc.getZ() ); + // [1.15] this.teleportTo(this.dimension, pos); + // [1.16 (1)] this.teleportTo(this.world.getDimensionManager(), pos); + // [1.16 (2)] this.teleportTo((WorldServer)this.world), pos); + this.currentWayPointIndex++; + } + + setMoveFlight(); + } + } + + /** + * Sets the x,y,z move for each tick + */ + @Override + public void setMoveFlight() { + double distX = fromLoc.getX() - flight.getWaypoints().get(currentWayPointIndex).getX(); + double distY = fromLoc.getY() - flight.getWaypoints().get(currentWayPointIndex).getY(); + double distZ = fromLoc.getZ() - flight.getWaypoints().get(currentWayPointIndex).getZ(); + double tick = Math.sqrt((distX * distX) + (distY * distY) + + (distZ * distZ)) / DragonTravel.getInstance().getConfigHandler().getSpeed(); + this.xPerTick = Math.abs(distX) / tick; + this.yPerTick = Math.abs(distY) / tick; + this.zPerTick = Math.abs(distZ) / tick; + } + + /** + * Starts the specified flight + * + * @param flight Flight to start + */ + @Override + public void startFlight(Flight flight, DragonType dragonType) { + this.flight = flight; + this.currentWayPointIndex = 0; + this.dragonType = dragonType; + + this.toLoc = flight.getWaypoints().get(currentWayPointIndex).getAsLocation(); + this.fromLoc = getEntity().getLocation(); + + setMoveFlight(); + } + + /** + * Normal Travel + */ + @Override + public void travel() { + if (getEntity().getPassenger() == null) + return; + + double myX = dg(); + double myY = di(); + double myZ = dm(); + + if (finalMove) { + // Go down to destination + if ((int) di() > (int) toLoc.getY()) + myY -= DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Go up to destination + else if ((int) di() < (int) toLoc.getY()) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + // Reached destination + else { + // Interworld travel, dragon reached temporary destination in target world + if (!getEntity().getWorld().getName().equals(toLoc.getWorld().getName())) { + this.rider = (Player) getEntity().getPassenger(); + midLocB.getChunk().load(); + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + DragonTravel.getInstance().getDragonManager().dismount(rider, true); + if (midLocB.getZ() < toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ()))))); + else if (midLocB.getZ() > toLoc.getZ()) + midLocB.setYaw((float) (-Math.toDegrees(Math.atan((midLocB.getX() - toLoc.getX()) / (midLocB.getZ() - toLoc.getZ())))) + 180.0F); + rider.teleport(midLocB); + if (!DragonTravel.getInstance().getDragonManager().mount(rider, false, dragonType)) + return; + if (!DragonTravel.getInstance().getDragonManager().getRiderDragons().containsKey(rider)) + return; + IRyeDragon dragon = DragonTravel.getInstance().getDragonManager().getRiderDragons().get(rider); + dragon.startTravel(toLoc, false, dragonType); + getEntity().remove(); + } + }, 1L); + } + // Dragon reached final destination + else { + DragonTravel.getInstance().getDragonManager().removeRiderAndDragon(getEntity(), true); + return; + } + } + + // Move player to new location on tick + e(myX, myY, myZ); + + return; + } + + if ((int) di() < travelY) + myY += DragonTravel.getInstance().getConfigHandler().getSpeed(); + + if (myX < toLoc.getX()) + myX += xPerTick; + else + myX -= xPerTick; + + if (myZ < toLoc.getZ()) + myZ += zPerTick; + else + myZ -= zPerTick; + + // For higher travel speeds the accuracy for dismounts needs + // to be decreased to prevent dragons from getting stuck + double maxDiff = DragonTravel.getInstance().getConfigHandler().getSpeed() + 1; + if (Math.abs(myZ - (int) toLoc.getZ()) <= maxDiff + && Math.abs(myX - (int) toLoc.getX()) <= maxDiff) { + finalMove = true; + } + e(myX, myY, myZ); + } + + /** + * ⒉setMoveTravel()->/dt travel + * Sets the x,z move for each tick + */ + @Override + public void setMoveTravel() { + double dist; + double distX; + double distY; + double distZ; + if (midLocA != null) { + dist = fromLoc.distance(midLocA); + distX = fromLoc.getX() - midLocA.getX(); + distY = fromLoc.getY() - midLocA.getY(); + distZ = fromLoc.getZ() - midLocA.getZ(); + } else { + dist = fromLoc.distance(toLoc); + distX = fromLoc.getX() - toLoc.getX(); + distY = fromLoc.getY() - toLoc.getY(); + distZ = fromLoc.getZ() - toLoc.getZ(); + } + double tick = dist / DragonTravel.getInstance().getConfigHandler().getSpeed(); + xPerTick = Math.abs(distX) / tick; + zPerTick = Math.abs(distZ) / tick; + yPerTick = Math.abs(distY) / tick; + } + + /** + * ⒈startTravel()->/dt travel + * Starts a travel to the specified location + * + * @param destLoc Location to start a travel to + */ + @Override + public void startTravel(Location destLoc, boolean interWorld, DragonType dragonType) { + this.dragonType = dragonType; + this.rider = (Player) getEntity().getPassenger(); + this.fromLoc = getEntity().getLocation(); + if (interWorld) { + this.midLocA = new Location(getEntity().getWorld(), dg() + 50 + Math.random() * 100, travelY, dm() + 50 + Math.random() * 100); + int scatter = 80; + this.midLocB = destLoc.clone().add(scatter, scatter, scatter); + this.toLoc = destLoc; + } else { + this.toLoc = destLoc; + } + setMoveTravel(); + } + + @Override + public DragonType getDragonType() { + return dragonType; + } + + @Override + public Entity getEntity() { + if (getBukkitEntity() != null) + return getBukkitEntity(); + return null; + } + + /*@Override + public boolean x() { + return super.x(); + }*/ + + + @Override + public boolean d_() { + return super.d_(); + } + + public void fixWings() { + // Artifact of old workaround for wings flipping really fast. + // Method stub is required for interface. + } + + public void setDragonType(DragonType dragonType) { + this.dragonType = dragonType; + } + + public int getWingCoolDown() { + return wingCoolDown; + } + + public Player getRider() { + return rider; + } + + public void setRider(Player rider) { + this.rider = rider; + } + + public Flight getFlight() { + return flight; + } + + public void setFlight(Flight flight) { + this.flight = flight; + } + + public int getCurrentWayPointIndex() { + return currentWayPointIndex; + } + + public void setCurrentWayPointIndex(int currentWayPointIndex) { + this.currentWayPointIndex = currentWayPointIndex; + } + + public boolean isFinalMove() { + return finalMove; + } + + public void setFinalMove(boolean finalMove) { + this.finalMove = finalMove; + } + + public int getTravelY() { + return travelY; + } + + public double getxPerTick() { + return xPerTick; + } + + public void setxPerTick(double xPerTick) { + this.xPerTick = xPerTick; + } + + public double getyPerTick() { + return yPerTick; + } + + public void setyPerTick(double yPerTick) { + this.yPerTick = yPerTick; + } + + public double getzPerTick() { + return zPerTick; + } + + public void setzPerTick(double zPerTick) { + this.zPerTick = zPerTick; + } + + private class WingFixerTask implements Runnable { + + private int id; + private int cooldown; + + public void setId(int id) { + this.id = id; + this.cooldown = wingCoolDown; + } + + @Override + public void run() { + cooldown -= 1; + if (cooldown <= 0) + Bukkit.getScheduler().cancelTask(id); + final Location loc = getEntity().getLocation().add(0, 2, 0); + final Material m[] = new Material[15]; + final MaterialData md[] = new MaterialData[15]; + + int counter = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + m[counter] = loc.clone().add(x, -y, 0).getBlock().getType(); + md[counter] = loc.clone().add(x, -y, 0).getBlock().getState().getData(); + loc.clone().add(x, -y, 0).getBlock().setType(Material.BARRIER); + counter++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0 && y == 0) continue; + m[counter] = loc.clone().add(0, -y, z).getBlock().getType(); + md[counter] = loc.clone().add(0, -y, z).getBlock().getState().getData(); + loc.clone().add(0, -y, z).getBlock().setType(Material.BARRIER); + counter++; + } + if (y == 0) { + loc.getBlock().setType(Material.WATER); + } + if (y == 1) { + loc.clone().add(0, -1, 0).getBlock().setType(Material.AIR); + } + } + + Bukkit.getScheduler().runTaskLater(DragonTravel.getInstance(), new Runnable() { + @Override + public void run() { + int count = 0; + for (int y = 0; y <= 2; y++) { + for (int x = -1; x <= 1; x++) { + loc.clone().add(x, -y, 0).getBlock().setType(m[count]); + loc.clone().add(x, -y, 0).getBlock().getState().setData(md[count]); + count++; + } + for (int z = -1; z <= 1; z++) { + if (z == 0) continue; + loc.clone().add(0, -y, z).getBlock().setType(m[count]); + loc.clone().add(0, -y, z).getBlock().getState().setData(md[count]); + count++; + } + } + } + }, 20L); + } + } + + @Override + public void setCustomNameVisible(boolean b) { + + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public void setCustomDragonName(String name) { + net.minecraft.network.chat.IChatBaseComponent nameInNewType = CraftChatMessage.fromString(name)[0]; // convert from "name" + + // Call new method + setCustomName(nameInNewType); + } + + // New (in CB 1_13_R1) + public void setCustomName(net.minecraft.network.chat.IChatBaseComponent name) { + super.a(name); + } + + // Old (until CB 1_12_R1), now only a compatibility-wrapper for our code + public String getCustomDragonName() { + // Call new method + net.minecraft.network.chat.IChatBaseComponent nameInNewType = getCustomName(); + return CraftChatMessage.fromComponent(nameInNewType); + } + + // New (in CB 1_13_R1) + public net.minecraft.network.chat.IChatBaseComponent getCustomName() { + return super.Z(); + } + +}