This commit is contained in:
Luke
2021-05-07 02:02:09 +02:00
19 changed files with 299 additions and 65 deletions

View File

@@ -237,10 +237,13 @@ export default function charCreator(globalData: IGlobalData) {
saveItem.HighlightedBackColor = new Color(25, 118, 210); saveItem.HighlightedBackColor = new Color(25, 118, 210);
creatorMainMenu.AddItem(saveItem); creatorMainMenu.AddItem(saveItem);
//let cancelItem = new UIMenuItem("Abbrechen", "Setzt alle \u00c4nderungen zur\u00fcck."); if (isSurgery) {
//cancelItem.BackColor = new Color(213, 0, 0); let cancelItem = new UIMenuItem("Abbrechen", "Bricht die Operation ab");
//cancelItem.HighlightedBackColor = new Color(229, 57, 53); cancelItem.BackColor = new Color(213, 0, 0);
//creatorMainMenu.AddItem(cancelItem); cancelItem.HighlightedBackColor = new Color(229, 57, 53);
creatorMainMenu.AddItem(cancelItem);
}
creatorMainMenu.ListChange.on((item, listIndex) => { creatorMainMenu.ListChange.on((item, listIndex) => {
if (item === genderItem) { if (item === genderItem) {
@@ -571,7 +574,7 @@ export default function charCreator(globalData: IGlobalData) {
creatorCamera.pointAtCoord(creatorCoords.cameraLookAt.x, creatorCoords.cameraLookAt.y, creatorCoords.cameraLookAt.z); creatorCamera.pointAtCoord(creatorCoords.cameraLookAt.x, creatorCoords.cameraLookAt.y, creatorCoords.cameraLookAt.z);
creatorCamera.setActive(true); creatorCamera.setActive(true);
} }
resetAppearanceMenu(); resetAppearanceMenu();
resetFeaturesMenu(); resetFeaturesMenu();
resetHairAndColorsMenu(); resetHairAndColorsMenu();
@@ -588,6 +591,7 @@ export default function charCreator(globalData: IGlobalData) {
localPlayer.freezePosition(true); localPlayer.freezePosition(true);
mp.game.cam.renderScriptCams(true, false, 0, true, false); mp.game.cam.renderScriptCams(true, false, 0, true, false);
applyCreatorOutfit(); applyCreatorOutfit();
mp.events.callRemote("creator_GenderChange", 0);
} }
}); });
@@ -611,5 +615,42 @@ export default function charCreator(globalData: IGlobalData) {
globalData.InMenu = false; globalData.InMenu = false;
globalData.InMenu = false; globalData.InMenu = false;
if (isSurgery) isSurgery = false; if (isSurgery) isSurgery = false;
}
mp.events.add("render", () => {
if (mp.cameras.exists(creatorCamera)) disableInput();
});
function disableInput() {
//WASD
mp.game.controls.disableControlAction(0, 30, true);
mp.game.controls.disableControlAction(0, 31, true);
mp.game.controls.disableControlAction(0, 32, true);
mp.game.controls.disableControlAction(0, 33, true);
mp.game.controls.disableControlAction(0, 34, true);
mp.game.controls.disableControlAction(0, 35, true);
mp.game.controls.disableControlAction(0, 266, true);
mp.game.controls.disableControlAction(0, 267, true);
mp.game.controls.disableControlAction(0, 268, true);
mp.game.controls.disableControlAction(0, 269, true);
//SPACE
mp.game.controls.disableControlAction(0, 22, true);
//R
mp.game.controls.disableControlAction(0, 140, true);
mp.game.controls.disableControlAction(0, 263, true);
//LMB
mp.game.controls.disableControlAction(0, 24, true);
mp.game.controls.disableControlAction(0, 257, true);
//LEFT CTRL
mp.game.controls.disableControlAction(0, 36, true);
//Q
mp.game.controls.disableControlAction(0, 44, true);
} }
} }

View File

