Add Taximeter

This commit is contained in:
Siga
2020-03-01 17:39:54 +01:00
parent edf06f4478
commit fb527f8c57
21 changed files with 404 additions and 56 deletions

View File

@@ -15,7 +15,7 @@ namespace ReallifeGamemode.Server.Extensions
public static Player GetDriver(this Vehicle veh)
{
return NAPI.Pools.GetAllPlayers().Where(p => p.Vehicle.Handle == veh.Handle && p.VehicleSeat == -1).FirstOrDefault();
return NAPI.Pools.GetAllPlayers().Where(p => p.Vehicle.Handle == veh.Handle && p.VehicleSeat == 0).FirstOrDefault();
}
}
}

View File

@@ -187,9 +187,9 @@ namespace ReallifeGamemode.Server.Finance
dbContext.SaveChanges();
}
if (paycheck.Amount > 0)
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Du hast einen Payday von ~g~$" + paycheck.Amount + "~s~ bekommen.");
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt + $~g~" + paycheck.Amount + "~s~.");
else
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Du hast einen Payday von ~r~$" + paycheck.Amount + "~s~ bekommen.");
ChatService.SendMessage(client, "~g~[PAYDAY]~s~ Dein Stundenumsatz beträgt - $~r~" + paycheck.Amount + "~s~.");
}

View File

@@ -16,6 +16,7 @@ namespace ReallifeGamemode.Server.Job
public event JobStopHandler JobStop;
private readonly List<Player> _inJob = new List<Player>();
private static readonly List<Player> jobPlayer = new List<Player>();
public abstract int Id { get; }
@@ -27,6 +28,7 @@ namespace ReallifeGamemode.Server.Job
{
if (_inJob.Contains(player)) return;
_inJob.Add(player);
jobPlayer.Add(player);
ChatService.SendMessage(player, $"~y~[JOB]~s~ Du hast deinen Job ~o~{this.Name}~s~ gestartet.");
@@ -37,6 +39,7 @@ namespace ReallifeGamemode.Server.Job
{
if (!_inJob.Contains(player)) return;
_inJob.Remove(player);
jobPlayer.Remove(player);
if (quit)
{
@@ -54,6 +57,7 @@ namespace ReallifeGamemode.Server.Job
}
}
public static List<Player> GetPlayerInJob() => jobPlayer;
public List<Player> GetUsersInJob() => _inJob;
}
}

View File

