Merge branch 'develop' into 'master'

0.8.0

See merge request log-gtav/reallife-gamemode!67
This commit is contained in:
hydrant
2021-05-08 23:44:18 +00:00
135 changed files with 8163 additions and 1113 deletions

View File

@@ -132,6 +132,11 @@ namespace ReallifeGamemode.Server.Bank
using (var dbContext = new DatabaseContext())
{
if (player.GetUser().PlayedMinutes < 180)
{
player.SendNotification("~r~Du kannst Geld erst ab 3 Spielstunden vergeben");
return;
}
if (player.GetUser(dbContext) == target.GetUser(dbContext))
{
player.SendNotification($"~r~Du kannst dir selber kein Geld überweisen.");

View File

@@ -172,7 +172,7 @@ namespace ReallifeGamemode.Server.Commands
#region Support
[Command("tog", "~m~Benutzung: ~s~/tog [Typ = ~g~IP~s~, ~g~deathlogs~s~, ~g~LC~s~, ~g~Connect~s~, ~g~D~s~, ~g~GA~s~, ~g~All~s~]", GreedyArg = true)]
[Command("tog", "~m~Benutzung: ~s~/tog [Typ = ~g~ip~s~, ~g~deathlogs~s~, ~g~lc~s~, ~g~connect~s~, ~g~d~s~, ~g~ga~s~, ~g~all~s~]", GreedyArg = true)]
public void CmdAdminTog(Player player, string typ, string option1 = null, string option2 = null)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)
@@ -187,12 +187,12 @@ namespace ReallifeGamemode.Server.Commands
if (player.HasData("togip"))
{
player.ResetData("togip");
player.SendNotification("~g~[Info]~w~ Ip´s werden nun ausgeblendet.");
player.SendNotification("Die IP-Adressen sind nun ~r~deaktiviert~s~.");
}
else
{
player.SetData("togip", true);
player.SendNotification("~g~[Info]~w~ Ip´s werden nun angezeigt.");
player.SendNotification("Die IP-Adressen sind nun ~g~aktiviert~s~.");
}
break;
@@ -200,12 +200,12 @@ namespace ReallifeGamemode.Server.Commands
if (player.HasData("togdeath"))
{
player.ResetData("togdeath");
player.SendNotification("~g~[Info]~w~ Deathlogs werden nun ausgeblendet.");
player.SendNotification("Du hast die Todesbenachrichtigungen ~r~deaktiviert~s~.");
}
else
{
player.SetData("togdeath", true);
player.SendNotification("~g~[Info]~w~ Deathlogs werden nun angezeigt.");
player.SendNotification("Du hast die Todesbenachrichtigungen ~g~aktiviert~s~.");
}
break;
@@ -213,12 +213,12 @@ namespace ReallifeGamemode.Server.Commands
if (player.HasData("toglc"))
{
player.ResetData("toglc");
player.SendNotification("~g~[Info]~w~ Leaderchat wird nun ausgeblendet.");
player.SendNotification("Du hast den /lc-Chat ~r~deaktiviert~s~.");
}
else
{
player.SetData("toglc", true);
player.SendNotification("~g~[Info]~w~ Leaderchat wird nun angezeigt.");
player.SendNotification("Du hast den /lc-Chat ~g~aktiviert~s~.");
}
break;
@@ -226,40 +226,40 @@ namespace ReallifeGamemode.Server.Commands
if (player.HasData("togconnect"))
{
player.ResetData("togconnect");
player.SendNotification("~g~[Info]~w~ Connect-Logs werden nun ausgeblendet.");
player.SendNotification("Du hast die Connect-Nachrichten ~r~deaktiviert~s~.");
}
else
{
player.SetData("togconnect", true);
player.SendNotification("~g~[Info]~w~ Connect-Logs werden nun angezeigt.");
player.SendNotification("Du hast die Connect-Nachrichten ~g~aktiviert~s~.");
}
break;
case "d":
if (player.HasData("togd"))
{
player.ResetData("togd");
player.SendNotification("~g~[Info]~w~ D-Chat wird nun ausgeblendet.");
player.SendNotification("Du hast den /d-Chat ~r~deaktiviert~s~.");
}
else
{
player.SetData("togd", true);
player.SendNotification("~g~[Info]~w~ D-Chat wird nun angezeigt.");
player.SendNotification("Du hast den /d-Chat ~g~aktiviert~s~.");
}
break;
case "ga":
if (player.HasData("togga"))
{
player.ResetData("togga");
player.SendNotification("~g~[Info]~w~ GA-Chat wird nun ausgeblendet.");
player.SendNotification("Du hast den /ga-Chat ~r~deaktiviert~s~.");
}
else
{
player.SetData("togga", true);
player.SendNotification("~g~[Info]~w~ GA-Chat wird nun angezeigt.");
player.SendNotification("Du hast den /ga-Chat ~g~aktiviert~s~.");
}
break;
case "all":
if(!player.HasData("togall"))
if (!player.HasData("togall"))
{
player.SetData("togip", true);
player.SetData("togdeath", true);
@@ -270,7 +270,7 @@ namespace ReallifeGamemode.Server.Commands
player.SetData("togga", true);
player.SetData("togall", true);
player.SendNotification("~g~[Info]~s~ Alle Logs wurden eingeschaltet");
player.SendNotification("Du hast alle Benachrichtigungen ~g~aktiviert~s~.");
}
else
{
@@ -283,7 +283,7 @@ namespace ReallifeGamemode.Server.Commands
player.ResetData("togga");
player.ResetData("togall");
player.SendNotification("~g~[Info]~s~ Alle Logs wurden ausgeschaltet");
player.SendNotification("Du hast alle Benachrichtigungen ~r~deaktiviert~s~.");
}
break;
}
@@ -314,6 +314,12 @@ namespace ReallifeGamemode.Server.Commands
player.TriggerEvent("toggleTSupportMode", false);
player.SetData("SAdminduty", false);
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();
}
@@ -351,7 +357,7 @@ namespace ReallifeGamemode.Server.Commands
[Command("o", "~m~Benutzung: ~s~/o [Nachricht]", GreedyArg = true)]
public void CmdAdminO(Player player, string message)
{
if(!player.IsLoggedIn())
if (!player.IsLoggedIn())
{
return;
}
@@ -470,11 +476,11 @@ namespace ReallifeGamemode.Server.Commands
msg = Regex.Replace(msg, "(~[a-zA-Z]~)|(!{(.*)})", "");
ChatService.SendMessage(player, "~y~PM an " + target.Name + ": " + msg + " ");
string Message = "~y~PM von " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + msg + "";
string Message = "~y~PM von " + player.GetUser().AdminLevel.GetName() + " " + player.Name + ": " + msg;
ChatService.SendMessage(target, Message);
}
[Command("skick", "~m~Benutzung: ~s~/skick [Player] [Grund]", GreedyArg = true)]
[Command("skick", "~m~Benutzung: ~s~/skick [Spieler] [Grund]", GreedyArg = true)]
public void CmdAdminSKick(Player player, string targetname, string reason)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.SUPPORTER) ?? true)
@@ -497,14 +503,14 @@ namespace ReallifeGamemode.Server.Commands
}
string adminPlayername = NAPI.Player.GetPlayerName(player);
ChatService.SendMessage(target, "~r~KICKINFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt: " + reason);
ChatService.SendMessage(target, "~r~INFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt (Grund: " + reason + ").");
NAPI.Task.Run(() =>
{
target.Kick();
}, 2500);
ChatService.BroadcastAdmin("~y~SKICK: ~w~" + target.Name + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason, AdminLevel.SUPPORTER);
ChatService.BroadcastAdmin("~y~SKICK: ~w~" + target.Name + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt (Grund: " + reason + ").", AdminLevel.SUPPORTER);
}
[Command("clearchat", "~m~Benutzung: ~s~/clearchat")]
@@ -544,6 +550,40 @@ namespace ReallifeGamemode.Server.Commands
#endregion Support
#region Admin
[Command("towaypoint", "~m~Benutzung: ~s~/towaypoint", Alias = "tow")]
public void CmdAdminToWaypoint(Player player)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
{
ChatService.NotAuthorized(player);
return;
}
player.TriggerEvent("tpToWaypoint");
}
[Command("remspawnschutz", "~m~Benutzung: ~s~/rmss [Target]", Alias = "rmss")]
public void CmdAdminRmss(Player player, String targetname)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
{
ChatService.NotAuthorized(player);
return;
}
Player target = PlayerService.GetPlayerByNameOrId(targetname);
if (target == null || !target.IsLoggedIn())
{
ChatService.PlayerNotFound(player);
return;
}
target.SendChatMessage(player.Name + " hat deinen Spawnschutz entfernt");
player.SendChatMessage("Du hast den Spawnschutz von " + target.Name + " entfernt");
target.TriggerEvent("abortSpawnschutz");
}
[Command("remspawnschutz", "~m~Benutzung: ~s~/rmss [Target]")]
public void CmdAdminRmss(Player player, String targetname)
@@ -838,14 +878,14 @@ namespace ReallifeGamemode.Server.Commands
string adminPlayername = NAPI.Player.GetPlayerName(player);
ChatService.SendMessage(target, "~r~KICKINFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt: " + reason);
ChatService.SendMessage(target, "~r~INFO: ~w~Du wurdest von " + adminPlayername + " vom Server gekickt (Grund: " + reason + ").");
NAPI.Task.Run(() =>
{
target.Kick();
}, 2500);
ChatService.Broadcast("~y~INFO: ~w~" + target.Name + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt: " + reason);
ChatService.Broadcast("!{#FF4040}[KICK] ~w~" + target.Name + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " gekickt (Grund: " + reason + ").");
}
[Command("warn", "~m~Benutzung: ~s~/warn [Player] [Grund]", GreedyArg = true)]
@@ -875,13 +915,13 @@ namespace ReallifeGamemode.Server.Commands
dbContext.SaveChanges();
if (userwarn.warn >= 3)
{
ChatService.BroadcastAdmin("~y~INFO: Das war der 3. Warn - bitte bannen!", AdminLevel.ADMIN);
ChatService.BroadcastAdmin("~y~INFO: ~w~" + targetPlayername + " hat jetzt drei Warns bitte bannen!", AdminLevel.ADMIN);
}
}
ChatService.SendMessage(target, "~r~WARNINFO: ~w~Du wurdest von " + adminPlayername + " verwarnt: " + reason);
ChatService.SendMessage(target, "!{#FF4040}[WARN] ~w~Du wurdest von " + adminPlayername + " verwarnt (Grund: " + reason + ").");
ChatService.BroadcastAdmin("~y~INFO: ~w~" + targetPlayername + " wurde von " + player.GetUser().AdminLevel.GetName() + " " + adminPlayername + " verwarnt: " + reason, AdminLevel.ADMIN);
ChatService.BroadcastAdmin("~y~INFO: " + targetPlayername + " ~w~wurde von " + player.GetUser().AdminLevel.GetName() + " ~y~" + adminPlayername + " ~w~verwarnt (Grund: " + reason + ").", AdminLevel.ADMIN);
}
[Command("ip", "~m~Benutzung: ~s~/ip [Spieler]")]
@@ -899,11 +939,11 @@ namespace ReallifeGamemode.Server.Commands
ChatService.PlayerNotFound(player);
return;
}
ChatService.SendMessage(player, "IP von ~y~" + NAPI.Player.GetPlayerName(target) + ": ~g~" + target.Address);
ChatService.SendMessage(player, "~y~IP: ~w~Die IP-Adresse von ~y~" + NAPI.Player.GetPlayerName(target) + " ~w~lautet: ~y~" + target.Address);
}
[Command("ban", "~m~Benutzung: ~s~/ban [User] [Grund] [Zeit in Minuten(0 für Permanent)]", GreedyArg = true)]
public void CmdAdminBan(Player admin, string user, string reason, string strmins = "0")
[Command("ban", "~m~Benutzung: ~s~/ban [User] [Zeit in Minuten (0 = Permanent)] [Grund]", GreedyArg = true)]
public void CmdAdminBan(Player admin, string user, string strmins, string reason)
{
if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
{
@@ -934,11 +974,11 @@ namespace ReallifeGamemode.Server.Commands
reason = Regex.Replace(reason, "(~[a-zA-Z]~)|(!{(.*)})", "");
string adminPlayername = NAPI.Player.GetPlayerName(admin);
String banMessage = "~r~BANINFO: ~w~Du wurdest von " + adminPlayername + " vom Server gebannt: " + reason;
String banMessage = "~r~INFO: ~w~Du wurdest von " + adminPlayername + " permanent vom Server gebannt (Grund: " + reason + ").";
if (mins > 0)
{
banMessage = "~r~BANINFO: ~w~Du wurdest von " + adminPlayername + " für " + mins + " Minuten vom Server gebannt: " + reason;
banMessage = "~r~INFO: ~w~Du wurdest von " + adminPlayername + " für " + mins + " Minuten vom Server gebannt (Grund: " + reason + ").";
}
ChatService.SendMessage(target, banMessage);
@@ -949,7 +989,7 @@ namespace ReallifeGamemode.Server.Commands
}, 2500);
}
[Command("unban", "~m~Benutzung: ~s~/unban [Name] ")]
[Command("unban", "~m~Benutzung: ~s~/unban [Name]")]
public void CmdAdminUnban(Player admin, string userName)
{
if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true)
@@ -998,7 +1038,7 @@ namespace ReallifeGamemode.Server.Commands
user.UnbanPlayer();
}
string message = "~b~[ADMIN] ~s~Der Spieler ~y~" + user.Name + " ~s~wurde von ~y~" + admin.Name + " ~s~entbannt.";
string message = "~y~INFO: ~w~Der Spieler ~y~" + user.Name + " ~w~wurde von ~y~" + admin.Name + " ~w~entbannt.";
ChatService.BroadcastAdmin(message, AdminLevel.ADMIN);
}
@@ -1180,7 +1220,7 @@ namespace ReallifeGamemode.Server.Commands
return;
}
target.RemoveAllWeapons();
ChatService.SendMessage(target, "~b~Deine Waffen wurden dir von " + player.Name + "(Admin) abgenommen");
ChatService.SendMessage(target, "~b~Deine Waffen wurden dir von " + player.Name + " (Admin) abgenommen");
ChatService.SendMessage(player, "~b~Dem Spieler " + target.Name + " wurden erfolgreich alle Waffen abgenommen ");
}
@@ -1509,33 +1549,6 @@ namespace ReallifeGamemode.Server.Commands
Medic.delReviveTask(target);
}
[Command("aunshow", "~m~Benutzung:~s~ /aunshow")]
public void CmdAdminUnshow(Player player)
{
User user = player.GetUser();
if (!user.IsAdmin(AdminLevel.HEADADMIN))
{
ChatService.NotAuthorized(player);
return;
}
bool currentStatus = user.GetData<bool>("adminUnshow");
currentStatus = !currentStatus;
user.SetData("adminUnshow", currentStatus);
player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
user.SetBlipAndNametagColor();
if(currentStatus)
{
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun Unshow");
}
else
{
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun nicht mehr Unshow");
}
}
[Command("setap", "~m~Benutzung: ~s~/setap [Spieler] (Armor)")]
public void CmdAdminSetAP(Player player, string name, int armor = 100)
{
@@ -1809,12 +1822,16 @@ namespace ReallifeGamemode.Server.Commands
[Command("spectate", "~m~Benutzung: ~s~/spectate [NAME/ID]", Alias = "spec")]
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);
return;
}
Player target;
bool currentStatus = player.GetData<bool>("adminUnshow");
if (targetname != null)
{
target = PlayerService.GetPlayerByNameOrId(targetname);
@@ -1823,14 +1840,71 @@ namespace ReallifeGamemode.Server.Commands
ChatService.PlayerNotFound(player);
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
{
currentStatus = !currentStatus;
player.SetData("adminUnshow", currentStatus);
player.TriggerEvent("SERVER:ADMIN_STOP_SPECTATE");
}
player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
player.SafeTeleport(player.GetData<Vector3>("specPosition"));
}
user.SetBlipAndNametagColor();
}
[Command("aunshow", "~m~Benutzung:~s~ /aunshow")]
public void CmdAdminUnshow(Player player)
{
User user = player.GetUser();
if (!user.IsAdmin(AdminLevel.HEADADMIN))
{
ChatService.NotAuthorized(player);
return;
}
if (!player.IsTSupport())
{
ChatService.ErrorMessage(player, "Du bist nicht im T-Support");
return;
}
bool currentStatus = player.GetData<bool>("adminUnshow");
currentStatus = !currentStatus;
player.SetData("adminUnshow", currentStatus);
player.TriggerEvent("toggleAdminUnshowMode", currentStatus);
user.SetBlipAndNametagColor();
if (currentStatus)
{
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun Unshow");
}
else
{
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du bist nun nicht mehr Unshow");
}
}
#endregion Admin
@@ -2162,18 +2236,15 @@ namespace ReallifeGamemode.Server.Commands
return;
}
Weather weatherBefore = NAPI.World.GetWeather();
NAPI.World.SetWeather(weather);
Weather weatherAfter = NAPI.World.GetWeather();
Weather weatherBefore = World.WeatherSync.Weather;
World.WeatherSync.SetWeather(weather);
Weather weatherAfter = World.WeatherSync.Weather;
ChatService.SendMessage(player, "~w~Wetter geändert: " + 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~" + NAPI.World.GetWeather() + "~s~ geändert.", true);
}
else
{
ChatService.SendMessage(player, "~w~Das Wetter konnte nicht geändert werden");
NAPI.Notification.SendNotificationToAll("Das Wetter wurde von ~g~" + player.Name + " ~s~auf ~g~" + weatherAfter + "~s~ geändert.", true);
}
}
@@ -3562,10 +3633,10 @@ namespace ReallifeGamemode.Server.Commands
}
}
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du hast ein Payday gedroppt.");
ChatService.SendMessage(player, "~b~[ADMIN]~s~ Du hast einen PayDay gedroppt.");
}
[Command("setwage", "~m~Benutzung: ~s~/setwage [Name/Id] [Lohn]")]
[Command("setwage", "~m~Benutzung: ~s~/setwage [Spieler] [Lohn]")]
public void CmdAdminSetWage(Player player, string nameOrId, int wage)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true)
@@ -3759,13 +3830,14 @@ namespace ReallifeGamemode.Server.Commands
player.SendChatMessage("~m~Benutzung:~s~ /business [price] [Option]");
}
[Command("checkstats", "~m~Benutzung:~s~ /checkstats [Name / ID]")]
[Command("checkstats", "~m~Benutzung:~s~ /checkstats [Spieler]")]
public void CmdAdminCheckStats(Player player, string nameOrId)
{
User user = player.GetUser();
if (!user.IsAdmin(AdminLevel.SUPPORTER))
{
ChatService.NotAuthorized(player);
return;
}
Player target = PlayerService.GetPlayerByNameOrId(nameOrId);
@@ -3782,7 +3854,18 @@ namespace ReallifeGamemode.Server.Commands
bool bikeLicense = targetUser.DriverLicenseBike;
bool flyingLicense = targetUser.FlyingLicensePlane;
bool weaponLicense = targetUser.WeaponLicense;
ChatService.SendMessage(player, $"Stats von {target.Name} - HandMoney: {handmoney.ToMoneyString()}, BankMoney: {bankmoney.ToMoneyString()}, DriverLicense: {driverLicense.ToString()}, BikeLicense: {bikeLicense.ToString()}, FlyingLicense: {flyingLicense.ToString()}, WeaponLicense: {weaponLicense.ToString()}");
int playedHours = targetUser.PlayedMinutes / 60;
string playedHoursString = "";
int jailTime = targetUser.JailTime;
if (user.IsAdmin(AdminLevel.HEADADMIN)) {
playedHoursString = playedHours.ToString();
} else {
int newbiePlayedHoursThreshold = GlobalHelper.newbiePlayedMinutesThreshold / 60;
playedHoursString = playedHours > newbiePlayedHoursThreshold ? (newbiePlayedHoursThreshold + "+") : playedHours.ToString();
}
ChatService.SendMessage(player, $"Statistiken von {target.Name} - HandMoney: {handmoney.ToMoneyString()}, BankMoney: {bankmoney.ToMoneyString()}, DriverLicense: {driverLicense.ToString()}, BikeLicense: {bikeLicense.ToString()}, FlyingLicense: {flyingLicense.ToString()}, WeaponLicense: {weaponLicense.ToString()}, playedHours: {playedHoursString}, JailTime: {jailTime.ToString()}");
}
#endregion ALevel1337
@@ -3899,10 +3982,16 @@ namespace ReallifeGamemode.Server.Commands
[RemoteEvent("Noclip")]
public void Noclip(Player player)
{
if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true)
if (!player.GetUser().IsAdmin(AdminLevel.HEADADMIN))
{
return;
}
if (!player.IsTSupport())
{
ChatService.ErrorMessage(player, "Du bist nicht im T-Support");
return;
}
if (player.HasData("Adminduty") && player.GetData<bool>("Adminduty"))
player.TriggerEvent("ADMIN:NoClip");
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
@@ -82,15 +82,15 @@ namespace ReallifeGamemode.Server.Commands
message = Regex.Replace(message, "(~[a-zA-Z]~)|(!{(.*)})", "");
string rank = string.Empty;
string factionName = string.Empty;
if (f?.GangOwned == true)
{
rank = user.FactionRank.RankName;
factionName = user.Faction.Name + " " + user.FactionRank.RankName;
}
else
{
rank = "[ADMIN]";
factionName = "ADMIN";
}
var logEntry = new GangChatLogEntry()
@@ -102,7 +102,7 @@ namespace ReallifeGamemode.Server.Commands
dbContext.GangChatLogs.Add(logEntry);
dbContext.SaveChanges();
string broadcastMessage = "!{FF0000}** " + rank + " " + player.Name + ": " + message + " **";
string broadcastMessage = "!{E52222}** [" + factionName + "] " + player.Name + ": " + message + " **";
using (var context = new DatabaseContext())
{
ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.GangOwned), true, (admin) => admin.HasData("togga"));
@@ -166,11 +166,11 @@ namespace ReallifeGamemode.Server.Commands
if (f?.StateOwned ?? false)
{
factionName = user.FactionRank.RankName;
factionName = user.Faction.Name + " " + user.FactionRank.RankName;
}
else
{
factionName = "[ADMIN]";
factionName = "ADMIN";
}
var logEntry = new DepartmentChatLogEntry()
@@ -182,7 +182,7 @@ namespace ReallifeGamemode.Server.Commands
dbContext.DepartmentChatLogs.Add(logEntry);
dbContext.SaveChanges();
string broadcastMessage = "!{CC3333}** " + factionName + " " + player.Name + ": " + message + ", over **";
string broadcastMessage = "!{CC3333}** [" + factionName + "] " + player.Name + ": " + message + ", over **";
using (var context = new DatabaseContext())
{
ChatService.BroadcastFaction(broadcastMessage, context.Factions.ToList().FindAll(c => c.StateOwned), true, (admin) => admin.HasData("togd"));
@@ -511,7 +511,7 @@ namespace ReallifeGamemode.Server.Commands
#region Staatsfraktionen (LSPD / FBI) Commands
[Command("m", "~m~Benutzung: ~s~/m [Message]", GreedyArg = true)]
[Command("m", "~m~Benutzung: ~s~/m [Nachricht]", GreedyArg = true)]
public void CmdFactionMegaphone(Player player, string message)
{
User user = player.GetUser();
@@ -533,7 +533,7 @@ namespace ReallifeGamemode.Server.Commands
return;
}
ChatService.SendInRange(player.Position, 50, "!{#FFFF00}[" + player.GetUser().Faction.Name + " " + player.Name + ": !{#FFFF00}" + message + "]");
ChatService.SendInRange(player.Position, 50, "!{#FFFF00}Megafon (" + player.Name + "): " + message);
}
[Command("cuff", "~m~Benutzung: ~s~/cuff")]

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using GTANetworkAPI;
using Newtonsoft.Json;
using ReallifeGamemode.Database.Entities;
@@ -16,7 +17,26 @@ using ReallifeGamemode.Services;
namespace ReallifeGamemode.Server.Commands
{
internal class UserCommands : Script
{
{
[Command("rent", "~m~rent stop")]
public void CmdUserStopRent(Player player, String option = "") {
if (!player.IsLoggedIn()) return;
if (option != "stop")
{
player.SendChatMessage("Mit \"/rent stop\" kannst du die Miete kündigen");
return;
}
if (!player.HasData("hasRentcar"))
{
ChatService.ErrorMessage(player, "Du hast zurzeit kein Fahrzeug gemietet");
return;
}
Rentcar.cancelRent(player);
}
[Command("eventport", "~m~eventport")]
public void CmdUserEventport(Player player, String option = "")
{
@@ -71,6 +91,42 @@ namespace ReallifeGamemode.Server.Commands
player.SendNotification("Du hast dich zum Event teleportiert");
}
[Command("sms", "~m~Benutzung: ~s~/sms [Spieler] [Nachricht]", GreedyArg = true)]
public void CmdUserSMS(Player player, string name, string msg)
{
if (!player.IsLoggedIn()) return;
Player target = PlayerService.GetPlayerByNameOrId(name);
if (target == null || !target.IsLoggedIn())
{
ChatService.PlayerNotFound(player);
return;
}
if (target == player)
{
ChatService.ErrorMessage(player, "Du kannst dir keine SMS schreiben");
return;
}
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (user.BankAccount.Balance < 5) {
ChatService.ErrorMessage(player, "Dafür hast du nicht genug Geld auf deinem Bankkonto");
return;
}
user.BankAccount.Balance -= 5;
dbContext.SaveChanges();
}
msg = Regex.Replace(msg, "(~[a-zA-Z]~)|(!{(.*)})", "");
ChatService.SendMessage(player, $"~y~SMS ~w~an ~y~{ target.Name }~w~: { msg }");
ChatService.SendMessage(target, $"~y~SMS ~w~von ~y~{ player.Name }~w~: { msg }");
}
[Command("look", "~m~look")]
public void CmdUserLook(Player player)
{
@@ -178,7 +234,7 @@ namespace ReallifeGamemode.Server.Commands
{
player.SendChatMessage("E - Interagieren (ATM, Türen, Shops, Friseur etc.");
player.SendChatMessage("M - Interaktionsmenü öffnen und schließen");
player.SendChatMessage("X - Fahrzeug auf -/ abschließen sowie im Fahrzeuginteraktionsmenü öffnen");
player.SendChatMessage("Z - Fahrzeug auf -/ abschließen sowie im Fahrzeuginteraktionsmenü öffnen");
player.SendChatMessage("N - Fahrzeugmotor Starten");
player.SendChatMessage("O - Onlineliste öffnen / schließen");
player.SendChatMessage("I - Inventar öffnen / schließen");

View File

@@ -71,7 +71,7 @@ namespace ReallifeGamemode.Server.DrivingSchool
new Vector3(-255.55, -1419.48, 32.75),
new Vector3(-369.08, -1415.37, 29.68),
new Vector3(-114.48, -1251.43, 37.59),
new Vector3(59.22, -1261.71, 29.84),
new Vector3(70.312744, -1250.7972, 29.84),
new Vector3(39.12, -1165.28, 29.87),
new Vector3(-307.52, -1200.85, 37.79),
new Vector3(-441.79, -1251.67, 46.37),

View File

@@ -78,6 +78,11 @@ namespace ReallifeGamemode.Server.Events
player.TriggerEvent("CLIENT:AddPed", 3, "s_m_m_pilot_01", -1621.4542236328125, -3152.724365234375, 13.991769790649414, 50.73009490966797, 0, false, true, 0, "none", true, true, true);//Ped_Pilot LS Airport
player.TriggerEvent("CLIENT:AddPed", 4, "u_m_o_finguru_01", -534.4425659179688, -2145.747314453125, 5.992100715637207, 53.96156692504883, 0, false, true, 0, "none", true, true, true);//Ped Busfahrer
player.TriggerEvent("CLIENT:AddPed", 5, "csb_prolsec", 1690.84, 2591.17 , 45.91, -2.66, 0, false, true, 0, "none", true, true, true);//Ped Knast
player.TriggerEvent("CLIENT:AddPed", 6, "ig_siemonyetarian", -1023.1589, -2693.6948, 13.98, 173.95613, 0, false, true, 0, "none", true, true, true);//Ped Rentcar NoobSpawn
player.TriggerEvent("CLIENT:AddPed", 7, "ig_siemonyetarian", -369.1589, -230.92816, 36.028805, 150.26433, 0, false, true, 0, "none", true, true, true);//Ped Rentcar KH/Stadthalle
player.TriggerEvent("CLIENT:AddPed", 8, "ig_siemonyetarian", 1222.0868, 2726.5286, 38.00415, 113.77263, 0, false, true, 0, "none", true, true, true);//Ped Rentcar Knast
player.TriggerEvent("CLIENT:AddPed", 9, "ig_siemonyetarian", -215.4218292236328, 6218.90478515625, 31.491567611694336, -135.07437133789062, 0, false, true, 0, "none", true, true, true);//Ped Rentcar Paleto
player.TriggerEvent("CLIENT:AddPed", 10, "ig_siemonyetarian", 818.239990234375, -1040.833984375, 26.750696182250977, 3.0542829036712646, 0, false, true, 0, "none", true, true, true);//Ped Rentcar Lamesa
TimeSpan currentTime = TimeManager.CurrentTime;
bool disableLightMode = currentTime > LightModeTimeFrom && currentTime < LightModeTimeTo;

View File

@@ -79,6 +79,7 @@ namespace ReallifeGamemode.Server.Events
var playerInGangwar = player.HasData("inGangWar");
var killerInGangwar = killer.HasData("inGangWar");
NAPI.Util.ConsoleOutput($"OnPlayerDeath - Player {player.Name} died - PlayerInGangwar = {playerInGangwar}, KillerInGangwar = {killerInGangwar}");
if (playerInGangwar && killerInGangwar)
{
@@ -148,7 +149,7 @@ namespace ReallifeGamemode.Server.Events
if (copNearby)
{
user.SetJailTime(true, dbContext);
Jail.Check_PutBehindBars(user, "cell");
Jail.Check_PutBehindBars(user, JailInLocations.InCell);
ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert.");
}
else

View File

@@ -127,6 +127,11 @@ namespace ReallifeGamemode.Server.Events
}
}
if (Rentcar.mapPlayerRentcarBill.ContainsKey(player.Name))
{
Rentcar.cancelRent(player);
}
//Vehicle LastVehicle = player.GetData<Vehicle>("LastVehicle");
JobBase job = JobManager.GetJob(player.GetUser().JobId ?? -1);
if (job != null)

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
@@ -34,7 +35,7 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:NUM2")]
public void KeyPressNUM2(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
if (player.GetData<bool>("editmode") == true && player.GetUser().IsAdmin(AdminLevel.HEADADMIN) == true)
{
var saveMode = player.GetData<string>("quicksavemode");
@@ -91,7 +92,7 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:RIGHT_ARROW")]
public void KeyPressRightArrow(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
User user = player.GetUser();
if (!player.IsDuty())
@@ -116,10 +117,10 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:M")]
public void KeyPressM(Player player)
{
if (!player.IsLoggedIn()) return;
using var dbContext = new DatabaseContext();
User u = player.GetUser(dbContext);
if (u == null) return;
if (player.GetData<bool>("isDead")) return;
var vehicles = dbContext.UserVehicles.Where(veh => veh.UserId == u.Id).OrderBy(veh => veh.Id).Select(v => new
{
@@ -135,7 +136,6 @@ namespace ReallifeGamemode.Server.Events
Price = f.BuyPrice
});
Paycheck paycheck = null;
if (Economy.Paychecks.ContainsKey(u.Id)) paycheck = Economy.Paychecks[u.Id];
@@ -189,6 +189,7 @@ namespace ReallifeGamemode.Server.Events
int ticket_amount = 0;
int pay_amount = 0;
bool house = false;
bool hasRentcar = player.GetData<bool>("hasRentcar") == true;
if (u.House != null)
{
@@ -204,13 +205,14 @@ namespace ReallifeGamemode.Server.Events
{
pay_amount = player.GetData<int>("pay_amount");
}
player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(memberList), JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, house);
player.TriggerEvent("SERVER:InteractionMenu_OpenMenu", JsonConvert.SerializeObject(accountData), factionleader, JsonConvert.SerializeObject(memberList), JsonConvert.SerializeObject(jobData), faction, group, factionInvite, groupInvite, ticket_boolean, ticket_amount, pay_amount, JsonConvert.SerializeObject(hasRentcar), house);
}
[RemoteEvent("keyPress:E")]
public void KeyPressE(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead") || player.IsInVehicle) return;
var user = player.GetUser();
if (player.HasData("nearATM"))
@@ -219,12 +221,9 @@ namespace ReallifeGamemode.Server.Events
return;
}
if (!player.IsInVehicle)
if (GroundItem.PickUpGroundItem(player))
{
if (GroundItem.PickUpGroundItem(player))
{
return;
}
return;
}
DutyPoint nearestDuty = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5 && d.FactionId == user.FactionId);
@@ -237,6 +236,7 @@ namespace ReallifeGamemode.Server.Events
JobPoint nearestJobPoint = PositionManager.JobPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6);
Player nearestCuffPlayer = PositionManager.cuffPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.6 && user.GetData<bool>("duty"));
AmmunationPoint nearestAmmunationPoint = PositionManager.AmmunationPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5);
RentcarPoint nearestRentcarPoint = PositionManager.rentcarPoints.Find(s => s.Position.DistanceTo(player.Position) <= 1.5);
if (user?.FactionId != null)
{
@@ -309,7 +309,7 @@ namespace ReallifeGamemode.Server.Events
player.SendNotification("Du bist nun ~g~im Dienst.");
player.TriggerEvent("toggleDutyMode", true);
player.TriggerEvent("abortSpawnschutz");
if (player.GetUser().FactionId == 2) //Fire Department
if (user.FactionId == 2) //Fire Department
{
Medic.UpdateDutyMedics();
}
@@ -466,9 +466,7 @@ namespace ReallifeGamemode.Server.Events
});
}
player.TriggerEvent("showWeaponMenu", primarys.ToArray(), secondarys.ToArray(), melees.ToArray(), specials.ToArray(), armor.ToArray(), JsonConvert.SerializeObject(timer.ToArray()), JsonConvert.SerializeObject(amountInfos));
}
}
if (nearestJailReleasePoint != null)
@@ -495,6 +493,42 @@ namespace ReallifeGamemode.Server.Events
player.CuffPlayer(nearestCuffPlayer);
}
}
//Rentcar Points
if (nearestRentcarPoint != null)
{
if (player.IsInVehicle)
{
return;
}
//Noobspawn
if (player.Position.DistanceTo(PositionManager.rentcarPoints[0].Position) <= 1.5)
{
player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.noobspawnVehicleProperties), "noobspawn");
}
//Stadthalle
else if (player.Position.DistanceTo(PositionManager.rentcarPoints[1].Position) <= 1.5)
{
player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.stadthalleVehicleProperties), "lamesa");
}
//Knast
else if (player.Position.DistanceTo(PositionManager.rentcarPoints[2].Position) <= 1.5)
{
player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.knastVehicleProperties), "stadthalle");
}
//Paleto
else if (player.Position.DistanceTo(PositionManager.rentcarPoints[3].Position) <= 1.5)
{
player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "knast");
}
//Lamesa
else if (player.Position.DistanceTo(PositionManager.rentcarPoints[4].Position) <= 1.5)
{
player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "paleto");
}
}
if (nearestElevatorPoint != null)
{
List<string> stages = new List<string>();
@@ -550,6 +584,56 @@ namespace ReallifeGamemode.Server.Events
nearestAmmunationPoint.Ammunation.LoadShopNUI(player);
}
}
//if (CharacterCreator.surgeryPoint.DistanceTo(player.Position) <= 1.5)
//{
// if (user.GetData<bool>("duty"))
// {
// player.SendNotification("~r~Im Dienst kannst du nicht operiert werden", false);
// return;
// }
// if (JobBase.GetPlayerInJob().Contains(player))
// {
// player.SendNotification("~r~Im aktiven Job kannst du nicht operiert werden", false);
// return;
// }
// if (user.Wanteds > 0)
// {
// player.SendNotification("~r~Wenn du gesucht wirst kannst du nicht operiert werden", false);
// return;
// }
// var freeSurgery = user.FreeSurgery;
// if (freeSurgery == false && user.BankAccount.Balance < CharacterCreator.SURGERY_PRICE)
// {
// ChatService.ErrorMessage(player, $"Du benötigst {CharacterCreator.SURGERY_PRICE.ToMoneyString()} auf dem Bankkonto um die Operation durchzuführen");
// return;
// }
// ChatService.SendMessage(player, "~r~ACHTUNG! Dadurch wird dein alter Charakter gelöscht. Du kannst dir hiermit einen neuen erstellen.");
// ChatService.SendMessage(player, "Beim Wechsel des Geschlechts verlierst du ebenfalls deine gekaufte Kleidung");
// if (freeSurgery == true)
// {
// ChatService.SendMessage(player, "Du kannst deinen Charakter dieses mal kostenlos erstellen");
// }
// else
// {
// ChatService.SendMessage(player, "Die Änderung des Charakters kostet ~g~" + CharacterCreator.SURGERY_PRICE.ToMoneyString());
// }
// ChatService.SendMessage(player, "Du kannst die Charaktererstellung wieder verlassen und behältst deinen alten Charakter!");
// ChatService.SendMessage(player, "Bitte starte mit ~g~J");
// player.SetData<bool>("charSurgery", true);
// NAPI.Task.Run(() =>
// {
// if (player.GetData<bool>("charSurgery") == true)
// {
// player.ResetData("charSurgery");
// player.SendNotification("~r~Chirurg-Angebot abgebrochen.");
// }
// }, 30000);
//}
if (user.FactionLeader)
{
player.TriggerEvent("CLIENT:StartGangwar");
@@ -608,7 +692,7 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:I")]
public void KeyPressI(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
if (player.GetData<bool>("isDead")) return;
player.TriggerEvent("inventoryShow");
@@ -618,7 +702,7 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:J")]
public void KeyPressJ(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
if (player.GetData<bool>("healDecision") == true)
{
player.ResetData("healDecision");
@@ -626,14 +710,20 @@ namespace ReallifeGamemode.Server.Events
return;
}
if(player.GetData<bool>("SellVehicleDecision") == true && player.HasData("VehicleToSell"))
if (player.GetData<bool>("SellVehicleDecision") == true && player.HasData("VehicleToSell"))
{
InteractionManager.SellServerVehicle(player, player.GetData<int>("VehicleToSell"));
player.ResetData("SellVehicleDecision");
player.ResetData("VehicleToSell");
player.ResetData("VehicleToSell");
return;
}
if (player.GetData<bool>("charSurgery") == true)
{
CharacterCreator.StartSurgery(player);
player.ResetData("charSurgery");
}
User u = player.GetUser();
if (u.JobId == null) return;
@@ -702,19 +792,19 @@ namespace ReallifeGamemode.Server.Events
return new
{
Id = p.Handle.Value,
p.Name,
p.Ping,
FactionName = u?.Faction?.Name ?? "Zivilist",
FactionId = u?.FactionId ?? 0
Name = p.Name + (u.PlayedMinutes <= GlobalHelper.newbiePlayedMinutesThreshold ? "<span class=\"player__status\">Neuling</span>" : ""),
FactionId = u?.FactionId ?? 0,
p.Ping
};
});
player.TriggerEvent("showPlayerlist", JsonConvert.SerializeObject(listPlayers));
}
[RemoteEvent("keyPress:K")]
public void KeyPressK(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
var user = player.GetUser();
if (user == null)
{
@@ -774,14 +864,14 @@ namespace ReallifeGamemode.Server.Events
[RemoteEvent("keyPress:L")]
public void KeyPressL(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
DoorManager.ChangeDoorState(player);
}
[RemoteEvent("keyPress:N")]
public void KeyPressN(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
if (player.GetData<bool>("healDecision") == true)
{
@@ -872,10 +962,10 @@ namespace ReallifeGamemode.Server.Events
VehicleStreaming.SetEngineState(v, !state);
}
[RemoteEvent("keyPress:X")]
[RemoteEvent("keyPress:Z")]
public void KeyPressX(Player player)
{
if (!player.IsLoggedIn()) return;
if (!player.IsLoggedIn() || player.GetData<bool>("isDead")) return;
if (!player.IsInVehicle)
{

View File

@@ -82,6 +82,7 @@ namespace ReallifeGamemode.Server.Events
player.SetData("Adminduty", false);
player.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney, 0);
player.TriggerEvent("headshotoff");
player.SetData("togdeath", true);
Gangwar.Gangwar.loadPlayer(player);
if (user.FactionLeader)
{
@@ -164,7 +165,7 @@ namespace ReallifeGamemode.Server.Events
}
else
{
Jail.Check_PutBehindBars(user, "cell");
Jail.Check_PutBehindBars(user, JailInLocations.InCell);
}
player.Dimension = 0;
@@ -183,6 +184,9 @@ namespace ReallifeGamemode.Server.Events
}
}
player.TriggerEvent("loadInventoryCEF");
player.TriggerEvent("loadPlayerListCEF");
player.TriggerEvent("draw", player.Name, player.Handle.Value);
NAPI.Task.Run(() =>
{

View File

@@ -79,7 +79,7 @@ namespace ReallifeGamemode.Server.Events
currentPlayerCreatorDimension++;
NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
player.TriggerEvent("toggleCreator");
player.TriggerEvent("toggleCreator",false);
player.SafeTeleport(new Vector3(402.8664, -996.4108, -99.00027));
//player.Position = new Vector3(user.PositionX, user.PositionY, user.PositionZ);

View File

@@ -7,7 +7,7 @@ namespace ReallifeGamemode.Server.Events
public class UpdateCharacterElevator : Script
{
[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);
if (elevator != null)

View File

@@ -1,141 +0,0 @@
using System;
using System.Linq;
using GTANetworkAPI;
using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Managers;
namespace ReallifeGamemode.Server.Events
{
public class UpdateCharacterWeapon : Script
{
[RemoteEvent("updateWeaponSelection")]
public void UpdateWeaponSelection(Player client, string weaponModel, int slot)
{
if (weaponModel == "Keine")
{
client.RemoveAllWeapons();
return;
}
WeaponHash weaponHash = NAPI.Util.WeaponNameToModel(weaponModel);
if (slot == 1)
{
client.RemoveAllWeapons();
client.GiveWeapon(weaponHash, 0);
}
if (slot == 2)
{
client.RemoveAllWeapons();
client.GiveWeapon(weaponHash, 0);
}
if (slot == 3)
{
client.RemoveAllWeapons();
client.GiveWeapon(weaponHash, 0);
}
if (slot == 4)
{
client.RemoveAllWeapons();
client.GiveWeapon(weaponHash, 0);
}
if (slot == 5)
{
client.SafeSetArmor(100);
}
}
[RemoteEvent("cancelWeaponSelection")]
public void CancelWeaponSelection(Player client)
{
client.RemoveAllWeapons();
}
[RemoteEvent("saveWeaponSelection")]
public void SaveWeaponSelection(Player client, string primaryModel, string secondaryModel, string meleeModel, string specialModel, string armor)
{
WeaponPoint nearestWeapon = PositionManager.WeaponPoints.Find(w => w.Position.DistanceTo(client.Position) <= 1.5 && w.FactionId == client.GetUser().FactionId);
if (nearestWeapon == null)
{
client.SendChatMessage("~y~Du bist nicht mehr an deinem Waffenschrank!");
return;
}
client.RemoveAllWeapons();
if (!uint.TryParse(primaryModel, out uint primary))
{
if (primaryModel.Contains("mk2") && !primaryModel.Contains("_mk2")) primaryModel = primaryModel.Replace("mk2", "_mk2");
primary = NAPI.Util.GetHashKey($"weapon_{primaryModel}");
}
if (!uint.TryParse(secondaryModel, out uint secondary))
{
if (secondaryModel.Contains("mk2") && !secondaryModel.Contains("_mk2")) secondaryModel = secondaryModel.Replace("mk2", "_mk2");
secondary = NAPI.Util.GetHashKey($"weapon_{secondaryModel}");
}
if (!uint.TryParse(meleeModel, out uint melee))
{
if (meleeModel.Contains("mk2") && !meleeModel.Contains("_mk2")) meleeModel = meleeModel.Replace("mk2", "_mk2");
melee = NAPI.Util.GetHashKey($"weapon_{meleeModel}");
}
client.GiveWeapon((WeaponHash)primary, 500);
client.GiveWeapon((WeaponHash)secondary, 250);
client.GiveWeapon((WeaponHash)melee, 1);
if (!uint.TryParse(specialModel, out uint special))
{
if (specialModel.Contains("mk2") && !specialModel.Contains("_mk2")) specialModel = specialModel.Replace("mk2", "_mk2");
special = NAPI.Util.GetHashKey($"weapon_{specialModel}");
}
client.GiveWeapon((WeaponHash)special, 30);
if (armor == "Schutzweste")
{
client.SafeSetArmor(100);
}
using (var context = new DatabaseContext())
{
User user = client.GetUser();
FactionWeapon slot1 = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.WeaponModel == primaryModel).FirstOrDefault();
if (slot1 != null)
slot1.Ammount -= 1;
FactionWeapon slot2 = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.WeaponModel == secondaryModel).FirstOrDefault();
if (slot2 != null)
slot2.Ammount -= 1;
FactionWeapon slot3 = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.WeaponModel == meleeModel).FirstOrDefault();
if (slot3 != null)
slot3.Ammount -= 1;
FactionWeapon slot4 = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.WeaponModel == specialModel).FirstOrDefault();
if (slot4 != null)
slot4.Ammount -= 1;
FactionWeapon slot5 = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.WeaponModel == armor).FirstOrDefault();
if (slot5 != null)
slot5.Ammount -= 1;
context.SaveChanges();
}
}
[RemoteEvent("CLIENT:Ammunation_BuyWeapon")]
public void AmmunationBuyWeapoon(Player player, string weaponmodel, int ammo, int price)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (user.Handmoney < price)
{
player.SendNotification("Du hast nicht genügend Geld bei dir");
return;
}
user.Handmoney -= price;
dbContext.SaveChanges();
player.GiveWeapon(NAPI.Util.WeaponNameToModel(weaponmodel), ammo);
//client.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney);
}
}
}
}

