Skip to content

Commit

Permalink
RCON Support (#96)
Browse files Browse the repository at this point in the history
* Added RCON dotnet submodule

* RCON Manager

* RCON works

* Switched inter-thread passing from tasks callbacks to BlockingCollection

* Cleanup

* Config based rcon port and password

* RCON is disabled by default in config

* Added SanAndreasUnity.RCON namespace to CommandInterpreter

* Pass command to main thread first and report progress afterwards

* Minor cleanup

* Removed InvalidOperationException as it was never possible

* Moved OnLoaderFinished code in RCONManager

* Added RCONManager script to prefab

* Added meta files
  • Loading branch information
antonioganea authored Nov 1, 2020
1 parent 29d5a04 commit c3aebc3
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
[submodule "Assets/UnityStandardAssets"]
path = Assets/UnityStandardAssets
url = https://github.com/GTA-ASM/UnityStandardAssets
[submodule "Assets/RCONdotnet"]
path = Assets/RCONdotnet
url = https://github.com/undbsd/rcon-dotnet
13 changes: 13 additions & 0 deletions Assets/Prefabs/GameManager.prefab
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ GameObject:
- component: {fileID: 1318502437576191535}
- component: {fileID: 7442340376164908290}
- component: {fileID: 8446601354455743255}
- component: {fileID: 5853763562556677784}
m_Layer: 0
m_Name: GameManager
m_TagString: Untagged
Expand Down Expand Up @@ -299,3 +300,15 @@ MonoBehaviour:
type: 3}
messagesContainer: {fileID: 0}
messagePoolSize: 10
--- !u!114 &5853763562556677784
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1297494511425690}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c77317cdc437f244b8d409c229aa2e95, type: 3}
m_Name:
m_EditorClassIdentifier:
1 change: 1 addition & 0 deletions Assets/RCONdotnet
Submodule RCONdotnet added at b5e93d
8 changes: 8 additions & 0 deletions Assets/RCONdotnet.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 6 additions & 3 deletions Assets/Resources/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"sv_max_connections": 32,
"sv_port": 14242,

"game_dir" : "",
"game_dir": "",

"archive_paths": [
"${game_dir}/models/gta3.img",
Expand All @@ -35,10 +35,13 @@
"water_path": "${game_dir}/data/water.dat",
"car_colors_path": "${game_dir}/data/carcols.dat",
"anim_groups_paths": [
"${game_dir}/data/animgrp.dat",
"${game_dir}/data/animgrp.dat"
],
"weapons_path": "${game_dir}/data/weapon.dat",

"dontLoadTextures": false,


"RCON_enabled": false,
"RCON_password": "super_secret_password",
"RCON_port": 25575
}
8 changes: 8 additions & 0 deletions Assets/Scripts/RCON.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 36 additions & 0 deletions Assets/Scripts/RCON/CommandInterpreter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace SanAndreasUnity.RCON
{
public class CommandInterpreter
{
public static String Interpret(String command)
{
string[] words = command.Split(' ');

if (command == "heartbeat")
{
// Implement heartbeat ping
return "Heartbeat was sent to master server";
}

if (command == "help")
{
return "The available commands for now are heartbeat, announce and help";
}

if (words[0] == "announce")
{
String announcement = String.Join(" ", words, 1, words.Length - 1);
SanAndreasUnity.Chat.ChatManager.SendChatMessageToAllPlayersAsServer(announcement);
return "Server : " + announcement;
}

return "Unknown command";
}
}

}
11 changes: 11 additions & 0 deletions Assets/Scripts/RCON/CommandInterpreter.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

100 changes: 100 additions & 0 deletions Assets/Scripts/RCON/RCONManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using Rcon;
using Rcon.Events;
using SanAndreasUnity.Net;
using SanAndreasUnity.Utilities;
using System;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.Threading.Tasks;
using UnityEngine;

namespace SanAndreasUnity.RCON
{
public class RCONManager : MonoBehaviour
{
// Todo : set these from config
private static String password;
private static int portNumber;

// Objects used to pass commands and responses between threads
private static BlockingCollection<String> mainToSec = new BlockingCollection<String>(1);
private static BlockingCollection<String> secToMain = new BlockingCollection<String>(1);

private static BackgroundWorker workerInstance = null;

public static void StartServer()
{
password = Config.Get<string>("RCON_password");
portNumber = Config.Get<int>("RCON_port");

if (workerInstance != null)
return;

workerInstance = new BackgroundWorker();

workerInstance.DoWork += new DoWorkEventHandler( worker_doWork );
workerInstance.ProgressChanged += new ProgressChangedEventHandler( worker_progressChanged );
workerInstance.WorkerReportsProgress = true;
// workerInstance.WorkerSupportsCancellation = true;

workerInstance.RunWorkerAsync(); // Call the background worker
}

#region Code that runs in the RCON Server Thread
private static void worker_doWork(object sender, DoWorkEventArgs e)
{
using (RconServer server = new RconServer(password, portNumber))
{
server.OnClientCommandReceived += Server_OnClientCommandReceived;
server.OnClientConnected += Server_OnClientConnected;
server.OnClientAuthenticated += Server_OnClientAuthenticated;
server.OnClientDisconnected += Server_OnClientDisconnected;
server.Start();
}
}
static void Server_OnClientAuthenticated(object sender, ClientAuthenticatedEventArgs e)
{
// Console.WriteLine("{0} authenticated", e.Client.Client.LocalEndPoint);
}
static void Server_OnClientDisconnected(object sender, ClientDisconnectedEventArgs e)
{
// Console.WriteLine("{0} disconnected", e.EndPoint);
}
static void Server_OnClientConnected(object sender, ClientConnectedEventArgs e)
{
// Console.WriteLine("{0} connected", e.Client.Client.LocalEndPoint);
}
static string Server_OnClientCommandReceived(object sender, ClientSentCommandEventArgs e)
{
secToMain.Add(e.Command); // Pass the command to the main thread

workerInstance.ReportProgress(0); //Report our progress to the main thread

String commandResult = "Command didn't process correctly"; // default value

commandResult = mainToSec.Take();

return commandResult;
}
#endregion

// Runs in main thread
private static void worker_progressChanged(object sender, ProgressChangedEventArgs e)
{
String command = "unknown";

command = secToMain.Take();

mainToSec.Add(CommandInterpreter.Interpret(command));
}

void OnLoaderFinished()
{
if (NetStatus.IsServer)
{
if (Config.Get<bool>("RCON_enabled"))
StartServer();
}
}
}
}
11 changes: 11 additions & 0 deletions Assets/Scripts/RCON/RCONManager.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit c3aebc3

Please sign in to comment.