ServerScript added (not finished yet)

This commit is contained in:
EntenKoeniq
2021-08-14 21:49:23 +02:00
parent ffe808d1ba
commit fc9a581ff6
7 changed files with 121 additions and 42 deletions

View File

@ -10,7 +10,7 @@ using GTA.Math;
namespace CoopClient
{
#region CLIENT-ONLY
public static class VectorExtensions
static class VectorExtensions
{
public static Vector3 ToVector(this Quaternion vec)
{
@ -57,7 +57,7 @@ namespace CoopClient
#endregion
[ProtoContract]
public struct LVector3
struct LVector3
{
#region CLIENT-ONLY
public Vector3 ToVector()
@ -84,7 +84,7 @@ namespace CoopClient
}
[ProtoContract]
public struct LQuaternion
struct LQuaternion
{
#region CLIENT-ONLY
public Quaternion ToQuaternion()
@ -114,7 +114,7 @@ namespace CoopClient
public float W { get; set; }
}
public enum PacketTypes
enum PacketTypes
{
HandshakePacket,
PlayerConnectPacket,
@ -129,7 +129,7 @@ namespace CoopClient
}
[Flags]
public enum PedDataFlags
enum PedDataFlags
{
LastSyncWasFull = 1 << 0,
IsAiming = 1 << 1,
@ -143,7 +143,7 @@ namespace CoopClient
#region ===== VEHICLE DATA =====
[Flags]
public enum VehicleDataFlags
enum VehicleDataFlags
{
LastSyncWasFull = 1 << 0,
IsInVehicle = 1 << 1,
@ -196,7 +196,7 @@ namespace CoopClient
#region -- PLAYER --
[ProtoContract]
public class HandshakePacket : Packet
class HandshakePacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }
@ -238,7 +238,7 @@ namespace CoopClient
}
[ProtoContract]
public class PlayerConnectPacket : Packet
class PlayerConnectPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -272,7 +272,7 @@ namespace CoopClient
}
[ProtoContract]
public class PlayerDisconnectPacket : Packet
class PlayerDisconnectPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -298,7 +298,7 @@ namespace CoopClient
}
[ProtoContract]
public class FullSyncPlayerPacket : Packet
class FullSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -364,7 +364,7 @@ namespace CoopClient
}
[ProtoContract]
public class FullSyncPlayerVehPacket : Packet
class FullSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -446,7 +446,7 @@ namespace CoopClient
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -504,7 +504,7 @@ namespace CoopClient
}
[ProtoContract]
public class LightSyncPlayerVehPacket : Packet
class LightSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -570,7 +570,7 @@ namespace CoopClient
}
[ProtoContract]
public class ChatMessagePacket : Packet
class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
@ -602,7 +602,7 @@ namespace CoopClient
#region -- NPC --
[ProtoContract]
public class FullSyncNpcPacket : Packet
class FullSyncNpcPacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }
@ -668,7 +668,7 @@ namespace CoopClient
}
[ProtoContract]
public class FullSyncNpcVehPacket : Packet
class FullSyncNpcVehPacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }

View File

