More hub changes
This commit is contained in:
parent
76ae23b56f
commit
ff54aab560
@ -68,8 +68,8 @@ public class AchievementMainPage extends ShopPageBase<AchievementManager, Achiev
|
||||
|
||||
ArrayList<String> lore = new ArrayList<String>();
|
||||
lore.add(" ");
|
||||
category.addStats(getClientManager(), _statsManager, lore, category == AchievementCategory.GLOBAL ? 10 : 2,
|
||||
getPlayer(), _targetName, _targetStats);
|
||||
// category.addStats(getClientManager(), _statsManager, lore, category == AchievementCategory.GLOBAL ? 10 : 2,
|
||||
// getPlayer(), _targetName, _targetStats);
|
||||
lore.add(" ");
|
||||
addAchievements(category, lore, 9);
|
||||
lore.add(ChatColor.RESET + "Click for more details!");
|
||||
|
@ -236,7 +236,7 @@ public class AchievementPage extends ShopPageBase<AchievementManager, Achievemen
|
||||
String itemName = C.Bold + _category.getFriendlyName() + " Stats";
|
||||
List<String> lore = new ArrayList<String>();
|
||||
lore.add(" ");
|
||||
_category.addStats(getClientManager(), _statsManager, lore, getPlayer(), _targetName, _targetStats);
|
||||
//_category.addStats(getClientManager(), _statsManager, lore, getPlayer(), _targetName, _targetStats);
|
||||
|
||||
ItemStack item = new ItemStack(material);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
|
@ -41,7 +41,7 @@ public class ArcadeMainPage extends AchievementMainPage
|
||||
|
||||
ArrayList<String> lore = new ArrayList<String>();
|
||||
lore.add(" ");
|
||||
category.addStats(getClientManager(), _statsManager, lore, 2, getPlayer(), _targetName, _targetStats);
|
||||
//category.addStats(getClientManager(), _statsManager, lore, 2, getPlayer(), _targetName, _targetStats);
|
||||
lore.add(" ");
|
||||
addAchievements(category, lore, 9);
|
||||
lore.add(" ");
|
||||
|
@ -41,7 +41,7 @@ public class UHCMainPage extends AchievementMainPage
|
||||
|
||||
ArrayList<String> lore = new ArrayList<String>();
|
||||
lore.add(" ");
|
||||
category.addStats(getClientManager(), _statsManager, lore, getPlayer(), _targetName, _targetStats);
|
||||
//category.addStats(getClientManager(), _statsManager, lore, getPlayer(), _targetName, _targetStats);
|
||||
lore.add(" ");
|
||||
addAchievements(category, lore, 9);
|
||||
lore.add(" ");
|
||||
|
@ -81,7 +81,13 @@ public class NewNPCManager extends MiniPlugin
|
||||
// Loading NPCs on the main thread makes sure that _npcs is populated before anything tries to spawn NPCs.
|
||||
loadNPCs();
|
||||
// Any NPC with the metadata DUMMY will always be spawned regardless, useful for testing designs
|
||||
spawnNPCs("DUMMY", null);
|
||||
spawnNPCs("DUMMY", npc ->
|
||||
{
|
||||
if (npc instanceof PlayerNPC)
|
||||
{
|
||||
npc.getNameTag();
|
||||
}
|
||||
});
|
||||
|
||||
generatePermissions();
|
||||
}
|
||||
@ -232,7 +238,6 @@ public class NewNPCManager extends MiniPlugin
|
||||
/**
|
||||
* Used by {@link NPCMoveCommand}. Has no other purpose.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setPlayerTeleport(Player player)
|
||||
{
|
||||
_teleportMap.put(player, player.getLocation());
|
||||
|
@ -30,7 +30,7 @@ class NewNPCRepository extends RepositoryBase
|
||||
/**
|
||||
* A SQL statement that inserts an entry and returns the id field generated.
|
||||
*/
|
||||
private static final String INSERT_NPC = "INSERT INTO newNPCs (entity_type, name, world, x, y, z, yaw, pitch, in_hand, in_hand_data, helmet, chestplate, leggings, boots, metadata, skinValue, skinSignature) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
|
||||
private static final String INSERT_NPC = "INSERT INTO newNPCs (entity_type, name, world, x, y, z, yaw, pitch, in_hand, in_hand_data, helmet, chestplate, leggings, boots, metadata, skinValue, skinSignature) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
|
||||
/**
|
||||
* A SQL statement that deletes an entry with a specific id field.
|
||||
*/
|
||||
|
@ -73,7 +73,7 @@ public class ProfileMainPage extends ShopPageBase<ProfileManager, ProfileShop>
|
||||
|
||||
private void addStatsButton()
|
||||
{
|
||||
addButton(11, STATS_ITEM, new PageChangeButton());
|
||||
//addButton(11, STATS_ITEM, new PageChangeButton());
|
||||
}
|
||||
|
||||
private class PageChangeButton implements IButton
|
||||
|
@ -90,7 +90,8 @@ import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.core.youtube.YoutubeManager;
|
||||
import mineplex.hub.commands.GadgetToggle;
|
||||
import mineplex.hub.doublejump.JumpManager;
|
||||
import mineplex.hub.events.HubType;
|
||||
import mineplex.hub.plugin.HalloweenHubPlugin;
|
||||
import mineplex.hub.plugin.HubPlugin;
|
||||
import mineplex.hub.gamemode.GameModeManager;
|
||||
import mineplex.hub.hubgame.HubGameManager;
|
||||
import mineplex.hub.modules.ForcefieldManager;
|
||||
@ -137,6 +138,8 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
|
||||
private final JumpManager _jumpManager;
|
||||
private final HologramManager _hologramManager;
|
||||
|
||||
private final HubPlugin _hubPlugin;
|
||||
|
||||
private final WorldDataModule _worldData;
|
||||
private final Location _spawn;
|
||||
|
||||
@ -184,7 +187,7 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
|
||||
new MavericksManager(_plugin, cosmeticManager, hologramManager, this);
|
||||
|
||||
new SoccerManager(this, _gadgetManager);
|
||||
new KothManager(this, _gadgetManager);
|
||||
//new KothManager(this, _gadgetManager);
|
||||
|
||||
new MenuManager(_plugin);
|
||||
new NewInteractionsManager();
|
||||
@ -229,7 +232,7 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
|
||||
require(ProfileManager.class);
|
||||
require(HubPlayerManager.class);
|
||||
|
||||
new HubType();
|
||||
_hubPlugin = new HalloweenHubPlugin();
|
||||
|
||||
generatePermissions();
|
||||
}
|
||||
@ -285,7 +288,6 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
|
||||
|
||||
runSyncLater(Bukkit::shutdown, 40);
|
||||
}, 60);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,33 +1,18 @@
|
||||
package mineplex.hub.hubgame;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import mineplex.core.Managers;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.lifetimes.PhasedLifetime;
|
||||
import mineplex.core.newnpc.NPC;
|
||||
import mineplex.hub.hubgame.CycledGame.GameState;
|
||||
import mineplex.hub.hubgame.common.HubGameComponent;
|
||||
import mineplex.hub.hubgame.event.HubGamePlayerDeathEvent;
|
||||
import mineplex.hub.hubgame.event.HubGameStateChangeEvent;
|
||||
import mineplex.hub.world.WorldDataModule;
|
||||
|
||||
public abstract class CycledGame extends PhasedLifetime<GameState> implements HubGame, Listener
|
||||
public abstract class CycledGame extends HubGame
|
||||
{
|
||||
|
||||
private final HubGameManager _manager;
|
||||
private final Map<Class<? extends HubGameComponent<?>>, HubGameComponent<?>> _components;
|
||||
|
||||
// Game Properties
|
||||
private final HubGameType _type;
|
||||
private GameState _state;
|
||||
|
||||
// Game Timer
|
||||
@ -39,21 +24,13 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
private final List<Player> _allPlayers;
|
||||
private final List<Player> _places;
|
||||
|
||||
// NPC
|
||||
private NPC _npc;
|
||||
|
||||
// Lobby
|
||||
private Location _spawn;
|
||||
private int _countdown;
|
||||
|
||||
// World
|
||||
protected WorldDataModule _worldData;
|
||||
|
||||
public CycledGame(HubGameManager manager, HubGameType type)
|
||||
{
|
||||
_manager = manager;
|
||||
_components = new HashMap<>();
|
||||
_type = type;
|
||||
super(manager, type);
|
||||
|
||||
_state = GameState.Waiting;
|
||||
|
||||
_queuedPlayers = new ArrayList<>();
|
||||
@ -63,41 +40,7 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
|
||||
_countdown = -1;
|
||||
|
||||
_worldData = Managers.require(WorldDataModule.class);
|
||||
|
||||
_spawn = _worldData.getCustomLocation(type.name() + " SPAWN").get(0);
|
||||
|
||||
start(_state);
|
||||
UtilServer.RegisterEvents(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HubGameManager getManager()
|
||||
{
|
||||
return _manager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNpc(NPC npc)
|
||||
{
|
||||
_npc = npc;
|
||||
|
||||
if (npc.getEntity() != null)
|
||||
{
|
||||
_spawn.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(_spawn, npc.getEntity().getLocation())));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NPC getNpc()
|
||||
{
|
||||
return _npc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorldDataModule getWorldData()
|
||||
{
|
||||
return _worldData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -111,26 +54,6 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
return _allPlayers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getSpawn()
|
||||
{
|
||||
return _spawn;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected <T extends HubGameComponent<?>> T registerComponent(T instance)
|
||||
{
|
||||
_components.put((Class<? extends HubGameComponent<?>>) instance.getClass(), instance);
|
||||
register(instance);
|
||||
return instance;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends HubGameComponent<?>> T getComponent(Class<T> clazz)
|
||||
{
|
||||
return (T) _components.get(clazz);
|
||||
}
|
||||
|
||||
/*
|
||||
Game Events
|
||||
*/
|
||||
@ -180,6 +103,7 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
UtilServer.CallEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCleanupPlayer(Player player)
|
||||
{
|
||||
_queuedPlayers.remove(player);
|
||||
@ -193,11 +117,6 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
return _state == GameState.Live;
|
||||
}
|
||||
|
||||
public HubGameType getGameType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
public void setState(GameState state)
|
||||
{
|
||||
_state = state;
|
||||
@ -234,7 +153,7 @@ public abstract class CycledGame extends PhasedLifetime<GameState> implements Hu
|
||||
|
||||
public List<Player> getNextPlayers()
|
||||
{
|
||||
return _queuedPlayers.subList(0, Math.min(_queuedPlayers.size(), _type.getMaxPlayers()));
|
||||
return _queuedPlayers.subList(0, Math.min(_queuedPlayers.size(), getGameType().getMaxPlayers()));
|
||||
}
|
||||
|
||||
public List<Player> getPlaces()
|
||||
|
@ -1,47 +1,103 @@
|
||||
package mineplex.hub.hubgame;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import mineplex.core.Managers;
|
||||
import mineplex.core.common.util.F;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.lifetimes.PhasedLifetime;
|
||||
import mineplex.core.newnpc.NPC;
|
||||
import mineplex.hub.hubgame.CycledGame.GameState;
|
||||
import mineplex.hub.hubgame.common.HubGameComponent;
|
||||
import mineplex.hub.hubgame.ui.HubGamePage;
|
||||
import mineplex.hub.world.WorldDataModule;
|
||||
|
||||
public interface HubGame
|
||||
public abstract class HubGame extends PhasedLifetime<GameState> implements Listener
|
||||
{
|
||||
|
||||
HubGameManager getManager();
|
||||
private final HubGameManager _manager;
|
||||
private final HubGameType _type;
|
||||
private final Map<Class<? extends HubGameComponent<?>>, HubGameComponent<?>> _components;
|
||||
|
||||
HubGameType getGameType();
|
||||
protected final WorldDataModule _worldData;
|
||||
|
||||
void setNpc(NPC npc);
|
||||
private final Location _spawn;
|
||||
|
||||
NPC getNpc();
|
||||
public HubGame(HubGameManager manager, HubGameType type)
|
||||
{
|
||||
_manager = manager;
|
||||
_type = type;
|
||||
_components = new HashMap<>();
|
||||
|
||||
WorldDataModule getWorldData();
|
||||
_worldData = Managers.require(WorldDataModule.class);
|
||||
_spawn = _worldData.getCustomLocation(type.name() + " SPAWN").get(0);
|
||||
|
||||
Location getSpawn();
|
||||
start(GameState.Waiting);
|
||||
UtilServer.RegisterEvents(this);
|
||||
}
|
||||
|
||||
void onPlayerDeath(Player player);
|
||||
public abstract void onPlayerDeath(Player player);
|
||||
|
||||
List<Player> getAlivePlayers();
|
||||
public abstract List<Player> getAlivePlayers();
|
||||
|
||||
default boolean isAlive(Player player)
|
||||
public abstract void onCleanupPlayer(Player player);
|
||||
|
||||
public HubGameManager getManager()
|
||||
{
|
||||
return _manager;
|
||||
}
|
||||
|
||||
public HubGameType getGameType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected <T extends HubGameComponent<?>> T registerComponent(T instance)
|
||||
{
|
||||
_components.put((Class<? extends HubGameComponent<?>>) instance.getClass(), instance);
|
||||
register(instance);
|
||||
return instance;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends HubGameComponent<?>> T getComponent(Class<T> clazz)
|
||||
{
|
||||
return (T) _components.get(clazz);
|
||||
}
|
||||
|
||||
public void setNpc(NPC npc)
|
||||
{
|
||||
if (npc.getEntity() != null)
|
||||
{
|
||||
_spawn.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(_spawn, npc.getEntity().getLocation())));
|
||||
}
|
||||
}
|
||||
|
||||
public Location getSpawn()
|
||||
{
|
||||
return _spawn;
|
||||
}
|
||||
|
||||
public boolean isAlive(Player player)
|
||||
{
|
||||
return getAlivePlayers().contains(player);
|
||||
}
|
||||
|
||||
default void announce(String message)
|
||||
public void announce(String message)
|
||||
{
|
||||
getAlivePlayers().forEach(player -> player.sendMessage(F.main(getManager().getName(), message)));
|
||||
}
|
||||
|
||||
default HubGamePage getInformationPage(Player player)
|
||||
public HubGamePage getInformationPage(Player player)
|
||||
{
|
||||
return new HubGamePage<>(getManager(), getManager().getShop(), getManager().getClientManager(), getManager().getDonationManager(), player, this);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -101,13 +101,7 @@ public class HubGameManager extends MiniPlugin
|
||||
@EventHandler
|
||||
public void playerQuit(PlayerQuitEvent event)
|
||||
{
|
||||
_games.forEach(game ->
|
||||
{
|
||||
if (game instanceof CycledGame)
|
||||
{
|
||||
((CycledGame) game).onCleanupPlayer(event.getPlayer());
|
||||
}
|
||||
});
|
||||
_games.forEach(game -> game.onCleanupPlayer(event.getPlayer()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -20,6 +20,10 @@ public enum HubGameType
|
||||
"You can place blocks!",
|
||||
"Kill your opponent to win!"
|
||||
}, new ItemStack(Material.DIAMOND_SWORD), 2, 2),
|
||||
FOOTBALL("Soccer", new String[]
|
||||
{
|
||||
|
||||
}, new ItemStack(Material.SLIME_BALL), 1, 6),
|
||||
;
|
||||
|
||||
private final String _name;
|
||||
|
@ -1,8 +1,37 @@
|
||||
package mineplex.hub.hubgame;
|
||||
|
||||
public class SimpleGame
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class SimpleGame extends HubGame
|
||||
{
|
||||
|
||||
private final List<Player> _players;
|
||||
|
||||
public SimpleGame(HubGameManager manager, HubGameType type)
|
||||
{
|
||||
super(manager, type);
|
||||
|
||||
_players = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerDeath(Player player)
|
||||
{
|
||||
player.teleport(getSpawn());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Player> getAlivePlayers()
|
||||
{
|
||||
return _players;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCleanupPlayer(Player player)
|
||||
{
|
||||
_players.remove(player);
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import mineplex.hub.hubgame.HubGame;
|
||||
import mineplex.hub.hubgame.common.HubGameComponent;
|
||||
import mineplex.hub.hubgame.event.HubGameStateChangeEvent;
|
||||
import mineplex.minecraft.game.core.combat.event.CombatDeathEvent;
|
||||
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
|
||||
public class DamageComponent extends HubGameComponent<HubGame>
|
||||
{
|
||||
@ -68,6 +69,19 @@ public class DamageComponent extends HubGameComponent<HubGame>
|
||||
event.setCancelled(false);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void increaseKnockback(CustomDamageEvent event)
|
||||
{
|
||||
Player damagee = event.GetDamageePlayer();
|
||||
|
||||
if (damagee == null || !_game.isAlive(damagee))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
event.AddKnockback("Damage Component", 1.4);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void playerDeath(CombatDeathEvent event)
|
||||
{
|
||||
|
@ -0,0 +1,46 @@
|
||||
package mineplex.hub.plugin;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilTextTop;
|
||||
import mineplex.core.titles.tracks.custom.ScrollAnimation;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.utils.UtilScheduler;
|
||||
|
||||
public class HalloweenHubPlugin extends HubPlugin
|
||||
{
|
||||
|
||||
private final String[] NEWS_TEXT = new ScrollAnimation("HAPPY HALLOWEEN")
|
||||
.withPrimaryColour(ChatColor.GOLD)
|
||||
.withSecondaryColour(ChatColor.WHITE)
|
||||
.withTertiaryColour(ChatColor.YELLOW)
|
||||
.bold()
|
||||
.build();
|
||||
|
||||
private int _newsIndex;
|
||||
|
||||
public HalloweenHubPlugin()
|
||||
{
|
||||
super("Halloween");
|
||||
|
||||
_newsManager.setEnabled(false);
|
||||
UtilScheduler.runEvery(UpdateType.FASTEST, this::displayNews);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setupWorld()
|
||||
{
|
||||
_manager.GetSpawn().getWorld().setTime(18000);
|
||||
}
|
||||
|
||||
private void displayNews()
|
||||
{
|
||||
if (++_newsIndex == NEWS_TEXT.length)
|
||||
{
|
||||
_newsIndex = 0;
|
||||
}
|
||||
|
||||
UtilTextTop.display(NEWS_TEXT[_newsIndex], UtilServer.getPlayers());
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package mineplex.hub.events;
|
||||
package mineplex.hub.plugin;
|
||||
|
||||
import mineplex.core.MiniPlugin;
|
||||
import mineplex.hub.HubManager;
|
||||
@ -6,33 +6,36 @@ import mineplex.hub.hubgame.HubGame;
|
||||
import mineplex.hub.hubgame.HubGameManager;
|
||||
import mineplex.hub.hubgame.duel.Duels;
|
||||
import mineplex.hub.hubgame.tron.Tron;
|
||||
import mineplex.hub.news.NewsManager;
|
||||
|
||||
/**
|
||||
* Hub Types are effectively managers for specific events within the hub. Such as a Halloween or Christmas variants of the hub.
|
||||
* HubType means that lots of
|
||||
* Hub Plugins are effectively managers for specific events within the hub. Such as a Halloween or Christmas variants of the hub.
|
||||
* HubPlugin means that lots of
|
||||
* <pre>
|
||||
* if (HubType == HubType.SomeHubType)
|
||||
* if (HubPlugin == HubPlugin.SomeHubVariant)
|
||||
* </pre>
|
||||
*
|
||||
* checks aren't needed within the entire hub, making it cleaner and easier to maintain.
|
||||
*/
|
||||
public class HubType extends MiniPlugin
|
||||
public class HubPlugin extends MiniPlugin
|
||||
{
|
||||
|
||||
protected final HubManager _manager;
|
||||
protected final HubGameManager _hubGameManager;
|
||||
protected final NewsManager _newsManager;
|
||||
|
||||
public HubType()
|
||||
public HubPlugin()
|
||||
{
|
||||
this("Normal");
|
||||
}
|
||||
|
||||
public HubType(String moduleName)
|
||||
public HubPlugin(String moduleName)
|
||||
{
|
||||
super(moduleName);
|
||||
|
||||
_manager = require(HubManager.class);
|
||||
_hubGameManager = require(HubGameManager.class);
|
||||
_newsManager = require(NewsManager.class);
|
||||
|
||||
setupWorld();
|
||||
addHubGames();
|
Loading…
Reference in New Issue
Block a user