View File

@@ -324,5 +324,16 @@ namespace ReallifeGamemode.Server.Events
VehicleStreaming.SetDoorState(veh, doorId, DoorState.DoorClosed);
}
}
[RemoteEvent("CLIENT:VehicleMenu_UseSeatbelt")]
public void VehicleMenuUseSeatbelt(Player player)
{
if (!player.IsInVehicle)
{
return;
}
player.TriggerEvent("SERVER:ChangeSeatbeltState");
}
}
}

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

@@ -0,0 +1,141 @@
using System;
using System.Linq;
using GTANetworkAPI;
using Microsoft.Extensions.Logging;
using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Log;
using ReallifeGamemode.Server.Managers;
namespace ReallifeGamemode.Server.Events
{
public class Weapon : Script
{
private ILogger logger = LogManager.GetLogger<Weapon>();
private const int SLOT_PRIMARY = 2;
private const int SLOT_SECONDARY = 1;
private const int SLOT_MEELE = 3;
private const int SLOT_SPECIAL = 4;
[RemoteEvent("saveWeaponSelection")]
public void SaveWeaponSelection(Player client, string primaryModel, string secondaryModel, string meleeModel, string specialModel, string armor)
{
using var dbContext = new DatabaseContext();
User user = client.GetUser(dbContext);
WeaponPoint nearestWeapon = PositionManager.WeaponPoints.Find(w => w.Position.DistanceTo(client.Position) <= 1.5 && w.FactionId == user.FactionId);
if (nearestWeapon == null)
{
client.SendChatMessage("~y~Du bist nicht mehr an deinem Waffenschrank!");
return;
}
if (!string.IsNullOrEmpty(primaryModel))
{
HandleSlot(user, client, 2, primaryModel, dbContext);
}
if (!string.IsNullOrEmpty(secondaryModel))
{
HandleSlot(user, client, 1, secondaryModel, dbContext);
}
if (!string.IsNullOrEmpty(meleeModel))
{
HandleSlot(user, client, 3, meleeModel, dbContext);
}
if (!string.IsNullOrEmpty(specialModel))
{
HandleSlot(user, client, 4, specialModel, dbContext);
}
dbContext.SaveChanges();
if (armor == "Schutzweste")
{
logger.LogInformation("Player {0} took armor from weaponrack of faction {1}", user.Name, user.FactionId);
client.SafeSetArmor(100);
}
}
public void HandleSlot(User user, Player player, int slot, string selection, DatabaseContext context)
{
string weapon = GetRealWeaponModelName(selection);
uint hashKey = NAPI.Util.GetHashKey(weapon);
if (!Enum.GetValues(typeof(WeaponHash)).Cast<WeaponHash>().Contains((WeaponHash)hashKey))
{
logger.LogWarning("Player {0} tried to take invalid weapon {1} from weaponrack of faction {2}", user.Name, selection, user.FactionId);
return;
}
var slotWeapons = context.FactionWeapons.Where(w => w.FactionId == user.FactionId && w.SlotID == slot).ToList();
foreach (var slotWeaponHash in slotWeapons.Select(w => NAPI.Util.GetHashKey(GetRealWeaponModelName(w.WeaponModel))))
{
player.RemoveWeapon((WeaponHash)slotWeaponHash);
}
var chosenWeapon = slotWeapons.Where(w => w.WeaponModel == selection).FirstOrDefault();
if (chosenWeapon == null)
{
logger.LogWarning("Player {0} tried to take not-existing weapon {1} from weaponrack of faction {2}", user.Name, selection, user.FactionId);
return;
}
int ammo = GetSlotAmmoAmount(slot);
player.GiveWeapon((WeaponHash)hashKey, ammo);
player.SetWeaponAmmo((WeaponHash)hashKey, ammo);
chosenWeapon.Ammount -= 1;
logger.LogInformation("Player {0} took weapon {1} from weaponrack of faction {2}", user.Name, selection, user.FactionId);
}
private int GetSlotAmmoAmount(int slot) => slot switch
{
SLOT_PRIMARY => 500,
SLOT_SECONDARY => 250,
SLOT_MEELE => 1,
SLOT_SPECIAL => 20,
_ => 1
};
private string GetRealWeaponModelName(string weapon)
{
string ret = "weapon_" + weapon.ToLower();
if (!ret.Contains("_mk2") && ret.Contains("mk2"))
{
ret = ret.Replace("mk2", "_mk2");
}
return ret;
}
[RemoteEvent("CLIENT:Ammunation_BuyWeapon")]
public void AmmunationBuyWeapoon(Player player, string weaponmodel, int ammo, int price)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (user.Handmoney < price)
{
player.SendNotification("Du hast nicht genügend Geld bei dir");
return;
}
logger.LogInformation("Player {0} bought a {1} in ammunation", user.Name, weaponmodel);
user.Handmoney -= price;
dbContext.SaveChanges();
player.GiveWeapon(NAPI.Util.WeaponNameToModel(weaponmodel), ammo);
//client.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney);
}
}
}
}

