Merge pull request #147 from RinesThaix/goals

AbstractProjectile and arrows now call EntityAttackEvent, without damaging entities
This commit is contained in:
TheMode 2021-02-22 14:46:20 +01:00 committed by GitHub
commit 20a23a4ebc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 59 additions and 20 deletions

View File

@ -6,6 +6,7 @@ import net.minestom.server.utils.Position;
import net.minestom.server.utils.Vector;
import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
@ -28,10 +29,10 @@ public interface Projectile {
@SuppressWarnings("ConstantConditions")
static void shoot(@NotNull Projectile projectile, @NotNull Position from, @NotNull Position to, double power, double spread) {
Check.argCondition(!(projectile instanceof Entity), "Projectile must be an instance of Entity!");
Entity proj = (Entity) projectile;
double dx = to.getX() - from.getX();
double dy = to.getY() - from.getY();
double dz = to.getZ() - from.getZ();
Entity proj = (Entity) projectile;
double dx = to.getX() - from.getX();
double dy = to.getY() - from.getY();
double dz = to.getZ() - from.getZ();
double xzLength = Math.sqrt(dx * dx + dz * dz);
dy += xzLength * 0.20000000298023224D;
@ -55,4 +56,12 @@ public interface Projectile {
);
}
/**
* Gets the shooter of this projectile.
*
* @return the shooter of this projectile.
*/
@Nullable
Entity getShooter();
}

View File

@ -0,0 +1,25 @@
package net.minestom.server.entity.type.projectile;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.ObjectEntity;
import net.minestom.server.entity.type.Projectile;
import net.minestom.server.utils.Position;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class AbstractProjectile extends ObjectEntity implements Projectile {
private final Entity shooter;
public AbstractProjectile(@Nullable Entity shooter, @NotNull EntityType entityType, @NotNull Position spawnPosition) {
super(entityType, spawnPosition);
this.shooter = shooter;
}
@Override
public Entity getShooter() {
return this.shooter;
}
}

View File

@ -1,8 +1,10 @@
package net.minestom.server.entity.type.projectile;
import net.minestom.server.entity.*;
import net.minestom.server.entity.damage.DamageType;
import net.minestom.server.entity.type.Projectile;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.LivingEntity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.event.entity.EntityAttackEvent;
import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
@ -16,16 +18,13 @@ import java.util.Collection;
import java.util.Optional;
import java.util.stream.Collectors;
public class EntityAbstractArrow extends ObjectEntity implements Projectile {
public class EntityAbstractArrow extends AbstractProjectile {
private final static byte CRITICAL_BIT = 0x01;
private final static byte NO_CLIP_BIT = 0x02;
private final Entity shooter;
EntityAbstractArrow(@Nullable Entity shooter, @NotNull EntityType entityType, @NotNull Position spawnPosition) {
super(entityType, spawnPosition);
this.shooter = shooter;
super(shooter, entityType, spawnPosition);
super.hasPhysics = false;
setBoundingBox(.5F, .5F, .5F);
@ -115,7 +114,7 @@ public class EntityAbstractArrow extends ObjectEntity implements Projectile {
if (victimOptional.isPresent()) {
LivingEntity victim = (LivingEntity) victimOptional.get();
victim.setArrowCount(victim.getArrowCount() + 1);
victim.damage(DamageType.fromProjectile(this.shooter, this), 2F);
callEvent(EntityAttackEvent.class, new EntityAttackEvent(this, victim));
remove();
return super.onGround;
}
@ -171,7 +170,8 @@ public class EntityAbstractArrow extends ObjectEntity implements Projectile {
@Override
public int getObjectData() {
return this.shooter == null ? 0 : this.shooter.getEntityId() + 1;
Entity shooter = getShooter();
return shooter == null ? 0 : shooter.getEntityId() + 1;
}
}

View File

@ -1,5 +1,6 @@
package net.minestom.server.entity.type.projectile;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.ObjectEntity;
@ -7,11 +8,13 @@ import net.minestom.server.entity.type.Projectile;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.utils.Position;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class EntityEyeOfEnder extends ObjectEntity implements Projectile {
public class EntityEyeOfEnder extends AbstractProjectile {
public EntityEyeOfEnder(Position spawnPosition) {
super(EntityType.EYE_OF_ENDER, spawnPosition);
public EntityEyeOfEnder(@Nullable Entity shooter, @NotNull Position spawnPosition) {
super(shooter, EntityType.EYE_OF_ENDER, spawnPosition);
}

View File

@ -1,5 +1,6 @@
package net.minestom.server.entity.type.projectile;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.ObjectEntity;
@ -7,11 +8,12 @@ import net.minestom.server.entity.type.Projectile;
import net.minestom.server.item.ItemStack;
import net.minestom.server.utils.Position;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class EntityPotion extends ObjectEntity implements Projectile {
public class EntityPotion extends AbstractProjectile {
public EntityPotion(Position spawnPosition, @NotNull ItemStack potion) {
super(EntityType.POTION, spawnPosition);
public EntityPotion(@Nullable Entity shooter, @NotNull Position spawnPosition, @NotNull ItemStack potion) {
super(shooter, EntityType.POTION, spawnPosition);
setBoundingBox(0.25f, 0.25f, 0.25f);
setPotion(potion);
}