diff --git a/README.md b/README.md index 3d3e8b1..4ee9ef2 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ The [Minecraft Forge] implementation of the [FountainAPI], licensed under the MI ## Cloning -- SSH: `git clone git@github.com:FountainMC/FountainForge.git` -- HTTPS: `git clone https://github.com/FountainMC/FountainForge.git` +- SSH: `git clone --recursive git@github.com:FountainMC/FountainForge.git` +- HTTPS: `git clone --recursive https://github.com/FountainMC/FountainForge.git` ## Building diff --git a/src/main/java/org/fountainmc/forge/mixin/entity/MixinEntity.java b/src/main/java/org/fountainmc/forge/mixin/entity/MixinEntity.java index 5699c66..5665b6b 100644 --- a/src/main/java/org/fountainmc/forge/mixin/entity/MixinEntity.java +++ b/src/main/java/org/fountainmc/forge/mixin/entity/MixinEntity.java @@ -24,17 +24,27 @@ package org.fountainmc.forge.mixin.entity; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; +import net.minecraft.command.ICommandSender; import net.minecraft.util.math.BlockPos; import org.fountainmc.api.entity.Entity; import org.fountainmc.api.world.Location; import org.fountainmc.api.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.*; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; @Mixin(net.minecraft.entity.Entity.class) -public abstract class MixinEntity implements Entity { +@Implements(@Interface(iface = Entity.class, prefix = "entity$")) +public abstract class MixinEntity implements Entity, ICommandSender { @Shadow public boolean onGround; + @Shadow public float rotationPitch; + @Shadow public float rotationYaw; @Shadow public abstract BlockPos getPosition(); @@ -42,14 +52,118 @@ public abstract class MixinEntity implements Entity { @Shadow public abstract net.minecraft.world.World getEntityWorld(); + @Shadow + public abstract void setPosition(double x, double y, double z); + + @Shadow + public abstract List shadow$getPassengers(); + + @Shadow + public abstract void addPassenger(net.minecraft.entity.Entity passenger); + + @Shadow + public abstract void removePassenger(net.minecraft.entity.Entity passenger); + @Override public Location getLocation() { return new Location((World) this.getEntityWorld(), this.getPosition().getX(), this.getPosition().getY(), this.getPosition().getZ()); } + @Override + public void teleport(Location destination) { + this.setPosition(destination.getX(), destination.getY(), + destination.getZ()); + } + + @Override + public float getPitch() { + return this.rotationPitch; + } + + @Override + public void setPitch(float pitch) { + this.rotationPitch = pitch; + } + + @Override + public float getYaw() { + return this.rotationYaw; + } + + @Override + public void setYaw(float yaw) { + this.rotationYaw = yaw; + } + @Override public boolean isOnGround() { return this.onGround; } + + @Nullable + @Override + public Entity getPrimaryPassenger() { + if (getPassengers().size() != 0) { + return getPassengers().get(0); + } + return null; + } + + @Intrinsic + @Nonnull + public ImmutableList entity$getPassengers() { + return ImmutableList.copyOf((List)((List) this.shadow$getPassengers())); + } + + @Override + public void setPrimaryPassenger(Entity passenger) { + this.ejectPassenger(this.getPrimaryPassenger()); + ((net.minecraft.entity.Entity) passenger).startRiding(this.getCommandSenderEntity()); + } + + @Override + public boolean addPassenger(Entity entity, boolean force) { + this.addPassenger((net.minecraft.entity.Entity) entity); + return true; + } + + @Override + public void ejectAll() { + this.getPassengers().forEach(this::ejectPassenger); + } + + @Override + public void ejectPassenger(Entity passenger) { + passenger.leaveVehicle(); + } + + @Override + public int getMaximumPassengers() { + return this.shadow$getPassengers().size(); + } + + @Override + public void dismountVehicle() { + if (this.shadow$getPassengers().size() != 0) return; + this.getPrimaryPassenger().leaveVehicle(); + } + + @Nullable + @Override + public Entity getVehicle() { + return (Entity) this.getCommandSenderEntity().getRidingEntity(); + } + + @Override + public void leaveVehicle() { + (this.getCommandSenderEntity()).dismountRidingEntity(); + } + + @Override + public ImmutableCollection getNearbyEntities(double distance) { + List nmsEntities = this.getCommandSenderEntity().worldObj.getEntitiesWithinAABBExcludingEntity(this.getCommandSenderEntity(), this.getCommandSenderEntity().getEntityBoundingBox().expand(distance / 3, distance / 3, distance / 3)); + return ImmutableList.copyOf(((List)((List) nmsEntities))); + } + }