368 lines
11 KiB
C#
368 lines
11 KiB
C#
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<Player> playersInThisJob = new List<Player>();
|
|
public List<MuellmannData> muellmanData = new List<MuellmannData>();
|
|
private List<Vector3> vector3s = new List<Vector3>();
|
|
|
|
[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<Player> 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<Player> getClientsFromData()
|
|
{
|
|
List<Player> tempList = new List<Player>();
|
|
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
|
|
}
|
|
|
|
}
|
|
|