Cleaned up InsuranceController

This commit is contained in:
Chomp
2025-01-28 19:35:32 +00:00
parent ed2bc36edd
commit aba4282eb1
2 changed files with 72 additions and 70 deletions
@@ -112,25 +112,24 @@ public class InsuranceController(
foreach (var insured in insuranceDetails)
{
// Create a new root parent ID for the message we'll be sending the player
var rootItemParentID = _hashUtil.Generate();
var rootItemParentId = _hashUtil.Generate();
// Update the insured items to have the new root parent ID for root/orphaned items
insured.Items = _itemHelper.AdoptOrphanedItems(rootItemParentID, insured.Items);
insured.Items = _itemHelper.AdoptOrphanedItems(rootItemParentId, insured.Items);
var simulateItemsBeingTaken = _insuranceConfig.SimulateItemsBeingTaken;
if (simulateItemsBeingTaken)
{
// Find items that could be taken by another player off the players body
var itemsToDelete = FindItemsToDelete(rootItemParentID, insured);
var itemsToDelete = FindItemsToDelete(rootItemParentId, insured);
// Actually remove them.
RemoveItemsFromInsurance(insured, itemsToDelete);
// There's a chance we've orphaned weapon attachments, so adopt any orphaned items again
insured.Items = _itemHelper.AdoptOrphanedItems(rootItemParentID, insured.Items);
insured.Items = _itemHelper.AdoptOrphanedItems(rootItemParentId, insured.Items);
}
// Send the mail to the player.
SendMail(sessionId, insured);
// Remove the fully processed insurance package from the profile.
@@ -155,15 +154,15 @@ public class InsuranceController(
* @param index The array index of the insurance package to remove.
* @returns void
*/
private void RemoveInsurancePackageFromProfile(string sessionID, Insurance insPackage)
private void RemoveInsurancePackageFromProfile(string sessionId, Insurance insPackage)
{
var profile = _saveServer.GetProfile(sessionID);
var profile = _saveServer.GetProfile(sessionId);
profile.InsuranceList = profile.InsuranceList.Where(
insurance =>
insurance.TraderId != insPackage.TraderId ||
insurance.SystemData.Date != insPackage.SystemData.Date ||
insurance.SystemData.Time != insPackage.SystemData.Time ||
insurance.SystemData.Location != insPackage.SystemData.Location
insurance.SystemData?.Date != insPackage.SystemData?.Date ||
insurance.SystemData?.Time != insPackage.SystemData?.Time ||
insurance.SystemData?.Location != insPackage.SystemData?.Location
)
.ToList();
@@ -178,14 +177,14 @@ public class InsuranceController(
* @param insured - The insurance object containing the items to evaluate for deletion.
* @returns A Set containing the IDs of items that should be deleted.
*/
private HashSet<string> FindItemsToDelete(string rootItemParentID, Insurance insured)
private HashSet<string> FindItemsToDelete(string rootItemParentId, Insurance insured)
{
var toDelete = new HashSet<string>();
// Populate a Map object of items for quick lookup by their ID and use it to populate a Map of main-parent items
// and each of their attachments. For example, a gun mapped to each of its attachments.
var itemsMap = _itemHelper.GenerateItemsMap(insured.Items);
var parentAttachmentsMap = PopulateParentAttachmentsMap(rootItemParentID, insured, itemsMap);
var parentAttachmentsMap = PopulateParentAttachmentsMap(rootItemParentId, insured, itemsMap);
// Check to see if any regular items are present.
var hasRegularItems = itemsMap.Values.Any(
@@ -526,21 +525,10 @@ public class InsuranceController(
return removeCount;
}
foreach (var attachment in weightedAttachmentByPrice)
{
// Below min price to be taken, skip
if (attachment.Value < _insuranceConfig.MinAttachmentRoublePriceToBeTaken)
{
continue;
}
if (RollForDelete(traderId) ?? false)
{
removeCount++;
}
}
return removeCount;
// Get attachments count above or equal to price set in config
return weightedAttachmentByPrice
.Where(attachment => attachment.Value >= _insuranceConfig.MinAttachmentRoublePriceToBeTaken)
.Count(_ => RollForDelete(traderId) ?? false);
}
private void RemoveItemsFromInsurance(Insurance insured, HashSet<string> toDelete)
@@ -548,9 +536,16 @@ public class InsuranceController(
insured.Items = insured.Items.Where(item => !toDelete.Contains(item.Id)).ToList();
}
private void SendMail(string sessionID, Insurance insurance)
/**
* Handle sending the insurance message to the user that potentially contains the valid insurance items.
*
* @param sessionID The session ID that should receive the insurance message.
* @param insurance The context of insurance to use.
* @returns void
*/
private void SendMail(string sessionId, Insurance insurance)
{
// After all of the item filtering that we've done, if there are no items remaining, the insurance has
// If there are no items remaining after the item filtering, the insurance has
// successfully "failed" to return anything and an appropriate message should be sent to the player.
var traderDialogMessages = _databaseService.GetTrader(insurance.TraderId).Dialogue;
@@ -572,7 +567,7 @@ public class InsuranceController(
// Send the insurance message
_mailSendService.SendLocalisedNpcMessageToPlayer(
sessionID,
sessionId,
_traderHelper.GetTraderById(insurance.TraderId).ToString(),
insurance.MessageType ?? MessageType.SYSTEM_MESSAGE,
insurance.MessageTemplateId,
@@ -585,10 +580,13 @@ public class InsuranceController(
private bool IsMapLabsAndInsuranceDisabled(Insurance insurance, string labsId = "laboratory")
{
return (
insurance.SystemData?.Location?.ToLower() == labsId && !(_databaseService.GetLocation(labsId).Base.Insurance ?? false)
insurance.SystemData?.Location?.ToLower() == labsId && !(_databaseService.GetLocation(labsId)?.Base?.Insurance.GetValueOrDefault(false) ?? false)
);
}
/**
* Update IInsurance object with new messageTemplateId and wipe out items array data
*/
private void HandleLabsInsurance(Dictionary<string, List<string>?>? traderDialogMessages, Insurance insurance)
{
// Use labs specific messages if available, otherwise use default
@@ -604,7 +602,7 @@ public class InsuranceController(
}
private bool? RollForDelete(string? traderId, Item? insuredItem = null)
private bool? RollForDelete(string traderId, Item? insuredItem = null)
{
var trader = _traderHelper.GetTraderById(traderId);
if (trader is null)
@@ -612,8 +610,8 @@ public class InsuranceController(
return null;
}
var maxRoll = 9999;
var conversionFactor = 100;
const int maxRoll = 9999;
const int conversionFactor = 100;
var returnChance = _randomUtil.GetInt(0, maxRoll) / conversionFactor;
var traderReturnChance = _insuranceConfig.ReturnChancePercent[traderId];
@@ -628,19 +626,25 @@ public class InsuranceController(
return roll;
}
public ItemEventRouterResponse Insure(PmcData pmcData, InsureRequestData body, string sessionID)
/**
* Handle Insure event
* Add insurance to an item
*
* @param pmcData Player profile
* @param body Insurance request
* @param sessionID Session id
* @returns IItemEventRouterResponse object to send to client
*/
public ItemEventRouterResponse Insure(PmcData pmcData, InsureRequestData body, string sessionId)
{
var output = _eventOutputHolder.GetOutput(sessionID);
var output = _eventOutputHolder.GetOutput(sessionId);
var itemsToInsureCount = body.Items.Count;
List<IdWithCount> itemsToPay = [];
Dictionary<string, Item> inventoryItemsHash = new Dictionary<string, Item>();
// Create hash of player inventory items (keyed by item id)
foreach (var item in pmcData.Inventory.Items)
{
inventoryItemsHash[item.Id] = item;
}
// Get price of all items being insured
// Create hash of player inventory items (keyed by item id)
var inventoryItemsHash = pmcData.Inventory.Items.ToDictionary(item => item.Id);
// Get price of all items being insured, add to 'itemsToPay'
foreach (var key in body.Items)
{
itemsToPay.Add(
@@ -656,7 +660,7 @@ public class InsuranceController(
);
}
ProcessBuyTradeRequestData options = new ProcessBuyTradeRequestData
var options = new ProcessBuyTradeRequestData
{
SchemeItems = itemsToPay,
TransactionId = body.TransactionId,
@@ -664,21 +668,22 @@ public class InsuranceController(
Type = "",
ItemId = "",
Count = 0,
SchemeId = 0,
SchemeId = 0
};
// pay for the item insurance
_paymentService.PayMoney(pmcData, options, sessionID, output);
_paymentService.PayMoney(pmcData, options, sessionId, output);
if (output.Warnings?.Count > 0)
{
return output;
}
// add items to InsuredItems list once money has been paid
pmcData.InsuredItems ??= [];
foreach (var key in body.Items)
{
pmcData.InsuredItems.Add(new InsuredItem { TId = body.TransactionId, ItemId = inventoryItemsHash[key].Id });
// If Item is Helmet or Body Armour -> Handle insurance of Softinserts
// If Item is Helmet or Body Armour -> Handle insurance of soft inserts
if (_itemHelper.ArmorItemHasRemovableOrSoftInsertSlots(inventoryItemsHash[key].Template))
{
InsureSoftInserts(inventoryItemsHash[key], pmcData, body);
@@ -697,11 +702,11 @@ public class InsuranceController(
* @param pmcData Player profile
* @param body Insurance request data
*/
public void InsureSoftInserts(Item item, PmcData pmcData, InsureRequestData body)
public void InsureSoftInserts(Item itemWithSoftInserts, PmcData pmcData, InsureRequestData body)
{
var softInsertIds = _itemHelper.GetSoftInsertSlotIds();
var softInsertSlots = pmcData.Inventory.Items.Where(
item => item.ParentId == item.Id && softInsertIds.Contains(item.SlotId.ToLower())
item => item.ParentId == itemWithSoftInserts.Id && softInsertIds.Contains(item.SlotId.ToLower())
);
foreach (var softInsertSlot in softInsertSlots)
@@ -724,15 +729,15 @@ public class InsuranceController(
{
var response = new GetInsuranceCostResponseData();
var pmcData = _profileHelper.GetPmcProfile(sessionId);
var inventoryItemsHash = new Dictionary<string, Item>();
foreach (var item in pmcData?.Inventory?.Items ?? []) inventoryItemsHash[item.Id] = item;
// Create hash of inventory items, keyed by item Id
pmcData.Inventory.Items ??= [];
var inventoryItemsHash = pmcData.Inventory.Items.ToDictionary(item => item.Id);
// Loop over each trader in request
foreach (var trader in request.Traders ?? [])
{
var items = new Dictionary<string, double>();
foreach (var itemId in request.Items ?? [])
{
// Ensure hash has item in it
@@ -743,11 +748,13 @@ public class InsuranceController(
continue;
}
items[inventoryItemsHash[itemId].Template] =
_insuranceService.GetRoublePriceToInsureItemWithTrader(pmcData, inventoryItemsHash[itemId], trader);
items.Add(
inventoryItemsHash[itemId].Template,
_insuranceService.GetRoublePriceToInsureItemWithTrader(pmcData, inventoryItemsHash[itemId], trader)
);
}
response[trader] = items;
response.Add(trader, items);
}
return response;
+10 -15
View File
@@ -1204,7 +1204,7 @@ public class ItemHelper(
/// <param name="itemId">The unique identifier of the item for which to find the main parent.</param>
/// <param name="itemsMap">A Dictionary containing item IDs mapped to their corresponding Item objects for quick lookup.</param>
/// <returns>The Item object representing the top-most parent of the given item, or null if no such parent exists.</returns>
public Item GetAttachmentMainParent(string itemId, Dictionary<string, Item> itemsMap)
public Item? GetAttachmentMainParent(string itemId, Dictionary<string, Item> itemsMap)
{
var currentItem = itemsMap.FirstOrDefault(x => x.Key == itemId).Value;
@@ -1246,7 +1246,7 @@ public class ItemHelper(
* @param itemsMap - A Dictionary containing item IDs mapped to their corresponding Item objects for quick lookup.
* @returns The Item object representing the equipment parent of the given item, or `null` if no such parent exists.
*/
public Item GetEquipmentParent(string itemId, Dictionary<string, Item> itemsMap)
public Item? GetEquipmentParent(string itemId, Dictionary<string, Item> itemsMap)
{
var currentItem = itemsMap.GetValueOrDefault(itemId);
@@ -1318,7 +1318,7 @@ public class ItemHelper(
* @param item Db item template to look up Cartridge filter values from
* @returns Caliber of cartridge
*/
public string GetRandomCompatibleCaliberTemplateId(TemplateItem item)
public string? GetRandomCompatibleCaliberTemplateId(TemplateItem item)
{
var cartridges = item?.Properties?.Cartridges[0]?.Props?.Filters[0]?.Filter;
@@ -1679,7 +1679,7 @@ public class ItemHelper(
{
var localeDb = _localeService.GetLocaleDb();
var result = localeDb[$"{itemTpl} Name"];
if (result?.Count() > 0)
if (result?.Length > 0)
{
return result;
}
@@ -1784,9 +1784,9 @@ public class ItemHelper(
/// <param name="possibleTpls">Tpls to randomly choose from</param>
/// <param name="incompatibleModTpls">Incompatible tpls to not allow</param>
/// <returns>Chosen tpl or undefined</returns>
public string? GetCompatibleTplFromArray(List<string> possibleTpls, HashSet<string> incompatibleModTpls)
public string GetCompatibleTplFromArray(List<string> possibleTpls, HashSet<string> incompatibleModTpls)
{
if (possibleTpls.Count() == 0)
if (!possibleTpls.Any())
{
return null;
}
@@ -1795,7 +1795,7 @@ public class ItemHelper(
var count = 0;
while (chosenTpl is null)
{
// Loop over choosing a random tpl until one is found or count varaible reaches the same size as the possible tpls array
// Loop over choosing a random tpl until one is found or count variable reaches the same size as the possible tpls array
var tpl = _randomUtil.GetArrayValue(possibleTpls);
if (incompatibleModTpls.Contains(tpl))
{
@@ -1939,20 +1939,15 @@ public class ItemHelper(
// Returns A Map where the keys are the item IDs and the values are the corresponding Item objects.
public Dictionary<string, Item> GenerateItemsMap(List<Item> items)
{
Dictionary<string, Item> itemsMap = new();
foreach (var item in items)
{
itemsMap.Add(item.Id, item);
}
return itemsMap;
// Convert list to dictionary, keyed by items Id
return items.ToDictionary(item => item.Id);
}
// Add a blank upd object to passed in item if it does not exist already
// item to add upd to
// text to write to log when upd object was not found
// Returns True when upd object was added
public bool AddUpdObjectToItem(Item item, string warningMessageWhenMissing = null)
public bool AddUpdObjectToItem(Item item, string? warningMessageWhenMissing = null)
{
if (item.Upd is null)
{