@@ -3,6 +3,14 @@ using System.Collections.Generic;
using System.Text;
using GTANetworkAPI;
using ReallifeGamemode.Server.Util;
using ReallifeGamemode.Server.Services;
using ReallifeGamemode.Server.Extensions;
using System.Timers;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Server.Managers;
using ReallifeGamemode.Database.Entities;
using System.Linq;
using Newtonsoft.Json;
namespace ReallifeGamemode.Server.Job
{
@@ -10,26 +18,109 @@ namespace ReallifeGamemode.Server.Job
{
public List<TaxiContract> TaxiContracts { get; set; } = new List<TaxiContract>();
private static readonly Dictionary<NetHandle, Vector3> lastPositions = new Dictionary<NetHandle, Vector3>();
public override int Id => 1;
public override string Name => "Taxifahrer";
public override bool NeedVehicleToStart => true;
private static TaxiDriverJob _Instance;
public TaxiDriverJob()
{
JobStart += TaxiDriverJobJobStart;
JobStop += TaxiDriverJobJobStop;
}
public static TaxiDriverJob GetInstance()
{
if (_Instance == null)
_Instance = new TaxiDriverJob();
return _Instance;
}
private void TaxiDriverJobJobStart(Player player)
{
player.Vehicle.SetSharedData("vehicleTaxiLight", true);
player.TriggerEvent("CLIENT:setFarePrice");
}
private void TaxiDriverJobJobStop(Player player)
{
player.Vehicle.SetSharedData("vehicleTaxiLight", false);
int Id = player.GetUser().Id;
player.ResetData("DriverPrice");
Vehicle v = player.Vehicle;
foreach (Player occupant in v.Occupants)
{
occupant.TriggerEvent("CLIENT:cancelFare");
}
}
[RemoteEvent("SERVER:failedFarePrice")]
private void SrvEvent_failedFarePrice(Player player)
{
ChatService.ErrorMessage(player, "Bitte richtigen Wert eintragen");
TaxiDriverJobJobStop(player);
}
[RemoteEvent("SERVER:setFare")]
private void SrvEvent_setFare(Player player, int amount)
{
player.SetData<int>("DriverPrice", amount);
player.TriggerEvent("CLIENT:startFare");
}
[RemoteEvent("SERVER:payFare")]
private void SrvEvent_payFare(Player player, int amount, float km)
{
int id = player.GetUser().Id;
player.SetData<float>("FareKm", km);
int targetId = player.GetData<int>("Passager");
if (targetId == 0) return;
using (var dbContext = new DatabaseContext())
{
User target = dbContext.Users.Where(u => u.Id == targetId).FirstOrDefault();
target.Handmoney -= amount;
dbContext.SaveChanges();
target.Player.TriggerEvent("SERVER:SET_HANDMONEY", target.Handmoney);
}
}
public static void StartTaxiTimer()
{
Timer timer = new Timer(1000);
timer.Start();
timer.Elapsed += UpdateFare;
}
private static void UpdateFare(object sender, ElapsedEventArgs e)
{
foreach(var player in GetPlayerInJob())
{
if (!player.HasData("hasPassager")) { player.SetData<bool>("hasPassager", false); continue; }
int playerId = player.GetUser().Id;
Vehicle v = player.Vehicle;
Vector3 lastPosition = v.Position;
if (lastPositions.ContainsKey(v.Handle)) lastPosition = lastPositions[v.Handle];
lastPositions[v.Handle] = v.Position;
double distance = lastPosition.DistanceTo(v.Position) / 1000.0;
if (distance > 0.5) { ChatService.BroadcastAdmin($"Möglicher Cheater - {player.Name}", Database.AdminLevel.MAPPING); continue; }
if (!player.GetData<bool>("hasPassager")) continue;
foreach (Player occupant in v.Occupants)
{
occupant.TriggerEvent("CLIENT:updateFare", JsonConvert.SerializeObject(distance));
}
}
}
}
}

View File

