mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
more accurate harvesting rates
This commit is contained in:
@@ -19,26 +19,51 @@ void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Dam
|
||||
|
||||
auto BuildingSMActor = Cast<ABuildingSMActor>(BuildingActor);
|
||||
auto PlayerController = Cast<AFortPlayerControllerAthena>(InstigatedBy);
|
||||
auto Pawn = PlayerController ? PlayerController->GetMyFortPawn() : nullptr;
|
||||
// auto Pawn = PlayerController ? PlayerController->GetMyFortPawn() : nullptr;
|
||||
auto Weapon = Cast<AFortWeapon>(DamageCauser);
|
||||
|
||||
if (!BuildingSMActor || !PlayerController || !Pawn || !Weapon)
|
||||
if (!BuildingSMActor)
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
if (BuildingSMActor->IsDestroyed())
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
static auto LastDamageAmountOffset = BuildingSMActor->GetOffset("LastDamageAmount");
|
||||
static auto LastDamageHitOffset = BuildingSMActor->GetOffset("LastDamageHit", false) != -1 ? BuildingSMActor->GetOffset("LastDamageHit") : BuildingSMActor->GetOffset("LastDamageHitImpulseDir"); // idc
|
||||
|
||||
const float PreviousLastDamageAmount = BuildingSMActor->Get<float>(LastDamageAmountOffset);
|
||||
const float PreviousLastDamageHit = BuildingSMActor->Get<float>(LastDamageHitOffset);
|
||||
const float CurrentBuildingHealth = BuildingActor->GetHealth();
|
||||
|
||||
BuildingSMActor->Get<float>(LastDamageAmountOffset) = Damage;
|
||||
BuildingSMActor->Get<float>(LastDamageHitOffset) = CurrentBuildingHealth;
|
||||
|
||||
if (!PlayerController || !Weapon)
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
// if (!Pawn)
|
||||
// return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
auto WorldInventory = PlayerController->GetWorldInventory();
|
||||
|
||||
if (!WorldInventory)
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
auto WeaponData = Cast<UFortWeaponMeleeItemDefinition>(Weapon->GetWeaponData());
|
||||
|
||||
if (!WeaponData)
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
if (BuildingSMActor->IsDestroyed())
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
auto ResourceCount = 0;
|
||||
UFortResourceItemDefinition* ItemDef = UFortKismetLibrary::K2_GetResourceItemDefinition(BuildingSMActor->GetResourceType());
|
||||
|
||||
if (!ItemDef)
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
|
||||
static auto BuildingResourceAmountOverrideOffset = BuildingSMActor->GetOffset("BuildingResourceAmountOverride");
|
||||
auto& BuildingResourceAmountOverride = BuildingSMActor->Get<FCurveTableRowHandle>(BuildingResourceAmountOverrideOffset);
|
||||
|
||||
int ResourceCount = 0;
|
||||
|
||||
if (BuildingResourceAmountOverride.RowName.IsValid())
|
||||
{
|
||||
// auto AssetManager = Cast<UFortAssetManager>(GEngine->AssetManager);
|
||||
@@ -48,7 +73,7 @@ void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Dam
|
||||
// LOG_INFO(LogDev, "Before1");
|
||||
|
||||
if (!CurveTable)
|
||||
CurveTable = FindObject<UCurveTable>("/Game/Athena/Balance/DataTables/AthenaResourceRates.AthenaResourceRates");
|
||||
CurveTable = FindObject<UCurveTable>(L"/Game/Athena/Balance/DataTables/AthenaResourceRates.AthenaResourceRates");
|
||||
|
||||
{
|
||||
// auto curveMap = ((UDataTable*)CurveTable)->GetRowMap();
|
||||
@@ -59,31 +84,27 @@ void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Dam
|
||||
|
||||
// LOG_INFO(LogDev, "Out: {}", Out);
|
||||
|
||||
auto DamageThatWillAffect = Damage;
|
||||
const float DamageThatWillAffect = PreviousLastDamageHit > 0 && Damage > PreviousLastDamageHit ? PreviousLastDamageHit : Damage;
|
||||
|
||||
float skid = Out / (BuildingSMActor->GetMaxHealth() / DamageThatWillAffect);
|
||||
float skid = Out / (BuildingActor->GetMaxHealth() / DamageThatWillAffect);
|
||||
|
||||
ResourceCount = round(skid); // almost right
|
||||
ResourceCount = round(skid);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ItemDef || ResourceCount <= 0)
|
||||
if (ResourceCount <= 0)
|
||||
{
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
// return OnDamageServer(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
}
|
||||
|
||||
bool bIsWeakspot = Damage == 100.0f;
|
||||
PlayerController->ClientReportDamagedResourceBuilding(BuildingSMActor, BuildingSMActor->GetResourceType(), ResourceCount, false, bIsWeakspot);
|
||||
|
||||
if (ResourceCount > 0)
|
||||
{
|
||||
bool bShouldUpdate = false;
|
||||
PlayerController->GetWorldInventory()->AddItem(ItemDef, &bShouldUpdate, ResourceCount);
|
||||
bool bShouldUpdate = false;
|
||||
WorldInventory->AddItem(ItemDef, &bShouldUpdate, ResourceCount);
|
||||
|
||||
if (bShouldUpdate)
|
||||
PlayerController->GetWorldInventory()->Update();
|
||||
}
|
||||
if (bShouldUpdate)
|
||||
WorldInventory->Update();
|
||||
|
||||
return OnDamageServerOriginal(BuildingActor, Damage, DamageTags, Momentum, HitInfo, InstigatedBy, DamageCauser, EffectContext);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user