diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index 3a7adfd..e55ef2a 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -569,8 +569,40 @@ bool AFortGameModeAthena::Athena_ReadyToStartMatchHook(AFortGameModeAthena* Game int AFortGameModeAthena::Athena_PickTeamHook(AFortGameModeAthena* GameMode, uint8 preferredTeam, AActor* Controller) { LOG_INFO(LogTeam, "PickTeam called!"); - static auto NextTeamIndex = 3; - return NextTeamIndex++; + + auto GameState = Cast(GameMode->GetGameState()); + + auto Playlist = GameState->GetCurrentPlaylist(); + + static int CurrentTeamMembers = 0; // bad + + // std::cout << "Dru!\n"; + + if (!Playlist) + { + CurrentTeamMembers = 0; + static int Current = 3; + CurrentTeamMembers++; + return Current++; + } + + static int NextTeamIndex = Playlist->Get("DefaultFirstTeam"); + + // std::cout << "CurrentTeamMembers: " << CurrentTeamMembers << '\n'; + + static auto MaxSquadSizeOffset = Playlist->GetOffset("MaxSquadSize"); + + if (CurrentTeamMembers >= Playlist->Get(MaxSquadSizeOffset)) + { + // std::cout << "Moving next team!\n"; + + NextTeamIndex++; + CurrentTeamMembers = 0; + } + + CurrentTeamMembers++; + + return NextTeamIndex; } void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena* GameMode, AActor* NewPlayerActor) diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index 09f68c0..4fb2d1a 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -742,19 +742,28 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo if (!DeadPawn->IsDBNO()) { - static void (*RemoveFromAlivePlayers)(AFortGameModeAthena* GameMode, AFortPlayerController* PlayerController, APlayerState * PlayerState, APawn * FinisherPawn, - UFortWeaponItemDefinition * FinishingWeapon, uint8_t DeathCause, char a7) + static void (*RemoveFromAlivePlayers)(AFortGameModeAthena* GameMode, AFortPlayerController* PlayerController, APlayerState* PlayerState, APawn* FinisherPawn, + UFortWeaponItemDefinition* FinishingWeapon, uint8_t DeathCause, char a7) = decltype(RemoveFromAlivePlayers)(Addresses::RemoveFromAlivePlayers); AActor* DamageCauser = *(AActor**)(__int64(DeathReport) + MemberOffsets::DeathReport::DamageCauser); UFortWeaponItemDefinition* KillerWeaponDef = nullptr; static auto FortProjectileBaseClass = FindObject("/Script/FortniteGame.FortProjectileBase"); + LOG_INFO(LogDev, "FortProjectileBaseClass: {}", __int64(FortProjectileBaseClass)); if (DamageCauser->IsA(FortProjectileBaseClass)) + { + LOG_INFO(LogDev, "From a projectile!"); KillerWeaponDef = ((AFortWeapon*)DamageCauser->GetOwner())->GetWeaponData(); + } if (auto Weapon = Cast(DamageCauser)) + { + LOG_INFO(LogDev, "From a weapon!"); KillerWeaponDef = Weapon->GetWeaponData(); + } + + LOG_INFO(LogDev, "KillerWeaponDef: {}", KillerWeaponDef ? KillerWeaponDef->GetFullName() : "InvalidObject"); RemoveFromAlivePlayers(GameMode, PlayerController, KillerPlayerState == DeadPlayerState ? nullptr : KillerPlayerState, KillerPawn, KillerWeaponDef, DeathCause, 0); } diff --git a/Project Reboot 3.0/die.h b/Project Reboot 3.0/die.h index 4e54482..34cd3cd 100644 --- a/Project Reboot 3.0/die.h +++ b/Project Reboot 3.0/die.h @@ -90,32 +90,6 @@ static void SetZoneToIndexHook(AFortGameModeAthena* GameModeAthena, int Override { LOG_INFO(LogZone, "Hold [{}] {}", i, ZoneHoldDurations.at(i)); } - - /* - if (ZoneDurations.ArrayNum >= 1) ZoneDurations.at(0) = 0; - if (ZoneDurations.ArrayNum >= 2) ZoneDurations.at(1) = 180; - if (ZoneDurations.ArrayNum >= 3) ZoneDurations.at(2) = 120; - if (ZoneDurations.ArrayNum >= 4) ZoneDurations.at(3) = 90; - if (ZoneDurations.ArrayNum >= 5) ZoneDurations.at(4) = 70; - if (ZoneDurations.ArrayNum >= 6) ZoneDurations.at(5) = 60; - if (ZoneDurations.ArrayNum >= 7) ZoneDurations.at(6) = 60; - if (ZoneDurations.ArrayNum >= 8) ZoneDurations.at(7) = 55; - if (ZoneDurations.ArrayNum >= 9) ZoneDurations.at(8) = 45; - if (ZoneDurations.ArrayNum >= 10) ZoneDurations.at(9) = 75; - if (ZoneDurations.ArrayNum >= 11) ZoneDurations.at(10) = 0; - - if (ZoneHoldDurations.ArrayNum >= 1) ZoneHoldDurations.at(0) = 0; - if (ZoneHoldDurations.ArrayNum >= 2) ZoneHoldDurations.at(1) = 170; - if (ZoneHoldDurations.ArrayNum >= 3) ZoneHoldDurations.at(2) = 120; - if (ZoneHoldDurations.ArrayNum >= 4) ZoneHoldDurations.at(3) = 90; - if (ZoneHoldDurations.ArrayNum >= 5) ZoneHoldDurations.at(4) = 80; - if (ZoneHoldDurations.ArrayNum >= 6) ZoneHoldDurations.at(5) = 50; - if (ZoneHoldDurations.ArrayNum >= 7) ZoneHoldDurations.at(6) = 30; - if (ZoneHoldDurations.ArrayNum >= 8) ZoneHoldDurations.at(7) = 0; - if (ZoneHoldDurations.ArrayNum >= 9) ZoneHoldDurations.at(8) = 0; - if (ZoneHoldDurations.ArrayNum >= 10) ZoneHoldDurations.at(9) = 0; - if (ZoneHoldDurations.ArrayNum >= 11) ZoneHoldDurations.at(10) = 0; - */ } LOG_INFO(LogZone, "SafeZonePhase: {}", GameModeAthena->Get(SafeZonePhaseOffset));