Online Function With Room Codes

This commit is contained in:
brausjonas
2023-01-28 00:49:09 +01:00
parent 4127dbaaac
commit e89535fb02
55 changed files with 5573 additions and 425 deletions
+8
View File
@@ -0,0 +1,8 @@
<component name="ArtifactManager">
<artifact type="jar" name="Server:jar">
<output-path>$PROJECT_DIR$/out/artifacts/Server_jar</output-path>
<root id="archive" name="Server.jar">
<element id="module-output" name="Server" />
</root>
</artifact>
</component>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Server.iml" filepath="$PROJECT_DIR$/Server.iml" />
</modules>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>
+81
View File
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ArtifactsWorkspaceSettings">
<artifacts-to-build>
<artifact name="Server:jar" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="6d89163f-4054-4765-8ee3-ac6da16b6997" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2KuyzwPxozzNerRoAmXTliGxiKN" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"project.structure.last.edited": "Artifacts",
"project.structure.proportion": "0.0",
"project.structure.side.proportion": "0.2",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager">
<configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="Main" />
<module name="Server" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<recent_temporary>
<list>
<item itemvalue="Application.Main" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="6d89163f-4054-4765-8ee3-ac6da16b6997" name="Changes" comment="" />
<created>1674839030210</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1674839030210</updated>
<workItem from="1674839031467" duration="221000" />
<workItem from="1674839402490" duration="19826000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: Main
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+18
View File
@@ -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;
}
}
+3
View File
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: Main
+7
View File
@@ -0,0 +1,7 @@
public class Main
{
public static void main(String[] args)
{
new Server().start();
}
}
+187
View File
@@ -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();
}
}
}
}
+102
View File
@@ -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;
}
}
+16
View File
@@ -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);
}
}