Files
reallife-gamemode/ReallifeGamemode.Server/Job/RefuseCollectorJob.cs
2020-04-04 19:44:01 +02:00

371 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;
using ReallifeGamemode.Database.Entities;
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)
{
//setClothes
}
private void RefuseCollectorJobJobStop(Player player)
{
//removeClothes and replace with old
MuellmannJobBeenden(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 (!player.IsLoggedIn() || !GetPlayerInJob().Contains(player)) return;
User u = player.GetUser();
if (u.JobId != this.Id) 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 (!player.IsLoggedIn() || !GetPlayerInJob().Contains(player)) return;
User u = player.GetUser();
if (u.JobId != this.Id) 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 (!player.IsLoggedIn() || !GetPlayerInJob().Contains(player)) return;
User u = player.GetUser();
if (u.JobId != this.Id) 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
}
}