Fixed round ending. kind of. The first round works the next one does not
This commit is contained in:
parent
cc267d8cfe
commit
7fed4d8435
@ -2,11 +2,9 @@ package net.nevet5gi;
|
|||||||
|
|
||||||
import net.nevet5gi.commands.StartGameCommand;
|
import net.nevet5gi.commands.StartGameCommand;
|
||||||
import net.nevet5gi.events.PreStartTTTEvent;
|
import net.nevet5gi.events.PreStartTTTEvent;
|
||||||
import net.nevet5gi.listeners.GameStartTTTListener;
|
import net.nevet5gi.listeners.*;
|
||||||
import net.nevet5gi.listeners.GamesOnTTTListener;
|
|
||||||
import net.nevet5gi.listeners.PlayerInteractAtEntityListener;
|
|
||||||
import net.nevet5gi.listeners.PreStartTTTListener;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
public final class SimpleTTTCore extends JavaPlugin {
|
public final class SimpleTTTCore extends JavaPlugin {
|
||||||
@ -16,7 +14,8 @@ public final class SimpleTTTCore extends JavaPlugin {
|
|||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
this.getCommand("startgame").setExecutor(new StartGameCommand(this));
|
this.getCommand("startgame").setExecutor(new StartGameCommand(this));
|
||||||
this.getServer().getPluginManager().registerEvents(new PlayerInteractAtEntityListener(), this);
|
this.getServer().getPluginManager().registerEvents(new DeathListener(), this);
|
||||||
|
this.getServer().getPluginManager().registerEvents(new PlayerAttackListener(), this);
|
||||||
this.getServer().getPluginManager().registerEvents(new GamesOnTTTListener(), this);
|
this.getServer().getPluginManager().registerEvents(new GamesOnTTTListener(), this);
|
||||||
this.getServer().getPluginManager().registerEvents(new GameStartTTTListener(), this);
|
this.getServer().getPluginManager().registerEvents(new GameStartTTTListener(), this);
|
||||||
this.getServer().getPluginManager().registerEvents(new PreStartTTTListener(), this);
|
this.getServer().getPluginManager().registerEvents(new PreStartTTTListener(), this);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package net.nevet5gi.commands;
|
package net.nevet5gi.commands;
|
||||||
|
|
||||||
import net.nevet5gi.SimpleTTTCore;
|
import net.nevet5gi.SimpleTTTCore;
|
||||||
|
import net.nevet5gi.events.TTTGamesOnEvent;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -19,9 +20,10 @@ public class StartGameCommand implements CommandExecutor {
|
|||||||
if (sender instanceof Player) {
|
if (sender instanceof Player) {
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
if (player.getServer().getOnlinePlayers().size() >= 2) {
|
if (player.getServer().getOnlinePlayers().size() >= 2) {
|
||||||
player.sendMessage("Game Started");
|
if (!TTTGamesOnEvent.isInGame()) {
|
||||||
//player.sendMessage(getRandomRole().toString());
|
player.sendMessage("Game Started");
|
||||||
SimpleTTTCore.startGame(plugin);
|
SimpleTTTCore.startGame(plugin);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage("Not enough players to start game!");
|
player.sendMessage("Not enough players to start game!");
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,11 @@ import net.nevet5gi.util.Role;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -16,9 +18,11 @@ public class TTTGamesOnEvent extends Event {
|
|||||||
|
|
||||||
private static JavaPlugin plugin;
|
private static JavaPlugin plugin;
|
||||||
|
|
||||||
private List<Player> participatingPlayers = new ArrayList<>();
|
private static boolean inGame = false;
|
||||||
private Map<Player, Role> playerRoles;
|
|
||||||
private int[] roleAmounts = {0,0,0,0,0,0,0,0};
|
private static List<Player> participatingPlayers = new ArrayList<>();
|
||||||
|
private static Map<Player, Role> playerRoles;
|
||||||
|
private static int[] roleAmounts = {0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
|
|
||||||
public TTTGamesOnEvent(JavaPlugin plugin, List<Player> participatingPlayers, Map<Player, Role> playerRoles, int[] roleAmounts) {
|
public TTTGamesOnEvent(JavaPlugin plugin, List<Player> participatingPlayers, Map<Player, Role> playerRoles, int[] roleAmounts) {
|
||||||
@ -29,6 +33,12 @@ public class TTTGamesOnEvent extends Event {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void removePlayer(Player player) {
|
||||||
|
participatingPlayers.remove(player);
|
||||||
|
playerRoles.remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
public int[] getRoleAmounts() {
|
public int[] getRoleAmounts() {
|
||||||
return roleAmounts;
|
return roleAmounts;
|
||||||
}
|
}
|
||||||
@ -45,8 +55,18 @@ public class TTTGamesOnEvent extends Event {
|
|||||||
return playerRoles.get(player);
|
return playerRoles.get(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Role getPlayerRoleByInt(int playerInt) {
|
|
||||||
return playerRoles.get(playerInt);
|
public static boolean isInGame() {
|
||||||
|
return inGame;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setInGame(boolean choice) {
|
||||||
|
inGame = choice;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Role getRoleOfPlayer(Player player) {
|
||||||
|
return playerRoles.get(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
28
src/main/java/net/nevet5gi/listeners/DeathListener.java
Normal file
28
src/main/java/net/nevet5gi/listeners/DeathListener.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package net.nevet5gi.listeners;
|
||||||
|
|
||||||
|
import net.nevet5gi.events.TTTGamesOnEvent;
|
||||||
|
import net.nevet5gi.util.Role;
|
||||||
|
import net.nevet5gi.util.RoleColorHelper;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
|
|
||||||
|
public class DeathListener implements Listener {
|
||||||
|
@EventHandler
|
||||||
|
public static void onDeath(PlayerDeathEvent event) {
|
||||||
|
if (event.getEntity() instanceof Player) {
|
||||||
|
Player player = event.getEntity();
|
||||||
|
|
||||||
|
if (TTTGamesOnEvent.isInGame()) {
|
||||||
|
Role playerRole = TTTGamesOnEvent.getRoleOfPlayer(player);
|
||||||
|
int roleId = playerRole.getId();
|
||||||
|
TTTGamesOnEvent.removePlayer(player);
|
||||||
|
GamesOnTTTListener.rolesLeft[roleId]--;
|
||||||
|
GamesOnTTTListener.playersLeft--;
|
||||||
|
event.getEntity().getKiller().sendMessage(RoleColorHelper.getChatColorOfRole(TTTGamesOnEvent.getRoleOfPlayer(event.getEntity().getKiller())) + "You have killed: " + player.getName() + "!");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -24,17 +24,14 @@ public class GameStartTTTListener implements Listener {
|
|||||||
while (roleIsUnavailable) {
|
while (roleIsUnavailable) {
|
||||||
role = event.getRandomRole();
|
role = event.getRandomRole();
|
||||||
if (amounts[role.getId()] < 1) {
|
if (amounts[role.getId()] < 1) {
|
||||||
System.out.println(amounts[role.getId()]);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
event.setPlayerRole(player, role);
|
event.setPlayerRole(player, role);
|
||||||
amounts[role.getId()]--;
|
amounts[role.getId()]--;
|
||||||
roleIsUnavailable = false;
|
roleIsUnavailable = false;
|
||||||
}
|
}
|
||||||
System.out.println("End while loop");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("End for loop");
|
|
||||||
|
|
||||||
gameTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(event.getPlugin(), () -> {
|
gameTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(event.getPlugin(), () -> {
|
||||||
if (!called) {
|
if (!called) {
|
||||||
|
@ -17,17 +17,20 @@ import org.bukkit.event.Listener;
|
|||||||
public class GamesOnTTTListener implements Listener {
|
public class GamesOnTTTListener implements Listener {
|
||||||
|
|
||||||
private static int gamesOnTaskId = -1;
|
private static int gamesOnTaskId = -1;
|
||||||
private static int timeLeft = 300;
|
private static int timeLeft = 35;
|
||||||
|
|
||||||
public static int playersLeft = -1;
|
public static int playersLeft = -1;
|
||||||
|
|
||||||
private static boolean doRush = true;
|
private static boolean doRush = true;
|
||||||
|
|
||||||
|
public static int[] rolesLeft = {0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public static void gamesOnEvent(TTTGamesOnEvent event) {
|
public static void gamesOnEvent(TTTGamesOnEvent event) {
|
||||||
|
TTTGamesOnEvent.setInGame(true);
|
||||||
playersLeft = event.getPlayers().size();
|
playersLeft = event.getPlayers().size();
|
||||||
|
rolesLeft = RoleAmountHelper.getAmountOfRoles(playersLeft);
|
||||||
for (Player player : event.getPlayers()) {
|
for (Player player : event.getPlayers()) {
|
||||||
System.out.println(event.getPlayerRole(player));
|
|
||||||
ChatColor roleColor = RoleColorHelper.getChatColorOfRole(event.getPlayerRole(player));
|
ChatColor roleColor = RoleColorHelper.getChatColorOfRole(event.getPlayerRole(player));
|
||||||
player.sendTitle("Your role is: " + roleColor + event.getPlayerRole(player).toString(), "", 20, 80, 20);
|
player.sendTitle("Your role is: " + roleColor + event.getPlayerRole(player).toString(), "", 20, 80, 20);
|
||||||
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(roleColor + RoleDescriptionHelper.getRoleDescription(event.getPlayerRole(player))));
|
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(roleColor + RoleDescriptionHelper.getRoleDescription(event.getPlayerRole(player))));
|
||||||
@ -38,7 +41,7 @@ public class GamesOnTTTListener implements Listener {
|
|||||||
bossBar.addPlayer(player);
|
bossBar.addPlayer(player);
|
||||||
}
|
}
|
||||||
gamesOnTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(event.getPlugin(), () -> {
|
gamesOnTaskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(event.getPlugin(), () -> {
|
||||||
if (timeLeft == -1) {
|
if (timeLeft == -1 && TTTGamesOnEvent.isInGame()) {
|
||||||
bossBar.setTitle("Time Left: " + "Overtime");
|
bossBar.setTitle("Time Left: " + "Overtime");
|
||||||
bossBar.setColor(BarColor.RED);
|
bossBar.setColor(BarColor.RED);
|
||||||
} else if (timeLeft != 0) {
|
} else if (timeLeft != 0) {
|
||||||
@ -48,7 +51,7 @@ public class GamesOnTTTListener implements Listener {
|
|||||||
bossBar.setColor(BarColor.RED);
|
bossBar.setColor(BarColor.RED);
|
||||||
} else if (timeLeft > 30) {
|
} else if (timeLeft > 30) {
|
||||||
bossBar.setColor(BarColor.GREEN);
|
bossBar.setColor(BarColor.GREEN);
|
||||||
} else if (timeLeft > 10 && timeLeft < 30) {
|
} else if (timeLeft > 10 && timeLeft <= 30) {
|
||||||
bossBar.setColor(BarColor.YELLOW);
|
bossBar.setColor(BarColor.YELLOW);
|
||||||
} else {
|
} else {
|
||||||
bossBar.setColor(BarColor.WHITE);
|
bossBar.setColor(BarColor.WHITE);
|
||||||
@ -56,17 +59,21 @@ public class GamesOnTTTListener implements Listener {
|
|||||||
timeLeft--;
|
timeLeft--;
|
||||||
} else if (timeLeft == 0) {
|
} else if (timeLeft == 0) {
|
||||||
//DONE Make this not fail with null value after time is up
|
//DONE Make this not fail with null value after time is up
|
||||||
if (GameHelper.getGameDecision(event.getRoleAmounts(), playersLeft, doRush).equals(GameDecision.RUSH)) {
|
if (GameHelper.getGameDecision(rolesLeft, playersLeft, doRush).equals(GameDecision.RUSH)) {
|
||||||
doRush = false;
|
doRush = false;
|
||||||
timeLeft = 120;
|
timeLeft = 120;
|
||||||
} else if (GameHelper.getGameDecision(event.getRoleAmounts(), playersLeft, doRush).equals(GameDecision.OVERTIME)) {
|
} else if (GameHelper.getGameDecision(rolesLeft, playersLeft, doRush).equals(GameDecision.OVERTIME)) {
|
||||||
timeLeft = -1;
|
timeLeft = -1;
|
||||||
} else if (GameHelper.getGameDecision(event.getRoleAmounts(), playersLeft, doRush).equals(GameDecision.END)) {
|
} else if (GameHelper.getGameDecision(rolesLeft, playersLeft, doRush).equals(GameDecision.END)) {
|
||||||
bossBar.removeAll();
|
bossBar.removeAll();
|
||||||
for (Player player : event.getPlugin().getServer().getOnlinePlayers()) {
|
for (Player player : event.getPlugin().getServer().getOnlinePlayers()) {
|
||||||
player.sendTitle(RoleWinnerHelper.getTitle(GameHelper.getWinner()), "", 10, 60, 10);
|
player.sendTitle(RoleColorHelper.getChatColorOfRole(GameHelper.getWinner()) + RoleWinnerHelper.getTitle(GameHelper.getWinner()), "", 10, 60, 10);
|
||||||
}
|
}
|
||||||
SimpleTTTCore.startGame(event.getPlugin());
|
doRush = true;
|
||||||
|
/*SimpleTTTCore.startGame(event.getPlugin());*/
|
||||||
|
TTTGamesOnEvent.setInGame(false);
|
||||||
|
timeLeft = -1;
|
||||||
|
playersLeft = -1;
|
||||||
event.getPlugin().getServer().getScheduler().cancelTask(gamesOnTaskId);
|
event.getPlugin().getServer().getScheduler().cancelTask(gamesOnTaskId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package net.nevet5gi.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
public class PlayerAttackListener implements Listener {
|
||||||
|
|
||||||
|
}
|
@ -1,17 +0,0 @@
|
|||||||
package net.nevet5gi.listeners;
|
|
||||||
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
|
||||||
|
|
||||||
public class PlayerInteractAtEntityListener implements Listener {
|
|
||||||
@EventHandler
|
|
||||||
public static void onPlayerDeath(PlayerInteractAtEntityEvent event) {
|
|
||||||
if (event.getHand() == EquipmentSlot.OFF_HAND) {
|
|
||||||
return; // off hand packet, ignore.
|
|
||||||
}
|
|
||||||
|
|
||||||
GamesOnTTTListener.playersLeft--;
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,57 +3,72 @@ package net.nevet5gi.util;
|
|||||||
public class GameHelper {
|
public class GameHelper {
|
||||||
|
|
||||||
private static Role Winner = null;
|
private static Role Winner = null;
|
||||||
|
private static boolean inOvertime = false;
|
||||||
|
|
||||||
//Format: Detectives:Sheriffs:Survivalists:Mercenaries:Traitors:Assassins:LoneWolf:Jester
|
//Format: Detectives:Sheriffs:Survivalists:Mercenaries:Traitors:Assassins:LoneWolf:Jester
|
||||||
public static GameDecision getGameDecision(int[] PlayerRolesLeft, int PlayersLeft, boolean doRush) {
|
public static GameDecision getGameDecision(int[] PlayerRolesLeft, int PlayersLeft, boolean doRush) {
|
||||||
int InnocentRoles = PlayersLeft - (PlayerRolesLeft[4] + PlayerRolesLeft[5] + PlayerRolesLeft[6] + PlayerRolesLeft[7]);
|
|
||||||
int NeutralRoles = PlayerRolesLeft[6] + PlayerRolesLeft[7];
|
int NeutralRoles = PlayerRolesLeft[6] + PlayerRolesLeft[7];
|
||||||
int TraitorRoles = PlayerRolesLeft[4] + PlayerRolesLeft[5];
|
int TraitorRoles = PlayerRolesLeft[4] + PlayerRolesLeft[5];
|
||||||
|
int LoneWolf = PlayerRolesLeft[6];
|
||||||
|
int Jester = PlayerRolesLeft[7];
|
||||||
|
int InnocentRoles = PlayersLeft - (NeutralRoles + TraitorRoles);
|
||||||
|
|
||||||
|
|
||||||
if (NeutralRoles == 0 && TraitorRoles > 0) {
|
int CombinedRoles = InnocentRoles + NeutralRoles + TraitorRoles;
|
||||||
|
|
||||||
if (InnocentRoles > TraitorRoles && doRush) {
|
|
||||||
Winner = null;
|
|
||||||
return GameDecision.RUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TraitorRoles > InnocentRoles) {
|
|
||||||
Winner = Role.INNOCENT;
|
|
||||||
return GameDecision.END;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TraitorRoles == InnocentRoles) {
|
|
||||||
Winner = null;
|
|
||||||
return GameDecision.OVERTIME;
|
|
||||||
}
|
|
||||||
} else if (NeutralRoles > 0 && TraitorRoles == 0) {
|
|
||||||
if (NeutralRoles == InnocentRoles) {
|
|
||||||
Winner = null;
|
|
||||||
return GameDecision.OVERTIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NeutralRoles > InnocentRoles) {
|
|
||||||
Winner = Role.INNOCENT;
|
|
||||||
return GameDecision.END;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (InnocentRoles > NeutralRoles && doRush) {
|
|
||||||
Winner = null;
|
|
||||||
return GameDecision.RUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (InnocentRoles > NeutralRoles) {
|
|
||||||
Winner = null;
|
|
||||||
return GameDecision.OVERTIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (InnocentRoles + NeutralRoles == 0 && TraitorRoles > 0) {
|
||||||
|
/*System.out.println("Win " + 1);*/
|
||||||
|
Winner = Role.TRAITORS;
|
||||||
|
return GameDecision.END;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
|
if (TraitorRoles + NeutralRoles == 0 && InnocentRoles > 0) {
|
||||||
|
/*System.out.println(2);*/
|
||||||
|
Winner = Role.INNOCENT;
|
||||||
|
return GameDecision.END;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (Jester == 1 && CombinedRoles - Jester == 0) {
|
||||||
|
/*System.out.println(3);*/
|
||||||
|
Winner = Role.JESTER;
|
||||||
|
return GameDecision.END;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (LoneWolf == 1 && CombinedRoles - LoneWolf == 0) {
|
||||||
|
/*System.out.println(4);*/
|
||||||
|
Winner = Role.LONEWOLF;
|
||||||
|
return GameDecision.END;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (InnocentRoles == NeutralRoles + TraitorRoles && doRush) {
|
||||||
|
/*System.out.println(5);*/
|
||||||
|
Winner = null;
|
||||||
|
return GameDecision.RUSH;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (InnocentRoles == NeutralRoles + TraitorRoles && !doRush) {
|
||||||
|
/*System.out.println(6);*/
|
||||||
|
Winner = null;
|
||||||
|
inOvertime = true;
|
||||||
|
return GameDecision.OVERTIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*if (Winner == null) {
|
||||||
|
Winner = Role.JESTER;
|
||||||
|
}*/
|
||||||
|
return GameDecision.END;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Role getWinner() {
|
public static Role getWinner() {
|
||||||
return Winner;
|
return Winner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isInOvertime() {
|
||||||
|
return inOvertime;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
name: SimpleTTT
|
name: SimpleTTT
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
main: com.the5gi.SimpleTTTCore
|
main: net.nevet5gi.SimpleTTTCore
|
||||||
api-version: 1.19
|
api-version: 1.19
|
||||||
authors: [ the5gi,SteveO718 ]
|
authors: [ the5gi , SteveO718 ]
|
||||||
commands:
|
commands:
|
||||||
startgame:
|
startgame:
|
||||||
permission: sttt.start
|
permission: sttt.start
|
||||||
|
Loading…
Reference in New Issue
Block a user