Online Function With Room Codes
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.net.Socket;
|
||||
|
||||
public class Client
|
||||
{
|
||||
public DataOutputStream output;
|
||||
public DataInputStream input;
|
||||
public Socket socket;
|
||||
|
||||
|
||||
public Client(DataOutputStream output, DataInputStream input, Socket socket)
|
||||
{
|
||||
this.output = output;
|
||||
this.input = input;
|
||||
this.socket = socket;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: Main
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
public class Main
|
||||
{
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Server().start();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Room
|
||||
{
|
||||
// 1: 95.82, 0.5, 126.47
|
||||
// 2: 92.06, 0.36, 125.46
|
||||
// 3: 95.82, 0.5, 128.47
|
||||
// 4: 92.06, 0.36, 127.46
|
||||
|
||||
private Client[] players = new Client[2];
|
||||
private Vector3[] startPositions;
|
||||
private String roomCode;
|
||||
private Server server;
|
||||
|
||||
private List<Thread> threads = new ArrayList<>();
|
||||
|
||||
private int playerCount = 0;
|
||||
|
||||
private int currentPlayer = 0;
|
||||
|
||||
public Room(String roomCode, Server server)
|
||||
{
|
||||
this.roomCode = roomCode;
|
||||
startPositions = new Vector3[4];
|
||||
|
||||
startPositions[0] = new Vector3(96, 1, 126);
|
||||
startPositions[1] = new Vector3(92, 1, 126);
|
||||
startPositions[2] = new Vector3(96, 1, 128);
|
||||
startPositions[3] = new Vector3(92, 1, 128);
|
||||
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
public void addClient(Client client)
|
||||
{
|
||||
for (int i = 0; i < players.length; i++)
|
||||
{
|
||||
if (players[i] == null)
|
||||
{
|
||||
players[i] = client;
|
||||
playerCount++;
|
||||
|
||||
System.out.println("Client joined room " + roomCode + " successfully as player " + i);
|
||||
|
||||
Thread t = new Thread(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
int player = playerCount - 1;
|
||||
|
||||
DataInputStream input = null;
|
||||
try
|
||||
{
|
||||
input = new DataInputStream(players[player].socket.getInputStream());
|
||||
} catch (IOException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] readData = new byte[10];
|
||||
|
||||
input.read(readData);
|
||||
|
||||
switch (readData[0])
|
||||
{
|
||||
|
||||
//spieler hat gewürfelt
|
||||
//1 x, x = zahl
|
||||
case 3:
|
||||
for (int i = 0; i < players.length; i++)
|
||||
{
|
||||
if (i != player)
|
||||
{
|
||||
players[i].output.write(new byte[]{3, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
|
||||
}
|
||||
}
|
||||
break;
|
||||
//pfeil wurde ausgewählt
|
||||
//1 x, x = idx
|
||||
case 4:
|
||||
for (int i = 0; i < players.length; i++)
|
||||
{
|
||||
if (i != player)
|
||||
{
|
||||
players[i].output.write(new byte[]{4, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
//Spieler ist fertig mit seinem Zug
|
||||
//1 x, x = next player
|
||||
case 5:
|
||||
currentPlayer++;
|
||||
if (currentPlayer >= players.length)
|
||||
{
|
||||
currentPlayer = 0;
|
||||
}
|
||||
for (int i = 0; i < players.length; i++)
|
||||
{
|
||||
players[i].output.write(new byte[]{2, (byte) currentPlayer, 0, 0, 0, 0, 0, 0, 0, 0});
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
server.deleteRoom(roomCode);
|
||||
for(int i = 0; i < threads.size(); i++)
|
||||
{
|
||||
threads.get(i).stop();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (IOException e)
|
||||
{
|
||||
for(int i = 0; i < threads.size(); i++)
|
||||
{
|
||||
threads.get(i).stop();
|
||||
}
|
||||
server.deleteRoom(roomCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
t.start();
|
||||
threads.add(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//Make clients add all players to the world
|
||||
if (playerCount == players.length)
|
||||
{
|
||||
for (int j = 0; j < players.length; j++)
|
||||
{
|
||||
for (int k = 0; k < players.length; k++)
|
||||
{
|
||||
//0 1 create new player
|
||||
//1 0 no playable player
|
||||
//1 1 playable character
|
||||
//2-3-4 default pos
|
||||
//5 player index
|
||||
if (j == k)
|
||||
{
|
||||
try
|
||||
{
|
||||
players[j].output.write(new byte[]{1, 1, (byte) startPositions[k].x, (byte) startPositions[k].y, (byte) startPositions[k].z, (byte) k, 0, 0, 0, 0});
|
||||
} catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
players[j].output.write(new byte[]{1, 0, (byte) startPositions[k].x, (byte) startPositions[k].y, (byte) startPositions[k].z, (byte) k, 0, 0, 0, 0});
|
||||
} catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//0 2, activate a player
|
||||
//1 x, x = idx
|
||||
try
|
||||
{
|
||||
for (Client c : players)
|
||||
{
|
||||
c.output.write(new byte[]{2, 0, 0, 0, 0, 0, 0, 0, 0, 0});
|
||||
}
|
||||
} catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Server
|
||||
{
|
||||
private ServerSocket serverSocket;
|
||||
private HashMap<String, Room> rooms = new HashMap<>();
|
||||
|
||||
private final Server server = this;
|
||||
|
||||
public void deleteRoom(String code)
|
||||
{
|
||||
rooms.remove(code);
|
||||
System.out.println("Room " + code + " successfully deleted");
|
||||
}
|
||||
|
||||
public void start()
|
||||
{
|
||||
try
|
||||
{
|
||||
serverSocket = new ServerSocket(8051);
|
||||
|
||||
System.out.println("Server started! IP 185.245.96.48 PORT 8051");
|
||||
|
||||
while(true)
|
||||
{
|
||||
Socket tempClient = serverSocket.accept();
|
||||
|
||||
System.out.println("Client with IP " + tempClient.getInetAddress().getHostName() + " connected!");
|
||||
|
||||
new Thread(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Socket client = tempClient;
|
||||
|
||||
try
|
||||
{
|
||||
DataInputStream input = new DataInputStream(client.getInputStream());
|
||||
DataOutputStream output = new DataOutputStream(client.getOutputStream());
|
||||
byte[] readData = new byte[10];
|
||||
|
||||
input.read(readData);
|
||||
|
||||
switch(readData[0])
|
||||
{
|
||||
case 0:
|
||||
byte[] code = generateRoomCode();
|
||||
output.write(code);
|
||||
|
||||
Room room = new Room(new String(code, StandardCharsets.US_ASCII), server);
|
||||
rooms.put(new String(code, StandardCharsets.US_ASCII), room);
|
||||
|
||||
System.out.println("Room " + new String(code, StandardCharsets.US_ASCII) + " successfully created!");
|
||||
break;
|
||||
case 1:
|
||||
|
||||
input.read(readData);
|
||||
|
||||
String roomCode = new String(readData, StandardCharsets.US_ASCII);
|
||||
Client client1 = new Client(output, input, client);
|
||||
|
||||
rooms.get(roomCode).addClient(client1);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (Exception e){
|
||||
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
catch(Exception e){e.printStackTrace();}
|
||||
}
|
||||
|
||||
private byte[] generateRoomCode()
|
||||
{
|
||||
byte[] code = new byte[10];
|
||||
|
||||
for(int i = 0; i < code.length; i++)
|
||||
{
|
||||
if(i < code.length / 2)
|
||||
{
|
||||
code[i] = (byte)(Math.random() * 8 + 49);
|
||||
}
|
||||
else
|
||||
{
|
||||
code[i] = (byte)(Math.random() * 25 + 97);
|
||||
}
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
public class Vector3
|
||||
{
|
||||
public float x, y, z;
|
||||
|
||||
public Vector3(float x, float y, float z)
|
||||
{
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public static Vector3 zero()
|
||||
{
|
||||
return new Vector3(0, 0, 0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user