diff --git a/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts b/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts index d6f144e8..f9ca378f 100644 --- a/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts +++ b/ReallifeGamemode.Client/Jobs/BusRouteSelect.ts @@ -33,15 +33,14 @@ export default function busRouteList(globalData: IGlobalData) { routeMenu = new Menu("Bus Job", "", new Point(0, screenRes.y / 3), null, null); routeMenu.AddItem(new UIMenuListItem("Route wählen", "", new ItemsCollection(skillSelect))); - + routeSelect = "Anfänger"; routeMenu.AddItem(sendItem); routeMenu.AddItem(cancelItem); routeMenu.Visible = true; - routeSelect = skillSelect[0]; routeMenu.ListChange.on((item, index) => { switch (item.Text) { - case "Skill wählen": + case "Route wählen": routeSelect = String(item.SelectedItem.DisplayText); break; } @@ -49,18 +48,22 @@ export default function busRouteList(globalData: IGlobalData) { routeMenu.ItemSelect.on((item) => { if (item.Text === "Starten") { + if (routeSelect == skillSelect[1] && skill < 300) { mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true); - return; } - if (routeSelect == skillSelect[2] && skill < 800) { + else if (routeSelect == skillSelect[2] && skill < 800) + { mp.game.audio.playSoundFrontend(1, "Hack_Failed", "DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS", true); - return; + } + else + { + mp.events.callRemote("CLIENT:StartBusRoute", routeSelect); + routeMenu.Close(); + globalData.InMenu = false; } - mp.events.callRemote("CLIENT:StartBusRoute", routeSelect); - routeMenu.Close(); - globalData.InMenu = false; + } else if (item.Text === "Abbrechen") { mp.events.callRemote("CLIENT:Job_StopJob"); diff --git a/ReallifeGamemode.Server/Extensions/ListExtensions.cs b/ReallifeGamemode.Server/Extensions/ListExtensions.cs index ae9c665f..76d2ff0f 100644 --- a/ReallifeGamemode.Server/Extensions/ListExtensions.cs +++ b/ReallifeGamemode.Server/Extensions/ListExtensions.cs @@ -6,9 +6,25 @@ namespace ReallifeGamemode.Server.Extensions { internal static class ListExtensions { - public static bool Contains(this List list, Player client) + public static bool VectorEquals(this List vector3s, List compareToList) { - return list.Any(l => l.Handle.Value == client.Handle.Value); + if (vector3s.Count != compareToList.Count) + return false; + + for (int i = 0; i < vector3s.Count; i++) + { + Vector3 vector = vector3s[i]; + Vector3 compareTo = compareToList[i]; + + if (vector.X != compareTo.X) + return false; + if (vector.Y != compareTo.Y) + return false; + if (vector.Z != compareTo.Z) + return false; + } + + return true; } } } diff --git a/ReallifeGamemode.Server/Job/BusDriverJob.cs b/ReallifeGamemode.Server/Job/BusDriverJob.cs index 954688fd..93571fcc 100644 --- a/ReallifeGamemode.Server/Job/BusDriverJob.cs +++ b/ReallifeGamemode.Server/Job/BusDriverJob.cs @@ -269,9 +269,7 @@ namespace ReallifeGamemode.Server.Job if (!playerVehiclePair.ContainsKey(player)) return; - if (playerRouteCurrent.ContainsKey(player.Name)) - playerRouteCurrent.Remove(player.Name); - + CheckPointHandle.DeleteCheckpoints(player); playerVehiclePair[player].Delete(); playerVehiclePair.Remove(player); } @@ -283,16 +281,48 @@ namespace ReallifeGamemode.Server.Job List selectedRoute = playerRouteCurrent[player.Name]; - if (ROUTE_BEGINNER.Values.Where(v => v.Equals(selectedRoute)) != null) + if (ROUTE_BEGINNER.Values.Where(v => v.VectorEquals(selectedRoute)).Count() != 0) return BEGINNER; - else if (ROUTE_INTERMEDIATE.Values.Where(v => v.Equals(selectedRoute)) != null) + else if (ROUTE_INTERMEDIATE.Values.Where(v => v.VectorEquals(selectedRoute)).Count() != 0) return INTERMEDIATE; - else if (ROUTE_PROFESSIONAL.Values.Where(v => v.Equals(selectedRoute)) != null) + else if (ROUTE_PROFESSIONAL.Values.Where(v => v.VectorEquals(selectedRoute)).Count() != 0) return PROFESSIONAL; return "none"; } + public int getPlayerRouteInex(Player player) + { + if (!playerRouteCurrent.ContainsKey(player.Name)) + return -1; + + List selectedRoute = playerRouteCurrent[player.Name]; + + for (int i = 1; i < 100; i++) + { + if (!ROUTE_BEGINNER.ContainsKey(i) && !ROUTE_INTERMEDIATE.ContainsKey(i) && !ROUTE_PROFESSIONAL.ContainsKey(i)) + break; + + if (ROUTE_BEGINNER.ContainsKey(i)) + { + if (ROUTE_BEGINNER[i].VectorEquals(selectedRoute)) + return i; + } + if (ROUTE_INTERMEDIATE.ContainsKey(i)) + { + if (ROUTE_INTERMEDIATE[i].VectorEquals(selectedRoute)) + return i; + } + if (ROUTE_PROFESSIONAL.ContainsKey(i)) + { + if (ROUTE_PROFESSIONAL[i].VectorEquals(selectedRoute)) + return i; + } + } + + return -1; + } + private uint getPlayerJobVehicle(Player player) { string type = getPlayerRouteType(player); @@ -315,39 +345,64 @@ namespace ReallifeGamemode.Server.Job if (type == PROFESSIONAL && user.BusSkill < SKILL_PROFESSIONAL) { player.TriggerEvent("MenuSelect:Error"); return; } List selectedRoute = new List(); + int index = -1; if (playerRouteCurrent.ContainsKey(player.Name)) { - selectedRoute = playerRouteCurrent[player.Name]; + index = getPlayerRouteInex(player); } else { Random random = new Random(); - if (type == BEGINNER) - { - if (playerRoutePair1.ContainsKey(player.Name)) - selectedRoute = playerRoutePair1[player.Name]; - else - selectedRoute = ROUTE_BEGINNER.GetValueOrDefault(random.Next(1, ROUTE_BEGINNER.Count)); - } - else if (type == INTERMEDIATE) - { - if (playerRoutePair2.ContainsKey(player.Name)) - selectedRoute = playerRoutePair2[player.Name]; - else - selectedRoute = ROUTE_INTERMEDIATE.GetValueOrDefault(random.Next(1, ROUTE_INTERMEDIATE.Count)); - } - else if (type == PROFESSIONAL) - { - if (playerRoutePair3.ContainsKey(player.Name)) - selectedRoute = playerRoutePair3[player.Name]; - else - selectedRoute = ROUTE_PROFESSIONAL.GetValueOrDefault(random.Next(1, ROUTE_PROFESSIONAL.Count)); - } - - playerRouteCurrent.Add(player.Name, selectedRoute); + index = random.Next(1, 8); } + if (type == BEGINNER) + { + index %= ROUTE_BEGINNER.Count; + if (playerRoutePair1.ContainsKey(player.Name)) + { + selectedRoute = playerRoutePair1[player.Name]; + } + else + { + selectedRoute = ROUTE_BEGINNER.GetValueOrDefault(index); + playerRoutePair1.Add(player.Name, selectedRoute); + } + } + else if (type == INTERMEDIATE) + { + index %= ROUTE_INTERMEDIATE.Count; + + if (playerRoutePair2.ContainsKey(player.Name)) + { + selectedRoute = playerRoutePair2[player.Name]; + } + else + { + selectedRoute = ROUTE_INTERMEDIATE.GetValueOrDefault(index); + playerRoutePair2.Add(player.Name, selectedRoute); + } + } + else if (type == PROFESSIONAL) + { + index %= ROUTE_PROFESSIONAL.Count; + + if (playerRoutePair3.ContainsKey(player.Name)) + { + selectedRoute = playerRoutePair3[player.Name]; + } + else + { + selectedRoute = ROUTE_PROFESSIONAL.GetValueOrDefault(index); + playerRoutePair3.Add(player.Name, selectedRoute); + } + } + + if (playerRouteCurrent.ContainsKey(player.Name)) + playerRouteCurrent.Remove(player.Name); + playerRouteCurrent.Add(player.Name, selectedRoute); + if (selectedRoute.Count is 0) { Console.WriteLine($"[ERROR:BUSJOB] Player {player.Name} has empty route Vector3 List."); @@ -375,154 +430,18 @@ namespace ReallifeGamemode.Server.Job player.SetIntoVehicle(vehicle.Handle, 0); player.TriggerEvent("CLIENT:PlaySound", "jobs/busfahrer/FahrplanAbfahrt", "wav", 15); player.StartCheckPointRoute(selectedRoute, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - - #region delete - - /* - Vehicle veh = player.Vehicle; - if (player.VehicleSeat == 0) - { - if (type == "RouteStart") - { - if ((VehicleHash)veh.Model == VehicleHash.Bus) - { - Random rnd = new Random(); - int rroute = rnd.Next(1, 5); - switch (rroute) - { - case 1: - { - CheckPointHandle.StartCheckPointRoute(player, Skill1Route1, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 1"); - player.SetData("Route", "Skill1Route1"); - break; - } - case 2: - { - CheckPointHandle.StartCheckPointRoute(player, Skill1Route2, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 2"); - player.SetData("Route", "Skill1Route2"); - break; - } - case 3: - { - CheckPointHandle.StartCheckPointRoute(player, Skill1Route3, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 3"); - player.SetData("Route", "Skill1Route3"); - break; - } - case 4: - { - CheckPointHandle.StartCheckPointRoute(player, Skill1Route4, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 4"); - player.SetData("Route", "Skill1Route4"); - break; - } - } - player.TriggerEvent("CLIENT:SetDoorOpen", 0, false, false); - player.TriggerEvent("CLIENT:SetDoorOpen", 1, false, false); - player.TriggerEvent("CLIENT:SetDoorOpen", 2, false, false); - player.TriggerEvent("CLIENT:SetDoorOpen", 3, false, false); - player.TriggerEvent("CLIENT:SetDoorShut", 0, false); - player.TriggerEvent("CLIENT:SetDoorShut", 1, false); - player.TriggerEvent("CLIENT:SetDoorShut", 2, false); - player.TriggerEvent("CLIENT:SetDoorShut", 3, false); - } - if ((VehicleHash)veh.Model == VehicleHash.Coach) - { - Random rnd = new Random(); - int rroute = rnd.Next(1, 5); - switch (rroute) - { - case 1: - { - CheckPointHandle.StartCheckPointRoute(player, Skill2Route1, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 1"); - player.SetData("Route", "Skill2Route1"); - break; - } - case 2: - { - CheckPointHandle.StartCheckPointRoute(player, Skill2Route2, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 2"); - player.SetData("Route", "Skill2Route2"); - break; - } - case 3: - { - CheckPointHandle.StartCheckPointRoute(player, Skill2Route3, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 3"); - player.SetData("Route", "Skill2Route3"); - break; - } - case 4: - { - CheckPointHandle.StartCheckPointRoute(player, Skill2Route4, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 4"); - player.SetData("Route", "Skill2Route3"); - break; - } - } - player.TriggerEvent("CLIENT:SetDoorOpen", 0, false, false); - player.TriggerEvent("CLIENT:SetDoorShut", 0, false); - } - if ((VehicleHash)veh.Model == VehicleHash.Tourbus) - { - Random rnd = new Random(); - int rroute = rnd.Next(1, 4); - switch (rroute) - { - case 1: - { - CheckPointHandle.StartCheckPointRoute(player, Skill3Route1, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 1"); - player.SetData("Route", "Skill3Route1"); - break; - } - case 2: - { - CheckPointHandle.StartCheckPointRoute(player, Skill3Route2, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 2"); - player.SetData("Route", "Skill3Route2"); - break; - } - case 3: - { - CheckPointHandle.StartCheckPointRoute(player, Skill3Route3, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 3"); - player.SetData("Route", "Skill3Route3"); - break; - } - case 4: - { - CheckPointHandle.StartCheckPointRoute(player, Skill3Route4, MARKER_DELAY, MARKER_ID, MARKER_SIZE, MARKER_DIST, true, MARKER_EVENT); - player.SendChatMessage("~y~Job: ~w~Route wurde gesetzt: ~g~Route 4"); - player.SetData("Route", "Skill3Route4"); - break; - } - } - player.TriggerEvent("CLIENT:SetDoorOpen", 2, false, false); - player.TriggerEvent("CLIENT:SetDoorOpen", 3, false, false); - player.TriggerEvent("CLIENT:SetDoorShut", 2, false); - player.TriggerEvent("CLIENT:SetDoorShut", 3, false); - } - } - } - */ - - #endregion delete + if (index != -1) + player.SendChatMessage($"~y~[JOB]: ~w~Dir wurde ~g~ Route {index}~w~ zugeteilt."); } public override void LastCheckpoint(Player player) { Vehicle v = player.Vehicle; - player.SendChatMessage("~y~[Job]: ~w~Die neue Route lädt. Bitte warten..."); + player.SendChatMessage("~y~[JOB]: ~w~Die neue Route lädt. Bitte warten..."); + string type = getPlayerRouteType(player); + NAPI.Task.Run(() => { - string type = getPlayerRouteType(player); - - List selectedRoute = playerRouteCurrent[player.Name]; - if (type == BEGINNER) playerRoutePair1.Remove(player.Name); else if (type == INTERMEDIATE) @@ -530,7 +449,6 @@ namespace ReallifeGamemode.Server.Job else if (type == PROFESSIONAL) playerRoutePair3.Remove(player.Name); - playerRouteCurrent.Remove(player.Name); BusDriverJob job = JobManager.GetJob(); StartBusRoute(player, type); }, delayTime: 10000); @@ -699,13 +617,13 @@ namespace ReallifeGamemode.Server.Job user.BusSkill++; if (user.BusSkill == BusDriverJob.SKILL_INTERMEDIATE) { - player.SendChatMessage($"~y~[Job]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[Job]: ~w~Du kannst jetzt auch mit dem Coach fahren!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Coach fahren!"); } if (user.BusSkill == BusDriverJob.SKILL_PROFESSIONAL) { - player.SendChatMessage($"~y~[Job]: ~w~Du hast nun die Route ~g~{BusDriverJob.PROFESSIONAL} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[Job]: ~w~Du kannst jetzt auch mit dem Tourbus fahren!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.PROFESSIONAL} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Tourbus fahren!"); } BusDriverJob job = JobManager.GetJob(); diff --git a/ReallifeGamemode.Server/Job/JobBase.cs b/ReallifeGamemode.Server/Job/JobBase.cs index dae4f86b..541e6c19 100644 --- a/ReallifeGamemode.Server/Job/JobBase.cs +++ b/ReallifeGamemode.Server/Job/JobBase.cs @@ -44,7 +44,7 @@ namespace ReallifeGamemode.Server.Job _inJob.Add(player); jobPlayer.Add(player); - ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job (~o~{this.Name}~s~) gestartet."); + ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job ~o~{this.Name}~s~ gestartet."); JobStart?.Invoke(player); } @@ -57,7 +57,7 @@ namespace ReallifeGamemode.Server.Job if (quit) { - ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job (~o~{this.Name}~s~) beendet."); + ChatService.SendMessage(player, $"~y~[Job]~s~ Du hast deinen Job ~o~{this.Name}~s~ beendet."); player.Position = JobManager.playerJobStartPosition[player]; } diff --git a/ReallifeGamemode.Server/Job/PilotJob.cs b/ReallifeGamemode.Server/Job/PilotJob.cs index 3f879d88..d6046546 100644 --- a/ReallifeGamemode.Server/Job/PilotJob.cs +++ b/ReallifeGamemode.Server/Job/PilotJob.cs @@ -152,6 +152,8 @@ namespace ReallifeGamemode.Server.Job if (!playerVehiclePair.ContainsKey(player)) return; + CheckPointHandle.DeleteCheckpoints(player); + playerVehiclePair[player].Delete(); playerVehiclePair.Remove(player); } @@ -238,32 +240,6 @@ namespace ReallifeGamemode.Server.Job CheckPointHandle.StartCheckPointRoute(player, selectedRoute, 0, CHECKPOINT_MARKER_ID, 40, 10, true, "PILOT:InCheckpoint"); //6, 23, 25, 26, 27, 28 } - public static void payWage(Player jobber, int wage) - { - using (var dbContext = new DatabaseContext()) - { - if (jobber.VehicleSeat == 0) - { - jobber.GetUser(dbContext).Wage += wage; - //jobber.SendNotification($"~y~[JOB] ~g~+{wage}$"); - jobber.GetUser(dbContext).PilotSkill++; - dbContext.SaveChanges(); - if (jobber.GetUser(dbContext).PilotSkill == 300) - { - jobber.SendChatMessage($"~y~Job: ~s~Du hast nun ~g~Skill-Level 2 ~w~erreicht!"); - jobber.SendChatMessage($"~y~Job: ~s~Du kannst jetzt auch mit dem Velum Flugzeug (LS Airport) fliegen!"); - } - } - else - { - JobBase job = JobManager.GetJob(jobber.GetUser().JobId ?? -1); - job.StopJob(jobber); - CheckPointHandle.DeleteCheckpoints(jobber); - ChatService.SendMessage(jobber, $"~y~Job: ~s~Du hast deinen Job ~o~{job.Name}~s~ beendet."); - } - } - } - public string getPlayerRouteType(Player player) { if (!playerRouteCurrent.ContainsKey(player.Name)) @@ -271,9 +247,9 @@ namespace ReallifeGamemode.Server.Job List selectedRoute = playerRouteCurrent[player.Name]; - if (ROUTE_BEGINNER.Values.Where(v => v.Equals(selectedRoute)) != null) + if (ROUTE_BEGINNER.Values.Where(v => v.VectorEquals(selectedRoute)).Count() != 0) return BEGINNER; - else if (ROUTE_INTERMEDIATE.Values.Where(v => v.Equals(selectedRoute)) != null) + else if (ROUTE_INTERMEDIATE.Values.Where(v => v.VectorEquals(selectedRoute)).Count() != 0) return INTERMEDIATE; return "none"; @@ -314,8 +290,8 @@ namespace ReallifeGamemode.Server.Job PlayerTimer playerTimer = new PlayerTimer(player, playerVehiclePair[player], 30000); playerTimer.Elapsed += JobTimerElapsed; JobManager.playerTimersJobVehicleRespawn[player] = playerTimer; - player.SendChatMessage("~y~[JOB] ~w~Du hast das Fahrzeug verlassen,"); - player.SendChatMessage("~y~[JOB] ~w~Bist du nicht in 30 Sekunden zurück, ~r~wird der Job beendet!"); + //player.SendChatMessage("~y~[JOB] ~w~Du hast das Fahrzeug verlassen,"); + //player.SendChatMessage("~y~[JOB] ~w~Bist du nicht in 30 Sekunden zurück, ~r~wird der Job beendet!"); } private void JobTimerElapsed(Player player, Vehicle vehicle) @@ -365,8 +341,8 @@ namespace ReallifeGamemode.Server.Job user.PilotSkill++; if (user.PilotSkill == BusDriverJob.SKILL_INTERMEDIATE) { - player.SendChatMessage($"~y~[Job]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); - player.SendChatMessage($"~y~[Job]: ~w~Du kannst jetzt auch mit dem Coach fahren!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du hast nun die Route ~g~{BusDriverJob.INTERMEDIATE} ~w~freigeschaltet!"); + player.SendChatMessage($"~y~[JOB]: ~w~Du kannst jetzt auch mit dem Velum fliegen!"); } dbContext.SaveChanges();