Files
RAGECOOP-V/Client/Scripts/Main.cs

420 lines
13 KiB
C#
Raw Normal View History

2022-10-23 19:02:39 +08:00
using System;
2022-10-08 12:43:24 +08:00
using System.Collections.Concurrent;
2022-07-20 17:50:01 +08:00
using System.Collections.Generic;
using System.Diagnostics;
2022-08-02 17:43:18 +08:00
using System.Drawing;
2022-09-06 21:46:35 +08:00
using System.IO;
2023-02-12 22:06:57 +08:00
using System.Reflection;
2023-03-06 21:54:41 +08:00
using System.Runtime.CompilerServices;
using System.Threading;
2022-10-23 19:02:39 +08:00
using GTA;
using GTA.Math;
using GTA.Native;
using GTA.UI;
using LemonUI.Elements;
using LemonUI.Menus;
using Lidgren.Network;
using RageCoop.Client.Menus;
using RageCoop.Client.Scripting;
using RageCoop.Core;
using Control = GTA.Control;
2022-05-22 15:55:26 +08:00
namespace RageCoop.Client
2021-07-07 13:36:25 +02:00
{
[ScriptAttributes(Author = "RageCoop", SupportURL = "https://github.com/RAGECOOP/RAGECOOP-V", NoScriptThread = true)]
internal class Main : Script
2021-07-07 13:36:25 +02:00
{
2023-02-13 20:44:50 +08:00
internal static Version ModVersion = typeof(Main).Assembly.GetName().Version;
2021-07-07 13:36:25 +02:00
2022-07-20 17:50:01 +08:00
internal static int LocalPlayerID = 0;
internal static RelationshipGroup SyncedPedsGroup;
2021-07-07 13:36:25 +02:00
2023-02-13 20:44:50 +08:00
internal static ClientSettings Settings = null;
internal static Chat MainChat = null;
2023-02-13 20:44:50 +08:00
internal static Stopwatch Counter = new();
2023-02-13 17:51:18 +08:00
internal static Logger Log = null;
internal static ulong Ticked = 0;
internal static Vector3 PlayerPosition;
2023-03-07 20:17:53 +08:00
internal static Resources MainRes = null;
2022-10-23 19:02:39 +08:00
public static Ped P;
2023-03-19 16:58:07 +08:00
public static Vehicle V;
public static Vehicle LastV;
2022-10-23 19:02:39 +08:00
public static float FPS;
private static bool _lastDead;
public static bool CefRunning;
public static bool IsUnloading { get; private set; }
2023-03-08 11:09:47 +08:00
public static Script Instance { get; private set; }
2022-10-23 19:02:39 +08:00
2021-12-03 20:30:00 +01:00
/// <summary>
2022-10-23 19:02:39 +08:00
/// Don't use it!
2021-12-03 20:30:00 +01:00
/// </summary>
2021-07-07 13:36:25 +02:00
public Main()
2022-08-27 14:23:28 +08:00
{
2023-03-08 11:09:47 +08:00
Instance = this;
2022-11-16 17:37:31 +08:00
Directory.CreateDirectory(DataPath);
2022-07-14 17:59:41 +08:00
try
{
Settings = Util.ReadSettings();
}
catch
{
2022-11-16 17:37:31 +08:00
Notification.Show("Malformed configuration, overwriting with default values...");
2023-02-13 20:44:50 +08:00
Settings = new();
2022-07-14 17:59:41 +08:00
Util.SaveSettings();
}
2022-10-23 19:02:39 +08:00
2023-02-13 17:51:18 +08:00
Log = new Logger()
2022-05-31 19:35:01 -08:00
{
2023-03-06 21:54:41 +08:00
FlushImmediately = true,
Writers = null,
2022-05-31 19:35:01 -08:00
#if DEBUG
LogLevel = 0,
#else
2022-10-10 16:45:58 +08:00
LogLevel = Settings.LogLevel,
2022-05-31 19:35:01 -08:00
#endif
};
2023-02-13 17:51:18 +08:00
Log.OnFlush += (line, formatted) =>
{
2023-03-08 11:09:47 +08:00
SHVDN.Logger.Write($"[RageCoop] {line.Message}", (uint)line.LogLevel);
};
2023-03-06 21:54:41 +08:00
// Run static constructor to register all function pointers and remoting entries
RuntimeHelpers.RunClassConstructor(typeof(API).TypeHandle);
2021-07-07 13:36:25 +02:00
}
protected override void OnAborted(AbortedEventArgs e)
2022-10-08 12:43:24 +08:00
{
base.OnAborted(e);
2022-10-08 12:43:24 +08:00
try
{
IsUnloading = e.IsUnloading;
CleanUp("Abort");
2022-10-10 16:45:58 +08:00
WorldThread.DoQueuedActions();
if (IsUnloading)
{
2023-02-03 13:30:37 +08:00
ThreadManager.OnUnload();
2023-02-13 20:44:50 +08:00
Log.Dispose();
}
2022-10-08 12:43:24 +08:00
}
2022-10-08 23:49:48 +08:00
catch (Exception ex)
2022-10-08 12:43:24 +08:00
{
2023-02-13 17:51:18 +08:00
Log.Error(ex);
2022-10-08 12:43:24 +08:00
}
}
protected override void OnStart()
2022-10-08 12:43:24 +08:00
{
base.OnStart();
if (Game.Version < GameVersion.v1_0_1290_1_Steam)
2022-10-23 19:02:39 +08:00
{
throw new NotSupportedException("Please update your GTA5 to v1.0.1290 or newer!");
2022-10-23 19:02:39 +08:00
}
2022-10-08 12:43:24 +08:00
2023-03-06 21:54:41 +08:00
MainRes = new();
2023-02-12 22:06:57 +08:00
2023-02-13 17:51:18 +08:00
Log.Info(
$"Main script initialized");
BaseScript.OnStart();
SyncedPedsGroup = World.AddRelationshipGroup("SYNCPED");
Game.Player.Character.RelationshipGroup.SetRelationshipBetweenGroups(SyncedPedsGroup, Relationship.Neutral,
true);
MainChat = new Chat();
Util.NativeMemory();
Counter.Restart();
2023-02-12 22:06:57 +08:00
}
protected override void OnTick()
2021-07-07 13:36:25 +02:00
{
base.OnTick();
2023-03-19 16:58:07 +08:00
var lastVehicleHandle = Call<int>(GET_PLAYERS_LAST_VEHICLE);
var playerHandle = Call<int>(PLAYER_PED_ID);
if (LastV?.Handle != lastVehicleHandle)
LastV = Entity.FromHandle(lastVehicleHandle) as Vehicle;
if (P?.Handle != playerHandle)
P = (Ped)Entity.FromHandle(playerHandle);
var playerVehHandle = Call<int>(GET_VEHICLE_PED_IS_IN, P.Handle, false);
if (V?.Handle != playerVehHandle)
V = Entity.FromHandle(playerVehHandle) as Vehicle;
2022-09-06 21:46:35 +08:00
PlayerPosition = P.ReadPosition();
FPS = Game.FPS;
2023-03-19 16:58:07 +08:00
#if CEF
if (CefRunning)
{
CefManager.Tick();
}
#endif
if (!Networking.IsOnServer)
2021-07-07 13:36:25 +02:00
{
return;
}
try
{
EntityPool.DoSync();
}
catch (Exception ex)
{
2023-02-13 17:51:18 +08:00
Log.Error(ex);
}
if (Game.TimeScale != 1.0f)
2022-04-11 15:10:27 +02:00
{
2022-09-06 21:46:35 +08:00
Game.TimeScale = 1;
2022-04-11 15:10:27 +02:00
}
2022-07-20 17:50:01 +08:00
if (Networking.ShowNetworkInfo)
2021-08-18 11:47:59 +02:00
{
new ScaledText(new PointF(200, 0),
$"L: {Networking.Latency * 1000:N0}ms", 0.5f)
{ Alignment = Alignment.Center }.Draw();
new ScaledText(new PointF(200, 30),
2022-10-23 19:02:39 +08:00
$"R: {NetUtility.ToHumanReadable(Statistics.BytesDownPerSecond)}/s", 0.5f)
{ Alignment = Alignment.Center }.Draw();
new ScaledText(new PointF(200, 60),
2022-10-23 19:02:39 +08:00
$"S: {NetUtility.ToHumanReadable(Statistics.BytesUpPerSecond)}/s", 0.5f)
{ Alignment = Alignment.Center }.Draw();
2021-08-18 11:47:59 +02:00
}
2022-05-22 15:55:26 +08:00
2021-07-07 13:36:25 +02:00
MainChat.Tick();
PlayerList.Tick();
2022-10-08 12:43:24 +08:00
if (!API.Config.EnableAutoRespawn)
{
Call(PAUSE_DEATH_ARREST_RESTART, true);
Call(IGNORE_NEXT_RESTART, true);
Call(FORCE_GAME_STATE_PLAYING);
Call(TERMINATE_ALL_SCRIPTS_WITH_THIS_NAME, "respawn_controller");
if (P.IsDead)
{
Call(SET_FADE_OUT_AFTER_DEATH, false);
2022-07-20 17:50:01 +08:00
2022-09-06 21:46:35 +08:00
if (P.Health != 1)
{
2022-09-06 21:46:35 +08:00
P.Health = 1;
Game.Player.WantedLevel = 0;
2023-02-13 17:51:18 +08:00
Log.Debug("Player died.");
2022-10-08 12:43:24 +08:00
API.Events.InvokePlayerDied();
}
2022-10-23 19:02:39 +08:00
Screen.StopEffects();
}
else
{
Call(DISPLAY_HUD, true);
}
}
else if (P.IsDead && !_lastDead)
{
2022-10-08 23:49:48 +08:00
API.Events.InvokePlayerDied();
}
2022-09-06 21:46:35 +08:00
_lastDead = P.IsDead;
2022-05-22 15:55:26 +08:00
Ticked++;
2021-07-07 13:36:25 +02:00
}
2022-10-23 19:02:39 +08:00
protected override void OnKeyUp(GTA.KeyEventArgs e)
{
base.OnKeyUp(e);
#if CEF
if (CefRunning)
{
CefManager.KeyUp(e.KeyCode);
}
#endif
}
protected unsafe override void OnKeyDown(KeyEventArgs e)
2021-07-07 13:36:25 +02:00
{
base.OnKeyDown(e);
2022-08-13 02:19:40 +02:00
if (MainChat.Focused)
{
MainChat.OnKeyDown(e.KeyCode);
return;
}
#if CEF
if (CefRunning)
{
CefManager.KeyDown(e.KeyCode);
}
#endif
2022-08-13 02:19:40 +02:00
if (Networking.IsOnServer)
2022-08-13 00:52:34 +02:00
{
2022-08-15 16:13:53 +08:00
if (Voice.WasInitialized())
2022-08-13 00:52:34 +02:00
{
2022-10-23 19:02:39 +08:00
if (Game.IsControlPressed(Control.PushToTalk))
2022-08-13 03:39:11 +02:00
{
2022-08-15 16:13:53 +08:00
Voice.StartRecording();
2022-08-13 03:39:11 +02:00
return;
}
if (Voice.IsRecording())
2022-08-13 03:39:11 +02:00
{
2022-08-15 16:13:53 +08:00
Voice.StopRecording();
2022-08-13 03:39:11 +02:00
return;
}
2022-08-13 00:52:34 +02:00
}
2022-09-06 21:46:35 +08:00
2022-10-23 19:02:39 +08:00
if (Game.IsControlPressed(Control.FrontendPause))
{
Call(ACTIVATE_FRONTEND_MENU,
2023-02-12 22:06:57 +08:00
SHVDN.NativeMemory.GetHashKey("FE_MENU_VERSION_SP_PAUSE"), false, 0);
return;
}
2022-10-23 19:02:39 +08:00
if (Game.IsControlPressed(Control.FrontendPauseAlternate) && Settings.DisableAlternatePause)
{
Call(ACTIVATE_FRONTEND_MENU,
2023-02-12 22:06:57 +08:00
SHVDN.NativeMemory.GetHashKey("FE_MENU_VERSION_SP_PAUSE"), false, 0);
return;
}
}
2022-10-23 19:02:39 +08:00
if (e.KeyCode == Settings.MenuKey)
2022-05-22 15:55:26 +08:00
{
if (CoopMenu.MenuPool.AreAnyVisible)
{
2022-10-23 19:02:39 +08:00
CoopMenu.MenuPool.ForEach<NativeMenu>(x =>
{
if (x.Visible)
{
2022-09-06 21:46:35 +08:00
CoopMenu.LastMenu = x;
x.Visible = false;
}
});
}
else
{
CoopMenu.LastMenu.Visible = true;
}
2022-05-22 15:55:26 +08:00
}
2022-10-23 19:02:39 +08:00
else if (Game.IsControlJustPressed(Control.MpTextChatAll))
{
if (Networking.IsOnServer)
{
MainChat.Focused = true;
}
}
2022-10-23 19:02:39 +08:00
else if (MainChat.Focused)
{
return;
}
else if (Game.IsControlJustPressed(Control.MultiplayerInfo))
2022-05-22 15:55:26 +08:00
{
if (Networking.IsOnServer)
{
ulong currentTimestamp = Util.GetTickCount64();
2022-10-23 19:02:39 +08:00
PlayerList.Pressed = (currentTimestamp - PlayerList.Pressed) < 5000
? (currentTimestamp - 6000)
: currentTimestamp;
}
2022-05-22 15:55:26 +08:00
}
2022-09-06 21:46:35 +08:00
else if (e.KeyCode == Settings.PassengerKey)
2022-05-22 15:55:26 +08:00
{
if (P == null || P.IsInVehicle())
{
return;
}
2022-07-20 17:50:01 +08:00
if (P.IsTaskActive(TaskType.CTaskEnterVehicle))
2022-05-22 15:55:26 +08:00
{
P.Task.ClearAll();
}
else
{
var V = World.GetClosestVehicle(P.ReadPosition(), 15);
if (V != null)
{
var seat = P.GetNearestSeat(V);
var p = V.GetPedOnSeat(seat);
if (p != null && !p.IsDead)
{
for (int i = -1; i < V.PassengerCapacity; i++)
2022-08-21 14:12:44 +08:00
{
seat = (VehicleSeat)i;
p = V.GetPedOnSeat(seat);
if (p == null || p.IsDead)
2022-08-21 14:12:44 +08:00
{
break;
2022-08-21 14:12:44 +08:00
}
}
}
P.Task.EnterVehicle(V, seat, -1, 5, EnterVehicleFlags.None);
2022-05-22 15:55:26 +08:00
}
}
}
2021-07-07 13:36:25 +02:00
}
2022-10-23 19:02:39 +08:00
2022-09-06 21:46:35 +08:00
internal static void Connected()
{
Memory.ApplyPatches();
if (Settings.Voice && !Voice.WasInitialized())
{
Voice.Init();
}
2022-10-23 19:02:39 +08:00
2022-10-09 11:15:09 +08:00
API.QueueAction(() =>
2022-09-06 21:46:35 +08:00
{
WorldThread.Traffic(!Settings.DisableTraffic);
Call(SET_ENABLE_VEHICLE_SLIPSTREAMING, true);
2022-09-06 21:46:35 +08:00
CoopMenu.ConnectedMenuSetting();
MainChat.Init();
2022-10-23 19:02:39 +08:00
Notification.Show("~g~Connected!");
2022-09-06 21:46:35 +08:00
});
2023-02-13 17:51:18 +08:00
Log.Info(">> Connected <<");
2022-09-06 21:46:35 +08:00
}
2022-10-23 19:02:39 +08:00
2023-02-13 20:44:50 +08:00
private static readonly object _cleanupLock = new();
public static void CleanUp(string reason)
{
2023-02-13 20:44:50 +08:00
lock (_cleanupLock)
{
2023-02-13 20:44:50 +08:00
if (reason != "Abort")
{
2023-03-06 21:54:41 +08:00
Log.Info($">> Disconnected << reason: {reason}");
2023-02-13 20:44:50 +08:00
Notification.Show("~r~Disconnected: " + reason);
}
2023-03-07 20:17:53 +08:00
if (MainChat.Focused)
2022-09-06 21:46:35 +08:00
{
MainChat.Focused = false;
}
2022-10-23 19:02:39 +08:00
PlayerList.Cleanup();
2023-03-07 20:17:53 +08:00
MainChat.Clear();
2022-09-06 21:46:35 +08:00
EntityPool.Cleanup();
WorldThread.Traffic(true);
Call(SET_ENABLE_VEHICLE_SLIPSTREAMING, false);
2022-09-06 21:46:35 +08:00
CoopMenu.DisconnectedMenuSetting();
LocalPlayerID = default;
2023-03-07 20:17:53 +08:00
MainRes.Unload();
2023-02-13 20:44:50 +08:00
Memory.RestorePatches();
#if CEF
2022-11-16 17:37:31 +08:00
if (CefRunning)
{
CefManager.CleanUp();
}
#endif
2022-11-16 17:40:07 +08:00
2023-02-13 20:44:50 +08:00
DownloadManager.Cleanup();
Voice.ClearAll();
Networking.Peer?.Dispose();
Networking.Peer = null;
}
}
2022-05-22 15:55:26 +08:00
2021-07-07 13:36:25 +02:00
}
2022-10-23 19:02:39 +08:00
}