View File

@@ -103,7 +103,7 @@ namespace ReallifeGamemode.Server.Extensions
int factionMoney = user.Wanteds * 6;
var executiveFactions = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1 || f.Id == 3);
foreach(var faction in executiveFactions)
foreach (var faction in executiveFactions)
{
faction.BankAccount.Balance += factionMoney;
}
@@ -186,6 +186,11 @@ namespace ReallifeGamemode.Server.Extensions
return player.HasData("Adminduty") ? player.GetData<bool>("Adminduty") : false;
}
public static bool IsTSupport(this Player player)
{
return player.HasData("SAdminduty") ? player.GetData<bool>("SAdminduty") : false;
}
public static Vector3 GetPositionFromPlayer(Player player, float distance, int offset = 0)
{
var pos = player.Position;
@@ -224,8 +229,7 @@ namespace ReallifeGamemode.Server.Extensions
dbUser.SetBlipAndNametagColor();
dbContext.SaveChanges();
}
ChatService.SendMessage(user.Player, "!{#FF614A}Du hast ein Verbrechen begangen: " + reason + "" + (cop != null ? " | Gemeldet von: " + cop.Name + "." : ""));
ChatService.SendMessage(user.Player, " !{#FFFF00}Fahndungslevel:~s~ " + newWanteds);
user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + " (" + newWanteds + ")", "DIA_POLICE", 1, true, 6);
foreach (var copPlayer in NAPI.Pools.GetAllPlayers())
{
@@ -285,7 +289,7 @@ namespace ReallifeGamemode.Server.Extensions
if (mins == 0)
{
ChatService.Broadcast("!{#FF4040}[BAN] " + user.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]");
ChatService.Broadcast("!{#FF4040}[BAN] ~w~" + user.Name + " wurde von " + admin.Name + " permanent gebannt (Grund: " + reason + ").");
banUser = new Ban { UserId = user.Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp };
user.Player?.Kick();
@@ -294,7 +298,7 @@ namespace ReallifeGamemode.Server.Extensions
}
else
{
ChatService.Broadcast("!{#FF4040}[BAN] " + user.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]");
ChatService.Broadcast("!{#FF4040}[BAN] ~w~" + user.Name + " wurde von " + admin.Name + " für " + mins + " Minute(n) gebannt (Grund: " + reason + ").");
banUser = new Ban { UserId = user.Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp + mins * 60 };
user.Player?.Kick();
}
@@ -352,7 +356,7 @@ namespace ReallifeGamemode.Server.Extensions
}
bool duty = user.GetData<bool>("duty");
bool adminUnshow = user.GetData<bool>("adminUnshow");
bool adminUnshow = player.GetData<bool>("adminUnshow");
if (adminUnshow)
{

View File

@@ -11,15 +11,15 @@ namespace ReallifeGamemode.Server.WeaponDeal
{
class BasePoints
{
public void getbase(int? factionID, Player client)
{
if (factionID == 1)
{
client.TriggerEvent("SERVER:Util_setWaypoint", 428.07, -977.88); // LSPD
}
else if( factionID == 2)
else if (factionID == 2)
{
client.TriggerEvent("SERVER:Util_setWaypoint", 1157.56, -1518.56); // Sanitäter
}
@@ -45,7 +45,7 @@ namespace ReallifeGamemode.Server.WeaponDeal
}
else if (factionID == 8)
{
client.TriggerEvent("SERVER:Util_setWaypoint", 1209.42, -1628.65); // Ballas
client.TriggerEvent("SERVER:Util_setWaypoint", 1381.08, -1505.67); // Ballas
}
else if (factionID == 9)
{

View File

@@ -185,14 +185,14 @@ namespace ReallifeGamemode.Server.Finance
}
}
if (paycheck.Amount > 0)
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt + $~g~" + paycheck.Amount + "~s~.");
ChatService.SendMessage(client, $"~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt ~g~+{ paycheck.Amount.ToMoneyString() }~s~.");
else
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt - $~r~" + paycheck.Amount + "~s~.");
ChatService.SendMessage(client, $"~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt ~r~-{ Math.Abs(paycheck.Amount).ToMoneyString() }~s~.");
if (putInJail != 0 && minusJail)
{
u.JailTime = putInJail * 60;
ChatService.SendMessage(client, "Du hattest beim PayDay einen negativen Betrag auf deinem Bank-Konto, dafür wirst du eingesperrt.");
ChatService.SendMessage(client, "Du hattest beim PayDay einen negativen Betrag auf deinem Bankkonto, dafür wirst du eingesperrt.");
ChatService.SendMessage(client, "Achte darauf, keinen negativen Geldbetrag zu besitzen.");
}
@@ -200,7 +200,7 @@ namespace ReallifeGamemode.Server.Finance
if (putInJail != 0 && minusJail)
{
Jail.Check_PutBehindBars(u, "cell");
Jail.Check_PutBehindBars(u, JailInLocations.InCell);
}
}

View File

@@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using Newtonsoft.Json;
@@ -13,6 +13,7 @@ namespace ReallifeGamemode.Server.Gangwar
{
public static Turf[] _loadedTurfs;
private static List<Turfs> turfs;
public const int GANGWAR_TOTAL_TIME = 900;
public static void loadTurfs()
{
@@ -56,7 +57,8 @@ namespace ReallifeGamemode.Server.Gangwar
if (killerInsideTurf && victimInsideTurf)
{
NAPI.Util.ConsoleOutput($"GangwarKill - Victim {victim.Name} - Killer and Victim are in Turf area");
NAPI.Util.ConsoleOutput($"GangwarKill - Victim {victim.Name} - Killer and Victim are in Turf area");
killer.TriggerEvent("gangWarKillNotification", victim.Name);
foreach (var turf in getTurfs())
{
if (turf.getId() == victim.GetData<int>("inGangWar"))

View File

@@ -142,7 +142,7 @@ namespace ReallifeGamemode.Server.Gangwar
continue;
}
gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, 900 - timerCount);
gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, Gangwar.GANGWAR_TOTAL_TIME - timerCount);
}
/*if (this.Att_Score >= 200)
{
@@ -153,7 +153,7 @@ namespace ReallifeGamemode.Server.Gangwar
this.takeOver(this.Owner);
}*/
timerCount += 1;
if (timerCount >= 900) //change to 900 (seconds) before release for testing reasons change to whatever you like
if (timerCount >= Gangwar.GANGWAR_TOTAL_TIME)
{
if (this.Att_Score > this.Def_Score)
{
@@ -279,7 +279,7 @@ namespace ReallifeGamemode.Server.Gangwar
}
else if (getOwner() != FactionName)
{
takeOverMessage = $"~y~[GANGWAR] ~w~Die {getAttacker()} konnten das Gebiet ~g~{getName()} ~w~ der {getAttacker()} erfolgreich erobern.";
takeOverMessage = $"~y~[GANGWAR] ~w~Die {getAttacker()} konnten das Gebiet ~g~{getName()} ~w~ der {getOwner()} erfolgreich erobern.";
//ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", ownerFaction);
//ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte erfolgreich das Gebiet ~g~" + getName() + "~w~ erobern.", attackerFaction);
foreach (var o in owners)
@@ -312,6 +312,7 @@ namespace ReallifeGamemode.Server.Gangwar
c.TriggerEvent("CLIENT:setAttackBlip", false, TurfID);
c.ResetData("inGangWar");
c.ResetData("GotInsideOfTurf");
c.TriggerEvent("resetKillcounter");
}
this.playerInGangwar = null;
this.status = "conquered";

View File

@@ -146,6 +146,9 @@ namespace ReallifeGamemode.Server
Introduction.Setup();
PositionManager.LoadPositionManager();
LoadManager.LoadLoadManager();
Rentcar.Setup();
World.WeatherSync.Load();
TempBlip tempBlip = new TempBlip()
{

View File

@@ -1,13 +1,32 @@
using System.Linq;
using GTANetworkAPI;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Events;
using ReallifeGamemode.Server.Extensions;
namespace ReallifeGamemode.Server.Managers
{
public class CharacterCreator : Script
{
public static Vector3 surgeryPoint = new Vector3(342.30032, -1397.7542, 32.50923);
public const int SURGERY_PRICE = 15000;
public CharacterCreator()
{
//LoadSurgery();
}
private void LoadSurgery()
{
var point = surgeryPoint;
NAPI.Marker.CreateMarker(1, new Vector3(point.X, point.Y, point.Z - 2), new Vector3(point.X, point.Y, point.Z + 1),
new Vector3(0, 0, 0), 2, new Color(255, 255, 255, 50), false, 0);
NAPI.TextLabel.CreateTextLabel("Chirurg - Dr\u00fccke ~y~E", point, 7, 1, 0, new Color(255, 255, 255), false, 0);
}
[RemoteEvent("creator_GenderChange")]
public void changeGender(Player player, int gender)
{
@@ -50,27 +69,27 @@ namespace ReallifeGamemode.Server.Managers
float neckWidth = jFeatureData.Value<float>(19);
byte blemishes = jAppearanceData[0].Value<byte>("Value");
float blemishesOpacity = jAppearanceData[0].Value<byte>("Opacity");
float blemishesOpacity = jAppearanceData[0].Value<float>("Opacity");
byte facialHair = jAppearanceData[1].Value<byte>("Value");
float facialHairOpacity = jAppearanceData[1].Value<byte>("Opacity");
float facialHairOpacity = jAppearanceData[1].Value<float>("Opacity");
byte eyebrows = jAppearanceData[2].Value<byte>("Value");
float eyebrowsOpacity = jAppearanceData[2].Value<byte>("Opacity");
float eyebrowsOpacity = jAppearanceData[2].Value<float>("Opacity");
byte ageing = jAppearanceData[3].Value<byte>("Value");
float ageingOpacity = jAppearanceData[3].Value<byte>("Opacity");
float ageingOpacity = jAppearanceData[3].Value<float>("Opacity");
byte makeup = jAppearanceData[4].Value<byte>("Value");
float makeupOpacity = jAppearanceData[4].Value<byte>("Opacity");
float makeupOpacity = jAppearanceData[4].Value<float>("Opacity");
byte blush = jAppearanceData[5].Value<byte>("Value");
float blushOpacity = jAppearanceData[5].Value<byte>("Opacity");
float blushOpacity = jAppearanceData[5].Value<float>("Opacity");
byte complexion = jAppearanceData[6].Value<byte>("Value");
float complexionOpacity = jAppearanceData[6].Value<byte>("Opacity");
float complexionOpacity = jAppearanceData[6].Value<float>("Opacity");
byte sunDamage = jAppearanceData[7].Value<byte>("Value");
float sunDamageOpacity = jAppearanceData[7].Value<byte>("Opacity");
float sunDamageOpacity = jAppearanceData[7].Value<float>("Opacity");
byte lipstick = jAppearanceData[8].Value<byte>("Value");
float lipstickOpacity = jAppearanceData[8].Value<byte>("Opacity");
float lipstickOpacity = jAppearanceData[8].Value<float>("Opacity");
byte freckles = jAppearanceData[9].Value<byte>("Value");
float frecklesOpacity = jAppearanceData[9].Value<byte>("Opacity");
float frecklesOpacity = jAppearanceData[9].Value<float>("Opacity");
byte chestHair = jAppearanceData[10].Value<byte>("Value");
float chestHairOpacity = jAppearanceData[10].Value<byte>("Opacity");
float chestHairOpacity = jAppearanceData[10].Value<float>("Opacity");
byte hair = jHairAndColorData.Value<byte>(0);
byte hairColor = jHairAndColorData.Value<byte>(1);
@@ -82,8 +101,26 @@ namespace ReallifeGamemode.Server.Managers
byte lipstickColor = jHairAndColorData.Value<byte>(7);
byte chestHairColor = jHairAndColorData.Value<byte>(8);
var charExists = false;
var genderSwap = false;
using (var saveCharacter = new DatabaseContext())
{
var userId = player.GetUser(saveCharacter).Id;
var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId);
var oldChar = saveCharacter.Characters.FirstOrDefault(c => c.UserId == user.Id);
if (user.CharacterId != null)
{
charExists = true;
if (oldChar.Gender != gender)
{
genderSwap = true;
}
}
var character = new Database.Entities.Character
{
UserId = player.GetUser().Id,
@@ -148,30 +185,19 @@ namespace ReallifeGamemode.Server.Managers
ChestHairColor = chestHairColor
};
saveCharacter.Characters.Add(character);
saveCharacter.SaveChanges();
var userId = player.GetUser().Id;
var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId);
user.CharacterId = character.Id;
for (var x = 1; x <= 11; x++)
if (genderSwap)
{
var s = 0;
if (x == 10) s = -1;
if (x == 2) continue;
var createClothes = new Database.Entities.CharacterCloth()
{
UserId = userId,
Duty = false,
SlotType = 0,
SlotId = x,
ClothId = s,
Texture = 0
};
saveCharacter.CharacterClothes.Add(createClothes);
var charClothes = saveCharacter.CharacterClothes.Where(c => c.UserId == user.Id);
saveCharacter.RemoveRange(charClothes);
saveCharacter.SaveChanges();
}
for (var x = 0; x <= 7; x++)
{
var y = 0;
@@ -219,16 +245,19 @@ namespace ReallifeGamemode.Server.Managers
break;
};
}
var createClothes = new Database.Entities.CharacterCloth()
if (!charExists || genderSwap)
{
UserId = userId,
Duty = false,
SlotType = 1,
SlotId = x,
ClothId = y,
Texture = 0
};
saveCharacter.CharacterClothes.Add(createClothes);
var createClothes = new Database.Entities.CharacterCloth()
{
UserId = userId,
Duty = false,
SlotType = 1,
SlotId = x,
ClothId = y,
Texture = 0
};
saveCharacter.CharacterClothes.Add(createClothes);
}
}
else
{
@@ -236,6 +265,18 @@ namespace ReallifeGamemode.Server.Managers
}
}
if (charExists)
{
if (user.FreeSurgery == true)
{
user.FreeSurgery = false;
}
else
{
user.BankAccount.Balance -= SURGERY_PRICE;
}
saveCharacter.Remove(oldChar);
}
saveCharacter.SaveChanges();
}
//HeadOverlay makeupHo = new HeadOverlay()
@@ -254,9 +295,19 @@ namespace ReallifeGamemode.Server.Managers
//};
//player.SetHeadOverlay(4, makeupHo);
//player.SetHeadOverlay(5, blushHo);
player.SafeTeleport(Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING, true);
player.TriggerEvent("draw", player.Name, player.Handle.Value);
player.Dimension = 0;
if (charExists)
{
LeaveSurgery(player);
}
else
{
player.SafeTeleport(Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING, true);
player.TriggerEvent("draw", player.Name, player.Handle.Value);
player.Dimension = 0;
}
ApplyCharacter(player);
UpdateCharacterCloth.LoadCharacterDefaults(player);
}
/// <summary>
@@ -409,5 +460,224 @@ namespace ReallifeGamemode.Server.Managers
NAPI.Player.SetPlayerEyeColor(player, character.EyeColor);
}
}
public static void StartSurgery(Player player)
{
/*
Character c = player.GetUser().GetCharacter();
var PlayerCharacterData = new
{
Gender = c.Gender,
Father = c.Father,
Mother = c.Mother,
Similarity = c.Similarity,
SkinSimilarity = c.SkinSimilarity,
NoseWidth = c.NoseWidth,
NoseBottomHeight = c.NoseBottomHeight,
NoseTipLength = c.NoseTipLength,
NoseBridgeDepth = c.NoseBridgeDepth,
NoseTipHeight = c.NoseTipHeight,
NoseBroken = c.NoseBroken,
BrowHeight = c.BrowHeight,
BrowDepth = c.BrowDepth,
CheekboneHeight = c.CheekboneHeight,
CheekboneWidth = c.CheekboneWidth,
CheekDepth = c.CheekDepth,
EyeSize = c.EyeSize,
LipThickness = c.LipThickness,
JawWidth = c.JawWidth,
JawShape = c.JawShape,
ChinHeight = c.ChinHeight,
ChinDepth = c.ChinDepth,
ChinWidth = c.ChinWidth,
ChinIndent = c.ChinIndent,
NeckWidth = c.NeckWidth,
Blemishes = c.Blemishes,
BlemishesOpacity = c.BlemishesOpacity,
FacialHair = c.FacialHair,
FacialHairOpacity = c.FacialHairOpacity,
Eyebrows = c.Eyebrows,
EyebrowsOpacity = c.EyebrowsOpacity,
Ageing = c.Ageing,
AgeingOpacity = c.AgeingOpacity,
Makeup = c.Makeup,
MakeupOpacity = c.MakeupOpacity,
Blush = c.Blush,
BlushOpacity = c.BlushOpacity,
Complexion = c.Complexion,
ComplexionOpacity = c.ComplexionOpacity,
SunDamage = c.SunDamage,
SunDamageOpacity = c.SunDamageOpacity,
Lipstick = c.Lipstick,
LipstickOpacity = c.LipstickOpacity,
Freckles = c.Freckles,
FrecklesOpacity = c.FrecklesOpacity,
ChestHair = c.ChestHair,
ChestHairOpacity = c.ChestHairOpacity,
Hair = c.Hair,
HairColor = c.HairColor,
HairHighlightColor = c.HairHighlightColor,
EyebrowColor = c.EyebrowColor,
BeardColor = c.BeardColor,
EyeColor = c.EyeColor,
BlushColor = c.BlushColor,
LipstickColor = c.LipstickColor,
ChestHairColor = c.ChestHairColor
};*/
var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension");
currentPlayerCreatorDimension++;
NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
player.SafeTeleport(new Vector3(266.472, -1339.1357, 24.5378));
player.Heading = 146.35101f;
player.TriggerEvent("toggleCreator", true);
}
[RemoteEvent("surgeryLeave")]
public static void LeaveSurgery(Player player)
{
player.Dimension = 0;
player.SafeTeleport(surgeryPoint, -180, true);
ApplyCharacter(player);
UpdateCharacterCloth.LoadCharacterDefaults(player);
}
[RemoteEvent("SaveSurgery")]
public static void SaveSurgery(Player player, bool gender, string parentData, string featureData, string appearanceData, string hairAndColorData)
{
player.SafeTeleport(new Vector3(258.581, -1345.1406, 24.5378), Main.DEFAULT_SPAWN_HEADING, true);
var jParentData = JObject.Parse(parentData);
var jFeatureData = JArray.Parse(featureData);
var jAppearanceData = JArray.Parse(appearanceData);
var jHairAndColorData = JArray.Parse(hairAndColorData);
byte father = jParentData.Value<byte>("Father");
byte mother = jParentData.Value<byte>("Mother");
float similarity = jParentData.Value<float>("Similarity");
float skinSimilarity = jParentData.Value<float>("SkinSimilarity");
float noseWidth = jFeatureData.Value<float>(0);
float noseBottomHeight = jFeatureData.Value<float>(1);
float noseTipLength = jFeatureData.Value<float>(2);
float noseBridgeDepth = jFeatureData.Value<float>(3);
float noseTipHeight = jFeatureData.Value<float>(4);
float noseBroken = jFeatureData.Value<float>(5);
float browHeight = jFeatureData.Value<float>(6);
float browDepth = jFeatureData.Value<float>(7);
float cheekboneHeight = jFeatureData.Value<float>(8);
float cheekboneWidth = jFeatureData.Value<float>(9);
float cheekDepth = jFeatureData.Value<float>(10);
float eyeSize = jFeatureData.Value<float>(11);
float lipThickness = jFeatureData.Value<float>(12);
float jawWidth = jFeatureData.Value<float>(13);
float jawShape = jFeatureData.Value<float>(14);
float chinHeight = jFeatureData.Value<float>(15);
float chinDepth = jFeatureData.Value<float>(16);
float chinWidth = jFeatureData.Value<float>(17);
float chinIndent = jFeatureData.Value<float>(18);
float neckWidth = jFeatureData.Value<float>(19);
byte blemishes = jAppearanceData[0].Value<byte>("Value");
float blemishesOpacity = jAppearanceData[0].Value<byte>("Opacity");
byte facialHair = jAppearanceData[1].Value<byte>("Value");
float facialHairOpacity = jAppearanceData[1].Value<byte>("Opacity");
byte eyebrows = jAppearanceData[2].Value<byte>("Value");
float eyebrowsOpacity = jAppearanceData[2].Value<byte>("Opacity");
byte ageing = jAppearanceData[3].Value<byte>("Value");
float ageingOpacity = jAppearanceData[3].Value<byte>("Opacity");
byte makeup = jAppearanceData[4].Value<byte>("Value");
float makeupOpacity = jAppearanceData[4].Value<byte>("Opacity");
byte blush = jAppearanceData[5].Value<byte>("Value");
float blushOpacity = jAppearanceData[5].Value<byte>("Opacity");
byte complexion = jAppearanceData[6].Value<byte>("Value");
float complexionOpacity = jAppearanceData[6].Value<byte>("Opacity");
byte sunDamage = jAppearanceData[7].Value<byte>("Value");
float sunDamageOpacity = jAppearanceData[7].Value<byte>("Opacity");
byte lipstick = jAppearanceData[8].Value<byte>("Value");
float lipstickOpacity = jAppearanceData[8].Value<byte>("Opacity");
byte freckles = jAppearanceData[9].Value<byte>("Value");
float frecklesOpacity = jAppearanceData[9].Value<byte>("Opacity");
byte chestHair = jAppearanceData[10].Value<byte>("Value");
float chestHairOpacity = jAppearanceData[10].Value<byte>("Opacity");
//byte hair = jHairAndColorData.Value<byte>(0);
//byte hairColor = jHairAndColorData.Value<byte>(1);
//byte hairHighlightColor = jHairAndColorData.Value<byte>(2);
byte eyebrowColor = jHairAndColorData.Value<byte>(0);
byte beardColor = jHairAndColorData.Value<byte>(1);
byte eyeColor = jHairAndColorData.Value<byte>(2);
byte blushColor = jHairAndColorData.Value<byte>(3);
byte lipstickColor = jHairAndColorData.Value<byte>(4);
byte chestHairColor = jHairAndColorData.Value<byte>(5);
using (var saveCharacter = new DatabaseContext())
{
var character = new Database.Entities.Character
{
UserId = player.GetUser().Id,
Gender = gender,
Father = father,
Mother = mother,
Similarity = similarity,
SkinSimilarity = skinSimilarity,
NoseWidth = noseWidth,
NoseBottomHeight = noseBottomHeight,
NoseTipLength = noseTipLength,
NoseBridgeDepth = noseBridgeDepth,
NoseTipHeight = noseTipHeight,
NoseBroken = noseBroken,
BrowHeight = browHeight,
BrowDepth = browDepth,
CheekboneHeight = cheekboneHeight,
CheekboneWidth = cheekboneWidth,
CheekDepth = cheekDepth,
EyeSize = eyeSize,
LipThickness = lipThickness,
JawWidth = jawWidth,
JawShape = jawShape,
ChinHeight = chinHeight,
ChinDepth = chinDepth,
ChinWidth = chinWidth,
ChinIndent = chinIndent,
NeckWidth = neckWidth,
Blemishes = blemishes,
BlemishesOpacity = blemishesOpacity,
FacialHair = facialHair,
FacialHairOpacity = facialHairOpacity,
Eyebrows = eyebrows,
EyebrowsOpacity = eyebrowsOpacity,
Ageing = ageing,
AgeingOpacity = ageingOpacity,
Makeup = makeup,
MakeupOpacity = makeupOpacity,
Blush = blush,
BlushOpacity = blushOpacity,
Complexion = complexion,
ComplexionOpacity = complexionOpacity,
SunDamage = sunDamage,
SunDamageOpacity = sunDamageOpacity,
Lipstick = lipstick,
LipstickOpacity = lipstickOpacity,
Freckles = freckles,
FrecklesOpacity = frecklesOpacity,
ChestHair = chestHair,
ChestHairOpacity = chestHairOpacity,
EyebrowColor = eyebrowColor,
BeardColor = beardColor,
EyeColor = eyeColor,
BlushColor = blushColor,
LipstickColor = lipstickColor,
ChestHairColor = chestHairColor
};
}
ApplyCharacter(player);
}
}
}

