Newer
Older
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
public static class CommunicationEvents
{
public static UnityEvent<RaycastHit[]> TriggerEvent = new();
public static UnityEvent<RaycastHit[]> TriggerModFireEvent = new();
public static UnityEvent<int> ToolModeChangedEvent = new();
public static UnityEvent<Fact> AddFactEvent = new();
public static UnityEvent<Fact> RemoveFactEvent = new();
public static UnityEvent gameSucceededEvent = new();
public static UnityEvent gameNotSucceededEvent = new();
public static UnityEvent StartT0Event = new();
Björn Eßwein
committed
/** <summary>Inform ui that it should animate the given fact with the given material.</summary> */
public static UnityEvent<string, FactWrapper.FactMaterials> AnimateExistingFactEvent = new();
Björn Eßwein
committed
/** <summary>Start firework and invoke AnimateExistingFactEvent.</summary> */
public static UnityEvent<Fact, FactWrapper.FactMaterials> AnimateExistingAsSolutionEvent = new();
Björn Eßwein
committed
/** <summary>Show a missing fact for a short time as hint for the user.</summary> */
public static UnityEvent<Fact> AnimateNonExistingFactEvent = new();
//------------------------------------------------------------------------------------
//-------------------------------Global Variables-------------------------------------
Marco Zimmer
committed
// TODO! move to GlobalStatic/Behaviour
public static bool ServerAutoStart = true;
public static bool ServerRunning = true;
//CHANGE HERE PORT OF SERVER
public static string ServerPortDefault = "8085"; //used for Local
public static string ServerAddressLocalhost = "http://localhost"; //Without Port //Kann das weg?
public static string ServerAddressLocal = "http://localhost:8085"; // "http://localhost:8085" //Kann das weg?
public static string ServerAdress = "http://localhost:8085"; //need "http://" //used by dispalyScrolls.cs //http://10.231.4.95:8085"; //IMPORTANT for MAINMENU
public static Process process_mmt_frameIT_server;
public static int ToolID_new;
public static int ToolID_selected;//Script
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/// <summary>
/// The Servers stored in NetworkJSON, as an enum to have consistent names.<br/>
/// Why are <see cref="ServerSlot.last"/>,<see cref="ServerSlot.newIP"/> and
/// <see cref="ServerSlot.selecIP"/> in here? Historical Reasons^TM <br/>
/// If one wants to optimize things, it is likely advisable to make them variables instead.
/// But this also requires changing the read/write of NetworkJSON, and likely more ...
/// </summary>
[System.Serializable]
public enum ServerSlot
{// The numbers are due to legacy code, specifically ServerRunningA indices
last =1,
newIP =2,
slot1 =3,
slot2 =4,
slot3 =5,
slot4 =7,
slot5 =8,
selecIP=6
}
/// <summary>
/// The status of a <c>ServerSlot</c> in <see cref="ServerSlots"/>
/// </summary>
public enum ServerStatus
{// The numbers are due to legacy code, specifically ServerRunningA values
offline =0,
online =2,
checking=1,
NoNetworkAddress=3
}
/// <summary>
/// All data to a Server stored in a Server
/// </summary>
public class ServerSlotData
public ServerStatus currentStatus = ServerStatus.offline;
public bool hasBeenChecked = false;
//Define constructor via expression body definition
public ServerSlotData(string serverURL) => domain = serverURL;
/// <summary>
/// Ping the server to see if it is online.
/// Start as a <c>Coroutine</c>, because this involves a <c>WebRequest</c>
/// </summary>
public System.Collections.IEnumerator UpdateServerStatus()
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
currentStatus = ServerStatus.checking;
if (string.IsNullOrEmpty(domain))
{
currentStatus = CommunicationEvents.ServerStatus.NoNetworkAddress;
yield break;
}
UnityWebRequest request = UnityWebRequest.Get("http://" + domain + "/fact/list");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
currentStatus = ServerStatus.online;
}
else
{
UnityEngine.Debug.Log("Couldn't connect to Server " + domain + ": " + request.error + "\n");
currentStatus = ServerStatus.offline;
//try again
//request.Dispose();
//request = pingMMTServer(NetwAddress);
//yield return request.SendWebRequest();
//request.Dispose();
}
request.Dispose();
hasBeenChecked = true;
// To keep ServerRunningA updated, delete if you saved the world from that abomination
ServerSlot myKey = ServerSlots.FirstOrDefault(x => x.Value == this).Key;
ServerRunningA[(int)myKey] = (int)currentStatus;
/// <summary>
/// Gather the <see cref="ServerSlotData"/> of all <see cref="ServerSlot"/> in one place, so one can iterate over all of them
/// </summary>
public static Dictionary<ServerSlot, ServerSlotData> ServerSlots = new()
{ServerSlot.last, new ServerSlotData("")},
{ServerSlot.newIP, new ServerSlotData("") },
{ServerSlot.slot1, new ServerSlotData("- if you can read this") },
{ServerSlot.slot2, new ServerSlotData("- NetworkConfig") },
{ServerSlot.slot3, new ServerSlotData("- GO TO -> 'Options'") },
{ServerSlot.slot4, new ServerSlotData("- -> 'Reset Options'") },
{ServerSlot.slot5, new ServerSlotData("- -> PRESS: 'Reset Configurations'") },
{ServerSlot.selecIP, new ServerSlotData("") }
};
//Enum.GetNames(typeof(KnownServers)).Length; //Number of known Server slots, to be able to add more later
/*
* will be loaded from other config file
* ,and I am not going to refactor all of this as well, so just an indirection
*
* Also those are domain names (+ port) not IPs
public static string LastIP { get => ServerSlots[ServerSlot.last].domain; set => ServerSlots[ServerSlot.last].domain = value; }
public static string NewIP { get => ServerSlots[ServerSlot.newIP].domain; set => ServerSlots[ServerSlot.newIP].domain = value; }
public static string IPslot1 { get => ServerSlots[ServerSlot.slot1].domain; set => ServerSlots[ServerSlot.slot1].domain = value; }
public static string IPslot2 { get => ServerSlots[ServerSlot.slot2].domain; set => ServerSlots[ServerSlot.slot2].domain = value; }
public static string IPslot3 { get => ServerSlots[ServerSlot.slot3].domain; set => ServerSlots[ServerSlot.slot3].domain = value; }
public static string IPslot4 { get => ServerSlots[ServerSlot.slot4].domain; set => ServerSlots[ServerSlot.slot4].domain = value; }
public static string IPslot5 { get => ServerSlots[ServerSlot.slot5].domain; set => ServerSlots[ServerSlot.slot5].domain = value; }
public static string SelecIP { get => ServerSlots[ServerSlot.selecIP].domain; set => ServerSlots[ServerSlot.selecIP].domain = value; }
/// <summary>
/// IF YOU NEED THIS DATA, USE THE <see cref="ServerSlotData.currentStatus"/> OF THE <see cref="ServerSlots"/> MEMBERS.<br/>
/// Holds the status of the stored Servers.<br/>
/// This is acts like a function <see cref="ServerSlot"/> -> <see cref="ServerStatus"/> with a dont-care value at index 0.<br/>
/// There are so many references to this abomination that I will leave it here and just update it, to be consistent with
/// <see cref="ServerSlots"/>.
/// </summary>
public static int[] ServerRunningA = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//other, lastIP, newIP, IP1, IP2, IP3, selecIP, IP4, IP5,...}
//0: offline, 1: Checking, 2: online, 3: NoNetworkAddress;
public static bool autoOSrecognition = true;
public static OperationSystem Opsys = OperationSystem.Windows; //Scripts
public enum OperationSystem
{
iOS =2,
WindowsStoreApps = 3,
public static bool CursorVisDefault = true; //Script.
public static bool CursorVisLastUsedIngame = true; //Script.
Stefan Richter
committed
public static bool GadgetCanBeUsed = false;
Marco Zimmer
committed
// Configs
public static bool VerboseURI = false;
Marco Zimmer
committed
public enum Directories
{
Marco Zimmer
committed
Stages,
Marco Zimmer
committed
SaveGames,
Marco Zimmer
committed
ValidationSets,
Marco Zimmer
committed
FactStateMachines,
}
public static string CreateHierarchiePath(List<Directories> hierarchie, string prefix = "", string postfix = "")
{
foreach (var dir in hierarchie)
prefix = Path.Combine(prefix, dir.ToString());
Marco Zimmer
committed
Marco Zimmer
committed
}
public static string Get_DataPath()
{
Stefan Richter
committed
bool use_replacementfolder = false;
Stefan Richter
committed
return use_replacementfolder ? Path.Combine(Application.persistentDataPath, "DataPath_writeable") : Path.Combine(Application.dataPath, "StreamingAssets", "StreamToDataPath_withHandler");
OperationSystem.Android => Path.Combine(Application.persistentDataPath, "DataPath_writeable"),
OperationSystem.Windows or _ => Application.dataPath,
};
}
// TODO! avoid tree traversel with name
public static string CreatePathToFile(out bool file_exists, string name, string format = null, List<Directories> hierarchie = null, bool use_install_folder = false)
Marco Zimmer
committed
string ending = "";
if (!string.IsNullOrEmpty(format))
switch (format)
{
case "JSON":
ending = ".JSON";
break;
default:
break;
}
string path = use_install_folder
? Get_DataPath()
: Application.persistentDataPath;
if (hierarchie != null)
{
path = CreateHierarchiePath(hierarchie, path);
path = Path.Combine(path, name + ending);
file_exists = File.Exists(path);