From 9eccb130e587d5c7355913ea1e04c0f275225c63 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sat, 8 Feb 2025 00:05:46 +0100 Subject: [PATCH] Add Tank class and update Fighter tools in CTF game Introduced a new Tank game class with specialized attributes and equipment, and added it to the class selection setup. Enhanced the Fighter class by introducing a healing potion tool to improve gameplay utility. These changes enhance gameplay diversity and team strategies. --- .../ctf/commands/subcommands/SelectClass.java | 2 + .../game_class/creation/FighterCreator.java | 19 +++++-- .../ctf/game_class/creation/TankCreator.java | 49 +++++++++++++++++++ .../ctf/game_class/implementations/Tank.java | 15 ++++++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/alttd/ctf/game_class/creation/TankCreator.java create mode 100644 src/main/java/com/alttd/ctf/game_class/implementations/Tank.java diff --git a/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java b/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java index aea8c0b..698b6a6 100644 --- a/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java +++ b/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java @@ -5,6 +5,7 @@ import com.alttd.ctf.config.Messages; import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game_class.GameClass; import com.alttd.ctf.game_class.creation.FighterCreator; +import com.alttd.ctf.game_class.creation.TankCreator; import com.alttd.ctf.gui.ClassSelectionGUI; import com.alttd.ctf.team.TeamPlayer; import org.bukkit.command.CommandSender; @@ -25,6 +26,7 @@ public class SelectClass extends SubCommand { this.gameClasses = new HashMap<>(); gameManager.getTeams().forEach(team -> { gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(FighterCreator.createFighter(team.getColor())); + gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(TankCreator.createTank(team.getColor())); }); } diff --git a/src/main/java/com/alttd/ctf/game_class/creation/FighterCreator.java b/src/main/java/com/alttd/ctf/game_class/creation/FighterCreator.java index 6ec00d4..a8f7015 100644 --- a/src/main/java/com/alttd/ctf/game_class/creation/FighterCreator.java +++ b/src/main/java/com/alttd/ctf/game_class/creation/FighterCreator.java @@ -3,27 +3,40 @@ package com.alttd.ctf.game_class.creation; import com.alttd.ctf.game_class.GameClass; import com.alttd.ctf.game_class.implementations.Fighter; import com.alttd.ctf.team.TeamColor; +import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionType; import java.util.List; +@Slf4j public class FighterCreator { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); public static GameClass createFighter(TeamColor teamColor) { - return new Fighter(getArmor(), getTools(), getDisplayItem(teamColor), 15, 3, 5); + return new Fighter(getArmor(), getTools(teamColor), getDisplayItem(teamColor), 15, 3, 5); } private static List getArmor() { return (List.of(Material.AIR, Material.AIR, Material.LEATHER_CHESTPLATE, Material.AIR)); } - private static List getTools() { - return (List.of()); + private static List getTools(TeamColor teamColor) { + ItemStack healthPot = new ItemStack(Material.SPLASH_POTION); + if (!(healthPot.getItemMeta() instanceof PotionMeta potionMeta)) { + throw new IllegalStateException("No potion meta from a splash potion"); + } + potionMeta.setBasePotionType(PotionType.STRONG_HEALING); + potionMeta.itemName(MiniMessage.miniMessage().deserialize( + String.format("Emergency AOE med kit", teamColor.hex()))); + healthPot.setItemMeta(potionMeta); + healthPot.setAmount(3); + return (List.of(healthPot)); } private static ItemStack getDisplayItem(TeamColor teamColor) { diff --git a/src/main/java/com/alttd/ctf/game_class/creation/TankCreator.java b/src/main/java/com/alttd/ctf/game_class/creation/TankCreator.java new file mode 100644 index 0000000..f48ca09 --- /dev/null +++ b/src/main/java/com/alttd/ctf/game_class/creation/TankCreator.java @@ -0,0 +1,49 @@ +package com.alttd.ctf.game_class.creation; + +import com.alttd.ctf.game_class.GameClass; +import com.alttd.ctf.game_class.implementations.Fighter; +import com.alttd.ctf.team.TeamColor; +import lombok.extern.slf4j.Slf4j; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Material; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.List; + +@Slf4j +public class TankCreator { + + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public static GameClass createTank(TeamColor teamColor) {//TODO add ability to become temp invulnerable (with some particle effects mayb?) + return new Fighter(getArmor(), getTools(teamColor), getDisplayItem(teamColor), 30, 7, 4); + } + + private static List getArmor() { + return (List.of(Material.CHAINMAIL_BOOTS, Material.CHAINMAIL_LEGGINGS, Material.LEATHER_CHESTPLATE, Material.CHAINMAIL_HELMET)); + } + + private static List getTools(TeamColor teamColor) { + ItemStack shield = new ItemStack(Material.SHIELD); + ItemMeta itemMeta = shield.getItemMeta(); + itemMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + itemMeta.itemName(MiniMessage.miniMessage().deserialize( + String.format("Shield", teamColor.hex()))); + shield.setItemMeta(itemMeta); + return (List.of(shield)); + } + + private static ItemStack getDisplayItem(TeamColor teamColor) { + ItemStack itemStack = new ItemStack(Material.SHIELD); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(String.format("Tank", teamColor.hex()))); + itemMeta.lore(List.of( + miniMessage.deserialize("The Tank is slow but has a lot of health"), + miniMessage.deserialize("They can protect themselves and their team with their shield.") + )); + itemStack.setItemMeta(itemMeta); + return itemStack; + } +} diff --git a/src/main/java/com/alttd/ctf/game_class/implementations/Tank.java b/src/main/java/com/alttd/ctf/game_class/implementations/Tank.java new file mode 100644 index 0000000..979d826 --- /dev/null +++ b/src/main/java/com/alttd/ctf/game_class/implementations/Tank.java @@ -0,0 +1,15 @@ +package com.alttd.ctf.game_class.implementations; + +import com.alttd.ctf.game_class.GameClass; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Tank extends GameClass { + + protected Tank(@NotNull List armor, @NotNull List tools, @NotNull ItemStack displayItem, double health, int throwTickSpeed, int damage) { + super(armor, tools, displayItem, health, throwTickSpeed, damage); + } +}