using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common;
using SPTarkov.Server.Core.Models.Eft.ItemEvent;
using SPTarkov.Server.Core.Models.Eft.Repair;
using SPTarkov.Server.Core.Routers;
using SPTarkov.Server.Core.Services;
namespace SPTarkov.Server.Core.Controllers;
[Injectable]
public class RepairController(EventOutputHolder eventOutputHolder, RepairService repairService)
{
///
/// Handle TraderRepair event
/// Repair with trader
///
/// session id
/// endpoint request data
/// player profile
/// ItemEventRouterResponse
public ItemEventRouterResponse TraderRepair(MongoId sessionID, TraderRepairActionDataRequest request, PmcData pmcData)
{
var output = eventOutputHolder.GetOutput(sessionID);
// find the item to repair
foreach (var repairItem in request.RepairItems)
{
var repairDetails = repairService.RepairItemByTrader(sessionID, pmcData, repairItem, request.TraderId);
repairService.PayForRepair(sessionID, pmcData, repairItem.Id, repairDetails.RepairCost.Value, request.TraderId, output);
if (output.Warnings?.Count > 0)
{
return output;
}
// Add repaired item to output object
output.ProfileChanges[sessionID].Items.ChangedItems.Add(repairDetails.RepairedItem);
// Add skill points for repairing weapons
repairService.AddRepairSkillPoints(sessionID, repairDetails, pmcData);
}
return output;
}
///
/// Handle Repair event
/// Repair with repair kit
///
/// session id
/// endpoint request data
/// player profile
/// ItemEventRouterResponse
public ItemEventRouterResponse RepairWithKit(MongoId sessionId, RepairActionDataRequest body, PmcData pmcData)
{
var output = eventOutputHolder.GetOutput(sessionId);
// repair item
var repairDetails = repairService.RepairItemByKit(sessionId, pmcData, body.RepairKitsInfo, body.Target.Value, output);
repairService.AddBuffToItem(repairDetails, pmcData);
// add repaired item to send to client
output.ProfileChanges[sessionId].Items.ChangedItems.Add(repairDetails.RepairedItem);
// Add skill points for repairing items
repairService.AddRepairSkillPoints(sessionId, repairDetails, pmcData);
return output;
}
}