View File

@@ -24,7 +24,7 @@ namespace ReallifeGamemode.Server.Managers
{
foreach (Door door in dbContext.Doors)
{
_doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, 30f);
_doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, door.AlwaysOpen ? 200f : 30f);
}
}
}
@@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Managers
player.SendNotification(notStr, true);
NAPI.Pools.GetAllPlayers().ForEach(p => p.TriggerEvent("changeDoorState", d.Model, d.X, d.Y, d.Z, (d.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f));
NAPI.Pools.GetAllPlayers().ForEach(p => UpdateDoorState(p, d));
}
}
dbContext.SaveChanges();
@@ -80,9 +80,14 @@ namespace ReallifeGamemode.Server.Managers
using (var dbContext = new DatabaseContext())
{
Door door = dbContext.Doors.Where(d => d.Id == doorId).First();
player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f);
UpdateDoorState(player, door);
}
}
}
private static void UpdateDoorState(Player player, Door door)
{
player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked || door.AlwaysOpen ? 1 : 0), 0.0f, 0.0f, door.AlwaysOpen ? 1.0f : 0.0f);
}
}
}

View File

@@ -752,6 +752,12 @@ namespace ReallifeGamemode.Server.Managers
[RemoteEvent("CLIENT:InteractionMenu_Pay")]
public void InteractionMenu_Pay(Player player, string jsonNameOrId, string stringAmount)
{
if (player.GetUser().PlayedMinutes < 180)
{
player.SendNotification("~r~Du kannst Geld erst ab 3 Spielstunden vergeben");
return;
}
string nameOrId = (string)JsonConvert.DeserializeObject(jsonNameOrId);
int amount;
try

View File

@@ -531,8 +531,7 @@ namespace ReallifeGamemode.Server.Managers
{
if (usableItemObj.Use(fItem))
{
List<InventoryItem> items = backpackItems[player];
player.SetSharedData("backpackItems", JsonConvert.SerializeObject(items.ToArray()));
SetBackpackItems(player);
player.TriggerEvent("aproveUse", 1, iItem.Name);
}
}
@@ -590,6 +589,7 @@ namespace ReallifeGamemode.Server.Managers
break;
}
context.SaveChanges();
}
}

