mirror of
https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
synced 2025-04-17 12:40:59 +02:00
Compare commits
No commits in common. "4a9eba255bc34fb3f494c5e3bbb5e1bb40077ad8" and "acc797f2ff47b3955a6607241abddc2f73aa9506" have entirely different histories.
4a9eba255b
...
acc797f2ff
@ -228,7 +228,6 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
|
|||||||
private void setupGui() {
|
private void setupGui() {
|
||||||
GuiGlobals.initialize(this);
|
GuiGlobals.initialize(this);
|
||||||
BaseStyles.loadStyleResources(STYLES_SCRIPT);
|
BaseStyles.loadStyleResources(STYLES_SCRIPT);
|
||||||
BaseStyles.loadGlassStyle();
|
|
||||||
GuiGlobals.getInstance().getStyles().setDefaultStyle("pp"); //NON-NLS
|
GuiGlobals.getInstance().getStyles().setDefaultStyle("pp"); //NON-NLS
|
||||||
final BitmapFont normalFont = assetManager.loadFont(FONT); //NON-NLS
|
final BitmapFont normalFont = assetManager.loadFont(FONT); //NON-NLS
|
||||||
topText = new BitmapText(normalFont);
|
topText = new BitmapText(normalFont);
|
||||||
|
@ -25,9 +25,9 @@ import com.simsilica.lemur.component.SpringGridLayout;
|
|||||||
|
|
||||||
import static pp.monopoly.Resources.lookup;
|
import static pp.monopoly.Resources.lookup;
|
||||||
|
|
||||||
import com.simsilica.lemur.style.ElementId;
|
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.NetworkSupport;
|
import pp.monopoly.client.NetworkSupport;
|
||||||
|
import pp.monopoly.notification.Sound;
|
||||||
import pp.monopoly.server.MonopolyServer;
|
import pp.monopoly.server.MonopolyServer;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
import pp.dialog.DialogBuilder;
|
import pp.dialog.DialogBuilder;
|
||||||
@ -65,7 +65,7 @@ public class CreateGameMenu extends Dialog {
|
|||||||
|
|
||||||
final MonopolyApp app = network.getApp();
|
final MonopolyApp app = network.getApp();
|
||||||
|
|
||||||
int screenWidth = app.getContext().getSettings().getWidth();
|
int screenWidth = app.getContext().getSettings().getWidth();
|
||||||
int screenHeight = app.getContext().getSettings().getHeight();
|
int screenHeight = app.getContext().getSettings().getHeight();
|
||||||
|
|
||||||
// Set up the background image
|
// Set up the background image
|
||||||
@ -78,7 +78,7 @@ public class CreateGameMenu extends Dialog {
|
|||||||
background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements
|
background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements
|
||||||
app.getGuiNode().attachChild(background);
|
app.getGuiNode().attachChild(background);
|
||||||
|
|
||||||
addChild(new Label("Spiel erstellen", new ElementId("header"))); //NON-NLS
|
|
||||||
final Container input = new Container(new SpringGridLayout());
|
final Container input = new Container(new SpringGridLayout());
|
||||||
input.addChild(new Label(lookup("host.name") + ": "));
|
input.addChild(new Label(lookup("host.name") + ": "));
|
||||||
input.addChild(host, 1);
|
input.addChild(host, 1);
|
||||||
@ -88,20 +88,27 @@ public class CreateGameMenu extends Dialog {
|
|||||||
addChild(input);
|
addChild(input);
|
||||||
// "Abbrechen"-Button
|
// "Abbrechen"-Button
|
||||||
cancelButton.setPreferredSize(new Vector3f(120, 40, 0));
|
cancelButton.setPreferredSize(new Vector3f(120, 40, 0));
|
||||||
|
cancelButton.addClickCommands(source -> close());
|
||||||
|
addChild(cancelButton);
|
||||||
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
|
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
this.close();
|
this.close();
|
||||||
new StartMenu(network.getApp()).open();
|
new StartMenu(app);
|
||||||
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
}));
|
}));
|
||||||
addChild(cancelButton);
|
|
||||||
|
|
||||||
// "Selber hosten"-Button
|
// "Selber hosten"-Button
|
||||||
serverButton.addClickCommands(s -> ifTopDialog(this::startServerInThread));
|
addChild(serverButton).addClickCommands(s -> ifTopDialog(() -> {
|
||||||
addChild(serverButton);
|
startServerInThread();
|
||||||
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
|
}));
|
||||||
|
|
||||||
// "Beitreten"-Button
|
// "Beitreten"-Button
|
||||||
joinButton.setPreferredSize(new Vector3f(120, 40, 0));
|
joinButton.setPreferredSize(new Vector3f(120, 40, 0));
|
||||||
joinButton.addClickCommands(s -> ifTopDialog(this::connect));
|
|
||||||
addChild(joinButton);
|
addChild(joinButton);
|
||||||
|
joinButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
|
connect();
|
||||||
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -148,7 +155,7 @@ public class CreateGameMenu extends Dialog {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
new SettingsMenu(network.getApp()).open();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -211,6 +218,7 @@ public class CreateGameMenu extends Dialog {
|
|||||||
try {
|
try {
|
||||||
Thread.sleep(2000);
|
Thread.sleep(2000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
connect();
|
connect();
|
||||||
|
@ -131,11 +131,11 @@ public class LobbyMenu extends Dialog {
|
|||||||
buttonContainer.setBackground(null);
|
buttonContainer.setBackground(null);
|
||||||
// Lower-left container for "Abbrechen" button
|
// Lower-left container for "Abbrechen" button
|
||||||
lowerLeftMenu = new Container();
|
lowerLeftMenu = new Container();
|
||||||
Button cancelButton = new Button("Beenden");
|
Button cancelButton = new Button("Abbrechen");
|
||||||
cancelButton.setPreferredSize(new Vector3f(200, 60, 0)); // Set size to match the appearance in the image
|
cancelButton.setPreferredSize(new Vector3f(200, 60, 0)); // Set size to match the appearance in the image
|
||||||
cancelButton.setFontSize(18); // Adjust font size
|
cancelButton.setFontSize(18); // Adjust font size
|
||||||
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
|
cancelButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.closeApp();
|
this.close();
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
}));
|
}));
|
||||||
lowerLeftMenu.addChild(cancelButton);
|
lowerLeftMenu.addChild(cancelButton);
|
||||||
@ -217,7 +217,7 @@ public class LobbyMenu extends Dialog {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
new SettingsMenu(app).open();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package pp.monopoly.client.gui;
|
package pp.monopoly.client.gui;
|
||||||
|
|
||||||
import com.simsilica.lemur.Slider;
|
import com.simsilica.lemur.Slider;
|
||||||
|
import pp.monopoly.client.GameMusic;
|
||||||
import pp.monopoly.client.GameSound;
|
import pp.monopoly.client.GameSound;
|
||||||
|
|
||||||
public class SoundSlider extends Slider {
|
public class SoundSlider extends Slider {
|
||||||
|
@ -22,6 +22,8 @@ import pp.monopoly.client.gui.GameMenu;
|
|||||||
*/
|
*/
|
||||||
public class StartMenu extends Dialog {
|
public class StartMenu extends Dialog {
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
private Container logoContainer;
|
||||||
|
private Container unibwLogoContainer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the Startup Menu dialog for the Monopoly application.
|
* Constructs the Startup Menu dialog for the Monopoly application.
|
||||||
|
@ -3,11 +3,10 @@ package pp.monopoly.client.gui.popups;
|
|||||||
import com.jme3.material.Material;
|
import com.jme3.material.Material;
|
||||||
import com.jme3.material.RenderState.BlendMode;
|
import com.jme3.material.RenderState.BlendMode;
|
||||||
import com.jme3.math.ColorRGBA;
|
import com.jme3.math.ColorRGBA;
|
||||||
|
import com.jme3.math.Vector3f;
|
||||||
import com.jme3.scene.Geometry;
|
import com.jme3.scene.Geometry;
|
||||||
import com.jme3.scene.shape.Quad;
|
import com.jme3.scene.shape.Quad;
|
||||||
import com.simsilica.lemur.Button;
|
import com.simsilica.lemur.*;
|
||||||
import com.simsilica.lemur.Container;
|
|
||||||
import com.simsilica.lemur.Label;
|
|
||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
@ -5,6 +5,7 @@ import com.jme3.material.RenderState.BlendMode;
|
|||||||
import com.jme3.math.ColorRGBA;
|
import com.jme3.math.ColorRGBA;
|
||||||
import com.jme3.scene.Geometry;
|
import com.jme3.scene.Geometry;
|
||||||
import com.jme3.scene.shape.Quad;
|
import com.jme3.scene.shape.Quad;
|
||||||
|
import com.simsilica.lemur.Button;
|
||||||
import com.simsilica.lemur.Container;
|
import com.simsilica.lemur.Container;
|
||||||
import com.simsilica.lemur.Label;
|
import com.simsilica.lemur.Label;
|
||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
|
@ -5,7 +5,7 @@ import java.lang.System.Logger.Level;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import pp.monopoly.game.server.Player;
|
import pp.monopoly.game.server.PlayerHandler;
|
||||||
import pp.monopoly.message.client.ClientMessage;
|
import pp.monopoly.message.client.ClientMessage;
|
||||||
import pp.monopoly.message.server.BuyPropertyResponse;
|
import pp.monopoly.message.server.BuyPropertyResponse;
|
||||||
import pp.monopoly.message.server.DiceResult;
|
import pp.monopoly.message.server.DiceResult;
|
||||||
@ -52,7 +52,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
|
|||||||
/** The current state of the client game logic. */
|
/** The current state of the client game logic. */
|
||||||
private ClientState state = new LobbyState(this);
|
private ClientState state = new LobbyState(this);
|
||||||
|
|
||||||
private List<Player> players;
|
private PlayerHandler playerHandler;
|
||||||
|
|
||||||
private BoardManager boardManager = new BoardManager();
|
private BoardManager boardManager = new BoardManager();
|
||||||
|
|
||||||
@ -94,8 +94,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
|
|||||||
state.entry();
|
state.entry();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Player> getPlayers() {
|
public PlayerHandler getPlayerHandler() {
|
||||||
return players;
|
return playerHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -255,7 +255,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void received(GameStart msg) {
|
public void received(GameStart msg) {
|
||||||
players = msg.getPlayers();
|
playerHandler = msg.getPlayerHandler();
|
||||||
setInfoText("The game has started! Good luck!");
|
setInfoText("The game has started! Good luck!");
|
||||||
setState(new WaitForTurnState(this));
|
setState(new WaitForTurnState(this));
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,6 @@ package pp.monopoly.game.server;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import com.jme3.network.serializing.Serializable;
|
|
||||||
|
|
||||||
import pp.monopoly.message.server.DiceResult;
|
import pp.monopoly.message.server.DiceResult;
|
||||||
import pp.monopoly.model.FieldVisitor;
|
import pp.monopoly.model.FieldVisitor;
|
||||||
import pp.monopoly.model.Figure;
|
import pp.monopoly.model.Figure;
|
||||||
@ -30,7 +28,6 @@ import pp.monopoly.model.fields.WacheField;
|
|||||||
/**
|
/**
|
||||||
* Class representing a player
|
* Class representing a player
|
||||||
*/
|
*/
|
||||||
@Serializable
|
|
||||||
public class Player implements FieldVisitor<Void>{
|
public class Player implements FieldVisitor<Void>{
|
||||||
private final int id;
|
private final int id;
|
||||||
private String name;
|
private String name;
|
||||||
@ -43,14 +40,6 @@ public class Player implements FieldVisitor<Void>{
|
|||||||
private final PlayerHandler handler;
|
private final PlayerHandler handler;
|
||||||
private PlayerState state = new LobbyState();
|
private PlayerState state = new LobbyState();
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor for serialization purposes.
|
|
||||||
*/
|
|
||||||
private Player(){
|
|
||||||
id = 0;
|
|
||||||
handler = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a player with the speciefied params
|
* Constructs a player with the speciefied params
|
||||||
* @param id the id of the player
|
* @param id the id of the player
|
||||||
|
@ -8,13 +8,10 @@ import java.util.List;
|
|||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.jme3.network.serializing.Serializable;
|
|
||||||
|
|
||||||
import pp.monopoly.model.LimitedLinkedList;
|
import pp.monopoly.model.LimitedLinkedList;
|
||||||
/**
|
/**
|
||||||
* A class for helping with player actions and managing thier turns
|
* A class for helping with player actions and managing thier turns
|
||||||
*/
|
*/
|
||||||
@Serializable
|
|
||||||
public class PlayerHandler {
|
public class PlayerHandler {
|
||||||
private List<Player> players = new LimitedLinkedList<>(6);
|
private List<Player> players = new LimitedLinkedList<>(6);
|
||||||
private Set<Player> readyPlayers = new HashSet<>();
|
private Set<Player> readyPlayers = new HashSet<>();
|
||||||
@ -22,11 +19,6 @@ public class PlayerHandler {
|
|||||||
private Player hostPlayer;
|
private Player hostPlayer;
|
||||||
private Player extra = null;
|
private Player extra = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor for serialization purposes.
|
|
||||||
*/
|
|
||||||
private PlayerHandler() {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contructs a PlayerHandler
|
* Contructs a PlayerHandler
|
||||||
* @param logic the {@link ServerGameLogic} this PlayerHandler is a part of
|
* @param logic the {@link ServerGameLogic} this PlayerHandler is a part of
|
||||||
|
@ -204,7 +204,7 @@ public class ServerGameLogic implements ClientInterpreter {
|
|||||||
if(playerHandler.allPlayersReady()) {
|
if(playerHandler.allPlayersReady()) {
|
||||||
playerHandler.setStartBalance(startMoney);
|
playerHandler.setStartBalance(startMoney);
|
||||||
for (Player p : playerHandler.getPlayers()) {
|
for (Player p : playerHandler.getPlayers()) {
|
||||||
send(p, new GameStart(playerHandler.getPlayers()));
|
send(p, new GameStart(playerHandler));
|
||||||
}
|
}
|
||||||
playerHandler.randomOrder();
|
playerHandler.randomOrder();
|
||||||
send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn(playerHandler.getPlayerAtIndex(0)));
|
send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn(playerHandler.getPlayerAtIndex(0)));
|
||||||
|
@ -1,27 +1,25 @@
|
|||||||
package pp.monopoly.message.server;
|
package pp.monopoly.message.server;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.jme3.network.serializing.Serializable;
|
import com.jme3.network.serializing.Serializable;
|
||||||
|
|
||||||
import pp.monopoly.game.server.Player;
|
import pp.monopoly.game.server.PlayerHandler;
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
public class GameStart extends ServerMessage{
|
public class GameStart extends ServerMessage{
|
||||||
|
|
||||||
private List<Player> players;
|
private PlayerHandler ph;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default constructor for serialization purposes.
|
* Default constructor for serialization purposes.
|
||||||
*/
|
*/
|
||||||
private GameStart() { /* empty */ }
|
private GameStart() { /* empty */ }
|
||||||
|
|
||||||
public GameStart(List<Player> players) {
|
public GameStart(PlayerHandler ph) {
|
||||||
this.players = players;
|
this.ph = ph;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Player> getPlayers() {
|
public PlayerHandler getPlayerHandler() {
|
||||||
return players;
|
return ph;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -4,12 +4,9 @@ import java.util.Collections;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.jme3.network.serializing.Serializable;
|
|
||||||
|
|
||||||
import static java.lang.Math.max;
|
import static java.lang.Math.max;
|
||||||
import static java.lang.Math.min;
|
import static java.lang.Math.min;
|
||||||
|
|
||||||
@Serializable
|
|
||||||
public class Figure implements Item{
|
public class Figure implements Item{
|
||||||
private final String type;
|
private final String type;
|
||||||
private final int length; // The length of the Figure
|
private final int length; // The length of the Figure
|
||||||
|
@ -2,22 +2,14 @@ package pp.monopoly.model;
|
|||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import com.jme3.network.serializing.Serializable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A LinkedList with a maximum size limit.
|
* A LinkedList with a maximum size limit.
|
||||||
*
|
*
|
||||||
* @param <E> the type of elements held in this collection
|
* @param <E> the type of elements held in this collection
|
||||||
*/
|
*/
|
||||||
@Serializable
|
|
||||||
public class LimitedLinkedList<E> extends LinkedList<E> {
|
public class LimitedLinkedList<E> extends LinkedList<E> {
|
||||||
|
|
||||||
private int maxSize;
|
private final int maxSize;
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor for serialization purposes.
|
|
||||||
*/
|
|
||||||
private LimitedLinkedList() {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a LimitedLinkedList with the specified maximum size.
|
* Constructs a LimitedLinkedList with the specified maximum size.
|
||||||
|
@ -26,7 +26,6 @@ import com.jme3.network.serializing.Serializer;
|
|||||||
|
|
||||||
import pp.monopoly.MonopolyConfig;
|
import pp.monopoly.MonopolyConfig;
|
||||||
import pp.monopoly.game.server.Player;
|
import pp.monopoly.game.server.Player;
|
||||||
import pp.monopoly.game.server.PlayerHandler;
|
|
||||||
import pp.monopoly.game.server.ServerGameLogic;
|
import pp.monopoly.game.server.ServerGameLogic;
|
||||||
import pp.monopoly.game.server.ServerSender;
|
import pp.monopoly.game.server.ServerSender;
|
||||||
import pp.monopoly.message.client.BuyPropertyRequest;
|
import pp.monopoly.message.client.BuyPropertyRequest;
|
||||||
@ -37,12 +36,8 @@ import pp.monopoly.message.client.RollDice;
|
|||||||
import pp.monopoly.message.client.TradeOffer;
|
import pp.monopoly.message.client.TradeOffer;
|
||||||
import pp.monopoly.message.client.TradeResponse;
|
import pp.monopoly.message.client.TradeResponse;
|
||||||
import pp.monopoly.message.client.ViewAssetsRequest;
|
import pp.monopoly.message.client.ViewAssetsRequest;
|
||||||
import pp.monopoly.message.server.GameStart;
|
|
||||||
import pp.monopoly.message.server.NextPlayerTurn;
|
|
||||||
import pp.monopoly.message.server.ServerMessage;
|
import pp.monopoly.message.server.ServerMessage;
|
||||||
import pp.monopoly.model.Figure;
|
|
||||||
import pp.monopoly.model.IntPoint;
|
import pp.monopoly.model.IntPoint;
|
||||||
import pp.monopoly.model.LimitedLinkedList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server implementing the visitor pattern as MessageReceiver for ClientMessages
|
* Server implementing the visitor pattern as MessageReceiver for ClientMessages
|
||||||
@ -124,12 +119,6 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec
|
|||||||
Serializer.registerClass(TradeOffer.class);
|
Serializer.registerClass(TradeOffer.class);
|
||||||
Serializer.registerClass(TradeResponse.class);
|
Serializer.registerClass(TradeResponse.class);
|
||||||
Serializer.registerClass(ViewAssetsRequest.class);
|
Serializer.registerClass(ViewAssetsRequest.class);
|
||||||
Serializer.registerClass(GameStart.class);
|
|
||||||
Serializer.registerClass(LimitedLinkedList.class);
|
|
||||||
Serializer.registerClass(NextPlayerTurn.class);
|
|
||||||
Serializer.registerClass(Player.class);
|
|
||||||
Serializer.registerClass(Figure.class);
|
|
||||||
Serializer.registerClass(PlayerHandler.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerListeners() {
|
private void registerListeners() {
|
||||||
|
Loading…
Reference in New Issue
Block a user