Search in sources :

Example 1 with Projectile

use of me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile in project MechanicsMain by WeaponMechanics.

the class AirStrike method serialize.

@Override
@Nonnull
public AirStrike serialize(SerializeData data) throws SerializerException {
    int min = data.of("Minimum_Bombs").assertExists().assertPositive().getInt();
    int max = data.of("Maximum_Bombs").assertExists().assertPositive().getInt();
    Projectile projectile = data.of("Dropped_Projectile").assertExists().serialize(Projectile.class);
    double yOffset = data.of("Height").assertPositive().getDouble(60.0);
    double yNoise = data.of("Vertical_Randomness").assertPositive().getDouble(5.0);
    double separation = data.of("Distance_Between_Bombs").assertPositive().getDouble(3.0);
    double range = data.of("Maximum_Distance_From_Center").assertPositive().getDouble(25.0);
    int layers = data.of("Layers").assertPositive().getInt(1);
    int interval = data.of("Delay_Between_Layers").assertPositive().getInt(40);
    Detonation detonation = data.of("Detonation").serialize(Detonation.class);
    Mechanics mechanics = data.of("Mechanics").serialize(Mechanics.class);
    return new AirStrike(projectile, min, max, yOffset, yNoise, separation, range, layers, interval, detonation, mechanics);
}
Also used : WeaponMechanics(me.deecaad.weaponmechanics.WeaponMechanics) Mechanics(me.deecaad.weaponmechanics.mechanics.Mechanics) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Projectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile) Nonnull(javax.annotation.Nonnull)

Example 2 with Projectile

use of me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile in project MechanicsMain by WeaponMechanics.

the class AirStrike method trigger.

public void trigger(Location flareLocation, LivingEntity shooter, WeaponProjectile projectile) {
    if (mechanics != null)
        mechanics.use(new CastData(shooter, projectile.getWeaponTitle(), projectile.getWeaponStack()));
    new BukkitRunnable() {

        int count = 0;

        @Override
        public void run() {
            int bombs = NumberUtil.random(min, max);
            int checks = bombs * bombs;
            // Used to make sure we don't spawn bombs too close to
            // each other. Uses distanceBetweenSquared
            List<Vector2d> spawnLocations = new ArrayList<>(bombs);
            locationFinder: for (int i = 0; i < checks && spawnLocations.size() < bombs; i++) {
                double x = flareLocation.getX() + NumberUtil.random(-radius, radius);
                double z = flareLocation.getZ() + NumberUtil.random(-radius, radius);
                Vector2d vector = new Vector2d(x, z);
                for (Vector2d spawnLocation : spawnLocations) {
                    if (vector.distanceSquared(spawnLocation) < distanceBetweenSquared) {
                        continue locationFinder;
                    }
                }
                spawnLocations.add(vector);
                double y = flareLocation.getY() + height + NumberUtil.random(-yVariation, yVariation);
                Location location = new Location(flareLocation.getWorld(), x, y, z);
                // Either use the projectile settings from the "parent" projectile,
                // or use the projectile settings for this airstrike
                Projectile projectileHandler = getProjectile() != null ? getProjectile() : getConfigurations().getObject(projectile.getWeaponTitle() + ".Projectile", Projectile.class);
                if (projectileHandler != null) {
                    WeaponProjectile newProjectile = getProjectile() != null ? projectileHandler.create(shooter, location, new Vector(0, 0, 0), projectile.getWeaponStack(), projectile.getWeaponTitle()) : projectile.clone(location, new Vector(0, 0, 0));
                    newProjectile.setIntTag("airstrike-bomb", 1);
                    projectileHandler.shoot(newProjectile, location);
                }
            }
            if (++count >= loops) {
                cancel();
            }
        }
    }.runTaskTimerAsynchronously(WeaponMechanics.getPlugin(), 0, delay);
}
Also used : CastData(me.deecaad.weaponmechanics.mechanics.CastData) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) BukkitRunnable(org.bukkit.scheduler.BukkitRunnable) ArrayList(java.util.ArrayList) List(java.util.List) Vector(org.bukkit.util.Vector) Location(org.bukkit.Location) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Projectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile)

Example 3 with Projectile

use of me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile in project MechanicsMain by WeaponMechanics.

the class ShootHandler method shoot.

/**
 * Shoots using weapon.
 * Does not use ammo nor check for it.
 * Does not apply recoil nor anything that would require EntityWrapper.
 */