View File

@@ -32,6 +32,8 @@ namespace ReallifeGamemode.Server.Managers
public static List<AmmunationPoint> AmmunationPoints = new List<AmmunationPoint>();
public static List<RentcarPoint> rentcarPoints = new List<RentcarPoint>();
public static Vector3 eventportPosition;
public static bool eventportActive = false;
@@ -83,7 +85,7 @@ namespace ReallifeGamemode.Server.Managers
};
WeaponPoint weaponPointBallas = new WeaponPoint()
{
Position = new Vector3(1217.748, -1639.349, 47.77029),
Position = new Vector3(1381.08, -1505.67, 58.04),
FactionId = 8
};
WeaponPoint weaponPointGrove = new WeaponPoint()
@@ -151,7 +153,7 @@ namespace ReallifeGamemode.Server.Managers
};
ElevatorPoint FibElevatorPointGarage = new ElevatorPoint()
{
Position = new Vector3(124.2521, -741.3329, 33.13322), //FBI ganz ganz unten
Position = new Vector3(125.172, -739.3329, 33.13322), //FBI ganz ganz unten
FactionId = 3,
Stage = "Garage"
};
@@ -307,8 +309,47 @@ namespace ReallifeGamemode.Server.Managers
}
#endregion Shops
#region RentCar
RentcarPoint rentCarNoobSpawn = new RentcarPoint()
{
Position = Rentcar.noobSpawnBlipPosition
};
RentcarPoint rentCarStadthalle = new RentcarPoint()
{
Position = Rentcar.stadthalleBlipPosition
};
RentcarPoint rentCarKnast = new RentcarPoint()
{
Position = Rentcar.knastBlipPosition
};
RentcarPoint rentCarPaleto = new RentcarPoint()
{
Position = Rentcar.paletoBlipPosition
};
RentcarPoint rentCarLamesa = new RentcarPoint()
{
Position = Rentcar.lamesaBlipPosition
};
rentcarPoints.Add(rentCarNoobSpawn);
rentcarPoints.Add(rentCarLamesa);
rentcarPoints.Add(rentCarStadthalle);
rentcarPoints.Add(rentCarKnast);
rentcarPoints.Add(rentCarPaleto);
foreach (RentcarPoint point in rentcarPoints)
{
NAPI.Marker.CreateMarker(1, new Vector3(point.Position.X, point.Position.Y, point.Position.Z - 2), new Vector3(point.Position.X, point.Position.Y, point.Position.Z + 1),
new Vector3(0, 0, 0), 1.5f, new Color(255, 255, 255, 50), false, 0);
NAPI.TextLabel.CreateTextLabel("~y~Fahrzeugverleih\n~w~Drücke ~b~E~w~ um ein Fahrzeug zu mieten", point.Position, 7, 1, 0, new Color(255, 255, 255), false, 0);
NAPI.Blip.CreateBlip(88, new Vector3(point.Position.X, point.Position.Y, point.Position.Z), (float)0.7, 59, "Fahrzeugverleih", 255, 200, true, 0, 0);
}
}
#endregion RentCar
[RemoteEvent("sendClientToStage")]
public void ElevatorSendToStage(Player player, string level)
{
@@ -439,3 +480,9 @@ public class AmmunationPoint
public Vector3 Position { get; set; }
public Ammunation Ammunation { get; set; }
}
public class RentcarPoint
{
public Vector3 Position { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using GTANetworkAPI;
using ReallifeGamemode.Database.Entities;
@@ -35,7 +36,7 @@ namespace ReallifeGamemode.Server.Managers
colShape.OnEntityEnterColShape += (cs, c) =>
{
using var dbContext = new DatabaseContext();
if (c.IsInVehicle && c.VehicleSeat == 0)
if (c.IsInVehicle && c.VehicleSeat == 0 && IsPlayerAllowedToTuneVehicle(c, c.Vehicle, dbContext))
{
c.TriggerEvent("showTuningInfo");
}
@@ -43,12 +44,42 @@ namespace ReallifeGamemode.Server.Managers
colShape.OnEntityExitColShape += (cs, c) =>
{
c.TriggerEvent("hideTuningInfo", true);
if (c.IsInVehicle)
{
c.TriggerEvent("hideTuningInfo", true);
}
};
tuningGarages.Add(colShape);
}
private static bool IsPlayerAllowedToTuneVehicle(Player c, Vehicle vehicle, DatabaseContext dbContext)
{
User user = c.GetUser();
if (user == null)
{
return false;
}
ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext);
if (serverVehicle == null)
{
return false;
}
if (serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id)
{
return true;
}
if (serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0))
{
return true;
}
return false;
}
public static void ApplyTuningToServerVehicle(ServerVehicle sVeh)
{
Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(sVeh);
@@ -58,9 +89,13 @@ namespace ReallifeGamemode.Server.Managers
using (var dbContext = new DatabaseContext())
{
foreach (VehicleMod vMod in dbContext.VehicleMods.ToList().FindAll(vM => vM.ServerVehicleId == sVeh.Id))
foreach (VehicleMod vMod in dbContext.VehicleMods.Where(vM => vM.ServerVehicleId == sVeh.Id).ToList())
{
if (vMod.Slot == 18)
if (vMod.Slot == -2)
{
veh.SetSharedData("wheelType", vMod.ModId);
}
else if (vMod.Slot == 18)
{
veh.SetSharedData("mod" + vMod.Slot, true);
}
@@ -81,7 +116,33 @@ namespace ReallifeGamemode.Server.Managers
{
if (!player.IsInVehicle) return;
player.TriggerEvent("showTuningMenu");
player.TriggerEvent("showTuningMenu", false, GetVehicleBasePrice(player.Vehicle));
}
private int GetVehicleBasePrice(Vehicle vehicle)
{
if (vehicle == null)
{
return 0;
}
ServerVehicle serverVehicle = vehicle.GetServerVehicle();
if (serverVehicle == null)
{
return 0;
}
if (serverVehicle is UserVehicle userVehicle)
{
return userVehicle.Price ?? 0;
}
if (serverVehicle is FactionVehicle factionVehicle)
{
return factionVehicle.BuyPrice;
}
return 0;
}
[RemoteEvent("repairVehicle")]
@@ -200,5 +261,73 @@ namespace ReallifeGamemode.Server.Managers
dbContext.SaveChanges();
}
[RemoteEvent("CLIENT:Tuning_SetVehicleWheels")]
public void TuningManagerSetVehicleWheels(Player player, int wheelType, int wheelIndex, int price)
{
if (!player.IsInVehicle)
{
return;
}
Vehicle vehicle = player.Vehicle;
using var dbContext = new DatabaseContext();
User user = player.GetUser(dbContext);
if (user.BankAccount.Balance < price)
{
player.SendNotification("Du hast nicht genug Geld für dieses Tuningteil!");
return;
}
user.BankAccount.Balance -= price;
player.TriggerEvent("SERVER:Tuning_SetWheelsSuccessfull", wheelType, wheelIndex);
ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext);
if (serverVehicle != null)
{
VehicleMod typeMod = dbContext.VehicleMods.Where(m => m.ServerVehicleId == serverVehicle.Id && m.Slot == -2).FirstOrDefault();
if (typeMod == null)
{
typeMod = new VehicleMod()
{
ServerVehicleId = serverVehicle.Id,
Slot = -2,
ModId = wheelType
};
dbContext.VehicleMods.Add(typeMod);
}
else
{
typeMod.ModId = wheelType;
}
VehicleMod wheelMod = dbContext.VehicleMods.Where(m => m.ServerVehicleId == serverVehicle.Id && m.Slot == 23).FirstOrDefault();
if (wheelMod == null)
{
wheelMod = new VehicleMod()
{
ServerVehicleId = serverVehicle.Id,
Slot = 23,
ModId = wheelIndex
};
dbContext.VehicleMods.Add(wheelMod);
}
else
{
wheelMod.ModId = wheelIndex;
}
dbContext.SaveChanges();
}
vehicle.SetMod(23, wheelIndex);
vehicle.SetSharedData("wheelType", wheelType);
NAPI.ClientEvent.TriggerClientEventForAll("vehicleToggleMod", vehicle, -2, wheelType);
}
}
}

