using System; using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Newtonsoft.Json; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Core.Managers; using ReallifeGamemode.Server.Extensions; namespace ReallifeGamemode.Server.Job { public class RefuseCollectorJob : JobBase { public override int Id => 2; public override string Name => "Müllmann"; public override bool NeedVehicleToStart => false; public RefuseCollectorJob() { JobStart += RefuseCollectorJobJobStart; JobStop += RefuseCollectorJobJobStop; } private void RefuseCollectorJobJobStart(Player player) { if (!playersInThisJob.Contains(player)) playersInThisJob.Add(player); //setClothes } private void RefuseCollectorJobJobStop(Player player) { if (playersInThisJob.Contains(player)) playersInThisJob.Remove(player); //removeClothes and replace with old MuellmannJobBeenden(player); } private List playersInThisJob = new List(); public List muellmanData = new List(); private List vector3s = new List(); [ServerEvent(Event.ResourceStart)] public void LoadHouses() { foreach(var marker in HouseManager.houseMarkers) { vector3s.Add(new Vector3(marker.Value.Position.X, marker.Value.Position.Y, marker.Value.Position.Z)); } } [RemoteEvent("CLIENT:MuellmannJobStarten")] public void MuellmannJobStarten(Player player, Vehicle vehicle) { if (vehicle.Model == (uint)Types.VehicleModel.Trash || vehicle.Model == (uint)Types.VehicleModel.Trash2) { Vehicle veh; foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; veh = data.vehicle; ChatService.SendMessage((Player)player, "~g~Du hast den Müllmann-Job gestartet!"); player.TriggerEvent("SERVER:MuellmannStatusTrue"); player.TriggerEvent("SERVER:MuellmannBCSErstellen", JsonConvert.SerializeObject(vector3s.ToArray()), veh); return; } } } public void MuellmannJobBeenden(Player player) { if (player.IsInVehicle) { Vehicle vehicle = player.Vehicle; if (vehicle.Model == (uint)Types.VehicleModel.Trash || vehicle.Model == (uint)Types.VehicleModel.Trash2) { ChatService.SendMessage((Player)player, "~g~Du hast den Müllmann-Job beendet!"); player.TriggerEvent("SERVER:MuellmannStatusFalse"); player.TriggerEvent("SERVER:MuellmannBCSEntfernen"); } else { ChatService.SendMessage((Player)player, "~r~INFO: Das ist kein Müllwagen!"); } } else { ChatService.SendMessage((Player)player, "~r~INFO: Zum Job beenden musst du im Auto sein."); } } [RemoteEvent("CLIENT:MuellmannImShape")] public void MuellmannImShape(Player player, string jsonColShape) { foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; Player target = data.getPartnerClient(player); if (target != null) target.TriggerEvent("MuellmannUpdateColshape", jsonColShape); ChatService.SendMessage((Player)player, "Du hast den Müllsack in der Hand. Bringe ihm zum Müllwagen hinten."); return; } } [RemoteEvent("CLIENT:MuellmannAddSack")] public void MuellmannAddSack(Player player) { foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; int count = data.getTrashCount(); count++; data.setTrashCount(count); Player target = data.getPartnerClient(player); if (target != null) ChatService.SendMessage((Player)target, $"Es sind jetzt {count} Säcke im Müllwagen."); ChatService.SendMessage((Player)player, $"Es sind jetzt {count} Säcke im Müllwagen."); if (data.getTrashCount() >= 2) { ChatService.SendMessage((Player)player, "Auto ist voll fahre nun zu Base."); if (target != null) { ChatService.SendMessage((Player)target, "Auto ist voll fahre nun zu Base."); target.TriggerEvent("SERVER:MuellmannZuBase"); } player.TriggerEvent("SERVER:MuellmannZuBase"); } //bonus pro sack return; } } [RemoteEvent("CLIENT:MuellmannBaseSack")] public void MuellmannBaseSack(Player player) { if (player.VehicleSeat != 0) return; foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; Console.WriteLine($"[DATA DEBUG] vehicle: {data.vehicle.DisplayName} | Players: {data.getClientsFromData()}"); int count = data.getTrashCount(); Player target = data.getPartnerClient(player); if (target != null) ChatService.SendMessage((Player)target, $"Fahrzeug wurde entleert. Säcke: {count}"); ChatService.SendMessage((Player)player, $"Fahrzeug wurde entleert. Säcke: {count}"); player.TriggerEvent("SERVER:MuellmannHintenWiederLeer"); //bonus pro sack data.setTrashCount(0); return; } } #region zweiSpeieler [ServerEvent(Event.PlayerDisconnected)] private void SrvEvent_PlayerDc(Player player) { if (!GetPlayerInJob().Contains(player)) return; if (!playersInThisJob.Contains(player)) return; foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; if (data.hasFreePlace()) { muellmanData.Remove(data); //müllwagen respawnen return; } data.removeClientFromData(player); return; } } [ServerEvent(Event.PlayerDeath)] private void SrvEvent_PlayerDeath(Player player) { if (!GetPlayerInJob().Contains(player)) return; if (!playersInThisJob.Contains(player)) return; foreach (var data in muellmanData) { if (data.getDataFromClient(player) == null) continue; if (data.hasFreePlace()) { muellmanData.Remove(data); //müllwagen respawnen return; } data.removeClientFromData(player); return; } } [ServerEvent(Event.VehicleDeath)] private void SrvEvent_Vehicle(Vehicle veh) { if (veh.Model != (uint)Types.VehicleModel.Trash && veh.Model != (uint)Types.VehicleModel.Trash2) return; foreach (var data in muellmanData) { if (data.vehicle == veh) { //müllfahrzeug respawnen List clients = data.getClientsFromData(); foreach(var c in clients){ RefuseCollectorJobJobStop(c); } muellmanData.Remove(data); return; } } } [ServerEvent(Event.PlayerEnterVehicleAttempt)] public void SrvEvent_PlayerEnterVehicle(Player player, Vehicle vehicle, sbyte seat) { Player target; if (!GetPlayerInJob().Contains(player)) return; if (!playersInThisJob.Contains(player)) return; if (vehicle.Model == (uint)Types.VehicleModel.Trash || vehicle.Model == (uint)Types.VehicleModel.Trash2) { foreach (var data in muellmanData) { if (data.vehicle == vehicle) { if (data.getDataFromClient(player) != null) return; if (!data.hasFreePlace()) { player.StopAnimation(); return; } CheckDataForDuplicatePlayer(player, data); data.setClientToData(player); MuellmannJobStarten(player, vehicle); target = data.getPartnerClient(player); if (target == null) return; ChatService.SendMessage((Player)player, $"Dein Partner ist {target.Name} !"); ChatService.SendMessage((Player)target, $"Dein Partner ist {player.Name} !"); return; } } MuellmannData newData = new MuellmannData(vehicle); muellmanData.Add(newData); CheckDataForDuplicatePlayer(player, newData); newData.setClientToData(player); MuellmannJobStarten(player, vehicle); target = newData.getPartnerClient(player); if (target == null) return; ChatService.SendMessage((Player)player, $"Dein Partner ist {target.Name} !"); ChatService.SendMessage((Player)target, $"Dein Partner ist {player.Name} !"); } } public void CheckDataForDuplicatePlayer(Player player, MuellmannData data) { foreach (var d in muellmanData) { if (d == data) continue; MuellmannData temp = d.getDataFromClient(player); if (temp == null) continue; temp.removeClientFromData(player); } } #endregion #region Data public class MuellmannData { Player client1; Player client2; public Vehicle vehicle; int trashCount = 0; public MuellmannData(Vehicle vehicle) { this.vehicle = vehicle; } public void setClientToData(Player player) { if (client1 == player || client2 == player) { Console.WriteLine("Spieler schon gespeichert"); return; } if (client1 == null) { client1 = player; return; } else if (client2 == null) { client2 = player; return; } else if (client1 != null && client2 != null) { Console.WriteLine("kein Platz"); } } public void removeClientFromData(Player player) { if (client1 == player) { client1 = null; } if (client2 == player) { client2 = null; } } public int getTrashCount() { return this.trashCount; } public void setTrashCount(int i) { this.trashCount = i; } public List getClientsFromData() { List tempList = new List(); if (client1 != null) { tempList.Add(client1); } if (client2 != null) { tempList.Add(client2); } return tempList; } public MuellmannData getDataFromClient(Player player) { if (client1 != player && client2 != player) return null; return this; } public bool hasFreePlace() { if (client1 != null && client2 != null) return false; return true; } public Player getPartnerClient(Player player) { if (client1 != player && client2 != player) return null; if (client1 == player) { return client2; } if (client2 == player) { return client1; } return null; } } #endregion } }