Skip to content

Commit c62340c

Browse files
committed
Multiplayer: Disconnection
implemented a way to disconnect from the server
1 parent 250b5f6 commit c62340c

File tree

6 files changed

+171
-12
lines changed

6 files changed

+171
-12
lines changed

src/com/redomar/game/Game.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class Game extends Canvas implements Runnable {
4343

4444
private Screen screen;
4545
public InputHandler input;
46+
public WindowHandler window;
4647
public LevelHandler level;
4748
public Player player;
4849

@@ -54,14 +55,14 @@ public Game() {
5455
setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
5556
setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
5657

57-
frame = new JFrame(NAME);
58-
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
59-
frame.setLayout(new BorderLayout());
60-
frame.add(this, BorderLayout.CENTER);
61-
frame.pack();
62-
frame.setResizable(false);
63-
frame.setLocationRelativeTo(null);
64-
frame.setVisible(true);
58+
setFrame(new JFrame(NAME));
59+
getFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
60+
getFrame().setLayout(new BorderLayout());
61+
getFrame().add(this, BorderLayout.CENTER);
62+
getFrame().pack();
63+
getFrame().setResizable(false);
64+
getFrame().setLocationRelativeTo(null);
65+
getFrame().setVisible(true);
6566

6667
}
6768

@@ -80,6 +81,7 @@ public void init() {
8081

8182
screen = new Screen(WIDTH, HEIGHT, new SpriteSheet("/sprite_sheet.png"));
8283
input = new InputHandler(this);
84+
window = new WindowHandler(this);
8385
level = new LevelHandler("/levels/water_level.png");
8486

8587
player = new PlayerMP(level, 100, 100, input,
@@ -93,7 +95,7 @@ public void init() {
9395
}
9496

9597
// socketClient.sendData("ping".getBytes());
96-
loginPacket.writeData(socketClient);
98+
loginPacket.writeData(getSocketClient());
9799
}
98100

99101
public synchronized void start() {
@@ -105,8 +107,8 @@ public synchronized void start() {
105107
socketServer.start();
106108
}
107109

108-
socketClient = new GameClient(this, "127.0.0.1");
109-
socketClient.start();
110+
setSocketClient(new GameClient(this, "127.0.0.1"));
111+
getSocketClient().start();
110112
}
111113

112114
public synchronized void stop() {
@@ -151,7 +153,7 @@ public void run() {
151153

152154
if (System.currentTimeMillis() - lastTimer >= 1000) {
153155
lastTimer += 1000;
154-
frame.setTitle("Frames: " + frames + " Ticks: " + ticks);
156+
getFrame().setTitle("Frames: " + frames + " Ticks: " + ticks);
155157
frames = 0;
156158
ticks = 0;
157159
}
@@ -206,4 +208,20 @@ public static void main(String[] args) {
206208
new Game().start();
207209
}
208210

211+
public JFrame getFrame() {
212+
return frame;
213+
}
214+
215+
public void setFrame(JFrame frame) {
216+
this.frame = frame;
217+
}
218+
219+
public GameClient getSocketClient() {
220+
return socketClient;
221+
}
222+
223+
public void setSocketClient(GameClient socketClient) {
224+
this.socketClient = socketClient;
225+
}
226+
209227
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.redomar.game;
2+
3+
import java.awt.event.WindowEvent;
4+
import java.awt.event.WindowListener;
5+
6+
import com.redomar.game.net.packets.Packet01Disconnect;
7+
8+
public class WindowHandler implements WindowListener{
9+
10+
private final Game game;
11+
12+
public WindowHandler(Game game){
13+
this.game = game;
14+
this.game.getFrame().addWindowListener(this);
15+
}
16+
17+
@Override
18+
public void windowActivated(WindowEvent event) {
19+
20+
}
21+
22+
@Override
23+
public void windowClosed(WindowEvent event) {
24+
25+
}
26+
27+
@Override
28+
public void windowClosing(WindowEvent event) {
29+
Packet01Disconnect packet = new Packet01Disconnect(this.game.player.getUsername());
30+
packet.writeData(this.game.getSocketClient());
31+
}
32+
33+
@Override
34+
public void windowDeactivated(WindowEvent event) {
35+
36+
}
37+
38+
@Override
39+
public void windowDeiconified(WindowEvent event) {
40+
41+
}
42+
43+
@Override
44+
public void windowIconified(WindowEvent event) {
45+
46+
}
47+
48+
@Override
49+
public void windowOpened(WindowEvent event) {
50+
51+
}
52+
53+
}

src/com/redomar/game/level/LevelHandler.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javax.imageio.ImageIO;
1111

1212
import com.redomar.game.entities.Entity;
13+
import com.redomar.game.entities.PlayerMP;
1314
import com.redomar.game.gfx.Screen;
1415
import com.redomar.game.level.tiles.Tile;
1516

@@ -145,4 +146,15 @@ public void addEntity(Entity entity) {
145146
this.entities.add(entity);
146147
}
147148

149+
public void removeEntity(String username) {
150+
int index = 0;
151+
for(Entity e : entities){
152+
if(e instanceof PlayerMP && ((PlayerMP)e).getUsername().equalsIgnoreCase(username)){
153+
break;
154+
}
155+
index++;
156+
}
157+
this.entities.remove(index);
158+
}
159+
148160
}

src/com/redomar/game/net/GameClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.redomar.game.entities.PlayerMP;
1212
import com.redomar.game.net.packets.Packet;
1313
import com.redomar.game.net.packets.Packet00Login;
14+
import com.redomar.game.net.packets.Packet01Disconnect;
1415
import com.redomar.game.net.packets.Packet.PacketTypes;
1516

1617
public class GameClient extends Thread {
@@ -64,6 +65,11 @@ private void parsePacket(byte[] data, InetAddress address, int port) {
6465
game.level.addEntity(player);
6566
break;
6667
case DISCONNECT:
68+
packet = new Packet01Disconnect(data);
69+
System.out.println("[" + address.getHostAddress() + ":" + port
70+
+ "] " + ((Packet01Disconnect) packet).getUsername()
71+
+ " has disconnected...");
72+
game.level.removeEntity(((Packet01Disconnect)packet).getUsername());
6773
break;
6874
}
6975
}

src/com/redomar/game/net/GameServer.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.redomar.game.net.packets.Packet;
1414
import com.redomar.game.net.packets.Packet00Login;
1515
import com.redomar.game.net.packets.Packet.PacketTypes;
16+
import com.redomar.game.net.packets.Packet01Disconnect;
1617

1718
public class GameServer extends Thread {
1819

@@ -69,6 +70,11 @@ private void parsePacket(byte[] data, InetAddress address, int port) {
6970
this.addConnection(player, (Packet00Login) packet);
7071
break;
7172
case DISCONNECT:
73+
packet = new Packet01Disconnect(data);
74+
System.out.println("[" + address.getHostAddress() + ":" + port
75+
+ "] " + ((Packet01Disconnect) packet).getUsername()
76+
+ " has disconnected...");
77+
this.removeConnection((Packet01Disconnect) packet);
7278
break;
7379
}
7480
}
@@ -98,6 +104,32 @@ public void addConnection(PlayerMP player, Packet00Login packet) {
98104
}
99105
}
100106

107+
public void removeConnection(Packet01Disconnect packet) {
108+
this.connectedPlayers.remove(getPlayerMPIndex(packet.getUsername()));
109+
packet.writeData(this);
110+
}
111+
112+
public PlayerMP getPlayerMP(String username){
113+
for(PlayerMP player : this.connectedPlayers){
114+
if(player.getUsername().equalsIgnoreCase(username)){
115+
return player;
116+
}
117+
}
118+
return null;
119+
}
120+
121+
public int getPlayerMPIndex(String username){
122+
int index = 0;
123+
for(PlayerMP player : this.connectedPlayers){
124+
if(player.getUsername().equalsIgnoreCase(username)){
125+
break;
126+
} else {
127+
index++;
128+
}
129+
}
130+
return index;
131+
}
132+
101133
public void sendData(byte[] data, InetAddress ipAddress, int port) {
102134
DatagramPacket packet = new DatagramPacket(data, data.length,
103135
ipAddress, port);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.redomar.game.net.packets;
2+
3+
import com.redomar.game.net.GameClient;
4+
import com.redomar.game.net.GameServer;
5+
6+
public class Packet01Disconnect extends Packet {
7+
8+
private String username;
9+
10+
public Packet01Disconnect(byte[] data) {
11+
super(01);
12+
this.username = readData(data);
13+
}
14+
15+
public Packet01Disconnect(String username) {
16+
super(01);
17+
this.username = username;
18+
}
19+
20+
@Override
21+
public byte[] getData() {
22+
return ("01" + this.username).getBytes();
23+
}
24+
25+
@Override
26+
public void writeData(GameClient client) {
27+
client.sendData(getData());
28+
}
29+
30+
@Override
31+
public void writeData(GameServer server) {
32+
server.sendDataToAllClients(getData());
33+
}
34+
35+
public String getUsername() {
36+
return username;
37+
}
38+
}

0 commit comments

Comments
 (0)