More work on xbows

This commit is contained in:
nossr50
2020-07-28 18:17:57 -07:00
parent 515d58f04f
commit 3ca06f2518
7 changed files with 111 additions and 36 deletions

View File

@@ -7,6 +7,8 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.skills.archery.Archery;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.skills.RankUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@@ -14,11 +16,17 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Random;
public class CrossbowManager extends SkillManager {
public CrossbowManager(McMMOPlayer mcMMOPlayer) {
super(mcMMOPlayer, PrimarySkillType.CROSSBOWS);
}
private static final int SPREAD_VALUE = 12;
/**
* Calculate bonus XP awarded for Archery when hitting a far-away target.
@@ -57,10 +65,47 @@ public class CrossbowManager extends SkillManager {
private void coneOfDeathProcessing(ProjectileLaunchEvent projectileLaunchEvent) {
Projectile mainProjectile = projectileLaunchEvent.getEntity();
World world = mainProjectile.getWorld();
spawnConeArrows(projectileLaunchEvent.getEntity());
}
private void spawnConeArrows(@NotNull Projectile originProjectile) {
World world = originProjectile.getWorld();
Vector originVector = originProjectile.getVelocity().clone();
float originProjectileMagnitude = (float) originVector.length();
Vector originUnitVector = originVector.clone().normalize();
for(int i = 0; i < getConeOfDeathProjectileCount(); i++) {
Vector newProjectileVector = byRotateVector(originUnitVector, 0);
spawnTrackedProjectile(originProjectile, world, originProjectileMagnitude, newProjectileVector, getRandomizedSpreadValue());
}
}
private int getConeOfDeathProjectileCount() {
switch(RankUtils.getRank(mcMMOPlayer.getPlayer(), SubSkillType.CROSSBOWS_CONE_OF_DEATH)) {
case 1:
return 9;
case 2:
return 18;
default:
return 27;
}
}
private int getRandomizedSpreadValue() {
return SPREAD_VALUE + 12 + RandomUtils.nextInt(24);
}
private void spawnTrackedProjectile(@NotNull Projectile originProjectile, World world, float originProjectileMagnitude, Vector additionalProjectileVectorA, int spreadValue) {
Projectile spawnedProjectile = world.spawnArrow(originProjectile.getLocation(), additionalProjectileVectorA, originProjectileMagnitude, spreadValue);
spawnedProjectile.setShooter(mcMMOPlayer.getPlayer());
mcMMO.getSpawnedProjectileTracker().trackProjectile(spawnedProjectile);
}
@NotNull
private Vector byRotateVector(Vector originUnitVector, double angle) {
return originUnitVector.clone().rotateAroundAxis(originUnitVector, angle);
}