View File

@@ -5,7 +5,9 @@ using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Log;
using ReallifeGamemode.Server.Services;
using ReallifeGamemode.Server.Util;
using ReallifeGamemode.Services;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -689,14 +691,6 @@ namespace ReallifeGamemode.Server.Managers
"thrax",
"zorrusso",
"zion3",
"lsfd", //Mod
"lsfd2", //Mod
"lsfd3", //Mod
"lsfd4", //Mod
"lsfd5", //Mod
"lsfdtruck", //Mod
"lsfdtruck2", //Mod
"lsfdtruck3", //Mod
"polbullet", //Mod
"polbullet2", //Mod
"sherbullet", //Mod
@@ -770,8 +764,7 @@ namespace ReallifeGamemode.Server.Managers
"fibd2",//mod
"fibj",//mod
"fibn3",//mod
"fibr"//mod
"fibr",//mod
};
private static readonly Dictionary<int, ushort> _serverVehicles = new Dictionary<int, ushort>();
@@ -955,6 +948,17 @@ namespace ReallifeGamemode.Server.Managers
[ServerEvent(Event.VehicleDeath)]
public static void VehicleManagerVehicleDeath(Vehicle vehicle)
{
/*
String rentCarOwner = Rentcar.mapPlayerRentcarBill.FirstOrDefault(x => x.Value.Item1 == vehicle).Key;
ChatService.Broadcast("a:" + "");
if (rentCarOwner != null)
{
Player target = PlayerService.GetPlayerByNameOrId(rentCarOwner);
Rentcar.cancelRent(target);
}
*/
ServerVehicle serverVehicle = GetServerVehicleFromVehicle(vehicle);
if (serverVehicle == null)

View File

@@ -42,6 +42,7 @@
<ProjectReference Include="..\ReallifeGamemode.Server.Core.Events\ReallifeGamemode.Server.Core.Events.csproj" />
<ProjectReference Include="..\ReallifeGamemode.Server.Core.RageMP\ReallifeGamemode.Server.Core.RageMP.csproj" />
<ProjectReference Include="..\ReallifeGamemode.Server.Core\ReallifeGamemode.Server.Core.csproj" />
<ProjectReference Include="..\ReallifeGamemode.Server.Log\ReallifeGamemode.Server.Log.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="Bootstrapper">

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using GTANetworkAPI;
using Newtonsoft.Json;
@@ -124,7 +124,7 @@ namespace ReallifeGamemode.Server.Report
{
user = PlayerService.GetPlayerByNameOrId(username);
if (text.Equals("quit"))
if (text.Equals("quit") || text.Equals("close"))
{
ChatService.SendMessage(user, "!{#008fff}[REPORT]!{#FFFFFF} Chat vom Admin beendet");
ChatService.SendMessage(client, "!{#008fff}[REPORT]!{#FFFFFF} Chat beendet");
@@ -180,7 +180,7 @@ namespace ReallifeGamemode.Server.Report
public void RequestReport(Player user, string type, string data)
{
string text = JsonConvert.DeserializeObject<string>(data);
if (type == "Ticket Report")
if (type == "Ticket")
{
ReportManage temp = null;
for (int a = 0; a < listReports.Count; a++)
@@ -213,10 +213,10 @@ namespace ReallifeGamemode.Server.Report
listReports.Add(ticket);
//ChatService.SendMessage(user, "!{#addc8d}In Bearbeitung");
}
if (type == "Quick Report")
if (type == "Quick-Report")
{
ChatService.BroadcastAdmin("!{#008fff}[QR]~w~ " + user.Name + " (" + user.Handle.Value + ")~w~: " + text, AdminLevel.SUPPORTER);
user.SendChatMessage("~w~Dein Quick Report wurde an das Adminteam weitergeleitet");
user.SendChatMessage("~w~Dein Quick-Report wurde an das Adminteam weitergeleitet");
}
}

View File

@@ -14,8 +14,14 @@ namespace ReallifeGamemode.Server.Util
{ ".MichaPlays.", "Der echte Ballas Leader ist online (MichaPlays)" },
{ "iCroniX", "Life of Malle - Eimer für Alle - Alle für Malle - Böllern! (CroniX)" },
{ "balboistderbeste", "Hurra! Hurra! Der Balbo ist jetzt da! (balbo)" },
{ "AirMake", "The fresh breeze of the stone ist back. (AirMake)" },
{ "raviatex", "I'll remember you all in therapy. (aviate)" },
{ "datgame__", "KOPF ENTWICKLUNG!! (hydrant)" },
{ "Roachkook", "2head Entwickler ist wieder online (kookroach)" }
};
public static int newbiePlayedMinutesThreshold = 30 * 60;
public static DateTime CountdownUntil { get; internal set; }
public static string CountdownText { get; internal set; }
}

View File

@@ -0,0 +1,204 @@
using System;
using System.Collections.Generic;
using System.Text;
using GTANetworkAPI;
using ReallifeGamemode.Database.Entities;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Extensions;
using ReallifeGamemode.Server.Managers;
using ReallifeGamemode.Server.Services;
namespace ReallifeGamemode.Server.Util
{
class Rentcar : Script
{
//In Sekunden
public static int PAY_TIMER = 180;
//In Stunden
private static int PAYTIME_FREE = GlobalHelper.newbiePlayedMinutesThreshold / 60;
public static List<RentcarProperty> noobspawnVehicleProperties = new List<RentcarProperty>();
private static Vector3 noobspawnVehicleSpawnPosition = new Vector3(-1020.18695, -2695.2253, 13.988778);
private static double noobspawnVehicleSpawnHeading = 151.39877;
public static Vector3 noobSpawnBlipPosition = new Vector3(-1023.3046, -2694.8992, 13.906858);
public static List<RentcarProperty> stadthalleVehicleProperties = new List<RentcarProperty>();
private static Vector3 stadthalleVehicleSpawnPosition = new Vector3(-373, -236.31334, 35.8506);
private static double stadthalleVehicleSpawnHeading = 109.96821;
public static Vector3 stadthalleBlipPosition = new Vector3(-369.7236, -231.82654, 35.993023);
public static List<RentcarProperty> knastVehicleProperties = new List<RentcarProperty>();
private static Vector3 knastVehicleSpawnPosition = new Vector3(1212.741, 2726.6135, 38.00415);
private static double knastVehicleSpawnHeading = 173.14825;
public static Vector3 knastBlipPosition = new Vector3(1220.3483, 2725.4932, 38.00414);
public static List<RentcarProperty> paletoVehicleProperties = new List<RentcarProperty>();
private static Vector3 paletoVehicleSpawnPosition = new Vector3(-216.75778198242188, 6215.0068359375, 31.490657806396484);
private static double paletoVehicleSpawnHeading = -133.99148559570312;
public static Vector3 paletoBlipPosition = new Vector3(-214.52447509765625, 6218.1708984375, 31.49131965637207);
public static List<RentcarProperty> lamesaVehicleProperties = new List<RentcarProperty>();
private static Vector3 lamesaVehicleSpawnPosition = new Vector3(811.4766235351562, -1041.594482421875, 26.58707618713379);
private static double lamesaVehicleSpawnHeading = 88.71146392822266;
public static Vector3 lamesaBlipPosition = new Vector3(818.3075561523438, -1039.78759765625, 26.750783920288086);
public static Dictionary<string, (Vehicle, int)> mapPlayerRentcarBill = new Dictionary<string, (Vehicle, int)>();
public static void Setup()
{
noobspawnVehicleProperties.Add(new RentcarProperty("bmx", 10));
noobspawnVehicleProperties.Add(new RentcarProperty("faggio3", 50));
stadthalleVehicleProperties.Add(new RentcarProperty("bmx", 10));
stadthalleVehicleProperties.Add(new RentcarProperty("faggio3", 50));
knastVehicleProperties.Add(new RentcarProperty("bmx", 10));
knastVehicleProperties.Add(new RentcarProperty("faggio3", 50));
paletoVehicleProperties.Add(new RentcarProperty("bmx", 10));
paletoVehicleProperties.Add(new RentcarProperty("faggio3", 50));
lamesaVehicleProperties.Add(new RentcarProperty("bmx", 10));
lamesaVehicleProperties.Add(new RentcarProperty("faggio3", 50));
}
public static void cancelRent(Player player)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
user.BankAccount.Balance -= mapPlayerRentcarBill[player.Name].Item2;
dbContext.SaveChanges();
}
player.SetData("hasRentcar", false);
player.TriggerEvent("abortRentcarTimer");
player.SendChatMessage("~y~[Fahrzeugverleih] ~w~Mietfahrzeug erfolgreich gekündigt (Kosten: ~g~$~w~" + mapPlayerRentcarBill[player.Name].Item2 + ").");
VehicleManager.DeleteVehicle(mapPlayerRentcarBill[player.Name].Item1);
Rentcar.mapPlayerRentcarBill.Remove(player.Name);
}
[RemoteEvent("SERVER:updateRentCarBill")]
public void updateRentCarBill(Player player, int bill, int time)
{
if (canRentForFree(player))
{
return;
}
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (bill > user.BankAccount.Balance)
{
ChatService.ErrorMessage(player, "Du hast nicht genügend Geld auf dem Konto. Dein Mietfahrzeug wurde zurückgegeben");
cancelRent(player);
dbContext.SaveChanges();
return;
}
dbContext.SaveChanges();
}
if (!mapPlayerRentcarBill.ContainsKey(player.Name))
{
return;
}
player.TriggerEvent("BN_Show", "Fahrzeug seit ~b~" + (int)(time / 60) + "~w~ Minuten gemietet (Gesamtkosten: ~g~$~s~" + bill + ").");
mapPlayerRentcarBill[player.Name] = (mapPlayerRentcarBill[player.Name].Item1, bill);
}
[RemoteEvent("SERVER:rentcarBooked")]
public void rentcarBooked(Player player, string vehicleName, int price, String rentcarLocation)
{
if (player.GetData<bool>("hasRentcar") == true)
{
ChatService.ErrorMessage(player, "Du hast bereits ein Fahrzeug gemietet. Mit '/rent stop' kündigst du deinen bisherigen Mietvertrag");
return;
}
if (!uint.TryParse(vehicleName, out uint uHash))
uHash = NAPI.Util.GetHashKey(vehicleName);
if (!VehicleManager.IsValidHash(uHash))
{
return;
}
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (price > user.BankAccount.Balance)
{
ChatService.ErrorMessage(player, "Du hast nicht genügend Geld auf dem Konto");
dbContext.SaveChanges();
return;
}
dbContext.SaveChanges();
}
Vehicle v = null;
if (rentcarLocation == "noobspawn")
{
v = NAPI.Vehicle.CreateVehicle(uHash, noobspawnVehicleSpawnPosition, (float)noobspawnVehicleSpawnHeading, 111, 111, engine: true);
}
else if (rentcarLocation == "stadthalle")
{
v = NAPI.Vehicle.CreateVehicle(uHash, stadthalleVehicleSpawnPosition, (float)stadthalleVehicleSpawnHeading, 111, 111, engine: true);
}
else if (rentcarLocation == "knast")
{
v = NAPI.Vehicle.CreateVehicle(uHash, knastVehicleSpawnPosition, (float)knastVehicleSpawnHeading, 111, 111, engine: true);
}
else if (rentcarLocation == "paleto")
{
v = NAPI.Vehicle.CreateVehicle(uHash, paletoVehicleSpawnPosition, (float)paletoVehicleSpawnHeading, 111, 111, engine: true);
}
else if (rentcarLocation == "lamesa")
{
v = NAPI.Vehicle.CreateVehicle(uHash, lamesaVehicleSpawnPosition, (float)lamesaVehicleSpawnHeading, 111, 111, engine: true);
}
if (v == null)
{
return;
}
VehicleStreaming.SetEngineState(v, true);
VehicleStreaming.SetLockStatus(v, false);
mapPlayerRentcarBill[player.Name] = (v, 0);
player.SendChatMessage("~y~[Fahrzeugverleih] ~w~Viel Spaß mit deinem Fahrzeug! Mit '/rent stop' kannst du den Mietvertrag kündigen.");
if (canRentForFree(player))
{
player.SendChatMessage("~y~[Fahrzeugverleih] ~w~Da du neu in der Stadt bist, wird dir diese Fahrt nicht in Rechnung gestellt.");
}
player.SetData("hasRentcar", true);
player.TriggerEvent("triggerRentcarTimer", PAY_TIMER, price);
}
public static bool canRentForFree(Player player)
{
bool ret = false;
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (user.PlayedMinutes < PAYTIME_FREE * 60)
{
ret = true;
}
dbContext.SaveChanges();
}
return ret;
}
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace ReallifeGamemode.Server.Util
{
class RentcarProperty
{
public string Name { get; set; }
public int Price { get; set; }
public RentcarProperty(String n, int p){
Name = n;
Price = p;
}
}
}