@ -1,6 +1,6 @@
namespace CoopServer.Entities
{
struct EntitiesPed
public struct EntitiesPed
{
public LVector3 Position { get; set; }

View File

@ -1,6 +1,6 @@
namespace CoopServer.Entities
{
class EntitiesPlayer
public class EntitiesPlayer
{
public string SocialClubName { get; set; }
public string Username { get; set; }

View File

@ -56,7 +56,7 @@ namespace CoopServer
public float W { get; set; }
}
public enum PacketTypes
enum PacketTypes
{
HandshakePacket,
PlayerConnectPacket,
@ -71,7 +71,7 @@ namespace CoopServer
}
[Flags]
public enum PedDataFlags
enum PedDataFlags
{
LastSyncWasFull = 1 << 0,
IsAiming = 1 << 1,
@ -85,7 +85,7 @@ namespace CoopServer
#region ===== VEHICLE DATA =====
[Flags]
public enum VehicleDataFlags
enum VehicleDataFlags
{
LastSyncWasFull = 1 << 0,
IsInVehicle = 1 << 1,
@ -98,7 +98,7 @@ namespace CoopServer
}
[ProtoContract]
public struct VehicleDoors
struct VehicleDoors
{
[ProtoMember(1)]
public float AngleRatio { get; set; }
@ -114,13 +114,13 @@ namespace CoopServer
}
#endregion
public interface IPacket
interface IPacket
{
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
void NetIncomingMessageToPacket(NetIncomingMessage message);
}
public abstract class Packet : IPacket
abstract class Packet : IPacket
{
public abstract void PacketToNetOutGoingMessage(NetOutgoingMessage message);
public abstract void NetIncomingMessageToPacket(NetIncomingMessage message);
@ -128,7 +128,7 @@ namespace CoopServer
#region -- PLAYER --
[ProtoContract]
public class HandshakePacket : Packet
class HandshakePacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }
@ -170,7 +170,7 @@ namespace CoopServer
}
[ProtoContract]
public class PlayerConnectPacket : Packet
class PlayerConnectPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -204,7 +204,7 @@ namespace CoopServer
}
[ProtoContract]
public class PlayerDisconnectPacket : Packet
class PlayerDisconnectPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -230,7 +230,7 @@ namespace CoopServer
}
[ProtoContract]
public class FullSyncPlayerPacket : Packet
class FullSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -296,7 +296,7 @@ namespace CoopServer
}
[ProtoContract]
public class FullSyncPlayerVehPacket : Packet
class FullSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -378,7 +378,7 @@ namespace CoopServer
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -436,7 +436,7 @@ namespace CoopServer
}
[ProtoContract]
public class LightSyncPlayerVehPacket : Packet
class LightSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
@ -502,7 +502,7 @@ namespace CoopServer
}
[ProtoContract]
public class ChatMessagePacket : Packet
class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
@ -534,7 +534,7 @@ namespace CoopServer
#region -- NPC --
[ProtoContract]
public class FullSyncNpcPacket : Packet
class FullSyncNpcPacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }
@ -600,7 +600,7 @@ namespace CoopServer
}
[ProtoContract]
public class FullSyncNpcVehPacket : Packet
class FullSyncNpcVehPacket : Packet
{
[ProtoMember(1)]
public string ID { get; set; }

View File

@ -4,6 +4,8 @@ using System.Collections.Generic;
using System.Threading;
using System.Text;
using System.Net.Http;
using System.Reflection;
using System.IO;
using Newtonsoft.Json;
using Lidgren.Network;
@ -29,6 +31,8 @@ namespace CoopServer
private static readonly Dictionary<string, EntitiesPlayer> Players = new();
private static ServerScript GameMode;
public Server()
{
// 6d4ec318f1c43bd62fe13d5a7ab28650 = GTACOOP:R
@ -122,6 +126,37 @@ namespace CoopServer
#endregion
}
try
{
Logging.Info("Loading gamemode...");
Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "gamemodes" + Path.DirectorySeparatorChar + "FirstMod.dll");
Type[] types = asm.GetExportedTypes();
IEnumerable<Type> validTypes = types.Where(t => !t.IsInterface && !t.IsAbstract).Where(t => typeof(ServerScript).IsAssignableFrom(t));
Type[] enumerable = validTypes as Type[] ?? validTypes.ToArray();
if (!enumerable.Any())
{
Logging.Error("ERROR: No classes that inherit from ServerScript have been found in the assembly. Starting freeroam.");
}
else
{
GameMode = Activator.CreateInstance(enumerable.ToArray()[0]) as ServerScript;
if (GameMode == null)
{
Logging.Warning("Could not create gamemode: it is null.");
}
else
{
GameMode.Start();
}
}
}
catch (Exception e)
{
Logging.Error(e.Message);
}
Listen();
}
@ -437,8 +472,6 @@ namespace CoopServer
// Accept the connection and send back a new handshake packet with the connection ID
local.Approve(outgoingMessage);
Logging.Info("New player [" + packet.SocialClubName + " | " + packet.Username + "] connected!");
}
// The connection has been approved, now we need to send all other players to the new player and the new player to all players
@ -449,6 +482,11 @@ namespace CoopServer
SendChatMessage(new ChatMessagePacket() { Username = "Server", Message = MainSettings.WelcomeMessage }, new List<NetConnection>() { local });
}
if (GameMode != null)
{
GameMode.OnPlayerConnect(Players[packet.Player]);
}
List<NetConnection> playerList = FilterAllLocal(local);
if (playerList.Count == 0)
{
@ -486,6 +524,11 @@ namespace CoopServer
// Send all players a message that someone has left the server
private static void SendPlayerDisconnectPacket(PlayerDisconnectPacket packet, string reason = "Disconnected")
{
if (GameMode != null)
{
GameMode.OnPlayerDisconnect(Players[packet.Player], reason);
}
List<NetConnection> playerList = FilterAllLocal(packet.Player);
if (playerList.Count != 0)
{
@ -494,7 +537,6 @@ namespace CoopServer
MainNetServer.SendMessage(outgoingMessage, playerList, NetDeliveryMethod.ReliableOrdered, 0);
}
Logging.Info(Players[packet.Player].Username + " left the server, reason: " + reason);
Players.Remove(packet.Player);
}

37
Server/ServerScript.cs Normal file
View File

@ -0,0 +1,37 @@
using Lidgren.Network;
namespace CoopServer
{
public class ServerScript
{
public virtual void Start()
{
Logging.Info("Gamemode loaded successfully!");
}
public virtual void OnPlayerConnect(Entities.EntitiesPlayer client)
{
Logging.Info("New player [" + client.SocialClubName + " | " + client.Username + "] connected!");
}
public virtual void OnPlayerDisconnect(Entities.EntitiesPlayer client, string reason)
{
Logging.Info(client.Username + " left the server, reason: " + reason);
}
protected static void SendChatMessageToAll(string message, string username = "Server")
{
ChatMessagePacket packet = new()
{
Username = username,
Message = message
};
Logging.Info(username + packet.Message);
NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage();
packet.PacketToNetOutGoingMessage(outgoingMessage);
Server.MainNetServer.SendMessage(outgoingMessage, Server.MainNetServer.Connections, NetDeliveryMethod.ReliableOrdered, 0);
}
}
}

View File

@ -11,27 +11,27 @@ namespace CoopServer
XmlSerializer ser = new(typeof(T));
string path = AppContext.BaseDirectory + file;
T settings;
T data;
if (File.Exists(path))
{
using (FileStream stream = File.OpenRead(path))
{
settings = (T)ser.Deserialize(stream);
data = (T)ser.Deserialize(stream);
}
using (FileStream stream = new(path, File.Exists(path) ? FileMode.Truncate : FileMode.Create, FileAccess.ReadWrite))
{
ser.Serialize(stream, settings);
ser.Serialize(stream, data);
}
}
else
{
using FileStream stream = File.OpenWrite(path);
ser.Serialize(stream, settings = new T());
ser.Serialize(stream, data = new T());
}
return settings;
return data;
}
}
}