Added help info and more launcher functionality.
This commit is contained in:
parent
dec56be4af
commit
fb52091aa9
|
@ -7,11 +7,11 @@ import nl.andrewlalis.aos_client.launcher.servers.ServerInfoListModel;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.KeyAdapter;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
@ -35,7 +35,6 @@ public class Launcher extends JFrame {
|
||||||
|
|
||||||
private Container buildContent() {
|
private Container buildContent() {
|
||||||
JTabbedPane mainPanel = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
|
JTabbedPane mainPanel = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
|
||||||
mainPanel.addTab("Connect", null, this.getConnectPanel(), "Connect to a server and play.");
|
|
||||||
mainPanel.addTab("Servers", null, this.getServersPanel(), "View a list of available servers.");
|
mainPanel.addTab("Servers", null, this.getServersPanel(), "View a list of available servers.");
|
||||||
//
|
//
|
||||||
// JPanel settingsPanel = new JPanel();
|
// JPanel settingsPanel = new JPanel();
|
||||||
|
@ -44,57 +43,6 @@ public class Launcher extends JFrame {
|
||||||
return mainPanel;
|
return mainPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Container getConnectPanel() {
|
|
||||||
JPanel inputPanel = new JPanel(new GridBagLayout());
|
|
||||||
GridBagConstraints c = new GridBagConstraints();
|
|
||||||
c.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
c.gridx = 0;
|
|
||||||
c.gridy = 0;
|
|
||||||
inputPanel.add(new JLabel("Address"), c);
|
|
||||||
JTextField addressField = new JTextField(20);
|
|
||||||
c.gridx = 1;
|
|
||||||
inputPanel.add(addressField, c);
|
|
||||||
|
|
||||||
c.gridy = 1;
|
|
||||||
c.gridx = 0;
|
|
||||||
inputPanel.add(new JLabel("Username"), c);
|
|
||||||
JTextField usernameField = new JTextField(20);
|
|
||||||
c.gridx = 1;
|
|
||||||
inputPanel.add(usernameField, c);
|
|
||||||
|
|
||||||
var enterListener = new KeyAdapter() {
|
|
||||||
@Override
|
|
||||||
public void keyPressed(KeyEvent e) {
|
|
||||||
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
|
|
||||||
if (validateConnectInput(addressField, usernameField)) {
|
|
||||||
connect(addressField, usernameField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
addressField.addKeyListener(enterListener);
|
|
||||||
usernameField.addKeyListener(enterListener);
|
|
||||||
|
|
||||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
|
||||||
JButton cancelButton = new JButton("Cancel");
|
|
||||||
cancelButton.addActionListener(e -> this.dispose());
|
|
||||||
JButton connectButton = new JButton("Connect");
|
|
||||||
connectButton.addActionListener(e -> {
|
|
||||||
if (validateConnectInput(addressField, usernameField)) {
|
|
||||||
connect(addressField, usernameField);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
buttonPanel.add(cancelButton);
|
|
||||||
buttonPanel.add(connectButton);
|
|
||||||
|
|
||||||
JPanel mainPanel = new JPanel(new BorderLayout());
|
|
||||||
mainPanel.add(new JLabel("Directly connect to a server and play."), BorderLayout.NORTH);
|
|
||||||
mainPanel.add(inputPanel, BorderLayout.CENTER);
|
|
||||||
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
|
||||||
return mainPanel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Container getServersPanel() {
|
private Container getServersPanel() {
|
||||||
JPanel panel = new JPanel(new BorderLayout());
|
JPanel panel = new JPanel(new BorderLayout());
|
||||||
|
|
||||||
|
@ -144,16 +92,76 @@ public class Launcher extends JFrame {
|
||||||
|
|
||||||
JPanel buttonPanel = new JPanel();
|
JPanel buttonPanel = new JPanel();
|
||||||
JButton addServerButton = new JButton("Add Server");
|
JButton addServerButton = new JButton("Add Server");
|
||||||
|
addServerButton.setToolTipText("Add a new server to the list.");
|
||||||
addServerButton.addActionListener(e -> {
|
addServerButton.addActionListener(e -> {
|
||||||
// TODO: Add server dialog.
|
// TODO: Add server dialog.
|
||||||
});
|
});
|
||||||
buttonPanel.add(addServerButton);
|
buttonPanel.add(addServerButton);
|
||||||
|
JButton directConnectButton = new JButton("Direct Connect");
|
||||||
|
directConnectButton.setToolTipText("Connect to any server directly.");
|
||||||
|
directConnectButton.addActionListener(e -> {
|
||||||
|
JDialog dialog = new JDialog(this, true);
|
||||||
|
dialog.setTitle("Direct Connect");
|
||||||
|
dialog.setContentPane(getConnectPanel(dialog));
|
||||||
|
dialog.pack();
|
||||||
|
dialog.setLocationRelativeTo(this);
|
||||||
|
dialog.setVisible(true);
|
||||||
|
});
|
||||||
|
buttonPanel.add(directConnectButton);
|
||||||
|
|
||||||
|
JButton helpButton = new JButton("Help");
|
||||||
|
helpButton.setToolTipText("Show some helpful information for using this program.");
|
||||||
|
helpButton.addActionListener(e -> {
|
||||||
|
String uri = "https://github.com/andrewlalis/AceOfShades/blob/main/help.md";
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().browse(new URI(uri));
|
||||||
|
} catch (IOException | URISyntaxException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
JOptionPane.showMessageDialog(this, "Could not open URI in browser. For help, please visit\n" + uri, "Error", JOptionPane.WARNING_MESSAGE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
buttonPanel.add(helpButton);
|
||||||
|
|
||||||
panel.add(buttonPanel, BorderLayout.SOUTH);
|
panel.add(buttonPanel, BorderLayout.SOUTH);
|
||||||
|
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Container getConnectPanel(JDialog dialog) {
|
||||||
|
JPanel inputPanel = new JPanel(new GridBagLayout());
|
||||||
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
|
c.insets = new Insets(5, 5, 5, 5);
|
||||||
|
|
||||||
|
c.gridx = 0;
|
||||||
|
c.gridy = 0;
|
||||||
|
inputPanel.add(new JLabel("Address"), c);
|
||||||
|
JTextField addressField = new JTextField(20);
|
||||||
|
c.gridx = 1;
|
||||||
|
inputPanel.add(addressField, c);
|
||||||
|
|
||||||
|
c.gridy = 1;
|
||||||
|
c.gridx = 0;
|
||||||
|
inputPanel.add(new JLabel("Username"), c);
|
||||||
|
JTextField usernameField = new JTextField(20);
|
||||||
|
c.gridx = 1;
|
||||||
|
inputPanel.add(usernameField, c);
|
||||||
|
|
||||||
|
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||||
|
JButton connectButton = new JButton("Connect");
|
||||||
|
connectButton.addActionListener(e -> {
|
||||||
|
if (validateConnectInput(addressField, usernameField)) {
|
||||||
|
dialog.dispose();
|
||||||
|
connect(new ServerInfo("Unknown", addressField.getText(), usernameField.getText()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
buttonPanel.add(connectButton);
|
||||||
|
|
||||||
|
JPanel mainPanel = new JPanel(new BorderLayout());
|
||||||
|
mainPanel.add(inputPanel, BorderLayout.CENTER);
|
||||||
|
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
||||||
|
return mainPanel;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean validateConnectInput(JTextField addressField, JTextField usernameField) {
|
private boolean validateConnectInput(JTextField addressField, JTextField usernameField) {
|
||||||
List<String> warnings = new ArrayList<>();
|
List<String> warnings = new ArrayList<>();
|
||||||
if (addressField.getText() == null || addressField.getText().isBlank()) {
|
if (addressField.getText() == null || addressField.getText().isBlank()) {
|
||||||
|
@ -179,20 +187,6 @@ public class Launcher extends JFrame {
|
||||||
return warnings.isEmpty();
|
return warnings.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void connect(JTextField addressField, JTextField usernameField) {
|
|
||||||
String hostAndPort = addressField.getText();
|
|
||||||
String[] parts = hostAndPort.split(":");
|
|
||||||
String host = parts[0].trim();
|
|
||||||
int port = Integer.parseInt(parts[1]);
|
|
||||||
String username = usernameField.getText();
|
|
||||||
try {
|
|
||||||
new Client(host, port, username);
|
|
||||||
} catch (IOException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
JOptionPane.showMessageDialog(null, "Could not connect:\n" + ex.getMessage(), "Connection Error", JOptionPane.WARNING_MESSAGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void connect(ServerInfo serverInfo) {
|
private void connect(ServerInfo serverInfo) {
|
||||||
String username = serverInfo.getUsername();
|
String username = serverInfo.getUsername();
|
||||||
if (username == null) {
|
if (username == null) {
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Ace of Shades - Help Information
|
||||||
|
In this document, we'll go over how to use the launcher, basic game controls, and some explanations of game mechanics so that you can start playing right away.
|
||||||
|
|
||||||
|
## Launcher
|
||||||
|
The launcher is a small application that makes it easy to connect to different servers to join their hosted games. The first thing you'll see is a list of servers. **You can remove or edit a server by right-clicking on it**, and **you can add new servers using the Add Server button** at the bottom.
|
||||||
|
|
||||||
|
Each entry in the list is just a way to remember a specific address (and optionally your preferred username when connecting to that server), so that **you can double-click on a server to instantly connect**.
|
||||||
|
|
||||||
|
> Servers have an *address* which consists usually of an IP address and port number. For example, there might be a server whose address is `123.123.123.123:54321`.
|
||||||
|
>
|
||||||
|
> It's up to the server to decide whether to allow you to join, so pick a sensible username.
|
||||||
|
|
||||||
|
## Controls
|
||||||
|
To control your player in-game, the following are the default controls:
|
||||||
|
|
||||||
|
| Control | Description |
|
||||||
|
|--------------|-------------------------------------------------|
|
||||||
|
| `WASD` | Move player forward, left, backward, and right. |
|
||||||
|
| `R` | Reload your weapon. |
|
||||||
|
| `T` | Start typing a message in chat. |
|
||||||
|
| `/` | Start typing a command in chat. |
|
||||||
|
| `LEFT-CLICK` | Use your weapon. |
|
||||||
|
| `SCROLL` | Zoom in or out. |
|
||||||
|
| `MOUSE-MOVE` | Aim your weapon. |
|
||||||
|
| `ENTER` | Send your message or command in chat. |
|
||||||
|
|
||||||
|
> Be careful when typing a message or command in chat! Other players can and will try to kill you.
|
||||||
|
|
||||||
|
## Basic Mechanics
|
||||||
|
In most scenarios, when you join a server, you'll be placed onto a *team*. Each team has a spawn point, which is where you'll start out. There's also a resupply area for each team, where you can replenish your health and ammunition when running low.
|
||||||
|
|
||||||
|
Each time you kill someone from another team, your own team's score increases. Different servers may come up with different rules for what constitutes a victory, but the premise is simple: **kill as many enemies as possible**.
|
||||||
|
|
||||||
|
You can quit at any time by closing the game window.
|
||||||
|
|
||||||
|
> Some servers may have policies which discourage *combat-logging* (disconnecting when about to die), and they may ban you from reconnecting! Take this into account, and play fair.
|
Loading…
Reference in New Issue