More balancing & changed visual of bolt trim

This commit is contained in:
thetrouper
2025-06-01 08:27:11 -05:00
parent 613eef05d8
commit 1da50164ea
14 changed files with 147 additions and 147 deletions

View File

@@ -213,6 +213,7 @@ public class AdminCommand implements QuickCommand {
Text.color("&8&l| &7This armor is for testing purposes &c&lONLY&7!").decoration(TextDecoration.ITALIC,false) Text.color("&8&l| &7This armor is for testing purposes &c&lONLY&7!").decoration(TextDecoration.ITALIC,false)
)); ));
armor.addEnchant(Enchantment.VANISHING_CURSE,1,true); armor.addEnchant(Enchantment.VANISHING_CURSE,1,true);
armor.addEnchant(Enchantment.PROTECTION, 4, true);
armor.setUnbreakable(true); armor.setUnbreakable(true);
armor.addItemFlags(ItemFlag.HIDE_ENCHANTS); armor.addItemFlags(ItemFlag.HIDE_ENCHANTS);
armor.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); armor.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);

View File

@@ -4,6 +4,7 @@ import me.trouper.trimserver.server.Main;
import me.trouper.trimserver.server.systems.abilities.MaterialInfo; import me.trouper.trimserver.server.systems.abilities.MaterialInfo;
import me.trouper.trimserver.server.systems.abilities.AbstractAbility; import me.trouper.trimserver.server.systems.abilities.AbstractAbility;
import me.trouper.trimserver.server.systems.abilities.PatternInfo; import me.trouper.trimserver.server.systems.abilities.PatternInfo;
import me.trouper.trimserver.utils.PlayerUtils;
import me.trouper.trimserver.utils.SoundPlayer; import me.trouper.trimserver.utils.SoundPlayer;
import me.trouper.trimserver.utils.TargetingUtils; import me.trouper.trimserver.utils.TargetingUtils;
import me.trouper.trimserver.utils.text.Text; import me.trouper.trimserver.utils.text.Text;
@@ -23,13 +24,13 @@ import java.util.concurrent.atomic.AtomicInteger;
public class BoltAbility extends AbstractAbility implements Main { public class BoltAbility extends AbstractAbility implements Main {
public static final int NORMAL_COOLDOWN = 20 * 10; public static final int NORMAL_COOLDOWN = 20 * 10;
public static final double NORMAL_DAMAGE = 10; public static final double NORMAL_DAMAGE = 6;
public static final int RESIN_COOLDOWN = 20 * 5; public static final int RESIN_COOLDOWN = 20 * 5;
public static final double RESIN_DAMAGE = 7; public static final double RESIN_DAMAGE = 4;
public static final int NETHERITE_COOLDOWN = 20 * 15; public static final int NETHERITE_COOLDOWN = 20 * 15;
public static final double NETHERITE_DAMAGE = 20; public static final double NETHERITE_DAMAGE = 8;
public BoltAbility() { public BoltAbility() {
super(TrimPattern.BOLT); super(TrimPattern.BOLT);
@@ -42,10 +43,16 @@ public class BoltAbility extends AbstractAbility implements Main {
return TargetingUtils.areaAffect(caster.getLocation(),range,target-> !main.man().trustBackend.trusts(caster,target) && return TargetingUtils.areaAffect(caster.getLocation(),range,target-> !main.man().trustBackend.trusts(caster,target) &&
!shaper.activeShellTasks.containsKey(target.getUniqueId()) && !shaper.activeShellTasks.containsKey(target.getUniqueId()) &&
main.man().abilityBackend.abilityAllowed(caster,target.getLocation()),(target) ->{ main.man().abilityBackend.abilityAllowed(caster,target.getLocation()),(target) ->{
drawLightning(caster.getEyeLocation(),target.getEyeLocation(),innerBlock,outerBlock); PlayerUtils.dealTrueDamage(target,DamageSource.builder(DamageType.LIGHTNING_BOLT).withDamageLocation(caster.getEyeLocation()).build(),damage);
target.damage(damage,DamageSource.builder(DamageType.LIGHTNING_BOLT).withDamageLocation(caster.getEyeLocation()).withDirectEntity(caster).build());
if (target instanceof Player t) Text.sendMessage(Text.Pallet.INFO,t,"You have been stunned by {0}'s Bolt!",caster.getName()); if (target instanceof Player t) Text.sendMessage(Text.Pallet.INFO,t,"You have been stunned by {0}'s Bolt!",caster.getName());
SoundPlayer bolt = new SoundPlayer(target.getLocation(), Sound.ENTITY_LIGHTNING_BOLT_THUNDER,10,1);
SoundPlayer ring = new SoundPlayer(target.getLocation(), Sound.ITEM_TRIDENT_THUNDER,10,2);
SoundPlayer zip = new SoundPlayer(target.getLocation(), Sound.ENTITY_BEE_STING,10,1);
bolt.playWithin(50);
ring.playWithin(30);
AtomicInteger counter = new AtomicInteger(0); AtomicInteger counter = new AtomicInteger(0);
Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(task) -> { Bukkit.getScheduler().runTaskTimer(main.getPlugin(),(task) -> {
if (counter.getAndIncrement() > 40) { if (counter.getAndIncrement() > 40) {
@@ -55,13 +62,15 @@ public class BoltAbility extends AbstractAbility implements Main {
int tick = target.getNoDamageTicks(); int tick = target.getNoDamageTicks();
int maxTick = target.getMaximumNoDamageTicks(); int maxTick = target.getMaximumNoDamageTicks();
target.setNoDamageTicks(1); if (counter.get() % 5 == 0) zip.playWithin(30);
target.setMaximumNoDamageTicks(2); target.setNoDamageTicks(0);
target.setMaximumNoDamageTicks(1);
target.damage(0.01,DamageSource.builder(DamageType.LIGHTNING_BOLT).withDamageLocation(caster.getLocation()).withDirectEntity(caster).build()); target.damage(0.01,DamageSource.builder(DamageType.LIGHTNING_BOLT).withDamageLocation(caster.getLocation()).withDirectEntity(caster).build());
target.setNoDamageTicks(tick); target.setNoDamageTicks(tick);
target.setMaximumNoDamageTicks(maxTick); target.setMaximumNoDamageTicks(maxTick);
Location stunLoc = target.getLocation().clone(); Location stunLoc = target.getLocation().clone();
target.teleport(stunLoc); target.teleport(stunLoc);
drawLightning(caster.getEyeLocation().subtract(0,0.5,0),target.getEyeLocation(),innerBlock,outerBlock);
},0,1); },0,1);
}); });
} }
@@ -70,21 +79,14 @@ public class BoltAbility extends AbstractAbility implements Main {
int segments = 10; int segments = 10;
double maxOffset = 0.5; double maxOffset = 0.5;
long stayTime = 10L; long stayTime = 10L;
double thickness = 0.07; double thickness = 0.01;
double thicknessOut = 0.1; double thicknessOut = 0.05;
List<Player> viewers = new ArrayList<>(start.getWorld().getPlayers()); List<Player> viewers = new ArrayList<>(start.getWorld().getPlayers());
Location current = start.clone(); Location current = start.clone();
Vector direction = end.clone().subtract(start).toVector(); Vector direction = end.clone().subtract(start).toVector();
double segmentLength = direction.length() / segments; double segmentLength = direction.length() / segments;
direction.normalize().multiply(segmentLength); direction.normalize().multiply(segmentLength);
SoundPlayer bolt = new SoundPlayer(end, Sound.ENTITY_LIGHTNING_BOLT_THUNDER,10,1);
SoundPlayer ring = new SoundPlayer(end, Sound.ITEM_TRIDENT_THUNDER,10,1);
SoundPlayer zip = new SoundPlayer(end, Sound.ENTITY_BEE_STING,10,1);
zip.playWithin(30);
bolt.playWithin(50);
ring.playWithin(30);
for (int i = 0; i < segments; i++) { for (int i = 0; i < segments; i++) {
Vector offset = new Vector( Vector offset = new Vector(

View File

@@ -133,77 +133,77 @@ public class DuneAbility extends AbstractAbility {
} }
} }
@MaterialInfo(name = "Amethyst Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Amethyst Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean amethystAbility(Player player) { public boolean amethystAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Copper Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Copper Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean copperAbility(Player player) { public boolean copperAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Diamond Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Diamond Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean diamondAbility(Player player) { public boolean diamondAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Emerald Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Emerald Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean emeraldAbility(Player player) { public boolean emeraldAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Gold Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Gold Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean goldAbility(Player player) { public boolean goldAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Iron Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Iron Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean ironAbility(Player player) { public boolean ironAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Lapis Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Lapis Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean lapisAbility(Player player) { public boolean lapisAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Netherite Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90) @MaterialInfo(name = "Netherite Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*60)
@Override @Override
public boolean netheriteAbility(Player player) { public boolean netheriteAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Quartz Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Quartz Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean quartzAbility(Player player) { public boolean quartzAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Redstone Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Redstone Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean redstoneAbility(Player player) { public boolean redstoneAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());
return true; return true;
} }
@MaterialInfo(name = "Resin Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*160) @MaterialInfo(name = "Resin Wormsign",description = "Call upon Shai-Hulud to destroy your enemies", cooldownTicks = 20*90)
@Override @Override
public boolean resinAbility(Player player) { public boolean resinAbility(Player player) {
spawnWormSign(player,player.getLocation()); spawnWormSign(player,player.getLocation());

View File

@@ -5,7 +5,6 @@ import me.trouper.trimserver.server.systems.abilities.AbstractAbility;
import me.trouper.trimserver.server.systems.abilities.PatternInfo; import me.trouper.trimserver.server.systems.abilities.PatternInfo;
import me.trouper.trimserver.utils.PlayerUtils; import me.trouper.trimserver.utils.PlayerUtils;
import me.trouper.trimserver.utils.SoundPlayer; import me.trouper.trimserver.utils.SoundPlayer;
import me.trouper.trimserver.utils.TargetingUtils;
import me.trouper.trimserver.utils.visual.BlockDisplayRaytracer; import me.trouper.trimserver.utils.visual.BlockDisplayRaytracer;
import me.trouper.trimserver.utils.visual.CustomDisplayRaytracer; import me.trouper.trimserver.utils.visual.CustomDisplayRaytracer;
import org.bukkit.*; import org.bukkit.*;
@@ -25,20 +24,20 @@ import java.util.concurrent.atomic.AtomicInteger;
@PatternInfo(name = "Eye of Power", description = "Allows you to see players hidden with the host trim. Includes variants.") @PatternInfo(name = "Eye of Power", description = "Allows you to see players hidden with the host trim. Includes variants.")
public class EyeAbility extends AbstractAbility { public class EyeAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 30; public static final int NORMAL_COOLDOWN = 20 * 60;
public static final int NORMAL_DURATION = 5; public static final int NORMAL_DURATION = 4;
public static final double NORMAL_DAMAGE = 0.1; public static final double NORMAL_DAMAGE = 0.5;
public static final double NORMAL_DAMAGE_FAIL_CHANCE = 0.75; public static final double NORMAL_DAMAGE_CHANCE = 0.80;
public static final int NETHERITE_COOLDOWN = 20 * 15; public static final int NETHERITE_COOLDOWN = 20 * 40;
public static final int NETHERITE_DURATION = 10; public static final int NETHERITE_DURATION = 6;
public static final double NETHERITE_DAMAGE = 0.2; public static final double NETHERITE_DAMAGE = 0.8;
public static final double NETHERITE_DAMAGE_FAIL_CHANCE = 0.50; public static final double NETHERITE_DAMAGE_CHANCE = 1.0;
public static final int RESIN_COOLDOWN = 20 * 10; public static final int RESIN_COOLDOWN = 20 * 20;
public static final long RESIN_DURATION = 3; public static final long RESIN_DURATION = 2;
public static final double RESIN_DAMAGE = 0.1; public static final double RESIN_DAMAGE = 0.1;
public static final double RESIN_DAMAGE_FAIL_CHANCE = 0.80; public static final double RESIN_DAMAGE_CHANCE = 0.60;
public EyeAbility() { public EyeAbility() {
super(TrimPattern.EYE); super(TrimPattern.EYE);
@@ -87,7 +86,7 @@ public class EyeAbility extends AbstractAbility {
if (!(entity instanceof LivingEntity liv) || shaper.activeShellTasks.containsKey(liv.getUniqueId())) return; if (!(entity instanceof LivingEntity liv) || shaper.activeShellTasks.containsKey(liv.getUniqueId())) return;
hissSound.playWithin(30); hissSound.playWithin(30);
if (random.nextDouble(1) >= damageFailChance) { if (random.nextDouble(1) <= damageFailChance) {
int tick = liv.getNoDamageTicks(); int tick = liv.getNoDamageTicks();
int maxTick = liv.getMaximumNoDamageTicks(); int maxTick = liv.getMaximumNoDamageTicks();
@@ -114,77 +113,77 @@ public class EyeAbility extends AbstractAbility {
@MaterialInfo(name = "Amethyst Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Amethyst Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean amethystAbility(Player player) { public boolean amethystAbility(Player player) {
eyeLasers(player,Material.PURPLE_CONCRETE_POWDER,Material.MAGENTA_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.PURPLE_CONCRETE_POWDER,Material.MAGENTA_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Copper Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Copper Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean copperAbility(Player player) { public boolean copperAbility(Player player) {
eyeLasers(player,Material.LIME_TERRACOTTA,Material.GREEN_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.LIME_TERRACOTTA,Material.GREEN_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Diamond Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Diamond Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean diamondAbility(Player player) { public boolean diamondAbility(Player player) {
eyeLasers(player,Material.LIGHT_BLUE_CONCRETE_POWDER,Material.LIGHT_BLUE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.LIGHT_BLUE_CONCRETE_POWDER,Material.LIGHT_BLUE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Emerald Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Emerald Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean emeraldAbility(Player player) { public boolean emeraldAbility(Player player) {
eyeLasers(player,Material.LIME_CONCRETE_POWDER,Material.LIME_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.LIME_CONCRETE_POWDER,Material.LIME_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Gold Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Gold Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean goldAbility(Player player) { public boolean goldAbility(Player player) {
eyeLasers(player,Material.YELLOW_TERRACOTTA,Material.YELLOW_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.YELLOW_TERRACOTTA,Material.YELLOW_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Iron Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Iron Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean ironAbility(Player player) { public boolean ironAbility(Player player) {
eyeLasers(player,Material.LIGHT_GRAY_CONCRETE_POWDER,Material.LIGHT_GRAY_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.LIGHT_GRAY_CONCRETE_POWDER,Material.LIGHT_GRAY_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Lapis Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Lapis Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean lapisAbility(Player player) { public boolean lapisAbility(Player player) {
eyeLasers(player,Material.BLUE_CONCRETE,Material.BLUE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.BLUE_CONCRETE,Material.BLUE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Netherite Laser beam", description = "Shoot lasers from the eye on the chestpiece for 10 seconds", cooldownTicks = NETHERITE_COOLDOWN) @MaterialInfo(name = "Netherite Laser beam", description = "Shoot lasers from the eye on the chestpiece for 10 seconds", cooldownTicks = NETHERITE_COOLDOWN)
@Override @Override
public boolean netheriteAbility(Player player) { public boolean netheriteAbility(Player player) {
eyeLasers(player,Material.BLACK_CONCRETE,Material.BLACK_STAINED_GLASS,NETHERITE_DURATION,NETHERITE_DAMAGE,NETHERITE_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.BLACK_CONCRETE,Material.BLACK_STAINED_GLASS,NETHERITE_DURATION,NETHERITE_DAMAGE, NETHERITE_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Quartz Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Quartz Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean quartzAbility(Player player) { public boolean quartzAbility(Player player) {
eyeLasers(player,Material.WHITE_CONCRETE_POWDER,Material.WHITE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.WHITE_CONCRETE_POWDER,Material.WHITE_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Redstone Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Redstone Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean redstoneAbility(Player player) { public boolean redstoneAbility(Player player) {
eyeLasers(player,Material.RED_CONCRETE,Material.RED_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE,NORMAL_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.RED_CONCRETE,Material.RED_STAINED_GLASS,NORMAL_DURATION,NORMAL_DAMAGE, NORMAL_DAMAGE_CHANCE);
return true; return true;
} }
@MaterialInfo(name = "Resin Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = RESIN_COOLDOWN) @MaterialInfo(name = "Resin Laser beam", description = "Shoot lasers from the eye on the chestpiece for 5 seconds", cooldownTicks = RESIN_COOLDOWN)
@Override @Override
public boolean resinAbility(Player player) { public boolean resinAbility(Player player) {
eyeLasers(player,Material.ORANGE_CONCRETE_POWDER,Material.ORANGE_STAINED_GLASS,RESIN_DURATION,RESIN_DAMAGE,RESIN_DAMAGE_FAIL_CHANCE); eyeLasers(player,Material.ORANGE_CONCRETE_POWDER,Material.ORANGE_STAINED_GLASS,RESIN_DURATION,RESIN_DAMAGE, RESIN_DAMAGE_CHANCE);
return true; return true;
} }
} }

View File

@@ -25,14 +25,14 @@ import java.util.concurrent.atomic.AtomicInteger;
@PatternInfo(name = "The Host", description = "And like that, he vanishes!") @PatternInfo(name = "The Host", description = "And like that, he vanishes!")
public class HostAbility extends AbstractAbility { public class HostAbility extends AbstractAbility {
public static final int NORMAL_DURATION = 6; public static final int NORMAL_DURATION = 5;
public static final int NORMAL_COOLDOWN = 20 * 30; public static final int NORMAL_COOLDOWN = 20 * 30;
public static final int NETHERITE_DURATION = 15; public static final int NETHERITE_DURATION = 8;
public static final int NETHERITE_COOLDOWN = 20 * 20; public static final int NETHERITE_COOLDOWN = 20 * 45;
public static final int RESIN_DURATION = 5; public static final int RESIN_DURATION = 3;
public static final int RESIN_COOLDOWN = 20 * 15; public static final int RESIN_COOLDOWN = 20 * 10;
public HostAbility() { public HostAbility() {
super(TrimPattern.HOST); super(TrimPattern.HOST);

View File

@@ -28,7 +28,7 @@ public class RaiserAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 40; public static final int NORMAL_COOLDOWN = 20 * 40;
public static final int NETHERITE_DURATION = 20; public static final int NETHERITE_DURATION = 20;
public static final int NETHERITE_COOLDOWN = 20 * 25; public static final int NETHERITE_COOLDOWN = 20 * 30;
public static final int RESIN_DURATION = 10; public static final int RESIN_DURATION = 10;
public static final int RESIN_COOLDOWN = 20 * 15; public static final int RESIN_COOLDOWN = 20 * 15;

View File

@@ -29,13 +29,13 @@ import java.util.Random;
public class RibAbility extends AbstractAbility { public class RibAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 30; public static final int NORMAL_COOLDOWN = 20 * 30;
public static final int NORMAL_SPIKE_DAMAGE = 30; public static final int NORMAL_SPIKE_DAMAGE = 15;
public static final int NETHERITE_COOLDOWN = 20 * 20; public static final int NETHERITE_COOLDOWN = 20 * 20;
public static final int NETHERITE_SPIKE_DAMAGE = 50; public static final int NETHERITE_SPIKE_DAMAGE = 20;
public static final int RESIN_COOLDOWN = 20 * 15; public static final int RESIN_COOLDOWN = 20 * 15;
public static final int RESIN_SPIKE_DAMAGE = 15; public static final int RESIN_SPIKE_DAMAGE = 6;
private final Random random = new Random(); private final Random random = new Random();

View File

@@ -29,26 +29,29 @@ import java.util.concurrent.atomic.AtomicInteger;
@PatternInfo(name = "Build Sentry", description = "\"Meet the Engineer.\" Includes Variants.") @PatternInfo(name = "Build Sentry", description = "\"Meet the Engineer.\" Includes Variants.")
public class SentryAbility extends AbstractAbility { public class SentryAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 10; public static final int NORMAL_COOLDOWN = 20 * 60;
public static final int NORMAL_AMMO = 30; public static final int NORMAL_AMMO = 30;
public static final int NORMAL_MAX_LIFE = 30; public static final int NORMAL_MAX_LIFE = 30;
public static final int NORMAL_BULLET_COOLDOWN = 5; public static final int NORMAL_BULLET_COOLDOWN = 5;
public static final int NORMAL_BULLET_DAMAGE = 4;
public static final int NETHERITE_COOLDOWN = 20 * 15; public static final int NETHERITE_COOLDOWN = 20 * 45;
public static final int NETHERITE_AMMO = 50; public static final int NETHERITE_AMMO = 50;
public static final int NETHERITE_MAX_LIFE = 45; public static final int NETHERITE_MAX_LIFE = 30;
public static final int NETHERITE_BULLET_COOLDOWN = 2; public static final int NETHERITE_BULLET_COOLDOWN = 2;
public static final int NETHERITE_BULLET_DAMAGE = 5;
public static final int RESIN_COOLDOWN = 20 * 5; public static final int RESIN_COOLDOWN = 20 * 25;
public static final int RESIN_AMMO = 15; public static final int RESIN_AMMO = 5;
public static final int RESIN_MAX_LIFE = 15; public static final int RESIN_MAX_LIFE = 7;
public static final int RESIN_BULLET_COOLDOWN = 3; public static final int RESIN_BULLET_COOLDOWN = 1;
public static final int RESIN_BULLET_DAMAGE = 2;
public SentryAbility() { public SentryAbility() {
super(TrimPattern.SENTRY); super(TrimPattern.SENTRY);
} }
public static void spawnSentry(Location loc, Player owner, Material legsMat, Material turretMat, int ammo, long secondsAlive, long cooldownTicks) { public static void spawnSentry(Location loc, Player owner, Material legsMat, Material turretMat, int ammo, long secondsAlive, long cooldownTicks, double bulletDamage) {
AbstractAbility shaperInstance = main.man().abilityBackend.getAbility(TrimPattern.SHAPER); AbstractAbility shaperInstance = main.man().abilityBackend.getAbility(TrimPattern.SHAPER);
ShaperAbility shaper = (ShaperAbility) shaperInstance; ShaperAbility shaper = (ShaperAbility) shaperInstance;
@@ -126,14 +129,16 @@ public class SentryAbility extends AbstractAbility {
String bar = Text.generateProgressBar(10, maxAmmo, chamber); String bar = Text.generateProgressBar(10, maxAmmo, chamber);
meter.text(Text.color("%s's Sentry\n".formatted(owner.getName()) + "Ammo " + bar)); meter.text(Text.color("%s's Sentry\n".formatted(owner.getName()) + "Ammo " + bar));
Optional<Player> target = TargetingUtils.getClosestPlayer(finalLoc,15,p -> !p.isDead() && Optional<LivingEntity> target = TargetingUtils.getClosestLivingEntity(finalLoc,15,p -> !p.isDead() &&
!p.equals(owner) && !p.equals(owner) &&
!main.man().trustBackend.trusts(owner,p) && !main.man().trustBackend.trusts(owner,p) &&
!shaper.activeShellTasks.containsKey(p.getUniqueId()) && !shaper.activeShellTasks.containsKey(p.getUniqueId()) &&
PlayerUtils.combatAllowed(p,owner)); PlayerUtils.combatAllowed(p,owner) &&
!p.equals(dummy)
);
if (target.isPresent()) { if (target.isPresent()) {
Player tracked = target.get(); LivingEntity tracked = target.get();
Vector toEye = tracked.getLocation() Vector toEye = tracked.getLocation()
.add(0, tracked.getEyeHeight(), 0) .add(0, tracked.getEyeHeight(), 0)
.toVector() .toVector()
@@ -157,7 +162,7 @@ public class SentryAbility extends AbstractAbility {
int maxTick = liv.getMaximumNoDamageTicks(); int maxTick = liv.getMaximumNoDamageTicks();
liv.setNoDamageTicks(0); liv.setNoDamageTicks(0);
liv.setMaximumNoDamageTicks(0); liv.setMaximumNoDamageTicks(0);
liv.damage(8, DamageSource.builder(DamageType.ARROW).withDirectEntity(dummy).withDamageLocation(finalLoc).build()); liv.damage(bulletDamage, DamageSource.builder(DamageType.ARROW).withDirectEntity(dummy).build());
liv.setNoDamageTicks(tick); liv.setNoDamageTicks(tick);
liv.setMaximumNoDamageTicks(maxTick); liv.setMaximumNoDamageTicks(maxTick);
hitSound.playWithin(20); hitSound.playWithin(20);
@@ -233,77 +238,77 @@ public class SentryAbility extends AbstractAbility {
@MaterialInfo(name = "Amethyst ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Amethyst ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean amethystAbility(Player player) { public boolean amethystAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.AMETHYST_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.AMETHYST_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Copper ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Copper ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean copperAbility(Player player) { public boolean copperAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.COPPER_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.COPPER_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Diamond ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Diamond ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean diamondAbility(Player player) { public boolean diamondAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.DIAMOND_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.DIAMOND_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Emerald ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Emerald ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean emeraldAbility(Player player) { public boolean emeraldAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.EMERALD_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.EMERALD_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Gold ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Gold ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean goldAbility(Player player) { public boolean goldAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.GOLD_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.GOLD_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Iron ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Iron ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean ironAbility(Player player) { public boolean ironAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.IRON_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.IRON_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Lapis ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Lapis ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean lapisAbility(Player player) { public boolean lapisAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.LAPIS_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.LAPIS_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Netherite Sentry", description = "Spawns a supercharged sentry which absolutely shreds the nearest player", cooldownTicks = NETHERITE_COOLDOWN) @MaterialInfo(name = "Netherite Sentry", description = "Spawns a supercharged sentry which absolutely shreds the nearest player", cooldownTicks = NETHERITE_COOLDOWN)
@Override @Override
public boolean netheriteAbility(Player player) { public boolean netheriteAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.NETHERITE_BLOCK,Material.CRAFTER,NETHERITE_AMMO,NETHERITE_MAX_LIFE,NETHERITE_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.NETHERITE_BLOCK,Material.CRAFTER,NETHERITE_AMMO,NETHERITE_MAX_LIFE,NETHERITE_BULLET_COOLDOWN,NETHERITE_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Quartz ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Quartz ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean quartzAbility(Player player) { public boolean quartzAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.QUARTZ_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.QUARTZ_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Redstone ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Redstone ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean redstoneAbility(Player player) { public boolean redstoneAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.REDSTONE_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.REDSTONE_BLOCK,Material.DISPENSER,NORMAL_AMMO,NORMAL_MAX_LIFE,NORMAL_BULLET_COOLDOWN,NORMAL_BULLET_DAMAGE);
return true; return true;
} }
@MaterialInfo(name = "Resin ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = RESIN_COOLDOWN) @MaterialInfo(name = "Resin ", description = "Spawns a sentry which shoots the nearest player", cooldownTicks = RESIN_COOLDOWN)
@Override @Override
public boolean resinAbility(Player player) { public boolean resinAbility(Player player) {
spawnSentry(player.getLocation(),player,Material.RESIN_BLOCK,Material.DISPENSER,RESIN_AMMO,RESIN_MAX_LIFE,RESIN_BULLET_COOLDOWN); spawnSentry(player.getLocation(),player,Material.RESIN_BLOCK,Material.DISPENSER,RESIN_AMMO,RESIN_MAX_LIFE,RESIN_BULLET_COOLDOWN,RESIN_BULLET_DAMAGE);
return true; return true;
} }
} }

View File

@@ -35,24 +35,26 @@ public class ShaperAbility extends AbstractAbility implements Listener {
private final Map<UUID, AttributeModifier> knockbackModifiers = new ConcurrentHashMap<>(); private final Map<UUID, AttributeModifier> knockbackModifiers = new ConcurrentHashMap<>();
private final Map<UUID, Integer> originalFireTicks = new ConcurrentHashMap<>(); private final Map<UUID, Integer> originalFireTicks = new ConcurrentHashMap<>();
private static final int NORMAL_DURATION = 8 * 20; private static final int NORMAL_COOLDOWN = 20 * 30;
private static final int NORMAL_DURATION = 20 * 8;
private static final double NORMAL_SHATTER_DAMAGE = 10.0; private static final double NORMAL_SHATTER_DAMAGE = 10.0;
private static final double NORMAL_SHATTER_RADIUS = 8.0; private static final double NORMAL_SHATTER_RADIUS = 8.0;
private static final int SLOWNESS_AMPLIFIER = 1;
private static final int DEFAULT_COOLDOWN = 20 * 50; private static final int RESIN_COOLDOWN = 20 * 20;
private static final int NETHERITE_COOLDOWN = 20 * 90; private static final int RESIN_DURATION = 20 * 8;
private static final int RESIN_COOLDOWN = 20 * 40; private static final double RESIN_SHATTER_DAMAGE = 8;
private static final double RESIN_SHATTER_RADIUS = 8;
private static final double NETHERITE_DURATION_MULTIPLIER = 1.3; private static final int NETHERITE_COOLDOWN = 20 * 40;
private static final double NETHERITE_SHATTER_DAMAGE_MULTIPLIER = 1.5; private static final int NETHERITE_DURATION = 20 * 10;
private static final double NETHERITE_SHATTER_RADIUS_MULTIPLIER = 1.2; private static final double NETHERITE_SHATTER_DAMAGE = 16;
private static final double NETHERITE_SHATTER_RADIUS = 10;
public ShaperAbility() { public ShaperAbility() {
super(TrimPattern.SHAPER); super(TrimPattern.SHAPER);
} }
private void activateTerraShell(Player player, Material blockMaterialForShell) { private void activateTerraShell(Player player, Material blockMaterialForShell, int duration, double shatterDamage, double shatterRadius) {
UUID playerUUID = player.getUniqueId(); UUID playerUUID = player.getUniqueId();
if (activeShellTasks.containsKey(playerUUID)) return; if (activeShellTasks.containsKey(playerUUID)) return;
@@ -93,20 +95,7 @@ public class ShaperAbility extends AbstractAbility implements Listener {
shellParts.add(bd); shellParts.add(bd);
} }
int duration = NORMAL_DURATION; player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, duration, 1, false, false, true));
double shatterDamage = NORMAL_SHATTER_DAMAGE;
double shatterRadius = NORMAL_SHATTER_RADIUS;
int slownessAmplifier = SLOWNESS_AMPLIFIER;
if (blockMaterialForShell == Material.NETHERITE_BLOCK) {
duration = (int) (duration * NETHERITE_DURATION_MULTIPLIER);
shatterDamage *= NETHERITE_SHATTER_DAMAGE_MULTIPLIER;
shatterRadius *= NETHERITE_SHATTER_RADIUS_MULTIPLIER;
} else if (blockMaterialForShell == Material.RESIN_BLOCK) {
slownessAmplifier = 0;
}
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, duration, slownessAmplifier, false, false, true));
originalFireTicks.put(playerUUID, player.getFireTicks()); originalFireTicks.put(playerUUID, player.getFireTicks());
if (player.getFireTicks() > 0) player.setFireTicks(0); if (player.getFireTicks() > 0) player.setFireTicks(0);
@@ -243,80 +232,80 @@ public class ShaperAbility extends AbstractAbility implements Listener {
a.damage(event.getDamage()); a.damage(event.getDamage());
} }
@MaterialInfo(name = "Amethyst Terra Shell", description = "Protective Amethyst shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Amethyst Terra Shell", description = "Protective Amethyst shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean amethystAbility(Player player) { public boolean amethystAbility(Player player) {
activateTerraShell(player, Material.AMETHYST_BLOCK); activateTerraShell(player, Material.AMETHYST_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Copper Terra Shell", description = "Protective Copper shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Copper Terra Shell", description = "Protective Copper shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean copperAbility(Player player) { public boolean copperAbility(Player player) {
activateTerraShell(player, Material.COPPER_BLOCK); activateTerraShell(player, Material.COPPER_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Diamond Terra Shell", description = "Protective Diamond shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Diamond Terra Shell", description = "Protective Diamond shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean diamondAbility(Player player) { public boolean diamondAbility(Player player) {
activateTerraShell(player, Material.DIAMOND_BLOCK); activateTerraShell(player, Material.DIAMOND_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Emerald Terra Shell", description = "Protective Emerald shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Emerald Terra Shell", description = "Protective Emerald shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean emeraldAbility(Player player) { public boolean emeraldAbility(Player player) {
activateTerraShell(player, Material.EMERALD_BLOCK); activateTerraShell(player, Material.EMERALD_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Gold Terra Shell", description = "Protective Gold shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Gold Terra Shell", description = "Protective Gold shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean goldAbility(Player player) { public boolean goldAbility(Player player) {
activateTerraShell(player, Material.GOLD_BLOCK); activateTerraShell(player, Material.GOLD_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Iron Terra Shell", description = "Protective Iron shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Iron Terra Shell", description = "Protective Iron shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean ironAbility(Player player) { public boolean ironAbility(Player player) {
activateTerraShell(player, Material.IRON_BLOCK); activateTerraShell(player, Material.IRON_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Lapis Terra Shell", description = "Protective Lapis shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Lapis Terra Shell", description = "Protective Lapis shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean lapisAbility(Player player) { public boolean lapisAbility(Player player) {
activateTerraShell(player, Material.LAPIS_BLOCK); activateTerraShell(player, Material.LAPIS_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Netherite Terra Shell", description = "Superior Netherite shell: longer duration, higher resistance, stronger shatter.", cooldownTicks = NETHERITE_COOLDOWN) @MaterialInfo(name = "Netherite Terra Shell", description = "Superior Netherite shell: longer duration, higher resistance, stronger shatter.", cooldownTicks = NETHERITE_COOLDOWN)
@Override @Override
public boolean netheriteAbility(Player player) { public boolean netheriteAbility(Player player) {
activateTerraShell(player, Material.NETHERITE_BLOCK); activateTerraShell(player, Material.NETHERITE_BLOCK,NETHERITE_DURATION,NETHERITE_SHATTER_DAMAGE,NETHERITE_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Quartz Terra Shell", description = "Protective Quartz shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Quartz Terra Shell", description = "Protective Quartz shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean quartzAbility(Player player) { public boolean quartzAbility(Player player) {
activateTerraShell(player, Material.QUARTZ_BLOCK); activateTerraShell(player, Material.QUARTZ_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Redstone Terra Shell", description = "Protective Redstone shell, shatters on expiry.", cooldownTicks = DEFAULT_COOLDOWN) @MaterialInfo(name = "Redstone Terra Shell", description = "Protective Redstone shell, shatters on expiry.", cooldownTicks = NORMAL_COOLDOWN)
@Override @Override
public boolean redstoneAbility(Player player) { public boolean redstoneAbility(Player player) {
activateTerraShell(player, Material.REDSTONE_BLOCK); activateTerraShell(player, Material.REDSTONE_BLOCK,NORMAL_DURATION,NORMAL_SHATTER_DAMAGE,NORMAL_SHATTER_RADIUS);
return true; return true;
} }
@MaterialInfo(name = "Resin Terra Shell", description = "Lightweight Resin shell (reduced slowness), shatters on expiry. Faster cooldown.", cooldownTicks = RESIN_COOLDOWN) @MaterialInfo(name = "Resin Terra Shell", description = "Lightweight Resin shell (reduced slowness), shatters on expiry. Faster cooldown.", cooldownTicks = RESIN_COOLDOWN)
@Override @Override
public boolean resinAbility(Player player) { public boolean resinAbility(Player player) {
activateTerraShell(player, Material.RESIN_BLOCK); activateTerraShell(player, Material.RESIN_BLOCK,RESIN_DURATION,RESIN_SHATTER_DAMAGE,RESIN_SHATTER_RADIUS);
return true; return true;
} }
} }

View File

@@ -29,11 +29,14 @@ import java.util.Optional;
public class SilenceAbility extends AbstractAbility { public class SilenceAbility extends AbstractAbility {
public static final double NORMAL_DAMAGE = 10; public static final double NORMAL_DAMAGE = 10;
public static final int NORMAL_COOLDOWN = 20 * 10; public static final int NORMAL_COOLDOWN = 20 * 25;
public static final double NETHERITE_DAMAGE = 15; public static final double NETHERITE_DAMAGE = 30;
public static final int NETHERITE_COOLDOWN = 20 * 12; public static final int NETHERITE_COOLDOWN = 20 * 12;
public static final double RESIN_DAMAGE = 10;
public static final int RESIN_COOLDOWN = 20 * 6;
public SilenceAbility() { public SilenceAbility() {
super(TrimPattern.SILENCE); super(TrimPattern.SILENCE);
} }
@@ -67,8 +70,8 @@ public class SilenceAbility extends AbstractAbility {
!shaper.activeShellTasks.containsKey(entity.getUniqueId()) && !shaper.activeShellTasks.containsKey(entity.getUniqueId()) &&
PlayerUtils.combatAllowed(entity,player) PlayerUtils.combatAllowed(entity,player)
); );
targets.forEach(target -> { targets.stream().filter(t -> t instanceof LivingEntity).map(t-> (LivingEntity) t).forEach(target -> {
PlayerUtils.dealTrueDamage((LivingEntity) target, DamageSource.builder(DamageType.SONIC_BOOM).withDirectEntity(player).build(), damage); target.damage(damage,DamageSource.builder(DamageType.SONIC_BOOM).withDirectEntity(player).build());
}); });
return !targets.isEmpty(); return !targets.isEmpty();
},(point,blockHit) -> { },(point,blockHit) -> {
@@ -151,10 +154,10 @@ public class SilenceAbility extends AbstractAbility {
return true; return true;
} }
@MaterialInfo(name = "Resin ", description = "Shoot a sonic blast like the warden. Deals 15 true damage", cooldownTicks = NORMAL_COOLDOWN) @MaterialInfo(name = "Resin ", description = "Shoot a sonic blast like the warden. Deals 15 true damage", cooldownTicks = RESIN_COOLDOWN)
@Override @Override
public boolean resinAbility(Player player) { public boolean resinAbility(Player player) {
shootSonicBoom(player, NORMAL_DAMAGE); shootSonicBoom(player, RESIN_DAMAGE);
return true; return true;
} }
} }

View File

@@ -34,17 +34,17 @@ public class SpireAbility extends AbstractAbility {
private final Map<UUID, BukkitTask> activeTasks = new HashMap<>(); private final Map<UUID, BukkitTask> activeTasks = new HashMap<>();
private final Map<UUID, UUID> activeProjectiles = new HashMap<>(); private final Map<UUID, UUID> activeProjectiles = new HashMap<>();
public static final int NORMAL_COOLDOWN = 20 * 90;
public static final int NORMAL_DURATION = 30; public static final int NORMAL_DURATION = 30;
public static final int NORMAL_HEIGHT = 20; public static final int NORMAL_HEIGHT = 20;
public static final int NORMAL_COOLDOWN = 20 * 90;
public static final int NETHERITE_COOLDOWN = 20 * 100;
public static final int NETHERITE_DURATION = 40; public static final int NETHERITE_DURATION = 40;
public static final int NETHERITE_HEIGHT = 30; public static final int NETHERITE_HEIGHT = 30;
public static final int NETHERITE_COOLDOWN = 20 * 100;
public static final int RESIN_COOLDOWN = 20 * 60;
public static final int RESIN_DURATION = 15; public static final int RESIN_DURATION = 15;
public static final int RESIN_HEIGHT = 10; public static final int RESIN_HEIGHT = 10;
public static final int RESIN_COOLDOWN = 20 * 60;
public SpireAbility() { public SpireAbility() {
super(TrimPattern.SPIRE); super(TrimPattern.SPIRE);

View File

@@ -24,17 +24,18 @@ import java.util.List;
@PatternInfo(name = "Tidal Wave", description = "No lifeguard on duty, swim at your own risk!") @PatternInfo(name = "Tidal Wave", description = "No lifeguard on duty, swim at your own risk!")
public class TideAbility extends AbstractAbility { public class TideAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 30;
public static final int NORMAL_RADIUS = 10; public static final int NORMAL_RADIUS = 10;
public static final int NORMAL_DAMAGE = 6; public static final int NORMAL_DAMAGE = 6;
public static final int NORMAL_COOLDOWN = 20 * 30;
public static final int NETHERITE_COOLDOWN = 20 * 35;
public static final int NETHERITE_RADIUS = 12; public static final int NETHERITE_RADIUS = 12;
public static final int NETHERITE_DAMAGE = 15; public static final int NETHERITE_DAMAGE = 15;
public static final int NETHERITE_COOLDOWN = 20 * 35;
public static final int RESIN_COOLDOWN = 20 * 6;
public static final int RESIN_RADIUS = 5; public static final int RESIN_RADIUS = 5;
public static final int RESIN_DAMAGE = 3; public static final int RESIN_DAMAGE = 3;
public static final int RESIN_COOLDOWN = 20 * 6;
public TideAbility() { public TideAbility() {
super(TrimPattern.TIDE); super(TrimPattern.TIDE);

View File

@@ -27,15 +27,15 @@ import java.util.concurrent.atomic.AtomicInteger;
public class WayfinderAbility extends AbstractAbility { public class WayfinderAbility extends AbstractAbility {
public static final int NORMAL_COOLDOWN = 20 * 5; public static final int NORMAL_COOLDOWN = 20 * 5;
public static final double NORMAL_DAMAGE = 30; public static final double NORMAL_DAMAGE = 36;
public static final double NORMAL_RADIUS = 10; public static final double NORMAL_RADIUS = 10;
public static final int NETHERITE_COOLDOWN = 20 * 4; public static final int NETHERITE_COOLDOWN = 20 * 4;
public static final double NETHERITE_DAMAGE = 40; public static final double NETHERITE_DAMAGE = 46;
public static final double NETHERITE_RADIUS = 15; public static final double NETHERITE_RADIUS = 15;
public static final int RESIN_COOLDOWN = 20 * 2; public static final int RESIN_COOLDOWN = 20 * 2;
public static final double RESIN_DAMAGE = 20; public static final double RESIN_DAMAGE = 26;
public static final double RESIN_RADIUS = 4; public static final double RESIN_RADIUS = 4;
public WayfinderAbility() { public WayfinderAbility() {

View File

@@ -88,13 +88,13 @@ public class PlayerUtils implements Main {
public static void dealTrueDamage(LivingEntity target, DamageSource source, double amount) { public static void dealTrueDamage(LivingEntity target, DamageSource source, double amount) {
if (source.getDirectEntity() instanceof Player a && target instanceof Player t && !combatAllowed(t,a)) return; if (source.getDirectEntity() instanceof Player a && target instanceof Player t && !combatAllowed(t,a)) return;
target.damage(1, source);
double newHealth = target.getHealth() - amount; double newHealth = target.getHealth() - amount;
if (newHealth <= 0) { if (newHealth <= 0) {
target.setHealth(0); target.setHealth(1);
target.damage(30, source);
} else { } else {
target.setHealth(newHealth); target.setHealth(newHealth);
target.damage(1, source);
} }
Entity attacker = source.getDirectEntity(); Entity attacker = source.getDirectEntity();