[Bleeding] Implement ProjectileSource API. Addresses BUKKIT-1038, BUKKIT-1156

By: t00thpick1 <t00thpick1dirko@gmail.com>
This commit is contained in:
CraftBukkit/Spigot
2014-01-20 00:03:21 -05:00
parent 668c2bffdb
commit 115d946d7b
8 changed files with 266 additions and 32 deletions

View File

@@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.projectiles.ProjectileSource;
public class CraftArrow extends AbstractProjectile implements Arrow {
@@ -14,20 +15,6 @@ public class CraftArrow extends AbstractProjectile implements Arrow {
super(server, entity);
}
public LivingEntity getShooter() {
if (getHandle().shooter != null) {
return (LivingEntity) getHandle().shooter.getBukkitEntity();
}
return null;
}
public void setShooter(LivingEntity shooter) {
if (shooter instanceof CraftLivingEntity) {
getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
}
}
public void setKnockbackStrength(int knockbackStrength) {
Validate.isTrue(knockbackStrength >= 0, "Knockback cannot be negative");
getHandle().a(knockbackStrength);
@@ -45,6 +32,19 @@ public class CraftArrow extends AbstractProjectile implements Arrow {
getHandle().a(critical);
}
public ProjectileSource getShooter() {
return getHandle().projectileSource;
}
public void setShooter(ProjectileSource shooter) {
if (shooter instanceof LivingEntity) {
getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
} else {
getHandle().shooter = null;
}
getHandle().projectileSource = shooter;
}
@Override
public EntityArrow getHandle() {
return (EntityArrow) entity;
@@ -58,4 +58,17 @@ public class CraftArrow extends AbstractProjectile implements Arrow {
public EntityType getType() {
return EntityType.ARROW;
}
@Deprecated
public LivingEntity _INVALID_getShooter() {
if (getHandle().shooter == null) {
return null;
}
return (LivingEntity) getHandle().shooter.getBukkitEntity();
}
@Deprecated
public void _INVALID_setShooter(LivingEntity shooter) {
getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
}
}

View File

@@ -7,6 +7,7 @@ import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.LivingEntity;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.util.Vector;
public class CraftFireball extends AbstractProjectile implements Fireball {
@@ -30,18 +31,17 @@ public class CraftFireball extends AbstractProjectile implements Fireball {
getHandle().bukkitYield = yield;
}
public LivingEntity getShooter() {
if (getHandle().shooter != null) {
return (LivingEntity) getHandle().shooter.getBukkitEntity();
}
return null;
public ProjectileSource getShooter() {
return getHandle().projectileSource;
}
public void setShooter(LivingEntity shooter) {
public void setShooter(ProjectileSource shooter) {
if (shooter instanceof CraftLivingEntity) {
getHandle().shooter = (EntityLiving) ((CraftLivingEntity) shooter).entity;
getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
} else {
getHandle().shooter = null;
}
getHandle().projectileSource = shooter;
}
public Vector getDirection() {
@@ -65,4 +65,17 @@ public class CraftFireball extends AbstractProjectile implements Fireball {
public EntityType getType() {
return EntityType.UNKNOWN;
}
@Deprecated
public void _INVALID_setShooter(LivingEntity shooter) {
setShooter(shooter);
}
@Deprecated
public LivingEntity _INVALID_getShooter() {
if (getHandle().shooter != null) {
return (LivingEntity) getHandle().shooter.getBukkitEntity();
}
return null;
}
}

View File

@@ -9,6 +9,7 @@ import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fish;
import org.bukkit.entity.LivingEntity;
import org.bukkit.projectiles.ProjectileSource;
public class CraftFish extends AbstractProjectile implements Fish {
private double biteChance = -1;
@@ -17,7 +18,7 @@ public class CraftFish extends AbstractProjectile implements Fish {
super(server, entity);
}
public LivingEntity getShooter() {
public ProjectileSource getShooter() {
if (getHandle().owner != null) {
return getHandle().owner.getBukkitEntity();
}
@@ -25,7 +26,7 @@ public class CraftFish extends AbstractProjectile implements Fish {
return null;
}
public void setShooter(LivingEntity shooter) {
public void setShooter(ProjectileSource shooter) {
if (shooter instanceof CraftHumanEntity) {
getHandle().owner = (EntityHuman) ((CraftHumanEntity) shooter).entity;
}
@@ -61,4 +62,14 @@ public class CraftFish extends AbstractProjectile implements Fish {
Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1.");
this.biteChance = chance;
}
@Deprecated
public LivingEntity _INVALID_getShooter() {
return (LivingEntity) getShooter();
}
@Deprecated
public void _INVALID_setShooter(LivingEntity shooter) {
setShooter(shooter);
}
}

View File

@@ -13,6 +13,7 @@ import net.minecraft.server.EntityEnderDragon;
import net.minecraft.server.EntityEnderPearl;
import net.minecraft.server.EntityFishingHook;
import net.minecraft.server.EntityHuman;
import net.minecraft.server.EntityFireball;
import net.minecraft.server.EntityInsentient;
import net.minecraft.server.EntityLargeFireball;
import net.minecraft.server.EntityLiving;
@@ -293,8 +294,12 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
return effects;
}
@SuppressWarnings("unchecked")
public <T extends Projectile> T launchProjectile(Class<? extends T> projectile) {
return launchProjectile(projectile, null);
}
@SuppressWarnings("unchecked")
public <T extends Projectile> T launchProjectile(Class<? extends T> projectile, Vector velocity) {
net.minecraft.server.World world = ((CraftWorld) getWorld()).getHandle();
net.minecraft.server.Entity launch = null;
@@ -324,11 +329,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
launch = new EntityLargeFireball(world, getHandle(), direction.getX(), direction.getY(), direction.getZ());
}
((EntityFireball) launch).projectileSource = this;
launch.setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
}
Validate.notNull(launch, "Projectile not supported");
if (velocity != null) {
((T) launch.getBukkitEntity()).setVelocity(velocity);
}
world.addEntity(launch);
return (T) launch.getBukkitEntity();
}

View File

@@ -2,30 +2,32 @@ package org.bukkit.craftbukkit.entity;
import net.minecraft.server.EntityLiving;
import net.minecraft.server.EntityProjectile;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.projectiles.ProjectileSource;
public abstract class CraftProjectile extends AbstractProjectile implements Projectile {
public CraftProjectile(CraftServer server, net.minecraft.server.Entity entity) {
super(server, entity);
}
public LivingEntity getShooter() {
if (getHandle().getShooter() != null) {
return (LivingEntity) getHandle().getShooter().getBukkitEntity();
}
return null;
public ProjectileSource getShooter() {
return getHandle().projectileSource;
}
public void setShooter(LivingEntity shooter) {
public void setShooter(ProjectileSource shooter) {
if (shooter instanceof CraftLivingEntity) {
getHandle().shooter = (EntityLiving) ((CraftLivingEntity) shooter).entity;
if (shooter instanceof CraftHumanEntity) {
getHandle().shooterName = ((CraftHumanEntity) shooter).getName();
}
} else {
getHandle().shooter = null;
getHandle().shooterName = null;
}
getHandle().projectileSource = shooter;
}
@Override
@@ -37,4 +39,24 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj
public String toString() {
return "CraftProjectile";
}
@Deprecated
public LivingEntity _INVALID_getShooter() {
if (getHandle().shooter == null) {
return null;
}
return (LivingEntity) getHandle().shooter.getBukkitEntity();
}
@Deprecated
public void _INVALID_setShooter(LivingEntity shooter) {
if (shooter == null) {
return;
}
getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
if (shooter instanceof CraftHumanEntity) {
getHandle().shooterName = ((CraftHumanEntity) shooter).getName();
}
}
}