@@ -56,18 +56,25 @@ const muellbaseVector1 = new mp.Vector3(521.6251, -2194.5068, 5.985945);
const muellbaseVector2 = new mp.Vector3(454.88348, -2158.1938, 5.9788494); const muellbaseVector2 = new mp.Vector3(454.88348, -2158.1938, 5.9788494);
const muellbaseVector3 = new mp.Vector3(529.06635, -2088.4097, 8.303088); const muellbaseVector3 = new mp.Vector3(529.06635, -2088.4097, 8.303088);
const krankenhausVector1 = new mp.Vector3(-508.50705, -351.24368, 34);
//const krankenhausVector2 = new mp.Vector3(-437.00146, -357.10526, 32.735916
const krankenhausVector2 = new mp.Vector3(-442.62323, -356.99185, 33);
const krankenhausVector3 = new mp.Vector3(-448.9346, -297.23972, 33.68);
const krankenhausVector4 = new mp.Vector3(-504.952, -315.21698, 35.04881);
const polygon_busbase = polygons.add([busbaseVector1, busbaseVector2, busbaseVector3, busbaseVector4], 15, false, [255, 155, 0, 255], 0); const polygon_busbase = polygons.add([busbaseVector1, busbaseVector2, busbaseVector3, busbaseVector4], 15, false, [255, 155, 0, 255], 0);
const polygon_stadthalle = polygons.add([stadthalleVector1, stadthalleVector2, stadthalleVector3, stadthalleVector4], 15, false, [255, 155, 0, 255], 0); const polygon_stadthalle = polygons.add([stadthalleVector1, stadthalleVector2, stadthalleVector3, stadthalleVector4], 15, false, [255, 155, 0, 255], 0);
const polygon_fahrschule = polygons.add([fahrschuleVector1, fahrschuleVector2, fahrschuleVector3, fahrschuleVector4, fahrschuleVector5], 15, false, [255, 155, 0, 255], 0); const polygon_fahrschule = polygons.add([fahrschuleVector1, fahrschuleVector2, fahrschuleVector3, fahrschuleVector4, fahrschuleVector5], 15, false, [255, 155, 0, 255], 0);
const polygon_pilotAnfaenger = polygons.add([pilotAnfaengerVector1, pilotAnfaengerVector2, pilotAnfaengerVector3, pilotAnfaengerVector4], 15, false, [255, 155, 0, 255], 0); const polygon_pilotAnfaenger = polygons.add([pilotAnfaengerVector1, pilotAnfaengerVector2, pilotAnfaengerVector3, pilotAnfaengerVector4], 15, false, [255, 155, 0, 255], 0);
const polygon_pilotProfi = polygons.add([pilotProfiVector1, pilotProfiVector2, pilotProfiVector3, pilotProfiVector4], 15, false, [255, 155, 0, 255], 0); const polygon_pilotProfi = polygons.add([pilotProfiVector1, pilotProfiVector2, pilotProfiVector3, pilotProfiVector4], 15, false, [255, 155, 0, 255], 0);
const polygon_muellbase = polygons.add([muellbaseVector1, muellbaseVector2, muellbaseVector3], 15, false, [255, 155, 0, 255], 0); const polygon_muellbase = polygons.add([muellbaseVector1, muellbaseVector2, muellbaseVector3], 15, false, [255, 155, 0, 255], 0);
const polygon_krankenhaus = polygons.add([krankenhausVector1, krankenhausVector2, krankenhausVector3, krankenhausVector4], 50, false, [255, 155, 0, 255], 0);
const polygon_prison = polygons.add([prisonVector1, prisonVector2, prisonVector3, prisonVector4, prisonVector5, prisonVector6, prisonVector7, prisonVector8, const polygon_prison = polygons.add([prisonVector1, prisonVector2, prisonVector3, prisonVector4, prisonVector5, prisonVector6, prisonVector7, prisonVector8,
prisonVector9, prisonVector10, prisonVector11, prisonVector12, prisonVector13, prisonVector14, prisonVector15, prisonVector16, prisonVector9, prisonVector10, prisonVector11, prisonVector12, prisonVector13, prisonVector14, prisonVector15, prisonVector16,
prisonVector17, prisonVector18, prisonVector19, prisonVector20, prisonVector21, prisonVector22, prisonVector23, prisonVector24], 40, false, [255, 155, 0, 255], 0); prisonVector17, prisonVector18, prisonVector19, prisonVector20, prisonVector21, prisonVector22, prisonVector23, prisonVector24], 40, false, [255, 155, 0, 255], 0);
export let listNoDMZones = [polygon_busbase, polygon_stadthalle, polygon_fahrschule, polygon_pilotAnfaenger, polygon_pilotProfi, polygon_muellbase]; export let listNoDMZones = [polygon_busbase, polygon_stadthalle, polygon_fahrschule, polygon_pilotAnfaenger, polygon_pilotProfi, polygon_muellbase, polygon_krankenhaus];
export let isInAnyNoDMPolygon; export let isInAnyNoDMPolygon;
export default function polygonHandler() { export default function polygonHandler() {

View File

@@ -1,12 +1,29 @@
let cam: CameraMp = mp.cameras.new('spectateCam');; let cam: CameraMp;
let specPlayer: PlayerMp;
mp.events.add("SERVER:ADMIN_SPECTATE", (targetPlayer) => { mp.events.add("SERVER:ADMIN_SPECTATE", (targetPlayer) => {
cam.attachTo(targetPlayer.handle, 10.0, 0.0, 10.0, true); //cam.attachTo(targetPlayer.handle, 0, 1.0, 1.0, 1.0, 0, 0, 0, true, false, false, false, 0, false);
cam.setActive(true); specPlayer = targetPlayer;
cam = mp.cameras.new('spectateCam');
cam.attachTo(targetPlayer.handle, 0, -4, 1.5, true);
cam.pointAt(targetPlayer.handle, 0, 0, 0, true);
cam.setActive(true);
mp.game.cam.renderScriptCams(true, false, 0, true, false);
mp.players.local.attachTo(targetPlayer.handle, 0, 0, -4, 1, 0, 0, 0, true, false, false, false, 0, false);
}); });
mp.events.add("SERVER:ADMIN_STOP_SPECTATE", () => { mp.events.add("SERVER:ADMIN_STOP_SPECTATE", () => {
if (cam.isActive() == true) { if (mp.cameras.exists(cam)) {
cam.setActive(false); cam.destroy();
mp.game.cam.renderScriptCams(false, false, 0, true, false);
mp.players.local.detach(true, true);
}
});
mp.events.add("render", () => {
if (mp.cameras.exists(cam)) {
cam.setRot(0, 0, specPlayer.getRotation(0).z, 0);
} }
}); });

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a4100176763845d0d863b7e4782dd8ba3e316a078084704c80eba2e565b1edc6
size 106824192

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e350a25ff37d9d2d13a628558e96cb8fe91c5e5ad210d5f2697d1c981b7976f9
size 110010880

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc9132404cdc1d20830d4684697bf82f3738bc4345cc6d1189cf2b63f0b15de8
size 2962432

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7a66cd9ec235636bd61c7cf90c0602be8bf97c303fe2fa6703b49c42352aeb7c
size 18657792

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a7eb55afdb7bc022b5308388902e886291bff38a688b38e0dfcb48d492232a1a
size 5581312

View File

@@ -1,5 +1,23 @@
export default function waypointUtil() { export default function waypointUtil() {
mp.events.add("SERVER:Util_setWaypoint", (x, y) => {
let x_saved: number;
let y_saved: number;
let z_saved: number;
let waypointSet: boolean;
mp.events.add("SERVER:Util_setWaypoint", (x, y, z) => {
mp.game.ui.setNewWaypoint(x, y); mp.game.ui.setNewWaypoint(x, y);
}); });
mp.events.add("playerCreateWaypoint", (position) => {
x_saved = position.x;
y_saved = position.y;
z_saved = position.z;
waypointSet = true;
mp.events.callRemote("SERVER:waypointToDriver", position.x, position.y);
});
mp.events.add("playerRemoveWaypoint", () => {
waypointSet = false;
});
} }

View File

@@ -7,4 +7,6 @@
$root = $PSScriptRoot $root = $PSScriptRoot
dotnet tool update dotnet-ef --global dotnet tool update dotnet-ef --global
dotnet ef migrations add $MigrationName --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database" dotnet ef migrations add $MigrationName --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database"
pause

View File

@@ -1,4 +1,5 @@
$root = $PSScriptRoot $root = $PSScriptRoot
dotnet tool update dotnet-ef --global dotnet tool update dotnet-ef --global
dotnet ef database update --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database" dotnet ef database update --project "$root\ReallifeGamemode.Database.csproj" --startup-project "$root\..\ReallifeGamemode.Server\ReallifeGamemode.Server.csproj" --configuration "Database"
pause

View File

@@ -259,7 +259,7 @@ namespace ReallifeGamemode.Server.Commands
} }
break; break;
case "all": case "all":
if(!player.HasData("togall")) if (!player.HasData("togall"))
{ {
player.SetData("togip", true); player.SetData("togip", true);
player.SetData("togdeath", true); player.SetData("togdeath", true);
@@ -314,6 +314,12 @@ namespace ReallifeGamemode.Server.Commands
player.TriggerEvent("toggleTSupportMode", false); player.TriggerEvent("toggleTSupportMode", false);
player.SetData("SAdminduty", false); player.SetData("SAdminduty", false);
ChatService.SendMessage(player, "!{#ee4d2e}** " + "Du befindest dich nicht mehr im T-Support"); ChatService.SendMessage(player, "!{#ee4d2e}** " + "Du befindest dich nicht mehr im T-Support");
if (user.GetData<bool>("adminUnshow") == true)
{
user.SetData("adminUnshow", false);
player.TriggerEvent("toggleAdminUnshowMode", false);
}
} }
user.SetBlipAndNametagColor(); user.SetBlipAndNametagColor();
} }
@@ -351,7 +357,7 @@ namespace ReallifeGamemode.Server.Commands
[Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)] [Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)]
public void CmdAdminO(Player player, string message) public void CmdAdminO(Player player, string message)
{ {
if(!player.IsLoggedIn()) if (!player.IsLoggedIn())
{ {
return; return;
} }
@@ -1784,12 +1790,16 @@ namespace ReallifeGamemode.Server.Commands
[Command("spectate", "~m~Benutzung: ~s~/spectate [NAME/ID]", Alias = "spec")] [Command("spectate", "~m~Benutzung: ~s~/spectate [NAME/ID]", Alias = "spec")]
public void CmdAdminSpectate(Player player, string targetname = null) public void CmdAdminSpectate(Player player, string targetname = null)
{ {
if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) User user = player.GetUser();
if (!user.IsAdmin(AdminLevel.ADMIN))
{ {
ChatService.NotAuthorized(player); ChatService.NotAuthorized(player);
return; return;
} }
Player target; Player target;
bool currentStatus = player.GetData<bool>("adminUnshow");
if (targetname != null) if (targetname != null)
{ {
target = PlayerService.GetPlayerByNameOrId(targetname); target = PlayerService.GetPlayerByNameOrId(targetname);
@@ -1798,19 +1808,44 @@ namespace ReallifeGamemode.Server.Commands
ChatService.PlayerNotFound(player); ChatService.PlayerNotFound(player);
return; return;
} }
player.TriggerEvent("SERVER:ADMIN_SPECTATE", target);
if (target.Name == player.Name)
{
ChatService.ErrorMessage(player, "Du kannst dich nicht selbst spectaten");
return;
}
if (!currentStatus)
{
currentStatus = !currentStatus;
player.SetData("adminUnshow", currentStatus);
}
player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
player.SetData<Vector3>("specPosition", player.Position);
player.SafeTeleport(target.Position);
NAPI.Task.Run(() =>
{
player.TriggerEvent("SERVER:ADMIN_SPECTATE", target);
}, 100);
} }
else else
{ {
currentStatus = !currentStatus;
player.SetData("adminUnshow", currentStatus);
player.TriggerEvent("SERVER:ADMIN_STOP_SPECTATE"); player.TriggerEvent("SERVER:ADMIN_STOP_SPECTATE");
} player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
player.SafeTeleport(player.GetData<Vector3>("specPosition"));
}
user.SetBlipAndNametagColor();
} }
[Command("aunshow", "~m~Benutzung:~s~ /aunshow")] [Command("aunshow", "~m~Benutzung:~s~ /aunshow")]
public void CmdAdminUnshow(Player player) public void CmdAdminUnshow(Player player)
{ {
User user = player.GetUser(); User user = player.GetUser();
if (!user.IsAdmin(AdminLevel.ADMIN)) if (!user.IsAdmin(AdminLevel.HEADADMIN))
{ {
ChatService.NotAuthorized(player); ChatService.NotAuthorized(player);
return; return;
@@ -1822,9 +1857,9 @@ namespace ReallifeGamemode.Server.Commands
return; return;
} }
bool currentStatus = user.GetData<bool>("adminUnshow"); bool currentStatus = player.GetData<bool>("adminUnshow");
currentStatus = !currentStatus; currentStatus = !currentStatus;
user.SetData("adminUnshow", currentStatus); player.SetData("adminUnshow", currentStatus);
player.TriggerEvent("toggleAdminUnshowMode", currentStatus); player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
user.SetBlipAndNametagColor(); user.SetBlipAndNametagColor();
@@ -2169,18 +2204,15 @@ namespace ReallifeGamemode.Server.Commands
return; return;
} }
Weather weatherBefore = NAPI.World.GetWeather(); Weather weatherBefore = World.WeatherSync.Weather;
NAPI.World.SetWeather(weather); World.WeatherSync.SetWeather(weather);
Weather weatherAfter = NAPI.World.GetWeather(); Weather weatherAfter = World.WeatherSync.Weather;
ChatService.SendMessage(player, "~w~Wetter geändert: " + weatherAfter);
if (!weatherBefore.Equals(weatherAfter)) if (!weatherBefore.Equals(weatherAfter))
{ {
ChatService.SendMessage(player, "~w~Wetter geändert: " + NAPI.World.GetWeather()); NAPI.Notification.SendNotificationToAll("Das Wetter wurde von ~g~" + player.Name + " ~s~auf ~g~" + weatherAfter + "~s~ geändert.", true);
NAPI.Notification.SendNotificationToAll("Das Wetter wurde von ~g~" + player.Name + " ~s~auf ~g~" + NAPI.World.GetWeather() + "~s~ geändert.", true);
}
else
{
ChatService.SendMessage(player, "~w~Das Wetter konnte nicht geändert werden");
} }
} }
@@ -3914,7 +3946,7 @@ namespace ReallifeGamemode.Server.Commands
[RemoteEvent("Noclip")] [RemoteEvent("Noclip")]
public void Noclip(Player player) public void Noclip(Player player)
{ {
if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) if (!player.GetUser().IsAdmin(AdminLevel.HEADADMIN))
{ {
return; return;
} }

View File

@@ -7,7 +7,7 @@ namespace ReallifeGamemode.Server.Events
public class UpdateCharacterElevator : Script public class UpdateCharacterElevator : Script
{ {
[RemoteEvent("sendPlayerToStage")] [RemoteEvent("sendPlayerToStage")]
public void SaveWeaponSelection(Player client, string stage) public void SendPlayerToStageRemoteEvent(Player client, string stage)
{ {
ElevatorPoint elevator = PositionManager.ElevatorPoints.Find(e => e.Stage == stage); ElevatorPoint elevator = PositionManager.ElevatorPoints.Find(e => e.Stage == stage);
if (elevator != null) if (elevator != null)

View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Text;
using GTANetworkAPI;
using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Server.Services;
using ReallifeGamemode.Services;
namespace ReallifeGamemode.Server.Events
{
class Waypoint : Script
{
[RemoteEvent("SERVER:waypointToDriver")]
public void setWaypointToDriver(Player player, float x, float y)
{
if (!player.IsInVehicle)
{
return;
}
if (player.VehicleSeat == 0)
{
return;
}
Entity entity = NAPI.Vehicle.GetVehicleDriver(player.Vehicle);
Player driver = PlayerService.GetPlayerByNameOrId(entity.Value.ToString());
if (driver == null || entity == null)
{
return;
}
driver.TriggerEvent("SERVER:Util_setWaypoint", x, y);
driver.SendNotification(player.Name + " hat dir eine Markierung auf der Karte gesetzt");
player.SendNotification("Du hast " + driver.Name + " eine Markierung auf der Karte gesetzt");
}
}
}

View File

@@ -356,7 +356,7 @@ namespace ReallifeGamemode.Server.Extensions
} }
bool duty = user.GetData<bool>("duty"); bool duty = user.GetData<bool>("duty");
bool adminUnshow = user.GetData<bool>("adminUnshow"); bool adminUnshow = player.GetData<bool>("adminUnshow");
if (adminUnshow) if (adminUnshow)
{ {

View File

@@ -148,6 +148,8 @@ namespace ReallifeGamemode.Server
LoadManager.LoadLoadManager(); LoadManager.LoadLoadManager();
Rentcar.Setup(); Rentcar.Setup();
World.WeatherSync.Load();
TempBlip tempBlip = new TempBlip() TempBlip tempBlip = new TempBlip()
{ {
Color = 1, Color = 1,

View File

@@ -691,14 +691,6 @@ namespace ReallifeGamemode.Server.Managers
"thrax", "thrax",
"zorrusso", "zorrusso",
"zion3", "zion3",
"lsfd", //Mod
"lsfd2", //Mod
"lsfd3", //Mod
"lsfd4", //Mod
"lsfd5", //Mod
"lsfdtruck", //Mod
"lsfdtruck2", //Mod
"lsfdtruck3", //Mod
"polbullet", //Mod "polbullet", //Mod
"polbullet2", //Mod "polbullet2", //Mod
"sherbullet", //Mod "sherbullet", //Mod
@@ -773,11 +765,6 @@ namespace ReallifeGamemode.Server.Managers
"fibj",//mod "fibj",//mod
"fibn3",//mod "fibn3",//mod
"fibr",//mod "fibr",//mod
"vicechee", //mod
"sheriffcoqm", //mod
"polcoquette", //mod
"pdrafter", //mod
"pdrafter2", //mod
}; };
private static readonly Dictionary<int, ushort> _serverVehicles = new Dictionary<int, ushort>(); private static readonly Dictionary<int, ushort> _serverVehicles = new Dictionary<int, ushort>();

View File

@@ -209,8 +209,8 @@ namespace ReallifeGamemode.Server.Wanted
public static void BreakOut(Player player) public static void BreakOut(Player player)
{ {
User user = player.GetUser(); if (player.IsTSupport()) return;
User user = player.GetUser();
using (var dbContext = new DatabaseContext()) using (var dbContext = new DatabaseContext())
{ {
user = player.GetUser(dbContext); user = player.GetUser(dbContext);
@@ -225,8 +225,8 @@ namespace ReallifeGamemode.Server.Wanted
[RemoteEvent("SERVER:BreakOutIfInPrison")] [RemoteEvent("SERVER:BreakOutIfInPrison")]
public void breakOutIfInPrison(Player player) public void breakOutIfInPrison(Player player)
{ {
if (player.IsTSupport()) return;
User user = player.GetUser(); User user = player.GetUser();
using (var dbContext = new DatabaseContext()) using (var dbContext = new DatabaseContext())
{ {
if (Jailtime.ContainsKey(user.Id)) if (Jailtime.ContainsKey(user.Id))

View File

@@ -0,0 +1,103 @@
using System;
using System.Timers;
using GTANetworkAPI;
/**
* @overview Life of German Reallife - WeatherSync
* @author Alex_qp
* @copyright (c) 2008 - 2021 Life of German
*/
namespace ReallifeGamemode.Server.World
{
/// <summary>
/// Serverwide WeatherSystem (+ sync)
/// </summary>
static class WeatherSync
{
// SETTINGS
private const uint _syncInterval = 5 * 60 * 1000; // 5 min
private static readonly int[] _countRange = new int[] { 3, 5 }; // min, max both inclusive. How often should weather be synced before actual changing?
// INTERNAL
private static int _count = 0;
private static int _targetCount = GetNewTargetCount();
/// <summary>
/// Get/Set the current weather.
/// <remarks>Only use in main thread!</remarks>
/// </summary>
public static Weather Weather
{
get { return NAPI.World.GetWeather(); }
set { NAPI.World.SetWeather(value); }
}
/// <summary>
/// Set the current weather by string.
/// </summary>
/// <remarks>Only use in main thread!</remarks>
/// </summary>
/// <param name="weather"></param>
public static void SetWeather(string weather)
{
NAPI.World.SetWeather(weather);
}
private static Timer weatherTimer;
/// <summary>
/// Loads/Starts the WeatherSync.
/// </summary>
public static void Load()
{
weatherTimer = new Timer(_syncInterval);
weatherTimer.Start();
weatherTimer.Elapsed += OnWeatherTimer;
NAPI.Util.ConsoleOutput("Loaded WeatherSync");
}
private static int GetNewTargetCount()
{
return new Random().Next(_countRange[0], _countRange[1] + 1);
}
private static Weather GetRandomWeather(Weather[] weathers)
{
return weathers[new Random().Next(weathers.Length)];
}
private static void OnWeatherTimer(object sender, ElapsedEventArgs e)
{
NAPI.Task.Run(() =>
{
if (_count < _targetCount)
{
// sync weather for all players
_count++;
Weather = Weather;
}
else
{
// change weather and reset counters
_count = 0;
_targetCount = GetNewTargetCount();
Weather = Weather switch
{
Weather.EXTRASUNNY => GetRandomWeather(new Weather[] { Weather.EXTRASUNNY, Weather.CLEAR }),
Weather.CLEAR => GetRandomWeather(new Weather[] { Weather.EXTRASUNNY, Weather.CLEAR, Weather.CLOUDS, Weather.SMOG }),
Weather.CLOUDS => GetRandomWeather(new Weather[] { Weather.CLEAR, Weather.CLOUDS, Weather.SMOG, Weather.FOGGY, Weather.OVERCAST }),
Weather.SMOG => GetRandomWeather(new Weather[] { Weather.CLOUDS, Weather.SMOG, Weather.FOGGY, Weather.OVERCAST }),
Weather.FOGGY => GetRandomWeather(new Weather[] { Weather.CLOUDS, Weather.SMOG, Weather.FOGGY, Weather.OVERCAST, Weather.RAIN }),
Weather.OVERCAST => GetRandomWeather(new Weather[] { Weather.CLOUDS, Weather.SMOG, Weather.RAIN, Weather.CLEARING }), // may add overcast
Weather.RAIN => GetRandomWeather(new Weather[] { Weather.OVERCAST, Weather.RAIN, Weather.CLEARING, Weather.THUNDER }),
Weather.THUNDER => GetRandomWeather(new Weather[] { Weather.RAIN, Weather.THUNDER, Weather.CLEARING }),
Weather.CLEARING => GetRandomWeather(new Weather[] { Weather.CLEAR, Weather.CLOUDS, Weather.CLEARING }),
_ => GetRandomWeather(new Weather[] { Weather.EXTRASUNNY, Weather.CLEAR }),
};
}
});
}
}
}