Full Rotator Sync

This commit is contained in:
brausjonas
2023-04-14 17:49:48 +02:00
parent 0742ff15b4
commit 9000450834
10 changed files with 206 additions and 183 deletions
+91 -144
View File
@@ -11,8 +11,7 @@ import java.util.TimerTask;
/**
* this class handels all operations / syncs performed in a single room
*/
public class Room
{
public class Room {
//tells how many clients can connect to a room
public Client[] players = new Client[2];
//the array of players start positions
@@ -32,8 +31,7 @@ public class Room
private int currentPlayer = 0;
public Room(String roomCode, Server server)
{
public Room(String roomCode, Server server) {
this.roomCode = roomCode;
startPositions = new Vector3[4];
@@ -49,17 +47,15 @@ public class Room
/**
* Adds a Client to the game (on new player joined the room)
*
* @param client
*/
public void addClient(Client client)
{
public void addClient(Client client) {
//loops through all players existing and sends the needed information
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//places the new joined player in the next free slot
if (players[i] == null)
{
if (players[i] == null) {
players[i] = client;
playerCount++;
@@ -67,42 +63,32 @@ public class Room
System.out.println(client.name.replace(" ", "") + " joined room " + roomCode + " successfully as player " + i);
//creates a thread for the connection with the joined player
Thread t = new Thread(new Runnable()
{
Thread t = new Thread(new Runnable() {
@Override
public void run()
{
public void run() {
//assignes a player id
int player = playerCount - 1;
DataInputStream input = null;
try
{
try {
//tries to get the input stream (TCP)
input = new DataInputStream(players[player].socket.getInputStream());
} catch (IOException e)
{
} catch (IOException e) {
server.deleteRoom(roomCode);
}
for(int i = 0; i < players.length; i++)
{
if(players[i] != null)
{
try
{
players[i].output.write(new byte[]{11, (byte)playerCount, 0, 0, 0, 0, 0, 0, 0, 0});
} catch (IOException e)
{
for (int i = 0; i < players.length; i++) {
if (players[i] != null) {
try {
players[i].output.write(new byte[]{11, (byte) playerCount, 0, 0, 0, 0, 0, 0, 0, 0});
} catch (IOException e) {
}
}
}
while (true)
{
try
{
while (true) {
try {
//this is a buffer for all data being received by the player
byte[] readData = new byte[10];
@@ -120,18 +106,15 @@ public class Room
----------------------------------------
*/
//Checks which action (array[0]) is received
switch (readData[0])
{
switch (readData[0]) {
/**
* //spieler hat gewürfelt
*/
case 3:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//sync to all OTHER players
if (i != player)
{
if (i != player) {
//!!data processing!!
//----------------------------action---player-------rolled number----free space--------
players[i].output.write(new byte[]{3, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
@@ -142,12 +125,10 @@ public class Room
* //pfeil wurde ausgewählt
*/
case 4:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//!!data processing!!
//sync to all OTHER players
if (i != player)
{
if (i != player) {
//-------------------------------action----player-----arrow index--------free space-----
players[i].output.write(new byte[]{4, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
@@ -160,13 +141,11 @@ public class Room
case 5:
//calculate the next player
currentPlayer++;
if (currentPlayer >= players.length)
{
if (currentPlayer >= players.length) {
currentPlayer = 0;
}
//sync the activation of the current player to ALL clients
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//!!data processing!!
//----------------------------action--------the next player-----------free space------
players[i].output.write(new byte[]{2, (byte) currentPlayer, 0, 0, 0, 0, 0, 0, 0, 0});
@@ -177,14 +156,12 @@ public class Room
* //Es wurde auf ein CoinField getreten (Rot oder Blau)
*/
case 6:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//sync to OTHER players
if (i != player)
{
if (i != player) {
//!!data processing!!
//-----------------------------action--player-------losse or get------------free space--
players[i].output.write(new byte[]{6, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{6, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
}
break;
@@ -194,25 +171,22 @@ public class Room
*/
case 7:
//sync to ALL players
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//!!simple sync!!
//------------------------------action---player---------free space--------
players[i].output.write(new byte[]{7, (byte)player, 0, 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{7, (byte) player, 0, 0, 0, 0, 0, 0, 0, 0});
}
break;
/**
* //Spieler hat einen Stern gekauft
*/
case 8:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//!!simple sync!!
//sync to OTHER players
if (i != player)
{
if (i != player) {
//-----------------------------action----player----------free space------
players[i].output.write(new byte[]{8, (byte)player, 0, 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{8, (byte) player, 0, 0, 0, 0, 0, 0, 0, 0});
}
}
break;
@@ -221,49 +195,53 @@ public class Room
* //Spieler hat ein Item Gekauft
*/
case 9:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//Sync to OTHER players
if (i != player)
{
if (i != player) {
//!!data processing!!
//------------------------------action---player-------item ID--------free space--------
players[i].output.write(new byte[]{9, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{9, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
}
break;
case 10:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//Sync to OTHER players
if (i != player)
{
if (i != player) {
//!!data processing!!
//------------------------------action---player-------item index--------free space--------
players[i].output.write(new byte[]{10, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{10, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
}
break;
case 12:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//Sync to OTHER players
if (i != player)
{
if (i != player) {
//!!data processing!!
//------------------------------action---player-------item index--------free space--------
players[i].output.write(new byte[]{12, (byte)player, readData[1], 0, 0, 0, 0, 0, 0, 0});
players[i].output.write(new byte[]{12, (byte) player, readData[1], 0, 0, 0, 0, 0, 0, 0});
}
}
break;
//Coins Sync
case 13:
for (int i = 0; i < players.length; i++)
{
for (int i = 0; i < players.length; i++) {
//Sync to OTHER players
if (i != player)
{
players[i].output.write(new byte[]{13, readData[1], readData[2], (byte)player, 0, 0, 0, 0, 0, 0});
if (i != player) {
players[i].output.write(new byte[]{13, readData[1], readData[2], (byte) player, 0, 0, 0, 0, 0, 0});
}
}
break;
//Start Rotator AND stop Rotator
case 14: case 15:
for (int i = 0; i < players.length; i++) {
//Sync to OTHER players
if (i != player) {
players[i].output.write(readData);
}
}
break;
@@ -272,8 +250,7 @@ public class Room
break;
}
} catch (IOException e)
{
} catch (IOException e) {
//if something is crashing, the room is being deleted
server.deleteRoom(roomCode);
}
@@ -291,12 +268,9 @@ public class Room
}
//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++)
{
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
@@ -304,12 +278,10 @@ public class Room
//5 player index
//if the player should be playable
if (j == k)
{
try
{
if (j == k) {
try {
//sends the inital message to the player
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, (byte)players[k].characterID});
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, (byte) players[k].characterID});
//sends the name of the player (ASCII encoding)............................................................................
byte[] name = players[k].name.substring(0, 8).getBytes(StandardCharsets.US_ASCII);
@@ -317,37 +289,31 @@ public class Room
send[0] = 5;
send[1] = (byte) k;
for (int i = 2; i < send.length; i++)
{
for (int i = 2; i < send.length; i++) {
send[i] = name[i - 2];
}
players[j].output.write(send);
//stop sending the name................................................................................
} catch (IOException e)
{
} catch (IOException e) {
server.deleteRoom(roomCode);
}
}
}
//if the player should be a bot
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, (byte)players[k].characterID});
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, (byte) players[k].characterID});
byte[] name = players[k].name.substring(0, 8).getBytes(StandardCharsets.US_ASCII);
byte[] send = new byte[10];
send[0] = 5;
send[1] = (byte) k;
for (int i = 2; i < send.length; i++)
{
for (int i = 2; i < send.length; i++) {
send[i] = name[i - 2];
}
players[j].output.write(send);
} catch (IOException e)
{
} catch (IOException e) {
server.deleteRoom(roomCode);
}
}
@@ -358,14 +324,11 @@ public class Room
//1 x, x = idx
//send the inital activation message
try
{
for (Client c : players)
{
try {
for (Client c : players) {
c.output.write(new byte[]{2, 0, 0, 0, 0, 0, 0, 0, 0, 0});
}
} catch (IOException e)
{
} catch (IOException e) {
server.deleteRoom(roomCode);
}
}
@@ -374,69 +337,53 @@ public class Room
/**
* Closes the room
*/
public void closeRoom()
{
public void closeRoom() {
//try to cick all the players (still connected) of the room
try
{
if (players[0] != null)
{
try {
if (players[0] != null) {
//127 is the action for room cick
players[0].output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
players[0].close();
}
} catch (Exception ex)
{
} catch (Exception ex) {
}
try
{
if (players[1] != null)
{
try {
if (players[1] != null) {
players[1].output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
players[1].close();
}
} catch (Exception ex)
{
} catch (Exception ex) {
}
try
{
if (players[2] != null)
{
try {
if (players[2] != null) {
players[2].output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
players[2].close();
}
} catch (Exception ex)
{
} catch (Exception ex) {
}
try
{
if (players[3] != null)
{
try {
if (players[3] != null) {
players[3].output.write(new byte[]{127, 0, 0, 0, 0, 0, 0, 0, 0, 0});
players[3].close();
}
} catch (Exception ex)
{
} catch (Exception ex) {
}
//try to close all open threads (not crashed yet)
for (int i = 0; i < threads.size(); i++)
{
try
{
for (int i = 0; i < threads.size(); i++) {
try {
threads.get(i).interrupt();
System.out.println("thread " + threads.get(i).getName() + " stopped!");
} catch (Exception e)
{
} catch (Exception e) {
}
}