quakeball/Assets/Scripts/Net/NetChaperone.cs

101 lines
3.2 KiB
C#

using System.Collections.Generic;
using System;
using UnityEngine;
using NeonTea.Quakeball.Interface;
using NeonTea.Quakeball.TeaNet.Peers;
namespace NeonTea.Quakeball.Net {
public class NetChaperone : MonoBehaviour, PeerMessageListener {
public GameObject SpawnedRemotePlayer;
private Terminal Terminal;
private Queue<string> MessageQueue = new Queue<string>();
private Queue<SpawnInfo> SpawnQueue = new Queue<SpawnInfo>();
class SpawnInfo {
public ulong id;
public Vector3 location;
}
public void SpawnPlayer(ulong uid, Vector3 location) {
SpawnInfo info = new SpawnInfo();
info.id = uid;
info.location = location;
SpawnQueue.Enqueue(info);
}
private void Start() {
if (Terminal.Singleton != null) {
Terminal = Terminal.Singleton;
Terminal.RegisterCommand("host", Host, "host [<port>] [<address>] - Hosts server at given address and port.");
Terminal.RegisterCommand("join", Join, "join [<address>] [<port>] - Tries to join a server at given address and port.");
}
}
private void Update() {
if (Terminal != null && Terminal.isActiveAndEnabled) {
while (MessageQueue.Count > 0) {
Terminal.Println(MessageQueue.Dequeue());
}
while (SpawnQueue.Count > 0) {
SpawnInfo info = SpawnQueue.Dequeue();
GameObject obj = GameObject.Instantiate(SpawnedRemotePlayer);
obj.transform.position = info.location;
Net.Singleton.Instance.PlayerSpawned(info.id, obj);
}
}
}
private bool Host(string[] args) {
if (args.Length > 2) {
Terminal.Println($"<color={Terminal.ERROR_COLOR}>Can't accept more than 2 arguments.</color>");
return false;
}
string addr = "0.0.0.0";
string portstr = "8080";
if (args.Length > 0) {
portstr = args[0];
}
if (args.Length > 1) {
addr = args[1];
}
int port;
if (!Int32.TryParse(portstr, out port)) {
return false;
}
Net.Singleton.StartServer(addr, port, this);
return true;
}
private bool Join(string[] args) {
if (args.Length > 2) {
Terminal.Println($"<color={Terminal.ERROR_COLOR}>Can't accept more than 2 arguments.</color>");
return false;
}
string addr = "127.0.0.1";
string portstr = "8080";
if (args.Length > 0) {
addr = args[0];
}
if (args.Length > 1) {
portstr = args[1];
}
int port;
if (!Int32.TryParse(portstr, out port)) {
return false;
}
Net.Singleton.StartClient(addr, port, this);
return true;
}
public void Message(string msg) {
MessageQueue.Enqueue(msg);
}
public void Err(string err) { }
}
}