mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 02:30:44 -05:00
Implement BTR taxi service (!64)
- Move creation/init of the BTRManager to before the `ExtractionTimerPanel.SetTime` method, to fix BTR timer panel not functioning - Add subserviceId to the `OnTraderServicePurchased` event - Add BTR taxi service handling Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com> Reviewed-on: SPT-AKI/Modules#64 Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com> Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
parent
7c744a4dc0
commit
136b051623
@ -50,13 +50,7 @@ namespace Aki.Debugging.BTR
|
||||
_updateTaxiPriceMethod = AccessTools.GetDeclaredMethods(btrControllerType).Single(IsUpdateTaxiPriceMethod);
|
||||
}
|
||||
|
||||
// Find `BTRControllerClass.method_9(PathDestination currentDestinationPoint, bool lastRoutePoint)`
|
||||
private bool IsUpdateTaxiPriceMethod(MethodInfo method)
|
||||
{
|
||||
return (method.GetParameters().Length == 2 && method.GetParameters()[0].ParameterType == typeof(PathDestination));
|
||||
}
|
||||
|
||||
private void Start()
|
||||
public void Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -88,6 +82,12 @@ namespace Aki.Debugging.BTR
|
||||
}
|
||||
}
|
||||
|
||||
// Find `BTRControllerClass.method_9(PathDestination currentDestinationPoint, bool lastRoutePoint)`
|
||||
private bool IsUpdateTaxiPriceMethod(MethodInfo method)
|
||||
{
|
||||
return (method.GetParameters().Length == 2 && method.GetParameters()[0].ParameterType == typeof(PathDestination));
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
btrController.SyncBTRVehicleFromServer(UpdateDataPacket());
|
||||
@ -189,12 +189,18 @@ namespace Aki.Debugging.BTR
|
||||
}
|
||||
|
||||
/**
|
||||
* BTR has arrived at a destination, re-calculate taxi prices
|
||||
* BTR has arrived at a destination, re-calculate taxi prices and remove purchased taxi service
|
||||
*/
|
||||
private void ToDestinationEvent(PathDestination destinationPoint, bool isFirst, bool isFinal, bool isLastRoutePoint)
|
||||
{
|
||||
// Remove purchased taxi service
|
||||
TraderServicesManager.Instance.RemovePurchasedService(ETraderServiceType.PlayerTaxi, BTRUtil.BTRTraderId);
|
||||
|
||||
// Update the prices for the taxi service
|
||||
_updateTaxiPriceMethod.Invoke(btrController, new object[] { destinationPoint, isFinal });
|
||||
|
||||
// Update the UI
|
||||
TraderServicesManager.Instance.GetTraderServicesDataFromServer(BTRUtil.BTRTraderId);
|
||||
}
|
||||
|
||||
private bool IsBtrService(ETraderServiceType serviceType)
|
||||
@ -209,7 +215,7 @@ namespace Aki.Debugging.BTR
|
||||
return false;
|
||||
}
|
||||
|
||||
private void BTRTraderServicePurchased(ETraderServiceType serviceType)
|
||||
private void BTRTraderServicePurchased(ETraderServiceType serviceType, string subserviceId)
|
||||
{
|
||||
if (!IsBtrService(serviceType))
|
||||
{
|
||||
@ -227,6 +233,8 @@ namespace Aki.Debugging.BTR
|
||||
StartCoverFireTimer(90f);
|
||||
break;
|
||||
case ETraderServiceType.PlayerTaxi:
|
||||
btrController.BtrVehicle.IsPaid = true;
|
||||
btrController.BtrVehicle.MoveToDestination(subserviceId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -14,11 +14,13 @@ namespace Aki.Debugging.BTR.Patches
|
||||
{
|
||||
protected override MethodBase GetTargetMethod()
|
||||
{
|
||||
return AccessTools.Method(typeof(GameWorld), nameof(GameWorld.OnGameStarted));
|
||||
// Note: This may seem like a weird place to hook, but `SetTime` requires that the BtrController
|
||||
// exist and be setup, so we'll use this as the entry point
|
||||
return AccessTools.Method(typeof(ExtractionTimersPanel), nameof(ExtractionTimersPanel.SetTime));
|
||||
}
|
||||
|
||||
[PatchPostfix]
|
||||
private static void PatchPostfix()
|
||||
[PatchPrefix]
|
||||
private static void PatchPrefix()
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -35,7 +37,8 @@ namespace Aki.Debugging.BTR.Patches
|
||||
gameWorld.LocationId = gameWorld.MainPlayer.Location;
|
||||
}
|
||||
|
||||
gameWorld.gameObject.AddComponent<BTRManager>();
|
||||
var btrManager = gameWorld.gameObject.AddComponent<BTRManager>();
|
||||
btrManager.Init();
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
|
@ -15,7 +15,7 @@ namespace Aki.SinglePlayer.Utils.TraderServices
|
||||
/// <summary>
|
||||
/// Subscribe to this event to trigger trader service logic.
|
||||
/// </summary>
|
||||
public event Action<ETraderServiceType> OnTraderServicePurchased;
|
||||
public event Action<ETraderServiceType, string> OnTraderServicePurchased;
|
||||
|
||||
private static TraderServicesManager _instance;
|
||||
|
||||
@ -136,10 +136,10 @@ namespace Aki.SinglePlayer.Utils.TraderServices
|
||||
return;
|
||||
}
|
||||
|
||||
SetServicePurchased(serviceType, serviceData.TraderId);
|
||||
SetServicePurchased(serviceType, subServiceId, serviceData.TraderId);
|
||||
}
|
||||
|
||||
public void SetServicePurchased(ETraderServiceType serviceType, string traderId)
|
||||
public void SetServicePurchased(ETraderServiceType serviceType, string subserviceId, string traderId)
|
||||
{
|
||||
if (_servicePurchased.TryGetValue(serviceType, out var traderDict))
|
||||
{
|
||||
@ -150,7 +150,15 @@ namespace Aki.SinglePlayer.Utils.TraderServices
|
||||
_servicePurchased[serviceType] = new Dictionary<string, bool>();
|
||||
_servicePurchased[serviceType][traderId] = true;
|
||||
}
|
||||
OnTraderServicePurchased.Invoke(serviceType);
|
||||
OnTraderServicePurchased.Invoke(serviceType, subserviceId);
|
||||
}
|
||||
|
||||
public void RemovePurchasedService(ETraderServiceType serviceType, string traderId)
|
||||
{
|
||||
if (_servicePurchased.TryGetValue(serviceType, out var traderDict))
|
||||
{
|
||||
traderDict[traderId] = false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsServicePurchased(ETraderServiceType serviceType, string traderId)
|
||||
|
Loading…
x
Reference in New Issue
Block a user