Update FortPlayerController.cpp

This commit is contained in:
max_the
2024-01-14 23:01:21 +01:00
committed by GitHub
parent c11ffdaa0e
commit 28d5870f73

View File

@@ -548,6 +548,101 @@ void AFortPlayerController::ServerAttemptInteractHook(UObject* Context, FFrame*
return; return;
} }
else if (ReceivingActor->IsA(BuildingItemCollectorActorClass)) else if (ReceivingActor->IsA(BuildingItemCollectorActorClass))
{
if (Engine_Version >= 424 && /*Fortnite_Version < 15 && */ReceivingActor->GetFullName().contains("Wumba"))
{
bool bIsSidegrading = InteractionBeingAttempted == EInteractionBeingAttempted::SecondInteraction ? true : false;
LOG_INFO(LogDev, "bIsSidegrading: {}", (bool)bIsSidegrading);
struct FWeaponUpgradeItemRow
{
void* FTableRowBaseInheritance;
UFortWeaponItemDefinition* CurrentWeaponDef; // 0x8(0x8)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
UFortWeaponItemDefinition* UpgradedWeaponDef; // 0x10(0x8)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
EFortWeaponUpgradeCosts WoodCost; // 0x18(0x1)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
EFortWeaponUpgradeCosts MetalCost; // 0x19(0x1)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
EFortWeaponUpgradeCosts BrickCost; // 0x1A(0x1)(Edit, ZeroConstructor, DisableEditOnInstance, IsPlainOldData, NoDestructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
EFortWeaponUpgradeDirection Direction;
};
static auto WumbaDataTable = FindObject<UDataTable>("/Game/Items/Datatables/AthenaWumbaData.AthenaWumbaData");
static auto LootPackagesRowMap = WumbaDataTable->GetRowMap();
auto Pawn = Cast<AFortPawn>(PlayerController->GetPawn());
auto CurrentHeldWeapon = Pawn->GetCurrentWeapon();
auto CurrentHeldWeaponDef = CurrentHeldWeapon->GetWeaponData();
auto Direction = bIsSidegrading ? EFortWeaponUpgradeDirection::Horizontal : EFortWeaponUpgradeDirection::Vertical;
LOG_INFO(LogDev, "Direction: {}", (int)Direction);
FWeaponUpgradeItemRow* FoundRow = nullptr;
for (int i = 0; i < LootPackagesRowMap.Pairs.Elements.Data.Num(); i++)
{
auto& Pair = LootPackagesRowMap.Pairs.Elements.Data.at(i).ElementData.Value;
auto First = Pair.First;
auto Row = (FWeaponUpgradeItemRow*)Pair.Second;
if (Row->CurrentWeaponDef == CurrentHeldWeaponDef && Row->Direction == Direction)
{
FoundRow = Row;
break;
}
}
if (!FoundRow)
{
LOG_WARN(LogGame, "Failed to find row!");
return;
}
auto NewDefinition = FoundRow->UpgradedWeaponDef;
LOG_INFO(LogDev, "UpgradedWeaponDef: {}", NewDefinition->GetFullName());
int WoodCost = (int)FoundRow->WoodCost * 50;
int StoneCost = (int)FoundRow->BrickCost * 50 - 400;
int MetalCost = (int)FoundRow->MetalCost * 50 - 200;
if (bIsSidegrading)
{
WoodCost = 20;
StoneCost = 20;
MetalCost = 20;
}
static auto WoodItemData = FindObject<UFortItemDefinition>("/Game/Items/ResourcePickups/WoodItemData.WoodItemData");
static auto StoneItemData = FindObject<UFortItemDefinition>("/Game/Items/ResourcePickups/StoneItemData.StoneItemData");
static auto MetalItemData = FindObject<UFortItemDefinition>("/Game/Items/ResourcePickups/MetalItemData.MetalItemData");
auto WorldInventory = PlayerController->GetWorldInventory();
auto WoodInstance = WorldInventory->FindItemInstance(WoodItemData);
auto WoodCount = WoodInstance->GetItemEntry()->GetCount();
auto StoneInstance = WorldInventory->FindItemInstance(StoneItemData);
auto StoneCount = StoneInstance->GetItemEntry()->GetCount();
auto MetalInstance = WorldInventory->FindItemInstance(MetalItemData);
auto MetalCount = MetalInstance->GetItemEntry()->GetCount();
bool bShouldUpdate = false;
WorldInventory->RemoveItem(WoodInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, WoodCost);
WorldInventory->RemoveItem(StoneInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, StoneCost);
WorldInventory->RemoveItem(MetalInstance->GetItemEntry()->GetItemGuid(), &bShouldUpdate, MetalCost);
WorldInventory->RemoveItem(CurrentHeldWeapon->GetItemEntryGuid(), &bShouldUpdate, 1, true);
WorldInventory->AddItem(NewDefinition, &bShouldUpdate);
if (bShouldUpdate)
WorldInventory->Update();
}
else
{ {
auto WorldInventory = PlayerController->GetWorldInventory(); auto WorldInventory = PlayerController->GetWorldInventory();
@@ -628,6 +723,7 @@ void AFortPlayerController::ServerAttemptInteractHook(UObject* Context, FFrame*
ItemCollector->K2_DestroyActor(); ItemCollector->K2_DestroyActor();
} }
} }
}
return ServerAttemptInteractOriginal(Context, Stack, Ret); return ServerAttemptInteractOriginal(Context, Stack, Ret);
} }