diff --git a/src/de/steamwar/lobby/LobbySystem.properties b/src/de/steamwar/lobby/LobbySystem.properties index a157b1b..2c54623 100644 --- a/src/de/steamwar/lobby/LobbySystem.properties +++ b/src/de/steamwar/lobby/LobbySystem.properties @@ -9,4 +9,72 @@ PORTAL_COMMAND_ADD_HELP = §8/§7portal §ecreate §8[§7PortalType§8] §8[§7P PORTAL_COMMAND_REMOVE_HELP = §8/§7portal §eremove §8[§7PortalName§8] §8- §7Entfernt ein Portal PORTAL_COMMAND_LIST_SHORT_INFO = §e{0} §8- §7{1} §7Pos1§8(§7{2}§8) §7Pos2§8(§7{3}§8) -PORTAL_NO_WORLDEDIT_SELECTION = §cKeine WorldEdit Selection \ No newline at end of file +PORTAL_NO_WORLDEDIT_SELECTION = §cKeine WorldEdit Selection + +# Particle +PARTICLE_INVENTORY = §6Partikel +PARTICLE_DESELECT = §8Keine Partikel +PARTICLE_LOCKED = {0} §8- §c§lGesperrt + +PARTICLE_UNLOCKED_BY_TEAM = §fTeambeitritt +PARTICLE_UNLOCKED_BY_EVENT = §fEventteilnahme +PARTICLE_UNLOCKED_BY_SERVER_TEAM = §fServerteam + +PARTICLE_ATTRIBUTE_CIRCLE = §8-§f Ring +PARTICLE_ATTRIBUTE_BI_CIRCLE = §8-§f Doppelring +PARTICLE_ATTRIBUTE_CLOUD = §8-§f Wolke +PARTICLE_ATTRIBUTE_TICK = §8-§f Immer aktiv +PARTICLE_ATTRIBUTE_NON_FLOOR = §8-§f in Luft +PARTICLE_ATTRIBUTE_WING = §8-§f Flügel +PARTICLE_ATTRIBUTE = §eAttribute§7: + +PARTICLE_UNLOCKED_BY = §eFreigeschaltet durch + +PARTICLE_SELECT = §eZum Auswählen klicken + +PARTICLE_SNEEZE = §aSneeze +PARTICLE_SMOKE = §7Rauch +PARTICLE_FIRE = §cFeuer +PARTICLE_WATER = §bWasser +PARTICLE_HEART = §cHerzen +PARTICLE_NOTES = §eNoten +PARTICLE_NAUTILUS = §aNautilus +PARTICLE_SNOWBALL = §fSchneeball +PARTICLE_EFFECT = §5Effekt +PARTICLE_CAMPFIRE = §7Rauch +PARTICLE_MAGIC = §5Magie +PARTICLE_ANGRY = §4Wut +PARTICLE_SLIME = §aSchleim +PARTICLE_MOB = §7Mob +PARTICLE_SQUID = §8Tintenfisch +PARTICLE_BUBBLE = §aBlasen +PARTICLE_HONEY = §6Honig +PARTICLE_NECTAR = §6Nektar +PARTICLE_FIREWORK = §7Feuerwerk +PARTICLE_DRAGON_BREATH = §5Drachenatem +PARTICLE_DAMAGE = §5Schaden +PARTICLE_DOLPHIN = §dDelphin +PARTICLE_WITCH = §5Hexe +PARTICLE_ENCHANTING = §eZauber +PARTICLE_HAPPY = §2Freude +PARTICLE_FLAME = §7Flammen +PARTICLE_END_ROD = §fEnd Rod +PARTICLE_CLOUD = §7Wolke +PARTICLE_TOTEM = §aTotem +PARTICLE_TOWN = §5Town +PARTICLE_ENCHANTING_CIRCLE = §fVerzaubert +PARTICLE_WATER_FIRE = §bWasser§7/§cFeuer +PARTICLE_MAGIC_ENCHANTING = §5Magie§7/§eZauber +PARTICLE_WINGS_EVIL = §5Lila Flügel + +PARTICLE_UNLOCKED_BY_EVENT_PLACEMENT = §f{0} 1., 2. oder 3. Platz +PARTICLE_UNLOCKED_BY_EVENT_PARTICIPATION = §f{0} + +PARTICLE_EVENT_ENCHANTING = §cVerzaubert +PARTICLE_EVENT_CLOUD = §fWolken +PARTICLE_EVENT_SMOKE = §7Rauch +PARTICLE_EVENT_WATER = §bWasser +PARTICLE_EVENT_WINGS = §fFlügel +PARTICLE_EVENT_RAIN_CLOUD = §fRegenwolke +PARTICLE_EVENT_WGS = §fWGS +PARTICLE_EVENT_WARGEARCLASH = §fClash \ No newline at end of file diff --git a/src/de/steamwar/lobby/listener/ParticleListener.java b/src/de/steamwar/lobby/listener/ParticleListener.java index 9d37e92..c504f74 100644 --- a/src/de/steamwar/lobby/listener/ParticleListener.java +++ b/src/de/steamwar/lobby/listener/ParticleListener.java @@ -20,8 +20,10 @@ package de.steamwar.lobby.listener; import de.steamwar.lobby.LobbySystem; +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.particles.ParticleEnum; import de.steamwar.lobby.particle.ParticleInventory; -import de.steamwar.lobby.particle.SpecialParticle; import de.steamwar.lobby.util.LobbyPlayer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -38,6 +40,15 @@ public class ParticleListener extends BasicListener { Bukkit.getScheduler().runTaskTimer(LobbySystem.getPlugin(), () -> { deg += 0.1; if (deg > 360) deg = 0; + Bukkit.getOnlinePlayers().forEach(player -> { + LobbyPlayer lobbyPlayer = LobbyPlayer.getLobbyPlayer(player.getUniqueId()); + ParticleEnum particle = lobbyPlayer.getParticle(); + if (particle == null) return; + BaseParticle baseParticle = particle.getParticle(); + if (baseParticle.needsTick()) { + baseParticle.particle(new ParticleData(player.getWorld(), player, deg)); + } + }); }, 0, 1); } @@ -53,11 +64,11 @@ public class ParticleListener extends BasicListener { public void handlePlayerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); LobbyPlayer lobbyPlayer = LobbyPlayer.getLobbyPlayer(player.getUniqueId()); - SpecialParticle particle = lobbyPlayer.getParticle(); - + ParticleEnum particle = lobbyPlayer.getParticle(); if (particle == null) return; - particle.execute(player.getWorld(), player, deg); + + BaseParticle baseParticle = particle.getParticle(); + if (baseParticle.needsTick()) return; + baseParticle.particle(new ParticleData(player.getWorld(), player, deg)); } - - } diff --git a/src/de/steamwar/lobby/particle/BaseParticle.java b/src/de/steamwar/lobby/particle/BaseParticle.java new file mode 100644 index 0000000..9d1a183 --- /dev/null +++ b/src/de/steamwar/lobby/particle/BaseParticle.java @@ -0,0 +1,49 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle; + +import org.bukkit.Color; +import org.bukkit.Particle; + +import java.util.Random; + +public interface BaseParticle { + Random RANDOM = new Random(); + + default Color randomColor() { + return Color.fromRGB(RANDOM.nextInt(256), RANDOM.nextInt(256), RANDOM.nextInt(256)); + } + + default float randomSize() { + return RANDOM.nextFloat() / 2 + 1; + } + + default Particle.DustOptions getParticleDust() { + return new Particle.DustOptions(randomColor(), randomSize()); + } + + ParticleItem getItem(); + + default boolean needsTick() { + return false; + } + + void particle(ParticleData particleData); +} diff --git a/src/de/steamwar/lobby/particle/CircleParticle.java b/src/de/steamwar/lobby/particle/CircleParticle.java deleted file mode 100644 index 1c76092..0000000 --- a/src/de/steamwar/lobby/particle/CircleParticle.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -import java.util.List; -import java.util.function.Function; -import java.util.function.UnaryOperator; - -public class CircleParticle extends SpecialParticle { - - private Particle particle; - private Particle particle2; - private Function locationShift; - private boolean customVelocity = false; - private float vx; - private float vy; - private float vz; - private double time = 1; - - public CircleParticle(Material material, String name, List lore, Particle particle, Particle particle2, UnaryOperator locationShift) { - super(material, name, lore); - this.particle = particle; - this.particle2 = particle2; - this.locationShift = locationShift; - } - - public CircleParticle(Material material, String name, List lore, Particle particle, Particle particle2, UnaryOperator locationShift, float vx, float vy, float vz, double time) { - super(material, name, lore); - this.particle = particle; - this.particle2 = particle2; - this.locationShift = locationShift; - customVelocity = true; - this.vx = vx; - this.vy = vy; - this.vz = vz; - this.time = time; - } - - @Override - public void particle(World world, Player player, double deg) { - Vector vector = new Vector(1, 0, 0); - vector.rotateAroundY(deg); - if (customVelocity) { - world.spawnParticle(particle, locationShift.apply(player.getLocation().add(vector)), 1, vx, vy, vz, time); - } else { - world.spawnParticle(particle, locationShift.apply(player.getLocation().add(vector)), 1); - } - - if (particle2 == null) { - return; - } - - vector.setX(-vector.getX()); - vector.setZ(-vector.getZ()); - if (customVelocity) { - world.spawnParticle(particle2, locationShift.apply(player.getLocation().add(vector)), 1, vx, vy, vz, time); - } else { - world.spawnParticle(particle2, locationShift.apply(player.getLocation().add(vector)), 1); - } - } - -} diff --git a/src/de/steamwar/lobby/particle/CloudCircleParticle.java b/src/de/steamwar/lobby/particle/CloudCircleParticle.java deleted file mode 100644 index 80f9ed7..0000000 --- a/src/de/steamwar/lobby/particle/CloudCircleParticle.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.util.List; -import java.util.function.UnaryOperator; - -public class CloudCircleParticle extends CircleParticle { - - public CloudCircleParticle(Material material, String name, List lore, Particle particle, UnaryOperator locationShift) { - super(material, name, lore, particle, null, locationShift, 0.0F, 0.0F, 0.0F, 0.01); - asCloud = true; - } - - @Override - public void particle(World world, Player player, double deg) { - super.particle(world, player, deg); - } - -} diff --git a/src/de/steamwar/lobby/particle/CloudParticle.java b/src/de/steamwar/lobby/particle/CloudParticle.java deleted file mode 100644 index 706c071..0000000 --- a/src/de/steamwar/lobby/particle/CloudParticle.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.util.List; - -public class CloudParticle extends SpecialParticle { - - private Particle particle; - - public CloudParticle(Material material, String name, List lore, Particle particle) { - super(material, name, lore); - asCloud = true; - this.particle = particle; - } - - @Override - public void particle(World world, Player player, double deg) { - world.spawnParticle(particle, player.getLocation().subtract(0, -0.2, 0), 5, 0.5F, 0.02F, 0.5F, 0.01); - } -} diff --git a/src/de/steamwar/lobby/particle/DustSimpleParticle.java b/src/de/steamwar/lobby/particle/DustSimpleParticle.java new file mode 100644 index 0000000..417b6ad --- /dev/null +++ b/src/de/steamwar/lobby/particle/DustSimpleParticle.java @@ -0,0 +1,60 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Particle; + +public class DustSimpleParticle implements BaseParticle { + + private final ParticleItem particleItem; + private final Particle particle; + private float vx; + private float vy; + private float vz; + private double time = 1; + private int count = 5; + + public DustSimpleParticle(ParticleItem particleItem, Particle particle, float vx, float vy, float vz, double time) { + this.particleItem = particleItem; + this.particle = particle; + this.vx = vx; + this.vy = vy; + this.vz = vz; + this.time = time; + } + + @Override + public ParticleItem getItem() { + return particleItem; + } + + @Override + public void particle(ParticleData particleData) { + Location location = particleData.getLocation().add(0.0, 0.2, 0.0); + Bukkit.getOnlinePlayers().forEach(player -> { + int viewDistance = player.getClientViewDistance() * 16; + if (location.distanceSquared(player.getLocation()) <= viewDistance * viewDistance) { + player.spawnParticle(particle, location, count, vx, vy, vz, time, getParticleDust()); + } + }); + } +} diff --git a/src/de/steamwar/lobby/particle/EventParticle.java b/src/de/steamwar/lobby/particle/EventParticle.java deleted file mode 100644 index 2268766..0000000 --- a/src/de/steamwar/lobby/particle/EventParticle.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.Material; -import org.bukkit.Particle; - -public enum EventParticle { - - WarGearSeason(22, new int[]{12, 285, 54}, new CloudCircleParticle(Material.ENCHANTING_TABLE, "§cVerzaubert", ParticleInventory.loreBuilder(new String[]{"Wolke", "Ring"}, "WarGearSeason 1., 2. oder 3. Platz"), Particle.ENCHANTMENT_TABLE, location -> location.add(0, 1.1, 0)), new SimpleParticle(Material.BOOK, "§5Verzaubert", ParticleInventory.loreBuilder(new String[0], "WarGearSeason"), Particle.ENCHANTMENT_TABLE)), - AirshipEvent(26, new int[]{205, 9, 54, 120, 292}, new CircleParticle(Material.SNOWBALL, "§fCloud", ParticleInventory.loreBuilder(new String[]{"Ring"}, "AirshipEvent 1., 2. oder 3. Platz"), Particle.CLOUD, null, location -> location.add(0, 2.2, 0)), new SimpleParticle(Material.SNOW_BLOCK, "§fCloud", ParticleInventory.loreBuilder(new String[0], "AirshipEvent"), Particle.CLOUD)), - HellsBellsWs(28, new int[]{205, 9, 11}, new CloudCircleParticle(Material.TNT_MINECART, "§7Smoke", ParticleInventory.loreBuilder(new String[]{"Wolke", "Ring"}, "HellsBells 1., 2. oder 3. Platz"), Particle.CAMPFIRE_COSY_SMOKE, location -> location.add(0, 2.2, 0)), new CircleParticle(Material.TNT, "§8Smoke", ParticleInventory.loreBuilder(new String[]{"Ring"}, "HellsBells"), Particle.CAMPFIRE_COSY_SMOKE, null, location -> location, 0, 0, 0, 0.01)), - Underwater(31, new int[]{9, 210, 520}, new CloudParticle(Material.PRISMARINE_CRYSTALS, "§bWasser", ParticleInventory.loreBuilder(new String[]{"Wolke"}, "Underwater 1., 2. oder 3. Platz"), Particle.DRIP_WATER), new SimpleParticle(Material.PRISMARINE_BRICKS, "§bWasser", ParticleInventory.loreBuilder(new String[0], "Underwater"), Particle.DRIP_WATER)); - - public static EventParticle[] eventParticles = values(); - - EventParticle(int event, int[] placementTeams, SpecialParticle placementParticle, SpecialParticle participationParticles) { - this.event = event; - this.placementTeams = placementTeams; - this.placementParticle = placementParticle; - this.participationParticles = participationParticles; - - } - - public final int event; - public final int[] placementTeams; - public final SpecialParticle placementParticle; - public final SpecialParticle participationParticles; -} diff --git a/src/de/steamwar/lobby/particle/EventParticleItem.java b/src/de/steamwar/lobby/particle/EventParticleItem.java new file mode 100644 index 0000000..2c679b9 --- /dev/null +++ b/src/de/steamwar/lobby/particle/EventParticleItem.java @@ -0,0 +1,74 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle; + +import de.steamwar.inventory.SWItem; +import de.steamwar.lobby.LobbySystem; +import de.steamwar.sql.Event; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class EventParticleItem extends ParticleItem { + + public static EventParticleItem participation(Material material, String name, int eventId) { + return new EventParticleItem(material, name, "PARTICLE_UNLOCKED_BY_EVENT_PARTICIPATION", eventId); + } + + public static EventParticleItem placement(Material material, String name, int eventId) { + return new EventParticleItem(material, name, "PARTICLE_UNLOCKED_BY_EVENT_PLACEMENT", eventId); + } + + private final String eventName; + + public EventParticleItem(Material material, String name, int eventId) { + this(material, name, null, eventId); + } + + public EventParticleItem(Material material, String name, String unlockedBy, int eventId) { + super(material, name, unlockedBy); + eventName = Event.get(eventId).getEventName(); + } + + public EventParticleItem addAttribute(String attribute) { + super.addAttribute(attribute); + return this; + } + + public SWItem toSWItem(Player player) { + String translatedName = LobbySystem.getMessage().parse(name, player); + List lore = new ArrayList<>(); + lore.add(""); + if (!attributes.isEmpty()) { + lore.add(LobbySystem.getMessage().parse("PARTICLE_ATTRIBUTE", player)); + attributes.forEach(attribute -> lore.add(LobbySystem.getMessage().parse(attribute, player))); + lore.add(""); + } + if (unlockedBy != null) { + lore.add(LobbySystem.getMessage().parse("PARTICLE_UNLOCKED_BY", player)); + lore.add(LobbySystem.getMessage().parse(unlockedBy, player, eventName)); + lore.add(""); + } + lore.add(LobbySystem.getMessage().parse("PARTICLE_SELECT", player)); + return new SWItem(material, translatedName, lore, false, clickType -> {}); + } +} diff --git a/src/de/steamwar/lobby/particle/FunctionalParticle.java b/src/de/steamwar/lobby/particle/FunctionalParticle.java deleted file mode 100644 index 2e11da0..0000000 --- a/src/de/steamwar/lobby/particle/FunctionalParticle.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.util.List; - -public class FunctionalParticle extends SpecialParticle { - - private ParticleFunction particleFunction; - - public FunctionalParticle(Material material, String name, List lore, ParticleFunction particleFunction) { - super(material, name, lore); - this.particleFunction = particleFunction; - } - - @Override - public void particle(World world, Player player, double deg) { - particleFunction.accept(world, player, deg); - } - -} diff --git a/src/de/steamwar/lobby/particle/ParticleData.java b/src/de/steamwar/lobby/particle/ParticleData.java new file mode 100644 index 0000000..8a4523b --- /dev/null +++ b/src/de/steamwar/lobby/particle/ParticleData.java @@ -0,0 +1,54 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; + +@RequiredArgsConstructor +@AllArgsConstructor +@Getter +public class ParticleData { + private final World world; + private final Player player; + private Location location; + private final double deg; + + public ParticleData withLocation(Location location) { + ParticleData particleData = copy(); + particleData.location = location; + return particleData; + } + + public Location getLocation() { + if (location == null) { + return player.getLocation(); + } + return location; + } + + public ParticleData copy() { + return new ParticleData(world, player, location, deg); + } +} diff --git a/src/de/steamwar/lobby/particle/ParticleFunction.java b/src/de/steamwar/lobby/particle/ParticleFunction.java deleted file mode 100644 index ab210ec..0000000 --- a/src/de/steamwar/lobby/particle/ParticleFunction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.lobby.particle; - -import org.bukkit.World; -import org.bukkit.entity.Player; - -@FunctionalInterface -public interface ParticleFunction { - void accept(World world, Player player, double time); -} diff --git a/src/de/steamwar/lobby/particle/ParticleInventory.java b/src/de/steamwar/lobby/particle/ParticleInventory.java index 33a7771..551e6db 100644 --- a/src/de/steamwar/lobby/particle/ParticleInventory.java +++ b/src/de/steamwar/lobby/particle/ParticleInventory.java @@ -22,13 +22,14 @@ package de.steamwar.lobby.particle; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; +import de.steamwar.lobby.LobbySystem; +import de.steamwar.lobby.particle.particles.*; import de.steamwar.lobby.util.LobbyPlayer; import de.steamwar.sql.Event; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.TeamTeilnahme; import de.steamwar.sql.UserGroup; import org.bukkit.Material; -import org.bukkit.Particle; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -42,82 +43,10 @@ public class ParticleInventory { private ParticleInventory() { } - private static final List PLAYER_PARTICLES = new ArrayList<>(); - private static final List TEAM_PARTICLES = new ArrayList<>(); - private static final List SERVERTEAM_PARTICLES = new ArrayList<>(); - - private static final List> PLAYER_PARTICLES_ENTRIES = new ArrayList<>(); - private static final List> TEAM_PARTICLES_ENTRIES = new ArrayList<>(); - private static final List> SERVERTEAM_PARTICLES_ENTRIES = new ArrayList<>(); - - static { - List defaultLore = loreBuilder(null, null); - List teamLore = loreBuilder(null, "Teambeitritt"); - List serverTeamLore = loreBuilder(null, "Serverteam"); - List serverTeamLore_C = loreBuilder(new String[]{"Wolke"}, "Serverteam"); - List serverTeamLore_R = loreBuilder(new String[]{"Ring"}, "Serverteam"); - List serverTeamLore_2R = loreBuilder(new String[]{"doppel Ring"}, "Serverteam"); - List serverTeamLore_CR = loreBuilder(new String[]{"Wolke", "Ring"}, "Serverteam"); - - PLAYER_PARTICLES.add(new SimpleParticle(Material.SLIME_BLOCK, "§aSneeze", defaultLore, Particle.SNEEZE, 0.2F, 0.2F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.COBWEB, "§7Smoke", defaultLore, Particle.SMOKE_NORMAL, 0.2F, 0.2F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.LAVA_BUCKET, "§cFeuer", defaultLore, Particle.DRIP_LAVA)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.WATER_BUCKET, "§bWasser", defaultLore, Particle.DRIP_WATER)); - PLAYER_PARTICLES.add(new FunctionalParticle(Material.RED_DYE, "§cHerzen", defaultLore, (world, player, integer) -> world.spawnParticle(Particle.HEART, player.getLocation().add(0, 2.2, 0), 5))); - PLAYER_PARTICLES.add(new FunctionalParticle(Material.NOTE_BLOCK, "§eNoten", defaultLore, (world, player, integer) -> world.spawnParticle(Particle.NOTE, player.getLocation().add(0, 2.2, 0), 5))); - PLAYER_PARTICLES.add(new SimpleParticle(Material.NAUTILUS_SHELL, "§aNautilis", defaultLore, Particle.NAUTILUS, 0.2F, 0F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.SNOWBALL, "§fSnowball", defaultLore, Particle.SNOWBALL, 0.2F, 0F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new FunctionalParticle(Material.GLASS_BOTTLE, "§5Effekt", defaultLore, (world, player, time) -> { - world.spawnParticle(Particle.REDSTONE, player.getLocation().add(0.0, 0.2, 0.0), 5, 0F, 0.2F, 0F, 0.01, SpecialParticle.getParticleDust()); - })); - PLAYER_PARTICLES.add(new SimpleParticle(Material.CAMPFIRE, "§7Rauch", defaultLore, Particle.CAMPFIRE_COSY_SMOKE, 0.0F, 0.2F, 0F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.CAULDRON, "§5Magie", defaultLore, Particle.CRIT_MAGIC, 0.2F, 0.2F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.REDSTONE_BLOCK, "§4Wut", defaultLore, Particle.VILLAGER_ANGRY, 0.2F, 0.02F, 0.2F, 0.01)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.SLIME_BALL, "§aSchleim", defaultLore, Particle.SLIME)); - PLAYER_PARTICLES.add(new SimpleParticle(Material.ZOMBIE_HEAD, "§7Mob", defaultLore, Particle.SPELL_MOB)); - - TEAM_PARTICLES.addAll(PLAYER_PARTICLES); - TEAM_PARTICLES.add(new SimpleParticle(Material.INK_SAC, "§8Squid", teamLore, Particle.SQUID_INK, 0.2F, 0.2F, 0.2F, 0.01)); - TEAM_PARTICLES.add(new SimpleParticle(Material.TUBE_CORAL, "§aBubble", teamLore, Particle.BUBBLE_POP, 0.2F, 0.2F, 0.2F, 0.01)); - TEAM_PARTICLES.add(new SimpleParticle(Material.HONEY_BOTTLE, "§6Honey", teamLore, Particle.DRIPPING_HONEY, 0.2F, 0.2F, 0.2F, 1)); - TEAM_PARTICLES.add(new SimpleParticle(Material.HONEYCOMB, "§6Nectar", teamLore, Particle.FALLING_NECTAR, 0.2F, 0.2F, 0.2F, 1)); - TEAM_PARTICLES.add(new FunctionalParticle(Material.FIRE_CHARGE, "§7Firework", loreBuilder(new String[]{"in Luft"}, "Team beitritt"), (world, player, time) -> { - if (world.getBlockAt(player.getLocation().subtract(0, 1, 0)).getType() == Material.AIR) { - world.spawnParticle(Particle.FIREWORKS_SPARK, player.getLocation().subtract(0, -0.2, 0), 2, 0.1F, 0.1F, 0.1F, 0.2); - } - })); - TEAM_PARTICLES.add(new SimpleParticle(Material.DRAGON_BREATH, "§5Dragon Breath", teamLore, Particle.DRAGON_BREATH, 1F, 0.02F, 1F, 0.01)); - TEAM_PARTICLES.add(new SimpleParticle(Material.SPIDER_EYE, "§5Damage", teamLore, Particle.DAMAGE_INDICATOR, 0.2F, 0F, 0.2F, 0.01)); - TEAM_PARTICLES.add(new SimpleParticle(Material.BLUE_DYE, "§dDolphin", teamLore, Particle.DOLPHIN, 0.2F, 0F, 0.2F, 0.01)); - TEAM_PARTICLES.add(new CircleParticle(Material.RED_CONCRETE, "§cHerzen", loreBuilder(new String[]{"Ring"}, "Team beitritt"), Particle.HEART, null, location -> location.add(0, 2.2, 0))); - - SERVERTEAM_PARTICLES.addAll(TEAM_PARTICLES); - SERVERTEAM_PARTICLES.add(new SimpleParticle(Material.EXPERIENCE_BOTTLE, "§5Hexe", serverTeamLore, Particle.SPELL_WITCH)); - SERVERTEAM_PARTICLES.add(new SimpleParticle(Material.ENCHANTING_TABLE, "§eZauber", serverTeamLore, Particle.ENCHANTMENT_TABLE)); - SERVERTEAM_PARTICLES.add(new SimpleParticle(Material.EMERALD_BLOCK, "§2Freude", serverTeamLore, Particle.VILLAGER_HAPPY, 0.2F, 0.2F, 0.2F, 0.01)); - SERVERTEAM_PARTICLES.add(new SimpleParticle(Material.FLINT_AND_STEEL, "§7Flammen", serverTeamLore, Particle.FLAME, 0F, 0.2F, 0F, 0.01)); - SERVERTEAM_PARTICLES.add(new SimpleParticle(Material.END_ROD, "§fEnd Rod", serverTeamLore, Particle.END_ROD, 0.2F, 0.2F, 0.2F, 0.01)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.WHITE_WOOL, "§fCloud", serverTeamLore_C, Particle.CLOUD)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.TOTEM_OF_UNDYING, "§aTotem", serverTeamLore_C, Particle.TOTEM)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.WHITE_DYE, "§eZauber", serverTeamLore_C, Particle.ENCHANTMENT_TABLE)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.FIRE_CORAL_BLOCK, "§cFlammen", serverTeamLore_C, Particle.FLAME)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.LIME_SHULKER_BOX, "§aSneeze", serverTeamLore_C, Particle.SNEEZE)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.GREEN_SHULKER_BOX, "§aSchleim", serverTeamLore_C, Particle.SLIME)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.DEAD_BRAIN_CORAL_BLOCK, "§8Smoke", serverTeamLore_C, Particle.CAMPFIRE_COSY_SMOKE)); - SERVERTEAM_PARTICLES.add(new CloudParticle(Material.FIREWORK_STAR, "§5Town", serverTeamLore_C, Particle.TOWN_AURA)); - SERVERTEAM_PARTICLES.add(new CircleParticle(Material.MAGMA_BLOCK, "§cFlammen", serverTeamLore_R, Particle.FLAME, null, location -> location.add(0, 1.1, 0), 0F, 0.0F, 0F, 0.01)); - SERVERTEAM_PARTICLES.add(new CircleParticle(Material.ENCHANTED_BOOK, "§fEnchanted", serverTeamLore_R, Particle.ENCHANTMENT_TABLE, null, location -> location.add(0, 1.1, 0), 0.0F, 0.0F, 0.0F, 0.01)); - SERVERTEAM_PARTICLES.add(new CircleParticle(Material.NOTE_BLOCK, "§eNoten", serverTeamLore_R, Particle.NOTE, null, location -> location.add(0, 2.2, 0), 0.0F, 0.0F, 0.0F, 0.01)); - SERVERTEAM_PARTICLES.add(new CircleParticle(Material.GUARDIAN_SPAWN_EGG, "§bWater§7/§cFire", serverTeamLore_2R, Particle.DRIP_WATER, Particle.DRIP_LAVA, location -> location.add(0, 1.1, 0), 0.0F, 0.0F, 0.0F, 0.01)); - SERVERTEAM_PARTICLES.add(new CircleParticle(Material.DIAMOND_SWORD, "§5Magic§7/§eZauber", serverTeamLore_2R, Particle.CRIT_MAGIC, Particle.ENCHANTMENT_TABLE, location -> location.add(0, 1.1, 0), 0.0F, 0.0F, 0.0F, 0.01)); - SERVERTEAM_PARTICLES.add(new CloudCircleParticle(Material.GLOWSTONE_DUST, "§5Magic", serverTeamLore_CR, Particle.CRIT_MAGIC, location -> location.add(0, 1.1, 0))); - SERVERTEAM_PARTICLES.add(new CloudCircleParticle(Material.FIRE_CORAL, "§cFlammen", serverTeamLore_CR, Particle.FLAME, location -> location.add(0, 1.1, 0))); - SERVERTEAM_PARTICLES.add(new CloudCircleParticle(Material.FIREWORK_ROCKET, "§7Firework", serverTeamLore_CR, Particle.FIREWORKS_SPARK, location -> location.add(0, 1.1, 0))); - SERVERTEAM_PARTICLES.add(new CloudCircleParticle(Material.CYAN_DYE, "§aWater", serverTeamLore_CR, Particle.WATER_WAKE, location -> location.add(0, 1.1, 0))); - - PLAYER_PARTICLES.forEach(specialParticle -> PLAYER_PARTICLES_ENTRIES.add(new SWListInv.SWListEntry<>(specialParticle.getItem(), specialParticle))); - TEAM_PARTICLES.forEach(specialParticle -> TEAM_PARTICLES_ENTRIES.add(new SWListInv.SWListEntry<>(specialParticle.getItem(), specialParticle))); - SERVERTEAM_PARTICLES.forEach(specialParticle -> SERVERTEAM_PARTICLES_ENTRIES.add(new SWListInv.SWListEntry<>(specialParticle.getItem(), specialParticle))); + private static void calculateParticles(ParticleEnum[] particles, Player player, List> particleList) { + for (ParticleEnum particle : particles) { + particleList.add(new SWListInv.SWListEntry<>(particle.getParticle().getItem().toSWItem(player), particle)); + } } private static SWInventory createInventory(Player player) { @@ -125,53 +54,52 @@ public class ParticleInventory { SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId()); UserGroup userGroup = steamwarUser.getUserGroup(); - List> particleList; - if (userGroup == UserGroup.Member) { - if (steamwarUser.getTeam() != 0) { - particleList = new ArrayList<>(TEAM_PARTICLES_ENTRIES); - } else { - if (TEAM_PARTICLES.contains(lobbyPlayer.getParticle())) { - lobbyPlayer.setParticle(null); - } - particleList = new ArrayList<>(PLAYER_PARTICLES_ENTRIES); - } - } else { - particleList = new ArrayList<>(SERVERTEAM_PARTICLES_ENTRIES); + List> particleList = new ArrayList<>(); + calculateParticles(PlayerParticle.particles, player, particleList); + if (steamwarUser.getTeam() != 0 || userGroup != UserGroup.Member) { + calculateParticles(TeamParticle.particles, player, particleList); + } + if (userGroup != UserGroup.Member) { + calculateParticles(ServerTeamParticle.particles, player, particleList); } Set events = steamwarUser.getTeam() == 0 ? new HashSet<>() : TeamTeilnahme.getEvents(steamwarUser.getTeam()).stream().map(Event::getEventID).collect(Collectors.toSet()); - for (EventParticle eventParticle : EventParticle.eventParticles) { - boolean clickablePlacement = userGroup.isTeamGroup(); - clickablePlacement |= (steamwarUser.getTeam() != 0 && contains(eventParticle.placementTeams, steamwarUser.getTeam())); - if (clickablePlacement) { - particleList.add(new SWListInv.SWListEntry<>(eventParticle.placementParticle.getItem(), eventParticle.placementParticle)); - } else { - SWItem swItem = eventParticle.placementParticle.getItem(); - swItem.setName(swItem.getItemMeta().getDisplayName() + " §8- §c§lGesperrt"); - particleList.add(new SWListInv.SWListEntry<>(swItem, null)); - } - - if (eventParticle.placementTeams.length != 0 && (userGroup.isTeamGroup() || events.contains(eventParticle.event))) { - particleList.add(new SWListInv.SWListEntry<>(eventParticle.participationParticles.getItem(), eventParticle.participationParticles)); - } else { - SWItem swItem = eventParticle.participationParticles.getItem(); - swItem.setName(swItem.getItemMeta().getDisplayName() + " §8- §c§lGesperrt"); - particleList.add(new SWListInv.SWListEntry<>(swItem, null)); - } + if (!events.isEmpty()) { + calculateParticles(EventParticle.particles, player, particleList); + } + for (EventParticlePlacement particle : EventParticlePlacement.particles) { + boolean clickable = userGroup.isTeamGroup(); + clickable |= (steamwarUser.getTeam() != 0 && contains(particle.getPlacementTeams(), steamwarUser.getTeam())); + addParticle(particleList, particle, clickable, player); + } + for (EventParticleParticipation particle : EventParticleParticipation.particles) { + boolean clickable = userGroup.isTeamGroup(); + clickable |= events.contains(particle.getEvent()); + addParticle(particleList, particle, clickable, player); } - SWListInv particleSWListInv = new SWListInv<>(player, "§6Partikel", false, particleList, (clickType, particle) -> { + SWListInv particleSWListInv = new SWListInv<>(player, LobbySystem.getMessage().parse("PARTICLE_INVENTORY", player), false, particleList, (clickType, particle) -> { if (particle == null) return; lobbyPlayer.setParticle(particle); player.closeInventory(); }); - particleSWListInv.setItem(49, Material.BARRIER, "§8Keine Partikel", new ArrayList<>(), false, clickType -> { + particleSWListInv.setItem(49, Material.BARRIER, LobbySystem.getMessage().parse("PARTICLE_DESELECT", player), new ArrayList<>(), false, clickType -> { lobbyPlayer.setParticle(null); }); return particleSWListInv; } + private static void addParticle(List> particleList, ParticleEnum particle, boolean clickable, Player player) { + if (clickable) { + particleList.add(new SWListInv.SWListEntry<>(particle.getParticle().getItem().toSWItem(player), particle)); + } else { + SWItem swItem = particle.getParticle().getItem().toSWItem(player); + swItem.setName(LobbySystem.getMessage().parse("PARTICLE_LOCKED", player, swItem.getItemMeta().getDisplayName())); + particleList.add(new SWListInv.SWListEntry<>(swItem, null)); + } + } + private static boolean contains(int[] ints, int element) { for (int i : ints) { if (i == element) return true; @@ -182,25 +110,5 @@ public class ParticleInventory { public static void openParticleInventory(Player player) { createInventory(player).open(); } - - public static List loreBuilder(String[] attribute, String unlocked) { - List lore = new ArrayList<>(); - lore.add(""); - if (attribute != null && attribute.length > 0) { - lore.add("§eAttribute§7:"); - for (String s : attribute) { - lore.add("§7- §f" + s); - } - lore.add(""); - } - if (unlocked != null) { - lore.add("§eFreigeschaltet durch"); - lore.add("§f" + unlocked); - lore.add(""); - } - lore.add("§eKlicken zum auswählen"); - return lore; - } - } diff --git a/src/de/steamwar/lobby/particle/ParticleItem.java b/src/de/steamwar/lobby/particle/ParticleItem.java new file mode 100644 index 0000000..50744d9 --- /dev/null +++ b/src/de/steamwar/lobby/particle/ParticleItem.java @@ -0,0 +1,69 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle; + +import de.steamwar.inventory.SWItem; +import de.steamwar.lobby.LobbySystem; +import lombok.RequiredArgsConstructor; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +@RequiredArgsConstructor +public class ParticleItem { + + protected final Material material; + protected final String name; + protected final Set attributes = new LinkedHashSet<>(); + protected String unlockedBy; + + public ParticleItem(Material material, String name, String unlockedBy) { + this.material = material; + this.name = name; + this.unlockedBy = unlockedBy; + } + + public ParticleItem addAttribute(String attribute) { + this.attributes.add(attribute); + return this; + } + + public SWItem toSWItem(Player player) { + String translatedName = LobbySystem.getMessage().parse(name, player); + List lore = new ArrayList<>(); + lore.add(""); + if (!attributes.isEmpty()) { + lore.add(LobbySystem.getMessage().parse("PARTICLE_ATTRIBUTE", player)); + attributes.forEach(attribute -> lore.add(LobbySystem.getMessage().parse(attribute, player))); + lore.add(""); + } + if (unlockedBy != null) { + lore.add(LobbySystem.getMessage().parse("PARTICLE_UNLOCKED_BY", player)); + lore.add(LobbySystem.getMessage().parse(unlockedBy, player)); + lore.add(""); + } + lore.add(LobbySystem.getMessage().parse("PARTICLE_SELECT", player)); + return new SWItem(material, translatedName, lore, false, clickType -> {}); + } +} diff --git a/src/de/steamwar/lobby/particle/SimpleParticle.java b/src/de/steamwar/lobby/particle/SimpleParticle.java index 52c0b1d..0f42271 100644 --- a/src/de/steamwar/lobby/particle/SimpleParticle.java +++ b/src/de/steamwar/lobby/particle/SimpleParticle.java @@ -1,62 +1,82 @@ /* + * This file is a part of the SteamWar software. * - * This file is a part of the SteamWar software. + * Copyright (C) 2022 SteamWar.de-Serverteam * - * Copyright (C) 2020 SteamWar.de-Serverteam + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.lobby.particle; -import org.bukkit.*; -import org.bukkit.entity.Player; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Particle; -import java.util.List; +public class SimpleParticle implements BaseParticle { -public class SimpleParticle extends SpecialParticle { - - private Particle particle; + private final ParticleItem particleItem; + private final Particle particle; private boolean customVelocity = false; private float vx; private float vy; private float vz; private double time = 1; + private int count = 5; - public SimpleParticle(Material material, String name, List lore, Particle particle) { - super(material, name, lore); + public SimpleParticle(ParticleItem particleItem, Particle particle) { + this.particleItem = particleItem; this.particle = particle; } - public SimpleParticle(Material material, String name, List lore, Particle particle, float vx, float vy, float vz, double time) { - super(material, name, lore); + public SimpleParticle(ParticleItem particleItem, Particle particle, float vx, float vy, float vz, double time) { + this.particleItem = particleItem; this.particle = particle; - customVelocity = true; + this.customVelocity = true; this.vx = vx; this.vy = vy; this.vz = vz; this.time = time; } - @Override - public void particle(World world, Player player, double deg) { - Location location = player.getLocation().add(0.0, 0.2, 0.0); - if (customVelocity) { - world.spawnParticle(particle, location, 5, vx, vy, vz, time); - } else { - world.spawnParticle(particle, location, 5); - } + public SimpleParticle(ParticleItem particleItem, Particle particle, float vx, float vy, float vz, double time, int count) { + this.particleItem = particleItem; + this.particle = particle; + this.customVelocity = true; + this.vx = vx; + this.vy = vy; + this.vz = vz; + this.time = time; + this.count = count; } + @Override + public ParticleItem getItem() { + return particleItem; + } + + @Override + public void particle(ParticleData particleData) { + Location location = particleData.getLocation().add(0.0, 0.2, 0.0); + Bukkit.getOnlinePlayers().forEach(player -> { + int viewDistance = player.getClientViewDistance() * 16; + if (location.distanceSquared(player.getLocation()) <= viewDistance * viewDistance) { + if (customVelocity) { + player.spawnParticle(particle, location, count, vx, vy, vz, time); + } else { + player.spawnParticle(particle, location, count); + } + } + }); + } } diff --git a/src/de/steamwar/lobby/particle/SpecialParticle.java b/src/de/steamwar/lobby/particle/SpecialParticle.java deleted file mode 100644 index 6ba8e21..0000000 --- a/src/de/steamwar/lobby/particle/SpecialParticle.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2020 SteamWar.de-Serverteam - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -package de.steamwar.lobby.particle; - -import de.steamwar.inventory.SWItem; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public abstract class SpecialParticle { - - private static final List EMPTY_LORE = new ArrayList<>(); - private static Random random = new Random(); - - public static Color randomColor() { - return Color.fromRGB(random.nextInt(256), random.nextInt(256), random.nextInt(256)); - } - - public static float randomSize() { - return random.nextFloat() / 2 + 1; - } - - public static Particle.DustOptions getParticleDust() { - return new Particle.DustOptions(randomColor(), randomSize()); - } - - private Material material; - private String name; - private List lore; - protected boolean asCloud = false; - - protected SpecialParticle(Material material, String name, List lore) { - if (lore == null) { - lore = EMPTY_LORE; - } - this.material = material; - this.name = name; - this.lore = lore; - } - - public final SWItem getItem() { - return new SWItem(material, name, lore, false, clickType -> {}); - } - - public final void execute(World world, Player player, double deg) { - if (asCloud) { - if (world.getBlockAt(player.getLocation().subtract(0, 1, 0)).getType() == Material.AIR) { - player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 5, 2, false, false, false)); - } else { - player.removePotionEffect(PotionEffectType.SLOW_FALLING); - return; - } - } - particle(world, player, deg); - } - - public abstract void particle(World world, Player player, double deg); - -} diff --git a/src/de/steamwar/lobby/particle/decorator/CircleParticle.java b/src/de/steamwar/lobby/particle/decorator/CircleParticle.java new file mode 100644 index 0000000..f46a09c --- /dev/null +++ b/src/de/steamwar/lobby/particle/decorator/CircleParticle.java @@ -0,0 +1,75 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.decorator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +public class CircleParticle implements BaseParticle { + + private ParticleItem particleItem = null; + private BaseParticle particle; + private BaseParticle particle2; + + public CircleParticle(BaseParticle particle) { + this.particle = particle; + } + + public CircleParticle(ParticleItem particleItem, BaseParticle particle, BaseParticle particle2) { + this.particleItem = particleItem; + this.particle = particle; + this.particle2 = particle2; + } + + @Override + public ParticleItem getItem() { + if (particleItem != null) { + return particleItem.addAttribute("PARTICLE_ATTRIBUTE_BI_CIRCLE"); + } + return particle.getItem().addAttribute("PARTICLE_ATTRIBUTE_CIRCLE"); + } + + @Override + public boolean needsTick() { + return particle.needsTick() || (particle2 != null && particle2.needsTick()); + } + + @Override + public void particle(ParticleData particleData) { + Location location = particleData.getLocation(); + + Vector vector = new Vector(1, 0, 0); + vector.rotateAroundY(particleData.getDeg()); + ParticleData nData = particleData.withLocation(location.clone().add(vector)); + particle.particle(nData); + + if (particle2 == null) { + return; + } + vector.setX(-vector.getX()); + vector.setZ(-vector.getZ()); + + nData = particleData.withLocation(location.clone().add(vector)); + particle2.particle(nData); + } +} diff --git a/src/de/steamwar/lobby/particle/decorator/CloudParticle.java b/src/de/steamwar/lobby/particle/decorator/CloudParticle.java new file mode 100644 index 0000000..773f741 --- /dev/null +++ b/src/de/steamwar/lobby/particle/decorator/CloudParticle.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.decorator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import lombok.NonNull; +import org.bukkit.Material; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class CloudParticle implements BaseParticle { + + private BaseParticle particle; + + public CloudParticle(@NonNull BaseParticle particle) { + this.particle = particle; + } + + @Override + public ParticleItem getItem() { + return particle.getItem().addAttribute("PARTICLE_ATTRIBUTE_CLOUD"); + } + + @Override + public boolean needsTick() { + return particle.needsTick(); + } + + @Override + public void particle(ParticleData particleData) { + if (particleData.getWorld().getBlockAt(particleData.getPlayer().getLocation().subtract(0, 0.5, 0)).getType() == Material.AIR) { + particleData.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 5, 2, false, false, false)); + } else { + particleData.getPlayer().removePotionEffect(PotionEffectType.SLOW_FALLING); + return; + } + ParticleData nData = particleData.withLocation(particleData.getLocation().subtract(0, -0.2, 0)); + particle.particle(nData); + } +} diff --git a/src/de/steamwar/lobby/particle/decorator/NonFloorParticle.java b/src/de/steamwar/lobby/particle/decorator/NonFloorParticle.java new file mode 100644 index 0000000..f0a090a --- /dev/null +++ b/src/de/steamwar/lobby/particle/decorator/NonFloorParticle.java @@ -0,0 +1,46 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.decorator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import org.bukkit.Material; + +public class NonFloorParticle implements BaseParticle { + + private BaseParticle particle; + + public NonFloorParticle(BaseParticle particle) { + this.particle = particle; + } + + @Override + public ParticleItem getItem() { + return particle.getItem().addAttribute("PARTICLE_ATTRIBUTE_NON_FLOOR"); + } + + @Override + public void particle(ParticleData particleData) { + if (particleData.getWorld().getBlockAt(particleData.getPlayer().getLocation().subtract(0, 0.5, 0)).getType() == Material.AIR) { + particle.particle(particleData); + } + } +} diff --git a/src/de/steamwar/lobby/particle/decorator/TickParticle.java b/src/de/steamwar/lobby/particle/decorator/TickParticle.java new file mode 100644 index 0000000..1eee74e --- /dev/null +++ b/src/de/steamwar/lobby/particle/decorator/TickParticle.java @@ -0,0 +1,49 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.decorator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import lombok.NonNull; + +public class TickParticle implements BaseParticle { + + private BaseParticle particle; + + public TickParticle(@NonNull BaseParticle particle) { + this.particle = particle; + } + + @Override + public ParticleItem getItem() { + return particle.getItem().addAttribute("PARTICLE_ATTRIBUTE_TICK"); + } + + @Override + public boolean needsTick() { + return true; + } + + @Override + public void particle(ParticleData particleData) { + particle.particle(particleData); + } +} diff --git a/src/de/steamwar/lobby/particle/decorator/WingParticle.java b/src/de/steamwar/lobby/particle/decorator/WingParticle.java new file mode 100644 index 0000000..ba07190 --- /dev/null +++ b/src/de/steamwar/lobby/particle/decorator/WingParticle.java @@ -0,0 +1,110 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.decorator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import lombok.SneakyThrows; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.util.Vector; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WingParticle implements BaseParticle, Listener { + + private Map playerMap = new HashMap<>(); + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + playerMap.remove(event.getPlayer()); + } + + public enum WingDesign { + SIMPLE("WingSimple4.png"), + COMPLEX("WingSimple2.png"), + SWORD("WingSword.png"), + SW("WingSW.png"), + WGS("WingWGS.png"), + SWORD_CROSSED("WingSwordCrossed.png"), + ; + + private List vectors = new ArrayList<>(); + + @SneakyThrows + WingDesign(String wingResource) { + BufferedImage bufferedImage = ImageIO.read(WingParticle.class.getResourceAsStream(wingResource)); + for (int x = 0; x < bufferedImage.getWidth(); x++) { + for (int y = 0; y < bufferedImage.getHeight(); y++) { + int rgb = bufferedImage.getRGB(x, y); + if (Color.WHITE.getRGB() != rgb) { + vectors.add(new Vector(x - bufferedImage.getWidth() / 2.0, bufferedImage.getHeight() - y - 1.0, 0)); + } + } + } + } + } + + private BaseParticle particle; + private double size; + private WingDesign wingDesign; + + public WingParticle(BaseParticle particle, double size, WingDesign wingDesign) { + this.particle = particle; + this.size = size; + this.wingDesign = wingDesign; + } + + @Override + public ParticleItem getItem() { + return particle.getItem().addAttribute("PARTICLE_ATTRIBUTE_WING"); + } + + @Override + public void particle(ParticleData particleData) { + int currentNumber = playerMap.getOrDefault(particleData.getPlayer(), 0) % 20; + playerMap.put(particleData.getPlayer(), currentNumber + 1); + if (currentNumber != 0) { + return; + } + if (particleData.getPlayer().isGliding()) { + return; + } + wingDesign.vectors.forEach(dVector -> { + Vector vector = new Vector(dVector.getX() * size, 0.6 + dVector.getY() * size - (particleData.getPlayer().isSneaking() ? 0.5 : 0) , 0.5); + vector.rotateAroundY(Math.toRadians(particleData.getPlayer().getLocation().getYaw() * -1)); + vector.setX(-vector.getX()); + vector.setZ(-vector.getZ()); + Location location = particleData.getPlayer().getLocation().clone().add(vector); + ParticleData current = particleData.withLocation(location); + particle.particle(current); + }); + } +} diff --git a/src/de/steamwar/lobby/particle/decorator/WingSW.png b/src/de/steamwar/lobby/particle/decorator/WingSW.png new file mode 100644 index 0000000..3f5dc5a Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingSW.png differ diff --git a/src/de/steamwar/lobby/particle/decorator/WingSimple2.png b/src/de/steamwar/lobby/particle/decorator/WingSimple2.png new file mode 100644 index 0000000..1b126d0 Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingSimple2.png differ diff --git a/src/de/steamwar/lobby/particle/decorator/WingSimple4.png b/src/de/steamwar/lobby/particle/decorator/WingSimple4.png new file mode 100644 index 0000000..09b3803 Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingSimple4.png differ diff --git a/src/de/steamwar/lobby/particle/decorator/WingSword.png b/src/de/steamwar/lobby/particle/decorator/WingSword.png new file mode 100644 index 0000000..074c91c Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingSword.png differ diff --git a/src/de/steamwar/lobby/particle/decorator/WingSwordCrossed.png b/src/de/steamwar/lobby/particle/decorator/WingSwordCrossed.png new file mode 100644 index 0000000..d0bd235 Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingSwordCrossed.png differ diff --git a/src/de/steamwar/lobby/particle/decorator/WingWGS.png b/src/de/steamwar/lobby/particle/decorator/WingWGS.png new file mode 100644 index 0000000..07f2ff1 Binary files /dev/null and b/src/de/steamwar/lobby/particle/decorator/WingWGS.png differ diff --git a/src/de/steamwar/lobby/particle/group/ParticleGroup.java b/src/de/steamwar/lobby/particle/group/ParticleGroup.java new file mode 100644 index 0000000..1d837c4 --- /dev/null +++ b/src/de/steamwar/lobby/particle/group/ParticleGroup.java @@ -0,0 +1,47 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.group; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; + +public class ParticleGroup implements BaseParticle { + + private ParticleItem particleItem; + private BaseParticle[] particles; + + public ParticleGroup(ParticleItem particleItem, BaseParticle... particles) { + this.particleItem = particleItem; + this.particles = particles; + } + + @Override + public ParticleItem getItem() { + return particleItem; + } + + @Override + public void particle(ParticleData particleData) { + for (BaseParticle particle : particles) { + particle.particle(particleData.copy()); + } + } +} diff --git a/src/de/steamwar/lobby/particle/mutator/LocationParticleMutator.java b/src/de/steamwar/lobby/particle/mutator/LocationParticleMutator.java new file mode 100644 index 0000000..602fd85 --- /dev/null +++ b/src/de/steamwar/lobby/particle/mutator/LocationParticleMutator.java @@ -0,0 +1,54 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.mutator; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleData; +import de.steamwar.lobby.particle.ParticleItem; +import org.bukkit.Location; + +import java.util.function.UnaryOperator; + +public class LocationParticleMutator implements BaseParticle { + + private BaseParticle particle; + private UnaryOperator mutator; + + public LocationParticleMutator(BaseParticle particle, UnaryOperator mutator) { + this.particle = particle; + this.mutator = mutator; + } + + @Override + public ParticleItem getItem() { + return particle.getItem(); + } + + @Override + public boolean needsTick() { + return particle.needsTick(); + } + + @Override + public void particle(ParticleData particleData) { + ParticleData nData = particleData.withLocation(mutator.apply(particleData.getLocation())); + particle.particle(nData); + } +} diff --git a/src/de/steamwar/lobby/particle/particles/EventParticle.java b/src/de/steamwar/lobby/particle/particles/EventParticle.java new file mode 100644 index 0000000..016ac02 --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/EventParticle.java @@ -0,0 +1,46 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.decorator.CircleParticle; +import de.steamwar.lobby.particle.decorator.NonFloorParticle; +import de.steamwar.lobby.particle.decorator.TickParticle; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +public enum EventParticle implements ParticleEnum { + + WATER(new TickParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(WATER_BUCKET, "PARTICLE_WATER", "PARTICLE_UNLOCKED_BY_EVENT"), Particle.DRIP_WATER), location -> location.add(0, 1.1, 0))))), + LAVA(new TickParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(LAVA_BUCKET, "PARTICLE_FIRE", "PARTICLE_UNLOCKED_BY_EVENT"), Particle.DRIP_LAVA), location -> location.add(0, 1.1, 0))))), + ; + public static ParticleEnum[] particles = values(); + + @Getter + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/particle/particles/EventParticleParticipation.java b/src/de/steamwar/lobby/particle/particles/EventParticleParticipation.java new file mode 100644 index 0000000..83689ac --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/EventParticleParticipation.java @@ -0,0 +1,56 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.EventParticleItem; +import de.steamwar.lobby.particle.ParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.decorator.CircleParticle; +import de.steamwar.lobby.particle.decorator.TickParticle; +import de.steamwar.lobby.particle.decorator.WingParticle; +import de.steamwar.lobby.particle.group.ParticleGroup; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +@Getter +public enum EventParticleParticipation implements ParticleEnum { + + WarGearSeason(22, new SimpleParticle(EventParticleItem.participation(BOOK, "PARTICLE_EVENT_ENCHANTING", 22), Particle.ENCHANTMENT_TABLE)), + AirshipEvent(26, new SimpleParticle(EventParticleItem.participation(SNOW_BLOCK, "PARTICLE_EVENT_CLOUD", 26), Particle.CLOUD)), + HellsBellsWs(28, new CircleParticle(new SimpleParticle(EventParticleItem.participation(TNT, "PARTICLE_EVENT_SMOKE", 28), Particle.CAMPFIRE_COSY_SMOKE, 0, 0, 0, 0.01))), + Underwater(31, new SimpleParticle(EventParticleItem.participation(PRISMARINE_BRICKS, "PARTICLE_EVENT_WATER", 31), Particle.DRIP_WATER)), + AdventWarShip(32, new ParticleGroup(EventParticleItem.participation(PRISMARINE_WALL, "PARTICLE_EVENT_WATER", 32), new SimpleParticle(null, Particle.DRIP_WATER), new SimpleParticle(null, Particle.WATER_WAKE, 0.2F, 0.2F, 0.2F, 0.01))), + MiniWarGearLiga(33, new CircleParticle(new SimpleParticle(EventParticleItem.participation(PRISMARINE_SLAB, "PARTICLE_EVENT_WATER", 33), Particle.WATER_WAKE, 0, 0, 0, 0))), + // Absturz(34, null), + UnderwaterMWG(35, new TickParticle(new LocationParticleMutator(new ParticleGroup(EventParticleItem.participation(BLUE_CARPET, "PARTICLE_EVENT_RAIN_CLOUD", 35), new SimpleParticle(null, Particle.CLOUD, 0.3F, 0.1F, 0.3F, 0.01), new SimpleParticle(null, Particle.WATER_WAKE, 0.3F, 0.1F, 0.3F, 0.01), new LocationParticleMutator(new SimpleParticle(null, Particle.DRIP_WATER, 0.3F, 0.0F, 0.3F, 0.01), location -> location.subtract(0, 0.2, 0))), location -> location.add(0, 2.2, 0)))), + WarGearSeason2022(37, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.participation(DIAMOND_SWORD, "PARTICLE_EVENT_WINGS", 37), Particle.DRAGON_BREATH, 0, 0, 0, 0, 1), 0.15, WingParticle.WingDesign.COMPLEX))), + // WargearClash(38, null), + ; + public static EventParticleParticipation[] particles = values(); + + private int event; + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/particle/particles/EventParticlePlacement.java b/src/de/steamwar/lobby/particle/particles/EventParticlePlacement.java new file mode 100644 index 0000000..662db20 --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/EventParticlePlacement.java @@ -0,0 +1,57 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.EventParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.decorator.CircleParticle; +import de.steamwar.lobby.particle.decorator.CloudParticle; +import de.steamwar.lobby.particle.decorator.TickParticle; +import de.steamwar.lobby.particle.decorator.WingParticle; +import de.steamwar.lobby.particle.group.ParticleGroup; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +@Getter +public enum EventParticlePlacement implements ParticleEnum { + + WarGearSeason(22, new int[]{12, 285, 54}, new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(EventParticleItem.placement(ENCHANTING_TABLE, "PARTICLE_EVENT_ENCHANTING", 22), Particle.ENCHANTMENT_TABLE, 0, 0, 0, 0.01), location -> location.add(0, 1.1, 0))))), + AirshipEvent(26, new int[]{205, 9, 54, 120, 292}, new CircleParticle(new LocationParticleMutator(new SimpleParticle(EventParticleItem.placement(SNOWBALL, "PARTICLE_EVENT_CLOUD", 26), Particle.CLOUD, 0, 0, 0, 0.01), location -> location.add(0, 2.2, 0)))), + HellsBellsWs(28, new int[]{205, 9, 11}, new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(EventParticleItem.placement(TNT_MINECART, "PARTICLE_EVENT_SMOKE", 28), Particle.CAMPFIRE_COSY_SMOKE, 0, 0, 0, 0.01), location -> location.add(0, 2.2, 0))))), + Underwater(31, new int[]{9, 210, 520}, new CloudParticle(new SimpleParticle(EventParticleItem.placement(PRISMARINE_SHARD, "PARTICLE_EVENT_WATER", 31), Particle.DRIP_WATER))), + AdventWarShip(32, new int[]{9, 205, 210}, new TickParticle(new LocationParticleMutator(new CircleParticle(new ParticleGroup(EventParticleItem.placement(PRISMARINE_CRYSTALS, "PARTICLE_EVENT_WATER", 32), new SimpleParticle(null, Particle.DRIP_WATER), new SimpleParticle(null, Particle.WATER_WAKE, 0.2F, 0.2F, 0.2F, 0.01))), location -> location.add(0, 1.1, 0)))), + MiniWarGearLiga(33, new int[]{9, 34, 205}, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.placement(IRON_SWORD, "PARTICLE_EVENT_WINGS", 33), Particle.WATER_WAKE, 0, 0, 0, 0, 1), 0.05, WingParticle.WingDesign.SWORD))), + Absturz(34, new int[]{210, 205, 527, 286}, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.placement(FEATHER, "PARTICLE_EVENT_WINGS", 34), Particle.CRIT_MAGIC, 0, 0, 0, 0, 1), 0.15, WingParticle.WingDesign.SIMPLE))), + UnderwaterMWG(35, new int[]{9, 210}, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.placement(CYAN_CARPET, "PARTICLE_EVENT_RAIN_CLOUD", 35), Particle.CRIT_MAGIC, 0, 0, 0, 0, 1), 0.15, WingParticle.WingDesign.SW))), + WarGearSeason2022(37, new int[]{}, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.placement(DIAMOND_HELMET, "PARTICLE_EVENT_WGS", 37), Particle.FIREWORKS_SPARK, 0, 0, 0, 0, 1), 0.15, WingParticle.WingDesign.WGS))), + WargearClash(38, new int[]{210, 158, 167, 286}, new TickParticle(new WingParticle(new SimpleParticle(EventParticleItem.placement(GOLDEN_SWORD, "PARTICLE_EVENT_WARGEARCLASH", 38), Particle.CRIT_MAGIC, 0, 0, 0, 0, 1), 0.1, WingParticle.WingDesign.SWORD_CROSSED))), + ; + public static EventParticlePlacement[] particles = values(); + + private int event; + private int[] placementTeams; + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/particle/particles/ParticleEnum.java b/src/de/steamwar/lobby/particle/particles/ParticleEnum.java new file mode 100644 index 0000000..db97369 --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/ParticleEnum.java @@ -0,0 +1,26 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; + +public interface ParticleEnum { + BaseParticle getParticle(); +} diff --git a/src/de/steamwar/lobby/particle/particles/PlayerParticle.java b/src/de/steamwar/lobby/particle/particles/PlayerParticle.java new file mode 100644 index 0000000..9bbbe1f --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/PlayerParticle.java @@ -0,0 +1,56 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.DustSimpleParticle; +import de.steamwar.lobby.particle.ParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +public enum PlayerParticle implements ParticleEnum { + + SNEEZE(new SimpleParticle(new ParticleItem(SLIME_BLOCK, "PARTICLE_SNEEZE"), Particle.SNEEZE, 0.2F, 0.2F, 0.2F, 0.01)), + SMOKE(new SimpleParticle(new ParticleItem(COBWEB, "PARTICLE_SMOKE"), Particle.SMOKE_NORMAL, 0.2F, 0.2F, 0.2F, 0.01)), + FIRE(new SimpleParticle(new ParticleItem(LAVA_BUCKET, "PARTICLE_FIRE"), Particle.DRIP_LAVA)), + WATER(new SimpleParticle(new ParticleItem(WATER_BUCKET, "PARTICLE_WATER"), Particle.DRIP_WATER)), + HEART(new LocationParticleMutator(new SimpleParticle(new ParticleItem(RED_DYE, "PARTICLE_HEART"), Particle.HEART), location -> location.add(0, 2.2, 0))), + NOTES(new LocationParticleMutator(new SimpleParticle(new ParticleItem(NOTE_BLOCK, "PARTICLE_NOTES"), Particle.NOTE), location -> location.add(0, 2.2, 0))), + NAUTILUS(new SimpleParticle(new ParticleItem(NAUTILUS_SHELL, "PARTICLE_NAUTILUS"), Particle.NAUTILUS, 0.2F, 0.2F, 0.2F, 0.01)), + SNOWBALL(new SimpleParticle(new ParticleItem(Material.SNOWBALL, "PARTICLE_SNOWBALL"), Particle.SNOWBALL, 0.2F, 0.2F, 0.2F, 0.01)), + EFFECT(new DustSimpleParticle(new ParticleItem(GLASS_BOTTLE, "PARTICLE_EFFECT"), Particle.REDSTONE, 0F, 0.2F, 0F, 0.01)), + CAMPFIRE(new SimpleParticle(new ParticleItem(Material.CAMPFIRE, "PARTICLE_CAMPFIRE"), Particle.CAMPFIRE_COSY_SMOKE, 0F, 0.2F, 0F, 0.01)), + MAGIC(new SimpleParticle(new ParticleItem(CAULDRON, "PARTICLE_MAGIC"), Particle.CRIT_MAGIC, 0.2F, 0.2F, 0.2F, 0.01)), + ANGRY(new SimpleParticle(new ParticleItem(REDSTONE_BLOCK, "PARTICLE_ANGRY"), Particle.VILLAGER_ANGRY, 0.2F, 0.2F, 0.2F, 0.01)), + SLIME(new SimpleParticle(new ParticleItem(SLIME_BALL, "PARTICLE_SLIME"), Particle.SLIME)), + MOB(new SimpleParticle(new ParticleItem(ZOMBIE_HEAD, "PARTICLE_MOB"), Particle.SPELL_MOB)), + ; + public static ParticleEnum[] particles = values(); + + @Getter + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/particle/particles/ServerTeamParticle.java b/src/de/steamwar/lobby/particle/particles/ServerTeamParticle.java new file mode 100644 index 0000000..fc9d000 --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/ServerTeamParticle.java @@ -0,0 +1,71 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.decorator.CircleParticle; +import de.steamwar.lobby.particle.decorator.CloudParticle; +import de.steamwar.lobby.particle.decorator.TickParticle; +import de.steamwar.lobby.particle.decorator.WingParticle; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +public enum ServerTeamParticle implements ParticleEnum { + + WITCH(new SimpleParticle(new ParticleItem(EXPERIENCE_BOTTLE, "PARTICLE_WITCH", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.SPELL_WITCH)), + ENCHANTING(new SimpleParticle(new ParticleItem(ENCHANTING_TABLE, "PARTICLE_ENCHANTING", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.ENCHANTMENT_TABLE)), + HAPPY(new SimpleParticle(new ParticleItem(EMERALD_BLOCK, "PARTICLE_HAPPY", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.VILLAGER_HAPPY, 0.2F, 0.2F, 0.2F, 0.01)), + FLAME(new SimpleParticle(new ParticleItem(FLINT_AND_STEEL, "PARTICLE_FLAME", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.FLAME, 0F, 0.2F, 0F, 0.01)), + END_ROD(new SimpleParticle(new ParticleItem(Material.END_ROD, "PARTICLE_END_ROD", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.END_ROD, 0.2F, 0.2F, 0.2F, 0.01)), + CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(WHITE_WOOL, "PARTICLE_CLOUD", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.CLOUD))), + TOTEM(new CloudParticle(new SimpleParticle(new ParticleItem(TOTEM_OF_UNDYING, "PARTICLE_TOTEM", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.TOTEM, 0.2F, 0.2F, 0.2F, 0.01))), + ENCHANTING_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(WHITE_DYE, "PARTICLE_ENCHANTING", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.ENCHANTMENT_TABLE))), + FLAME_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(FIRE_CORAL_BLOCK, "PARTICLE_FLAME", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.FLAME))), + SNEEZE_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(LIME_SHULKER_BOX, "PARTICLE_SNEEZE", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.SNEEZE))), + SLIME_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(GREEN_SHULKER_BOX, "PARTICLE_SLIME", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.SLIME))), + SMOKE_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(DEAD_BRAIN_CORAL_BLOCK, "PARTICLE_SMOKE", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.CAMPFIRE_COSY_SMOKE, 0.2F, 0.2F, 0.2F, 0.01))), + TOWN_CLOUD(new CloudParticle(new SimpleParticle(new ParticleItem(FIREWORK_STAR, "PARTICLE_TOWN", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.TOWN_AURA))), + FLAME_CIRCLE(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(MAGMA_BLOCK, "PARTICLE_FLAME", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.FLAME, 0F, 0F, 0F, 0.01), location -> location.add(0, 1.1, 0)))), + ENCHANTING_CIRCLE(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(WHITE_DYE, "PARTICLE_ENCHANTING_CIRCLE", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.ENCHANTMENT_TABLE, 0.2F, 0.2F, 0.2F, 0.01), location -> location.add(0, 1.1, 0)))), + NOTES_CIRCLE(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(NOTE_BLOCK, "PARTICLE_NOTES", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.NOTE, 0F, 0F, 0F, 0.01), location -> location.add(0, 2.2, 0)))), + WATER_FIRE(new LocationParticleMutator(new CircleParticle(new ParticleItem(GUARDIAN_SPAWN_EGG, "PARTICLE_WATER_FIRE", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), new SimpleParticle(null, Particle.DRIP_WATER, 0.0F, 0.0F, 0.0F, 0.01), new SimpleParticle(null, Particle.DRIP_LAVA, 0.0F, 0.0F, 0.0F, 0.01)), location -> location.add(0, 1.1, 0))), + WATER_FIRE_ALWAYS(new TickParticle(new LocationParticleMutator(new CircleParticle(new ParticleItem(MAGMA_CUBE_SPAWN_EGG, "PARTICLE_WATER_FIRE", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), new SimpleParticle(null,Particle.DRIP_WATER, 0.0F, 0.0F, 0.0F, 0.01), new SimpleParticle(null,Particle.DRIP_LAVA, 0.0F, 0.0F, 0.0F, 0.01)), location -> location.add(0, 1.1, 0)))), + MAGIC_ENCHANTING(new LocationParticleMutator(new CircleParticle(new ParticleItem(DIAMOND_SWORD, "PARTICLE_MAGIC_ENCHANTING", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), new SimpleParticle(null, Particle.CRIT_MAGIC, 0.0F, 0.0F, 0.0F, 0.01), new SimpleParticle(null, Particle.ENCHANTMENT_TABLE, 0.0F, 0.0F, 0.0F, 0.01)), location -> location.add(0, 1.1, 0))), + MAGIC_ENCHANTING_ALWAYS(new TickParticle(new LocationParticleMutator(new CircleParticle(new ParticleItem(WOODEN_SWORD, "PARTICLE_MAGIC_ENCHANTING", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), new SimpleParticle(null, Particle.CRIT_MAGIC, 0.0F, 0.0F, 0.0F, 0.01), new SimpleParticle(null, Particle.ENCHANTMENT_TABLE, 0.0F, 0.0F, 0.0F, 0.01)), location -> location.add(0, 1.1, 0)))), + MAGIC_CLOUD_CIRCLE(new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(GLOWSTONE_DUST, "PARTICLE_MAGIC", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.CRIT_MAGIC, 0.0F, 0.0F, 0.0F, 0.01), location -> location.add(0, 1.1, 0))))), + FLAME_CLOUD_CIRCLE(new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(FIRE_CORAL, "PARTICLE_FLAME", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.FLAME, 0.0F, 0.0F, 0.0F, 0.01), location -> location.add(0, 1.1, 0))))), + FIREWORK_CLOUD_CIRCLE(new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(FIREWORK_ROCKET, "PARTICLE_FIREWORK", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.FIREWORKS_SPARK, 0.0F, 0.0F, 0.0F, 0.01), location -> location.add(0, 1.1, 0))))), + WATER_CLOUD_CIRCLE(new CloudParticle(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(CYAN_DYE, "PARTICLE_WATER", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.WATER_WAKE, 0.0F, 0.0F, 0.0F, 0.01), location -> location.add(0, 1.1, 0))))), + ENCHANTING_DOUBLE_CIRCLE(new TickParticle(new LocationParticleMutator(new CircleParticle(new ParticleItem(BUBBLE_CORAL_BLOCK, "PARTICLE_ENCHANTING", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), new SimpleParticle(null, Particle.ENCHANTMENT_TABLE, 0.0F, 0.0F, 0.0F, 0.01), new SimpleParticle(null, Particle.ENCHANTMENT_TABLE, 0.0F, 0.0F, 0.0F, 0.01)), location -> location.add(0, 2.2, 0)))), + EVIL_WINGS(new TickParticle(new WingParticle(new SimpleParticle(new ParticleItem(PURPUR_SLAB, "PARTICLE_WINGS_EVIL", "PARTICLE_UNLOCKED_BY_SERVER_TEAM"), Particle.SPELL_WITCH, 0, 0, 0, 0, 1), 0.15, WingParticle.WingDesign.SIMPLE))), + ; + public static ParticleEnum[] particles = values(); + + @Getter + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/particle/particles/TeamParticle.java b/src/de/steamwar/lobby/particle/particles/TeamParticle.java new file mode 100644 index 0000000..9efc748 --- /dev/null +++ b/src/de/steamwar/lobby/particle/particles/TeamParticle.java @@ -0,0 +1,52 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.lobby.particle.particles; + +import de.steamwar.lobby.particle.BaseParticle; +import de.steamwar.lobby.particle.ParticleItem; +import de.steamwar.lobby.particle.SimpleParticle; +import de.steamwar.lobby.particle.decorator.CircleParticle; +import de.steamwar.lobby.particle.decorator.NonFloorParticle; +import de.steamwar.lobby.particle.mutator.LocationParticleMutator; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.Particle; + +import static org.bukkit.Material.*; + +@AllArgsConstructor +public enum TeamParticle implements ParticleEnum { + + SQUID(new SimpleParticle(new ParticleItem(INK_SAC, "PARTICLE_SQUID", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.SQUID_INK, 0.2F, 0.2F, 0.2F, 0.01)), + BUBBLE(new SimpleParticle(new ParticleItem(TUBE_CORAL, "PARTICLE_BUBBLE", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.BUBBLE_POP, 0.2F, 0.2F, 0.2F, 0.01)), + HONEY(new SimpleParticle(new ParticleItem(HONEY_BOTTLE, "PARTICLE_HONEY", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.DRIPPING_HONEY, 0.2F, 0.2F, 0.2F, 1)), + NECTAR(new SimpleParticle(new ParticleItem(HONEYCOMB, "PARTICLE_NECTAR", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.FALLING_NECTAR, 0.2F, 0.2F, 0.2F, 1)), + FIREWORK(new LocationParticleMutator(new NonFloorParticle(new SimpleParticle(new ParticleItem(FIRE_CHARGE, "PARTICLE_FIREWORK", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.FIREWORKS_SPARK, 0.1F, 0.1F, 0.1F, 0.2, 2)), location -> location.subtract(0, -0.2, 0))), + DRAGON_BREATH(new SimpleParticle(new ParticleItem(Material.DRAGON_BREATH, "PARTICLE_DRAGON_BREATH", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.DRAGON_BREATH, 1F, 0.2F, 1F, 0.01)), + DAMAGE(new SimpleParticle(new ParticleItem(SPIDER_EYE, "PARTICLE_DAMAGE", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.DAMAGE_INDICATOR, 0.2F, 0F, 0.2F, 0.01)), + DOLPHIN(new SimpleParticle(new ParticleItem(BLUE_DYE, "PARTICLE_DOLPHIN", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.DOLPHIN, 0.2F, 0F, 0.2F, 0.01)), + HEART(new CircleParticle(new LocationParticleMutator(new SimpleParticle(new ParticleItem(RED_CONCRETE, "PARTICLE_HEART", "PARTICLE_UNLOCKED_BY_TEAM"), Particle.HEART), location -> location.add(0, 2.2, 0)))), + ; + public static ParticleEnum[] particles = values(); + + @Getter + private BaseParticle particle; +} diff --git a/src/de/steamwar/lobby/util/LobbyPlayer.java b/src/de/steamwar/lobby/util/LobbyPlayer.java index ed0a018..03927ba 100644 --- a/src/de/steamwar/lobby/util/LobbyPlayer.java +++ b/src/de/steamwar/lobby/util/LobbyPlayer.java @@ -19,7 +19,9 @@ package de.steamwar.lobby.util; -import de.steamwar.lobby.particle.SpecialParticle; +import de.steamwar.lobby.particle.particles.*; +import de.steamwar.sql.SteamwarUser; +import de.steamwar.sql.UserConfig; import org.bukkit.entity.Player; import java.util.HashMap; @@ -30,13 +32,40 @@ public class LobbyPlayer { private static Map cache = new HashMap<>(); - private SpecialParticle specialParticle; + private ParticleEnum particle; + private int userId; private boolean fly; private LobbyPlayer(UUID uuid) { + userId = SteamwarUser.get(uuid).getId(); cache.put(uuid, this); - specialParticle = null; + particle = null; + String saved = UserConfig.getConfig(userId, "lobby-particle"); + if (saved != null) { + String[] strings = saved.split("@"); + switch (strings[0]) { + case "PlayerParticle": + particle = PlayerParticle.valueOf(strings[1]); + break; + case "TeamParticle": + particle = TeamParticle.valueOf(strings[1]); + break; + case "ServerTeamParticle": + particle = ServerTeamParticle.valueOf(strings[1]); + break; + case "EventParticle": + particle = EventParticle.valueOf(strings[1]); + case "EventParticleParticipation": + particle = EventParticleParticipation.valueOf(strings[1]); + break; + case "EventParticlePlacement": + particle = EventParticlePlacement.valueOf(strings[1]); + break; + default: + break; + } + } } public boolean isFlying() { @@ -47,12 +76,18 @@ public class LobbyPlayer { this.fly = fly; } - public SpecialParticle getParticle() { - return specialParticle; + public ParticleEnum getParticle() { + return particle; } - public void setParticle(SpecialParticle specialParticle) { - this.specialParticle = specialParticle; + public void setParticle(ParticleEnum particle) { + if (particle == null) { + UserConfig.removePlayerConfig(userId, "lobby-particle"); + } else { + String saved = particle.getClass().getSimpleName() + "@" + ((Enum) particle).name(); + UserConfig.updatePlayerConfig(userId, "lobby-particle", saved); + } + this.particle = particle; } public static LobbyPlayer getLobbyPlayer(UUID uuid) { @@ -63,5 +98,4 @@ public class LobbyPlayer { public static LobbyPlayer getLobbyPlayer(Player player) { return getLobbyPlayer(player.getUniqueId()); } - }