public void shoot(LivingEntity livingEntity, String weaponTitle, Vector normalizedDirection) {
    Configuration config = getConfigurations();
    Mechanics shootMechanics = config.getObject(weaponTitle + ".Shoot.Mechanics", Mechanics.class);
    if (shootMechanics != null)
        shootMechanics.use(new CastData(livingEntity, weaponTitle, null));
    Projectile projectile = config.getObject(weaponTitle + ".Projectile", Projectile.class);
    if (projectile == null)
        return;
    Location shootLocation = getShootLocation(livingEntity, false, true);
    double projectileSpeed = config.getDouble(weaponTitle + ".Shoot.Projectile_Speed");
    for (int i = 0; i < config.getInt(weaponTitle + ".Shoot.Projectiles_Per_Shot"); ++i) {
        // Only create bullet first if WeaponShootEvent changes
        WeaponProjectile bullet = projectile.create(livingEntity, shootLocation, normalizedDirection.clone().multiply(projectileSpeed), null, weaponTitle);
        WeaponShootEvent shootEvent = new WeaponShootEvent(bullet);
        Bukkit.getPluginManager().callEvent(shootEvent);
        bullet = shootEvent.getProjectile();
        // Shoot the given bullet
        projectile.shoot(bullet, shootLocation);
    }
}
Also used : CastData(me.deecaad.weaponmechanics.mechanics.CastData) Configuration(me.deecaad.core.file.Configuration) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) WeaponShootEvent(me.deecaad.weaponmechanics.weapon.weaponevents.WeaponShootEvent) Mechanics(me.deecaad.weaponmechanics.mechanics.Mechanics) WeaponMechanics(me.deecaad.weaponmechanics.WeaponMechanics) Projectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Location(org.bukkit.Location)

Example 4 with Projectile

use of me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile in project MechanicsMain by WeaponMechanics.

the class ClusterBomb method serialize.

@Override
@Nonnull
public ClusterBomb serialize(SerializeData data) throws SerializerException {
    int bombs = data.of("Number_Of_Bombs").assertExists().assertPositive().getInt();
    Projectile projectileSettings = data.of("Split_Projectile").serialize(Projectile.class);
    double speed = data.of("Projectile_Speed").assertPositive().getDouble(30.0) / 20.0;
    int splits = data.of("Number_Of_Splits").assertPositive().getInt(1);
    Detonation detonation = data.of("Detonation").serialize(Detonation.class);
    Mechanics mechanics = data.of("Mechanics").serialize(Mechanics.class);
    return new ClusterBomb(projectileSettings, speed, splits, bombs, detonation, mechanics);
}
Also used : Mechanics(me.deecaad.weaponmechanics.mechanics.Mechanics) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Projectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile) Nonnull(javax.annotation.Nonnull)

Example 5 with Projectile

use of me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile in project MechanicsMain by WeaponMechanics.

the class ClusterBomb method trigger.

public void trigger(WeaponProjectile projectile, LivingEntity shooter, Location splitLocation) {
    int currentDepth = projectile.getIntTag("cluster-split-level");
    // Checking to see if we have split the proper number of times
    if (currentDepth >= splits) {
        return;
    }
    debug.debug("Splitting cluster bomb");
    if (mechanics != null)
        mechanics.use(new CastData(shooter, projectile.getWeaponTitle(), projectile.getWeaponStack()));
    for (int i = 0; i < bombs; i++) {
        Vector vector = VectorUtil.random(speed);
        vector.setY(Math.abs(vector.getY()));
        // Either use the projectile settings from the "parent" projectile,
        // or use the projectile settings for this cluster bomb
        Projectile projectileHandler = getProjectile() != null ? getProjectile() : getConfigurations().getObject(projectile.getWeaponTitle() + ".Projectile", Projectile.class);
        if (projectileHandler != null) {
            WeaponProjectile newProjectile = getProjectile() != null ? projectileHandler.create(shooter, splitLocation, vector, projectile.getWeaponStack(), projectile.getWeaponTitle()) : projectile.clone(splitLocation, vector);
            newProjectile.setIntTag("cluster-split-level", currentDepth + 1);
            projectileHandler.shoot(newProjectile, splitLocation);
        }
    }
    // Remove the parent split
    projectile.remove();
}
Also used : CastData(me.deecaad.weaponmechanics.mechanics.CastData) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Vector(org.bukkit.util.Vector) WeaponProjectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile) Projectile(me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile)

Aggregations

Projectile (me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.Projectile)7 WeaponProjectile (me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.WeaponProjectile)6 CastData (me.deecaad.weaponmechanics.mechanics.CastData)4 Mechanics (me.deecaad.weaponmechanics.mechanics.Mechanics)4 WeaponMechanics (me.deecaad.weaponmechanics.WeaponMechanics)3 Vector (org.bukkit.util.Vector)3 Nonnull (javax.annotation.Nonnull)2 Configuration (me.deecaad.core.file.Configuration)2 WeaponShootEvent (me.deecaad.weaponmechanics.weapon.weaponevents.WeaponShootEvent)2 Location (org.bukkit.Location)2 Player (org.bukkit.entity.Player)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 WeaponInfoDisplay (me.deecaad.weaponmechanics.weapon.info.WeaponInfoDisplay)1 ProjectileSettings (me.deecaad.weaponmechanics.weapon.projectile.weaponprojectile.ProjectileSettings)1 Recoil (me.deecaad.weaponmechanics.weapon.shoot.recoil.Recoil)1 Spread (me.deecaad.weaponmechanics.weapon.shoot.spread.Spread)1 HandData (me.deecaad.weaponmechanics.wrappers.HandData)1 PlayerWrapper (me.deecaad.weaponmechanics.wrappers.PlayerWrapper)1 EntityType (org.bukkit.entity.EntityType)1