implment other controllers

This commit is contained in:
CWX
2025-01-23 23:52:35 +00:00
parent 41ebc62cb9
commit 48b5a00726
5 changed files with 315 additions and 77 deletions
+8 -27
View File
@@ -132,13 +132,15 @@ public class BotController(
public List<BotBase> Generate(string sessionId, GenerateBotsRequestData info)
{
var pmcProfile = _profileHelper.GetPmcProfile(sessionId);
// var pmcProfile = _profileHelper.GetPmcProfile(sessionId);
//
// // Use this opportunity to create and cache bots for later retrieval
// var multipleBotTypesRequested = info.Conditions?.Count > 1;
// return multipleBotTypesRequested
// ? GenerateMultipleBotsAndCache(info, pmcProfile, sessionId)
// : ReturnSingleBotFromCache(sessionId, info);
// Use this opportunity to create and cache bots for later retrieval
var multipleBotTypesRequested = info.Conditions?.Count > 1;
return multipleBotTypesRequested
? GenerateMultipleBotsAndCache(info, pmcProfile, sessionId)
: ReturnSingleBotFromCache(sessionId, info);
return new List<BotBase>();
}
private List<BotBase> GenerateMultipleBotsAndCache(GenerateBotsRequestData request, PmcData? pmcProfile, string sessionId)
@@ -404,27 +406,6 @@ public class BotController(
};
}
public int GetBotLimit(string type)
{
throw new NotImplementedException();
}
public bool IsBotPmc(string botRole)
{
throw new NotImplementedException();
}
public bool IsBotBoss(string botRole)
{
throw new NotImplementedException();
}
public bool IsBotFollower(string botRole)
{
throw new NotImplementedException();
}
public int GetBotCap(string location)
{
var botCap = _botConfig.MaxBotCap[location.ToLower()];
+3 -44
View File
@@ -88,27 +88,6 @@ public class GameController(
if (fullProfile.ProfileInfo?.IsWiped is not null && fullProfile.ProfileInfo.IsWiped.Value)
return;
if (fullProfile.SptData.Version!.Contains("3.9.") && fullProfile.SptData.Migrations.All(m => m.Key != "39x"))
{
_inventoryHelper.ValidateInventoryUsesMongoIds(fullProfile.CharacterData?.PmcData?.Inventory?.Items ?? []);
Migrate39xProfile(fullProfile);
// flag as migrated
fullProfile.SptData.Migrations.Add("39x", _timeUtil.GetTimeStamp());
_logger.Info($"Migration of 3.9.x profile: {fullProfile.ProfileInfo?.Username} completed successfully");
}
//3.10 migrations
if (fullProfile.SptData.Version!.Contains("3.10.") && fullProfile.SptData.Migrations.All(m => m.Key != "310x"))
{
Migrate310xProfile(fullProfile);
// Flag as migrated
fullProfile.SptData.Migrations["310x"] = _timeUtil.GetTimeStamp();
_logger.Success($"Migration of 3.10.x profile: {fullProfile.ProfileInfo?.Username} completed successfully");
}
fullProfile.CharacterData!.PmcData!.WishList ??= new DictionaryOrList<string, int>(new Dictionary<string, int>(), []);
fullProfile.CharacterData.ScavData!.WishList ??= new DictionaryOrList<string, int>(new Dictionary<string, int>(), []);
@@ -158,26 +137,6 @@ public class GameController(
_seasonalEventService.GivePlayerSeasonalGifts(sessionId);
}
private void Migrate39xProfile(SptProfile fullProfile)
{
throw new NotImplementedException();
}
private void Migrate310xProfile(SptProfile fullProfile)
{
throw new NotImplementedException();
}
/// <summary>
/// Handles migrating profiles from older SPT versions
/// </summary>
/// <param name="fullProfile"></param>
/// <remarks>Formerly migrate39xProfile in node server</remarks>
private void MigrateProfile(SptProfile fullProfile)
{
throw new NotImplementedException();
}
/// <summary>
/// Handle client/game/config
/// </summary>
@@ -354,13 +313,13 @@ public class GameController(
// Set new values, whatever is smallest
energyRegenPerHour += pmcProfile.Bonuses!
.Where((bonus) => bonus.Type == BonusType.EnergyRegeneration)
.Where(bonus => bonus.Type == BonusType.EnergyRegeneration)
.Aggregate(0d, (sum, bonus) => sum + (bonus.Value!.Value));
hydrationRegenPerHour += pmcProfile.Bonuses!
.Where((bonus) => bonus.Type == BonusType.HydrationRegeneration)
.Where(bonus => bonus.Type == BonusType.HydrationRegeneration)
.Aggregate(0d, (sum, bonus) => sum + (bonus.Value!.Value));
hpRegenPerHour += pmcProfile.Bonuses!
.Where((bonus) => bonus.Type == BonusType.HealthRegeneration)
.Where(bonus => bonus.Type == BonusType.HealthRegeneration)
.Aggregate(0d, (sum, bonus) => sum + (bonus.Value!.Value));
// Player has energy deficit
@@ -2,12 +2,12 @@ using SptCommon.Annotations;
namespace Core.Controllers;
// TODO: This seems unused, is it even needed?
[Injectable]
public class HandBookController
{
public void Load()
{
// throw new NotImplementedException();
// leaving as this is how node is RN
return;
}
}
+72 -2
View File
@@ -12,6 +12,7 @@ using Core.Utils;
using Core.Utils.Cloners;
using SptCommon.Annotations;
using SptCommon.Extensions;
using BodyPartHealth = Core.Models.Eft.Common.Tables.BodyPartHealth;
namespace Core.Controllers;
@@ -37,9 +38,78 @@ public class HealthController(
public ItemEventRouterResponse OffRaidHeal(
PmcData pmcData,
OffraidHealRequestData request,
string sessionId)
string sessionID)
{
throw new NotImplementedException();
var output = _eventOutputHolder.GetOutput(sessionID);
// Update medkit used (hpresource)
var healingItemToUse = pmcData.Inventory.Items.FirstOrDefault(item => item.Id == request.Item);
if (healingItemToUse is null) {
var errorMessage = _localisationService.GetText("health-healing_item_not_found", request.Item);
_logger.Error(errorMessage);
return _httpResponseUtil.AppendErrorToOutput(output, errorMessage);
}
// Ensure item has a upd object
_itemHelper.AddUpdObjectToItem(healingItemToUse);
if (healingItemToUse.Upd.MedKit is not null) {
healingItemToUse.Upd.MedKit.HpResource -= request.Count;
} else {
// Get max healing from db
var maxhp = _itemHelper.GetItem(healingItemToUse.Template).Value.Properties.MaxHpResource;
healingItemToUse.Upd.MedKit = new UpdMedKit { HpResource = maxhp - request.Count }; // Subtract amout used from max
// request.count appears to take into account healing effects removed, e.g. bleeds
// Salewa heals limb for 20 and fixes light bleed = (20+45 = 65)
}
// Resource in medkit is spent, delete it
if (healingItemToUse.Upd.MedKit.HpResource <= 0) {
_inventoryHelper.RemoveItem(pmcData, request.Item, sessionID, output);
}
var healingItemDbDetails = _itemHelper.GetItem(healingItemToUse.Template);
var healItemEffectDetails = healingItemDbDetails.Value.Properties.EffectsDamage;
BodyPartHealth bodyPartToHeal = pmcData.Health.BodyParts.GetValueOrDefault(request.Part.ToString());
if (bodyPartToHeal is null) {
_logger.Warning($"Player: {sessionID} Tried to heal a non-existent body part: {request.Part}");
return output;
}
// Get inital heal amount
var amountToHealLimb = request.Count;
// Check if healing item removes negative effects
var itemRemovesEffects = healingItemDbDetails.Value.Properties.EffectsDamage.Count > 0;
if (itemRemovesEffects && bodyPartToHeal.Effects is not null) {
// Can remove effects and limb has effects to remove
var effectsOnBodyPart = bodyPartToHeal.Effects.Keys;
foreach (var effectKey in effectsOnBodyPart) {
// Check if healing item removes the effect on limb
var matchingEffectFromHealingItem = healItemEffectDetails.GetValueOrDefault(effectKey);
if (matchingEffectFromHealingItem is null) {
// Healing item doesnt have matching effect, it doesnt remove the effect
continue;
}
// Adjust limb heal amount based on if its fixing an effect (request.count is TOTAL cost of hp resource on heal item, NOT amount to heal limb)
amountToHealLimb -= (int)(matchingEffectFromHealingItem.Cost ?? 0);
bodyPartToHeal.Effects.Remove(effectKey);
}
}
// Adjust body part hp value
bodyPartToHeal.Health.Current += amountToHealLimb;
// Ensure we've not healed beyond the limbs max hp
if (bodyPartToHeal.Health.Current > bodyPartToHeal.Health.Maximum) {
bodyPartToHeal.Health.Current = bodyPartToHeal.Health.Maximum;
}
return output;
}
/// <summary>
+230 -2
View File
@@ -2,8 +2,10 @@ using SptCommon.Annotations;
using Core.Generators;
using Core.Helpers;
using Core.Models.Eft.Common;
using Core.Models.Eft.Common.Tables;
using Core.Models.Eft.Hideout;
using Core.Models.Eft.ItemEvent;
using Core.Models.Enums;
using Core.Models.Spt.Config;
using Core.Models.Utils;
using Core.Routers;
@@ -42,13 +44,239 @@ public class HideoutController(
)
{
protected HideoutConfig _hideoutConfig = _configServer.GetConfig<HideoutConfig>();
protected string _nameTaskConditionCountersCraftingId = "673f5d6fdd6ed700c703afdc";
public void StartUpgrade(PmcData pmcData, HideoutUpgradeRequestData info, string sessionId, ItemEventRouterResponse output)
public void StartUpgrade(PmcData pmcData, HideoutUpgradeRequestData request, string sessionID, ItemEventRouterResponse output)
{
var items = request.Items.Select(
reqItem =>
{
var item = pmcData.Inventory.Items.FirstOrDefault(invItem => invItem.Id == reqItem.Id);
return new { inventoryItem = item, requestedItem = reqItem };
}
)
.ToList();
// If it's not money, its construction / barter items
foreach (var item in items)
{
if (item.inventoryItem is null)
{
_logger.Error(
_localisationService.GetText("hideout-unable_to_find_item_in_inventory", item.requestedItem.Id)
);
_httpResponseUtil.AppendErrorToOutput(output);
return;
}
if (
_paymentHelper.IsMoneyTpl(item.inventoryItem.Template) &&
item.inventoryItem.Upd is not null &&
item.inventoryItem.Upd.StackObjectsCount is not null &&
item.inventoryItem.Upd.StackObjectsCount > item.requestedItem.Count
)
{
item.inventoryItem.Upd.StackObjectsCount -= item.requestedItem.Count;
}
else
{
_inventoryHelper.RemoveItem(pmcData, item.inventoryItem.Id, sessionID, output);
}
}
// Construction time management
var profileHideoutArea = pmcData.Hideout.Areas.FirstOrDefault(area => area.Type == request.AreaType);
if (profileHideoutArea is null)
{
_logger.Error(_localisationService.GetText("hideout-unable_to_find_area", request.AreaType));
_httpResponseUtil.AppendErrorToOutput(output);
return;
}
var hideoutDataDb = _databaseService
.GetTables()
.Hideout.Areas.FirstOrDefault(area => area.Type == request.AreaType);
if (hideoutDataDb is null)
{
_logger.Error(
_localisationService.GetText("hideout-unable_to_find_area_in_database", request.AreaType)
);
_httpResponseUtil.AppendErrorToOutput(output);
return;
}
var ctime = hideoutDataDb.Stages[(profileHideoutArea.Level + 1).ToString()].ConstructionTime;
if (ctime > 0)
{
if (_profileHelper.IsDeveloperAccount(sessionID))
{
ctime = 40;
}
var timestamp = _timeUtil.GetTimeStamp();
profileHideoutArea.CompleteTime = Math.Round((double)(timestamp - ctime));
profileHideoutArea.Constructing = true;
}
}
public void UpgradeComplete(PmcData pmcData, HideoutUpgradeCompleteRequestData request, string sessionID, ItemEventRouterResponse output)
{
var hideout = _databaseService.GetHideout();
var globals = _databaseService.GetGlobals();
var profileHideoutArea = pmcData.Hideout.Areas.FirstOrDefault(area => area.Type == request.AreaType);
if (profileHideoutArea is null)
{
_logger.Error(_localisationService.GetText("hideout-unable_to_find_area", request.AreaType));
_httpResponseUtil.AppendErrorToOutput(output);
return;
}
// Upgrade profile values
profileHideoutArea.Level++;
profileHideoutArea.CompleteTime = 0;
profileHideoutArea.Constructing = false;
var hideoutData = hideout.Areas.FirstOrDefault(area => area.Type == profileHideoutArea.Type);
if (hideoutData is null)
{
_logger.Error(
_localisationService.GetText("hideout-unable_to_find_area_in_database", request.AreaType)
);
_httpResponseUtil.AppendErrorToOutput(output);
return;
}
// Apply bonuses
var hideoutStage = hideoutData.Stages[profileHideoutArea.Level.ToString()];
var bonuses = hideoutStage.Bonuses;
if (bonuses?.Count > 0)
{
foreach (var bonus in bonuses)
{
_hideoutHelper.ApplyPlayerUpgradesBonuses(pmcData, bonus);
}
}
// Upgrade includes a container improvement/addition
if (hideoutStage?.Container is not null)
{
AddContainerImprovementToProfile(
output,
sessionID,
pmcData,
profileHideoutArea,
hideoutData,
hideoutStage
);
}
// Upgrading water collector / med station
if (
profileHideoutArea.Type == HideoutAreas.WATER_COLLECTOR ||
profileHideoutArea.Type == HideoutAreas.MEDSTATION
)
{
SetWallVisibleIfPrereqsMet(pmcData);
}
// Cleanup temporary buffs/debuffs from wall if complete
if (profileHideoutArea.Type == HideoutAreas.EMERGENCY_WALL && profileHideoutArea.Level == 6)
{
_hideoutHelper.RemoveHideoutWallBuffsAndDebuffs(hideoutData, pmcData);
}
// Add Skill Points Per Area Upgrade
_profileHelper.AddSkillPointsToPlayer(
pmcData,
SkillTypes.HideoutManagement,
globals.Configuration.SkillsSettings.HideoutManagement.SkillPointsPerAreaUpgrade
);
}
private void SetWallVisibleIfPrereqsMet(PmcData pmcData)
{
var medStation = pmcData.Hideout.Areas.FirstOrDefault((area) => area.Type == HideoutAreas.MEDSTATION);
var waterCollector = pmcData.Hideout.Areas.FirstOrDefault((area) => area.Type == HideoutAreas.WATER_COLLECTOR);
if (medStation?.Level >= 1 && waterCollector?.Level >= 1)
{
var wall = pmcData.Hideout.Areas.FirstOrDefault((area) => area.Type == HideoutAreas.EMERGENCY_WALL);
if (wall?.Level == 0)
{
wall.Level = 3;
}
}
}
private void AddContainerImprovementToProfile(ItemEventRouterResponse output, string sessionID, PmcData pmcData, BotHideoutArea profileParentHideoutArea,
HideoutArea dbHideoutArea, Stage hideoutStage)
{
// Add key/value to `hideoutAreaStashes` dictionary - used to link hideout area to inventory stash by its id
if (pmcData.Inventory.HideoutAreaStashes.GetValueOrDefault(dbHideoutArea.Type.ToString()) is null)
{
pmcData.Inventory.HideoutAreaStashes[dbHideoutArea.Type.ToString()] = dbHideoutArea.Id;
}
// Add/upgrade stash item in player inventory
AddUpdateInventoryItemToProfile(sessionID, pmcData, dbHideoutArea, hideoutStage);
// Edge case, add/update `stand1/stand2/stand3` children
if (dbHideoutArea.Type == HideoutAreas.EQUIPMENT_PRESETS_STAND)
{
// Can have multiple 'standx' children depending on upgrade level
AddMissingPresetStandItemsToProfile(sessionID, hideoutStage, pmcData, dbHideoutArea, output);
}
// Dont inform client when upgraded area is hall of fame or equipment stand, BSG doesn't inform client this specifc upgrade has occurred
// will break client if sent
List<HideoutAreas> check = [HideoutAreas.PLACE_OF_FAME];
if (!check.Contains(dbHideoutArea.Type ?? HideoutAreas.NOTSET))
{
AddContainerUpgradeToClientOutput(sessionID, dbHideoutArea.Type, dbHideoutArea, hideoutStage, output);
}
// Some hideout areas (Gun stand) have child areas linked to it
var childDbArea = _databaseService
.GetHideout()
.Areas.FirstOrDefault(area => area.ParentArea == dbHideoutArea.Id);
if (childDbArea is not null)
{
// Add key/value to `hideoutAreaStashes` dictionary - used to link hideout area to inventory stash by its id
if (pmcData.Inventory.HideoutAreaStashes.GetValueOrDefault(childDbArea.Type.ToString()) is null)
{
pmcData.Inventory.HideoutAreaStashes[childDbArea.Type.ToString()] = childDbArea.Id;
}
// Set child area level to same as parent area
pmcData.Hideout.Areas.FirstOrDefault((hideoutArea) => hideoutArea.Type == childDbArea.Type).Level =
pmcData.Hideout.Areas.FirstOrDefault((x) => x.Type == profileParentHideoutArea.Type).Level;
// Add/upgrade stash item in player inventory
var childDbAreaStage = childDbArea.Stages[profileParentHideoutArea.Level.ToString()];
AddUpdateInventoryItemToProfile(sessionID, pmcData, childDbArea, childDbAreaStage);
// Inform client of the changes
AddContainerUpgradeToClientOutput(sessionID, childDbArea.Type, childDbArea, childDbAreaStage, output);
}
}
private void AddMissingPresetStandItemsToProfile(string sessionId, Stage hideoutStage, PmcData pmcData, HideoutArea dbHideoutArea, ItemEventRouterResponse output)
{
throw new NotImplementedException();
}
public void UpgradeComplete(PmcData pmcData, HideoutUpgradeCompleteRequestData request, string sessionId, ItemEventRouterResponse output)
private void AddUpdateInventoryItemToProfile(string sessionId, PmcData pmcData, HideoutArea childDbArea, Stage childDbAreaStage)
{
throw new NotImplementedException();
}
private void AddContainerUpgradeToClientOutput(string sessionId, HideoutAreas? type, HideoutArea childDbArea, Stage childDbAreaStage, ItemEventRouterResponse output)
{
throw new NotImplementedException();
}