View File

@@ -62,7 +62,6 @@ namespace ReallifeGamemode.Server.Util
});
}
private static void Timer60000_Elapsed(object sender, ElapsedEventArgs e)
{
NAPI.Task.Run(() =>
@@ -79,7 +78,6 @@ namespace ReallifeGamemode.Server.Util
{
NAPI.Task.Run(() =>
{
WantedEscapeTimer.Timer_Elapsed();
Jail.JailIn_Elapsed();
Gangwar.Gangwar.Value_TimerElapsed();
});

View File

@@ -29,8 +29,7 @@ namespace ReallifeGamemode.Server.Wanted
new Vector3(1651.512, 2570.2249, 45.564907)
};
//positionInJail: ENTWEDER "cell" ODER "outside", TODO: enum oder sowas
public static void Check_PutBehindBars(User user, String positionInJail)
public static void Check_PutBehindBars(User user, JailInLocations positionInJail)
{
user.SetBlipAndNametagColor();
Player player = user.Player;
@@ -45,14 +44,14 @@ namespace ReallifeGamemode.Server.Wanted
Vector3 position = null;
if (positionInJail == "cell")
if (positionInJail == JailInLocations.InCell)
{
Random rnd = new Random();
int rndInt = rnd.Next(1, 3);
position = prisonCells[rndInt];
}
else if (positionInJail == "outside")
else if (positionInJail == JailInLocations.Outside)
{
position = new Vector3(1691.42, 2562.77, 45.56);
}
@@ -115,7 +114,7 @@ namespace ReallifeGamemode.Server.Wanted
user.AnnouncePlayerJailedIn();
dbContext.SaveChanges();
//HERE: Freilauf
Check_PutBehindBars(user, "outside");
Check_PutBehindBars(user, JailInLocations.Outside);
break;
}
}
@@ -179,7 +178,7 @@ namespace ReallifeGamemode.Server.Wanted
dbContext.SaveChanges();
}
player.SafeSetHealth(100);
player.SafeTeleport(new Vector3(427.879, -984.65, 30.71));
player.SafeTeleport(JailOut_Point);
ChatService.HQMessage("Beamter " + cop.Name + " hat " + user.Name + " aus dem Knast entlassen.");
ChatService.SendMessage(player, "!{#8181E9}Der Beamte " + cop.Name + " hat dich aus dem Knast entlassen");
@@ -199,7 +198,7 @@ namespace ReallifeGamemode.Server.Wanted
dbContext.SaveChanges();
target.SafeSetHealth(100);
target.SafeTeleport(new Vector3(427.879, -984.65, 30.71));
target.SafeTeleport(JailOut_Point);
ChatService.HQMessage(" Admin " + admin.Name + " hat " + user.Name + " aus dem Knast entlassen.");
ChatService.SendMessage(target, "!{#8181E9}Admin " + admin.Name + " hat dich aus dem Knast entlassen");
@@ -210,8 +209,8 @@ namespace ReallifeGamemode.Server.Wanted
public static void BreakOut(Player player)
{
User user = player.GetUser();
if (player.IsTSupport()) return;
User user = player.GetUser();
using (var dbContext = new DatabaseContext())
{
user = player.GetUser(dbContext);
@@ -226,8 +225,8 @@ namespace ReallifeGamemode.Server.Wanted
[RemoteEvent("SERVER:BreakOutIfInPrison")]
public void breakOutIfInPrison(Player player)
{
if (player.IsTSupport()) return;
User user = player.GetUser();
using (var dbContext = new DatabaseContext())
{
if (Jailtime.ContainsKey(user.Id))

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace ReallifeGamemode.Server.Wanted
{
public enum JailInLocations
{
Outside,
InCell
}
}

View File

@@ -13,82 +13,25 @@ using ReallifeGamemode.Server.Services;
namespace ReallifeGamemode.Server.Wanted
{
public class WantedEscapeTimer
public class WantedEscapeTimer : Script
{
private const int WantedEscapeTime = 300000;
public static Dictionary<int, int> waTimer { get; set; } = new Dictionary<int, int>(); //zeit in ms
/*
public static void WantedTimer()
{
//System.Timers.Timer timer = new System.Timers.Timer(2500);
//timer.Start();
//timer.Elapsed += Timer_Elapsed;
}
*/
public static void ResetWantedTimeToElapse(User user)
{
waTimer[user.Id] = WantedEscapeTime;
}
public static void Timer_Elapsed()
[RemoteEvent("CLIENT:EscapeWanted")]
public void WantedEscape(Player player)
{
using var dbContext = new DatabaseContext();
foreach (var player in NAPI.Pools.GetAllPlayers())
User user = player.GetUser(dbContext);
if (user.Wanteds <= 0)
return;
player.TriggerEvent("BN_ShowWithPicture", "Abgetaucht", "Lester", "Du hast erfolgreich ein Wanted ~y~abgetaucht", "CHAR_LESTER", 1, true);
user.Wanteds -= 1;
if (user.Wanteds == 0)
{
User user = player.GetUser(dbContext);
if (user != null && user.Wanteds > 0)
{
if (!waTimer.ContainsKey(user.Id))
ResetWantedTimeToElapse(user);
bool isNearCop = false;
foreach (var playerCop in NAPI.Pools.GetAllPlayers())
{
if (!playerCop.IsLoggedIn()) continue;
User cop = playerCop.GetUser();
if (cop != null && (cop.FactionId == 1 || cop.FactionId == 3))
{
if (cop.GetData<bool>("duty") && playerCop.Position.DistanceTo2D(player.Position) <= 500)
{
//Schriftzug 'abgetaucht' zerstören :(
isNearCop = true;
break;
}
//Hier abgetaucht schriftzug einfügen :)
}
}
if (!waTimer.ContainsKey(user.Id))
waTimer[user.Id] = 300000;
if (waTimer[user.Id] <= 0)
{
ResetWantedTimeToElapse(user);
player.SendChatMessage("~y~Du hast erfolgreich einen Wanted abgetaucht.");
user.Wanteds -= 1;
if (user.Wanteds == 0)
{
ChatService.HQMessage(player.Name + " konnte solange abtauchen, sodass er nicht mehr gesucht wird.");
user.SetBlipAndNametagColor();
}
dbContext.SaveChanges();
waTimer[user.Id] = WantedEscapeTime;
}
else if (!isNearCop && !player.IsAfk())
{
player.TriggerEvent("SERVER:SetWantedFlash", true);
waTimer[user.Id] -= 2500;
}
else if (isNearCop)
{
player.TriggerEvent("SERVER:SetWantedFlash", false);
ResetWantedTimeToElapse(user);
}
}
ChatService.HQMessage(player.Name + " konnte solange abtauchen, sodass er nicht mehr gesucht wird.");
user.SetBlipAndNametagColor();
}
dbContext.SaveChanges();
}
}
}

View File

@@ -78,71 +78,70 @@ namespace ReallifeGamemode.Server.WeaponDeal
return;
fVeh.SetData<Vector3>("weaponDealPoint", vector);
if (user.Faction.WeaponDealTime <= 0)
if (user.Faction.WeaponDealTime > 0)
{
int i = 0;
string msg = "";
foreach (var point in WeaponDealPoints.WT_Route)
ChatService.ErrorMessage(client, "Du kannst noch keinen Waffendeal starten");
return;
}
int i = 0;
string msg = "";
foreach (var point in WeaponDealPoints.WT_Route)
{
i++;
if (point != vector)
continue;
switch (i)
{
i++;
if (point != vector)
continue;
case 1:
msg = "Das Madrazo Kartell scheint am Strand noch einige Waffen verbuddelt zu haben";
break;
switch (i)
{
case 1:
msg = "Die albanische Mafia hat einen Waffendeal mit uns abgemacht.";
break;
case 2:
msg = "Die Lost MC scheint wieder im Waffen-Business aktiv zu sein";
break;
case 2:
msg = "Die Lost MC scheint wieder im Waffen-Business aktiv zu sein.";
break;
case 3:
msg = "Ein paar hochrangige Mitglieder der U.S. Armee versuchen alte sowjetische Waffen loszuwerden";
break;
case 3:
msg = "Ein paar hochrangige Mitglieder der U.S. Armee versuchen alte sowjetische Waffen loszuwerden.";
break;
case 4:
msg = "Die Triaden können uns mit östlichen Importen beliefern";
break;
case 4:
msg = "Die russische Mafia kann uns mit östlichen Importen beliefern.";
break;
case 5:
msg = "Die albanische Mafia will wohl wieder Geschäfte mit uns machen";
break;
case 5:
msg = "Die albanische Mafia will wohl wieder Geschäfte mit uns machen.";
break;
case 6:
msg = "Die Waffen von den Russen waren schon immer zuverlässig...";
break;
}
case 6:
msg = "Die Waffen der Russen waren schon immer zuverlässig";
break;
}
}
string vehName = NAPI.Vehicle.GetVehicleDisplayName(factionVehicle.Model);
if (user.Faction.Id == 1 || user.Faction.Id == 3)
{
msg = "Die Waffenlieferung steht zur Abholung bereit";
}
if (user.Faction.Id == 3 || user.Faction.Id == 1)
{
msg = "Du kannst die Waffenlieferung nun abholen.";
}
ChatService.BroadcastFaction($"~y~[WAFFENDEAL]~s~ {msg}.", user.Faction);
ChatService.BroadcastFaction($"~y~[WAFFENDEAL]~s~ {msg}", user.Faction);
ChatService.SendMessage(client, $"~y~[WAFFENDEAL]~s~ Steige in den {vehName} ein und fahre zum Waffendeal.");
fVeh.SetData("weaponDeal", true);
InventoryManager.RemoveAllItemsfromVehicleInventory(fVeh);
Faction fac = context.Factions.Where(f => f.Id == user.FactionId).FirstOrDefault();
string vehName = NAPI.Vehicle.GetVehicleDisplayName(factionVehicle.Model);
ChatService.SendMessage(client, $"~y~[WAFFENDEAL]~s~ Steige in den {vehName} ein und fahre zum Übergabepunkt.");
fVeh.SetData("weaponDeal", true);
InventoryManager.RemoveAllItemsfromVehicleInventory(fVeh);
Faction fac = context.Factions.Where(f => f.Id == user.FactionId).FirstOrDefault();
if (fac.Id == 1 | fac.Id == 3)
{
fac.WeaponDealTime = 180;
context.SaveChanges();
}
else
{
fac.WeaponDealTime = 60;
context.SaveChanges();
}
if (fac.Id == 1 | fac.Id == 3)
{
fac.WeaponDealTime = 180;
context.SaveChanges();
}
else
{
ChatService.ErrorMessage(client, "Du kannst noch keinen Waffendeal starten");
fac.WeaponDealTime = 60;
context.SaveChanges();
}
}
}

View File

@@ -17,14 +17,12 @@ namespace ReallifeGamemode.Server.WeaponDeal
new Vector3(-2174.734, 4269.301, 46.95574), //Army Base
new Vector3(2530.14, 2617.15, 35.76),
new Vector3(-3179.78, 820.08, 1.59),
new Vector3(-1889.91, 2045.6, 138.68)
}.AsReadOnly();
public static readonly IReadOnlyCollection<Vector3> StaatsFrakWT_Route = new List<Vector3>
{
new Vector3(3627.138, 3759.711, 28.515)
new Vector3(3627.138, 3759.711, 25.515), //Human Labs
new Vector3(-1805.300, 3101.446, 29.841) //Staatsfraktions WT Army Base
}.AsReadOnly();
public static Vector3 getRndWD_Route(int factionID)
@@ -35,16 +33,16 @@ namespace ReallifeGamemode.Server.WeaponDeal
if (factionID == 1 | factionID == 3)
{
Random rnd = new Random();
factionWeaponDeal[factionID] = rnd.Next(0, StaatsFrakWT_Route.Count - 1);
factionWeaponDeal[factionID] = rnd.Next(0, StaatsFrakWT_Route.Count);
return StaatsFrakWT_Route.ElementAt(factionWeaponDeal[factionID]);
}
else
{
Random rnd = new Random();
factionWeaponDeal[factionID] = rnd.Next(0, WT_Route.Count - 1);
factionWeaponDeal[factionID] = rnd.Next(0, WT_Route.Count);
return WT_Route.ElementAt(factionWeaponDeal[factionID]);
}
/* if (factionWeaponDeal[factionID] == -1)
{
Random rnd = new Random();

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 }),
};
}
});
}
}
}