@@ -8,6 +8,7 @@ using ReallifeGamemode.Server.Util;
using ReallifeGamemode.Server.Wanted;
using ReallifeGamemode.Server.DrivingSchool;
using ReallifeGamemode.Server.WeaponDeal;
using ReallifeGamemode.Server.Job;
/**
* @overview Life of German Reallife - Main Class (Main.cs)
@@ -60,6 +61,7 @@ namespace ReallifeGamemode.Server
ATMManager.InitATMs();
CityHallManager.LoadCityHall();
JobManager.LoadJobs();
TaxiDriverJob.StartTaxiTimer();
HouseManager.LoadHouses();
DrivingSchool.DrivingSchool.Setup();
PlaneSchool.Setup();

View File

@@ -14,7 +14,7 @@ using System.Reflection;
namespace ReallifeGamemode.Server.Managers
{
class JobManager : Script
public class JobManager : Script
{
private static List<JobBase> _jobs = new List<JobBase>();
@@ -30,9 +30,8 @@ namespace ReallifeGamemode.Server.Managers
throw new InvalidOperationException($"Double Job ID found: {instance.Id} | {instance.Name}");
}
_jobs.Add(instance);
NAPI.Util.ConsoleOutput($"Loading job {instance.Name}");
NAPI.Util.ConsoleOutput($"Loading job {instance.Name}");
}
NAPI.Util.ConsoleOutput($"Loaded {_jobs.Count} jobs");
}
@@ -218,28 +217,64 @@ namespace ReallifeGamemode.Server.Managers
[ServerEvent(Event.PlayerEnterVehicle)]
public void JobManagerPlayerEnterVehicle(Player player, Vehicle veh, sbyte seat)
{
if (seat == 0) return;
ServerVehicle sVeh = veh.GetServerVehicle();
if (sVeh == null) return;
if (sVeh is JobVehicle jV && jV.JobId == 1) // Spieler steigt in Taxi ein
{
var taxiJob = JobManager.GetJob<TaxiDriverJob>();
Player driver = veh.GetDriver();
if (!driver.HasData("DriverPrice")) return;
int taxiPrice = driver.GetData<int>("DriverPrice");
float km = 0;
if (!driver.HasData("FareKm")) { driver.SetData<float>("FareKm", km); }
km = driver.GetData<float>("FareKm");
if (driver.HasData("Passager")) return;
driver.SetData<int>("Passager", player.GetUser().Id);
driver.SetData<bool>("hasPassager", true);
player.TriggerEvent("CLIENT:startCustomerFare", taxiPrice, km);
var taxiContracts = taxiJob.TaxiContracts.Where(t => t.Name == player.Name);
if (taxiContracts.Count() == 0) return;
var contract = taxiContracts.First();
taxiJob.TaxiContracts.Remove(contract);
Player driver = veh.GetDriver();
if (driver != null && contract.Driver.Handle != veh.GetDriver().Handle)
if (driver != null && contract.Driver != null && contract.Driver.Handle != veh.GetDriver().Handle)
{
ChatService.SendMessage(contract.Driver, $"!{{02FCFF}}{player.Name} ist in ein Taxi eingestiegen, der Auftrag wurde beendet.");
ChatService.SendMessage(player, $"!{{02FCFF}}Du bist in ein Taxi eingestiegen, der Auftrag wurde beendet.");
}
}
}
[ServerEvent(Event.PlayerExitVehicle)]
public void JobManagerPlayerEnterVehicle(Player player, Vehicle veh)
{
ServerVehicle sVeh = veh.GetServerVehicle();
if (sVeh == null) return;
if (sVeh is JobVehicle jV && jV.JobId == 1) // Spieler steigt in Taxi aus
{
var taxiJob = JobManager.GetJob<TaxiDriverJob>();
if (veh.Occupants.Count == 0) return;
Player driver = veh.GetDriver();
if (driver == null) return;
if (player.GetUser().Id != driver.GetData<int>("Passager")) { player.TriggerEvent("CLIENT:cancelFare"); return; }
player.TriggerEvent("CLIENT:cancelFareCustomer");
driver.ResetData("Passager");
driver.ResetData("hasPassager");
foreach(Player occupant in veh.Occupants)
{
if (occupant == driver) continue;
occupant.WarpOutOfVehicle();
}
}
}
[RemoteEvent("CLIENT:JobManager_TaxiJob_AcceptCall")]
public void TaxiJobAcceptCall(Player player, string name)
{
@@ -264,8 +299,10 @@ namespace ReallifeGamemode.Server.Managers
job.Driver = player;
player.TriggerEvent("SERVER:Util_setWaypoint", target.Position.X, target.Position.Y);
player.SetData<bool>("hasPassager", true);
ChatService.SendMessage(target, $"!{{02FCFF}}Dein Auftrag wurde von {player.Name} angenommen. Warte an deiner aktuellen Position.");
ChatService.SendMessage(target, $"!{{02FCFF}}Für die Anfahrt fallen zusätzlich Kosten auf.");
ChatService.SendMessage(player, $"!{{02FCFF}}Du hast den Auftrag von {name} angenommen. Hole ihn nun ab.");
}
}

View File

@@ -34,6 +34,9 @@
<Reference Include="Bootstrapper">
<HintPath>..\Import\Bootstrapper.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\Import\Newtonsoft.Json.dll</HintPath>
</Reference>
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(ConfigurationName)' != 'ServerBuild' AND '$(OS)' == 'Windows_NT'">
<Exec Command="powershell -NonInteractive -ExecutionPolicy ByPass -File ..\postbuild.ps1 -buildDirectory $(OutDir) -buildFilename $(TargetFileName)" LogStandardErrorAsError="True" />

View File

@@ -5,7 +5,7 @@ using System.Text;
namespace ReallifeGamemode.Server.Util
{
class TaxiContract
public class TaxiContract
{
public string Name { get; set; }