This commit is contained in:
Laura
2026-02-15 13:25:50 +01:00
parent 235ee7e7a1
commit a7620c09f8
32 changed files with 455 additions and 91 deletions
+5 -9
View File
@@ -10,15 +10,11 @@
<distributionManagement>
<repository>
<id>gitea</id>
<url>http://heimserver.local:36107/api/packages/minecraft/maven</url>
</repository>
<snapshotRepository>
<id>gitea</id>
<url>http://heimserver.local:36107/api/packages/minecraft/maven</url>
</snapshotRepository>
<repository>
<id>forgejo</id>
<name>Forgejo Maven</name>
<url>http://heimserver.local:36107/api/packages/minecraft/maven</url>
</repository>
</distributionManagement>
<properties>
<maven.compiler.source>21</maven.compiler.source>
@@ -1,14 +1,5 @@
package com.softwarerat.API.builder;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkEffectMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.SkullMeta;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -17,11 +8,20 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkEffectMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.SkullMeta;
// Another Item Builder
public class SpigotItem {
private ItemStack itemStack;
@@ -29,7 +29,7 @@ public class SpigotItem {
private String colorCode(@Nonnull String message) { return ChatColor.translateAlternateColorCodes('&', message); }
public SpigotItem(@Nonnull Material material, @Nonnull int amount) {
public SpigotItem(@Nonnull Material material, int amount) {
this.itemStack = new ItemStack(material, amount);
@@ -1,12 +1,5 @@
package com.softwarerat.API.commands;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.softwarerat.API.builder.SpigotInventory;
import com.softwarerat.API.builder.SpigotItem;
import com.softwarerat.API.builder.SpigotUI;
import com.softwarerat.GameAPI;
import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
@@ -16,6 +9,12 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.softwarerat.API.builder.SpigotInventory;
import com.softwarerat.API.builder.SpigotItem;
import com.softwarerat.API.builder.SpigotUI;
//Default Navigator
public class Navigator implements CommandExecutor {
JavaPlugin javaPlugin;
@@ -1,19 +1,19 @@
package com.softwarerat.API.data;
import com.softwarerat.API.gameState.GameState;
import com.softwarerat.API.gameType.GameType;
import com.softwarerat.API.location.PlayerSpawnLocation;
import com.softwarerat.GameAPI;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import java.util.List;
import com.softwarerat.API.data.gameState.GameStateManager;
import com.softwarerat.API.data.gameType.GameType;
import com.softwarerat.API.data.location.PlayerSpawnLocation;
import com.softwarerat.GameAPI;
import lombok.Getter;
import lombok.Setter;
// Server related Data
// made possible with Lombok
@Getter
@@ -22,7 +22,7 @@ public class GameData {
List<PlayerSpawnLocation> spawnLocations;
PlayerSpawnLocation defaultSpawnLocation;
GameAPI gameapi;
GameState currentGameState;
GameStateManager gameStateManager;
Location mapLocation;
String primaryKit;
String secondaryKit;
@@ -33,6 +33,7 @@ public class GameData {
Scoreboard scoreboard;
public GameData(GameAPI gameapi) {
this.gameapi = gameapi;
this.gameStateManager = new GameStateManager();
}
public String getGameHost(JavaPlugin javaPlugin){
@@ -0,0 +1,39 @@
package com.softwarerat.API.data.gameState;
import java.util.Arrays;
public class GameStateManager {
private final IGameState[] gameStates;
private int currentStateId;
public GameStateManager(IGameState... gameStates) {
this.gameStates = gameStates;
}
public IGameState getCurrentState() {
if (this.currentStateId < 0 || this.currentStateId >= this.gameStates.length)
return null;
return this.gameStates[this.currentStateId];
}
public IGameState nextState() {
if (this.currentStateId + 1 == this.gameStates.length)
throw new IllegalStateException("No states remaining");
IGameState oldState = getCurrentState();
this.currentStateId++;
IGameState newState = getCurrentState();
oldState.Stop();
newState.Start(this);
return newState;
}
@SafeVarargs
public final boolean isCurrentGameState(Class<? extends IGameState>... states) {
return Arrays.<Class<? extends IGameState>>stream(states).anyMatch(state -> state.isInstance(getCurrentState()));
}
}
@@ -0,0 +1,8 @@
package com.softwarerat.API.data.gameState;
public interface IGameState {
public void Start(GameStateManager manager);
public void Stop();
}
@@ -1,4 +1,4 @@
package com.softwarerat.API.gameType;
package com.softwarerat.API.data.gameType;
public enum GameType {
GAME_TYPE_MINIGAME,
@@ -1,4 +1,4 @@
package com.softwarerat.API.location;
package com.softwarerat.API.data.location;
import com.softwarerat.API.data.GameData;
import lombok.AllArgsConstructor;
@@ -1,12 +1,14 @@
package com.softwarerat.API.location;
import com.softwarerat.API.gameType.GameType;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Location;
package com.softwarerat.API.data.location;
import java.util.UUID;
import org.bukkit.Location;
import com.softwarerat.API.data.gameType.GameType;
import lombok.Getter;
import lombok.Setter;
// Game related Player spawn Location
@Getter
@@ -0,0 +1,83 @@
package com.softwarerat.API.data.player;
import java.util.Arrays;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.jetbrains.annotations.Nullable;
import com.softwarerat.API.data.store.CacheManager;
import com.softwarerat.API.data.store.FlagManager;
import com.softwarerat.API.event.PlayerFlagUpdateEvent;
public class GamePlayer extends CacheManager implements FlagManager<PlayerFlag> {
private static final String FLAG_KEY = "__flag__";
private final org.bukkit.entity.Player bukkitPlayer;
private Location enterSpectateLocation;
private Location leaveSpectateLocation;
GamePlayer(org.bukkit.entity.Player bukkitPlayer, Location enterSpectateLocation, Location leaveSpectateLocation) {
this.bukkitPlayer = bukkitPlayer;
this.enterSpectateLocation = enterSpectateLocation;
this.leaveSpectateLocation = leaveSpectateLocation;
}
public void setFlag(PlayerFlag flag) {
PlayerFlag currentFlag = getCurrentFlag();
PlayerFlagUpdateEvent event = new PlayerFlagUpdateEvent(this, currentFlag, flag);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
removeFromCache("__flag__");
addToCache("__flag__", flag.getInt());
}
}
public void removeFlag(PlayerFlag flag) {
setFlag(PlayerFlags.PLAYER);
}
public boolean hasFlag(PlayerFlag... flag) {
return ((Boolean)Arrays.<PlayerFlag>stream(flag)
.map(playerFlag -> Boolean.valueOf(getValueFromCache("__flag__").equals(playerFlag.getInt())))
.filter(aBoolean -> aBoolean.booleanValue())
.findFirst()
.orElse(Boolean.valueOf(false))).booleanValue();
}
public boolean isSpectator() {
return hasFlag(new PlayerFlag[] { PlayerFlags.SPECTATOR, PlayerFlags.SPECTATOR_TARGET });
}
public org.bukkit.entity.Player getBukkitPlayer() {
return this.bukkitPlayer;
}
public void setEnterSpectateLocation(Location enterSpectateLocation) {
this.enterSpectateLocation = enterSpectateLocation;
}
public void setLeaveSpectateLocation(Location leaveSpectateLocation) {
this.leaveSpectateLocation = leaveSpectateLocation;
}
public Location getEnterSpectateLocation() {
return this.enterSpectateLocation;
}
public Location getLeaveSpectateLocation() {
return this.leaveSpectateLocation;
}
@Nullable
private PlayerFlag getCurrentFlag() {
return Arrays.<PlayerFlag>stream((PlayerFlag[])PlayerFlags.values())
.filter(playerFlag -> !getValueFromCache("__flag__").equals(playerFlag.getInt()))
.findFirst()
.orElse(null);
}
}
@@ -1,9 +1,10 @@
package com.softwarerat.API.player;
package com.softwarerat.API.data.player;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import com.softwarerat.API.data.GameData;
import com.softwarerat.GameAPI;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
// Game related PlayerAPI for checking if a player is the GameHost
@@ -0,0 +1,7 @@
package com.softwarerat.API.data.player;
import com.softwarerat.API.data.store.Flag;
public interface PlayerFlag extends Flag {
}
@@ -0,0 +1,26 @@
package com.softwarerat.API.data.player;
public enum PlayerFlags implements PlayerFlag {
PLAYER("default flag for players", Integer.valueOf(1)),
SPECTATOR("if player is spectator", Integer.valueOf(2)),
SPECTATOR_TARGET("if player is spectator and views player", Integer.valueOf(3));
private final String description;
private final Integer number;
PlayerFlags(String description, Integer number) {
this.description = description;
this.number = number;
}
@Override
public String getDescription() {
return this.description;
}
@Override
public Integer getInt() {
return this.number;
}
}
@@ -0,0 +1,74 @@
package com.softwarerat.API.data.player;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class PlayerManager {
private final List<GamePlayer> playerList = new ArrayList<>();
private final Location enterSpectateLocation;
private final Location leaveSpectateLocation;
public PlayerManager(Location enterSpectateLocation, Location leaveSpectateLocation) {
this.enterSpectateLocation = enterSpectateLocation;
this.leaveSpectateLocation = leaveSpectateLocation;
}
protected void addPlayer(Player bukkitPlayer) {
if (getPlayer(bukkitPlayer) != null)
return;
GamePlayer player = new GamePlayer(bukkitPlayer, enterSpectateLocation, leaveSpectateLocation);
player.setFlag(PlayerFlags.PLAYER);
playerList.add(player);
}
protected void removePlayer(Player bukkitPlayer) {
GamePlayer player = getPlayer(bukkitPlayer);
if (player != null)
playerList.remove(player);
}
public GamePlayer getPlayer(Player bukkitPlayer) {
return playerList.stream()
.filter(player -> player.getBukkitPlayer().getUniqueId()
.equals(bukkitPlayer.getUniqueId()))
.findFirst()
.orElse(null);
}
public List<GamePlayer> players() {
return Collections.unmodifiableList(playerList);
}
public List<GamePlayer> playersWithFlag(PlayerFlag... flags) {
return playerList.stream()
.filter(player -> player.hasFlag(flags))
.collect(Collectors.toList());
}
public List<Player> bukkitPlayersWithFlag(PlayerFlag... flags) {
return playerList.stream()
.filter(player -> player.hasFlag(flags))
.map(GamePlayer::getBukkitPlayer)
.collect(Collectors.toList());
}
public List<GamePlayer> playersWithNoFlag(PlayerFlag... flags) {
return playerList.stream()
.filter(player -> !player.hasFlag(flags))
.collect(Collectors.toList());
}
public List<Player> bukkitPlayersWithNoFlag(PlayerFlag... flags) {
return playerList.stream()
.filter(player -> !player.hasFlag(flags))
.map(GamePlayer::getBukkitPlayer)
.collect(Collectors.toList());
}
}
@@ -1,12 +1,9 @@
package com.softwarerat.API.prefix;
package com.softwarerat.API.data.prefix;
import com.softwarerat.API.data.GameData;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
import java.util.List;
public class PrefixAPI {
/* PrefixSystem of the whole Network
* this will be the future way to add Tablist Prefixes, and will depend on GameData Settings like wich GameType and
@@ -1,9 +1,11 @@
package com.softwarerat.API.scoreboard;
package com.softwarerat.API.data.scoreboard;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.*;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
public class ScoreAPI {
@@ -0,0 +1,27 @@
package com.softwarerat.API.data.store;
import java.util.LinkedHashMap;
public class CacheManager {
private final LinkedHashMap<String, Object> cache = new LinkedHashMap<>();
public void addToCache(String key, Object value) {
this.cache.put(key, value);
}
public void removeFromCache(String key) {
this.cache.remove(key);
}
public void changeValueFromCache(String key, Object value) {
this.cache.replace(key, value);
}
public Object getValueFromCache(String key) {
return this.cache.getOrDefault(key, (Object)null);
}
public boolean containsCache(String key) {
return this.cache.containsKey(key);
}
}
@@ -0,0 +1,6 @@
package com.softwarerat.API.data.store;
public interface Flag {
String getDescription();
Integer getInt();
}
@@ -0,0 +1,9 @@
package com.softwarerat.API.data.store;
public interface FlagManager<T extends Flag> {
void setFlag(T paramT);
void removeFlag(T paramT);
boolean hasFlag(T... paramVarArgs);
}
@@ -1,4 +1,4 @@
package com.softwarerat.API.world;
package com.softwarerat.API.data.world;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -0,0 +1,58 @@
package com.softwarerat.API.event;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import com.softwarerat.API.data.player.GamePlayer;
import com.softwarerat.API.data.player.PlayerFlag;
public final class PlayerFlagUpdateEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final GamePlayer player;
private final PlayerFlag previousFlag;
private final PlayerFlag newFlag;
private boolean cancelled;
public PlayerFlagUpdateEvent(GamePlayer player, PlayerFlag previousFlag, PlayerFlag newFlag) {
this.player = player;
this.previousFlag = previousFlag;
this.newFlag = newFlag;
}
public boolean isCancelled() {
return this.cancelled;
}
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
public GamePlayer getPlayer() {
return this.player;
}
public PlayerFlag getNewFlag() {
return this.newFlag;
}
public PlayerFlag getPreviousFlag() {
return this.previousFlag;
}
@NotNull
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
@@ -1,4 +1,4 @@
package com.softwarerat.API.listener;
package com.softwarerat.API.event.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -1,4 +1,4 @@
package com.softwarerat.API.listener;
package com.softwarerat.API.event.listener;
// Chat Listener
public class ChatListener {
@@ -1,4 +1,4 @@
package com.softwarerat.API.listener;
package com.softwarerat.API.event.listener;
// Join Listener
public class JoinListener {
@@ -1,4 +1,4 @@
package com.softwarerat.API.listener;
package com.softwarerat.API.event.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -1,16 +1,17 @@
package com.softwarerat.API.listener;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.softwarerat.API.builder.SpigotInventory;
import com.softwarerat.API.builder.SpigotItem;
import com.softwarerat.API.builder.SpigotUI;
package com.softwarerat.API.event.listener;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.ChatColor;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.softwarerat.API.builder.SpigotInventory;
import com.softwarerat.API.builder.SpigotItem;
import com.softwarerat.API.builder.SpigotUI;
// Lobby join magic including the navigator
public class LobbyJoinListener implements Listener{
@@ -0,0 +1,4 @@
package com.softwarerat.API.event.listener;
public class QuitListener {
}
@@ -0,0 +1,42 @@
package com.softwarerat.API.event.listener.spectator;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import com.softwarerat.API.data.player.PlayerManager;
public class SpectatorFoodLevelChangeListener {
private final PlayerManager playerManager;
public SpectatorFoodLevelChangeListener(PlayerManager playerManager) {
this.playerManager = playerManager;
}
public PlayerManager playerManager() {
return this.playerManager;
}
@EventHandler
public void onSpectatorFoodLevelChange(FoodLevelChangeEvent event) {
Player player;
HumanEntity humanEntity = event.getEntity();
if (humanEntity instanceof Player) {
player = (Player)humanEntity;
} else {
return;
}
if (!this.playerManager.getPlayer(player).isSpectator())
return;
event.setFoodLevel(20);
event.setCancelled(true);
}
}
@@ -1,7 +0,0 @@
package com.softwarerat.API.gameState;
public enum GameState {
GAME_STATE_LOBBY,
GAME_STATE_INGAME;
}
@@ -1,8 +0,0 @@
package com.softwarerat.API.gameState;
public interface IGameState {
public void Start();
public void Stop();
}
@@ -1,4 +0,0 @@
package com.softwarerat.API.listener;
public class QuitListener {
}
+8 -7
View File
@@ -1,16 +1,17 @@
package com.softwarerat;
import com.softwarerat.API.commands.Navigator;
import com.softwarerat.API.data.GameData;
import com.softwarerat.API.location.LocationAPI;
import com.softwarerat.API.prefix.PrefixAPI;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import com.softwarerat.API.world.WorldAPI;
import com.softwarerat.API.data.GameData;
import com.softwarerat.API.data.location.LocationAPI;
import com.softwarerat.API.data.prefix.PrefixAPI;
import com.softwarerat.API.data.world.WorldAPI;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter