Show item name and player in ap item pickup notification

This commit is contained in:
aMannus
2025-05-26 10:49:44 +02:00
parent e6fec935d6
commit d5f395493b
5 changed files with 31 additions and 12 deletions

View File

@@ -70,5 +70,5 @@ DEFINE_HOOK(OnFileDropped, (std::string filePath));
DEFINE_HOOK(OnAssetAltChange, ());
DEFINE_HOOK(OnKaleidoUpdate, ());
DEFINE_HOOK(OnRandomizerItemGivenHooks, (uint32_t rc));
DEFINE_HOOK(OnRandomizerItemGivenHooks, (uint32_t rc, GetItemEntry gi, uint8_t isGiSkipped));
DEFINE_HOOK(OnArchipelagoItemRecieved, (uint32_t rc));

View File

@@ -304,8 +304,8 @@ void GameInteractor_ExecuteOnKaleidoUpdate() {
// Mark: Randomizer
void GameInteractor_ExecuteOnRandomizerItemGivenHooks(uint32_t rc) {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnRandomizerItemGivenHooks>(rc);
void GameInteractor_ExecuteOnRandomizerItemGivenHooks(uint32_t rc, GetItemEntry gi, uint8_t isGiSkipped) {
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnRandomizerItemGivenHooks>(rc, gi, isGiSkipped);
}
// MARK: Archipelago

View File

@@ -82,7 +82,7 @@ void GameInteractor_RegisterOnAssetAltChange(void (*fn)(void));
void GameInteractor_ExecuteOnKaleidoUpdate();
// Mark: - Randomizer
void GameInteractor_ExecuteOnRandomizerItemGivenHooks(uint32_t rc);
void GameInteractor_ExecuteOnRandomizerItemGivenHooks(uint32_t rc, GetItemEntry gi, uint8_t isGiSkipped);
// Mark: - Archipelago
void GameInteractor_ExecuteOnArchipelagoItemRecieved(uint32_t rc);

View File

@@ -307,6 +307,7 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
GetItemEntry getItemEntry;
RandomizerCheck rc = randomizerQueuedChecks.front();
auto loc = Rando::Context::GetInstance()->GetItemLocation(rc);
uint8_t isGiSkipped = 0;
if (rc == RC_ARCHIPELAGO_RECIEVED_ITEM) {
getItemEntry = Rando::Context::GetInstance()->GetArchipelagoGIEntry();
@@ -324,6 +325,7 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
randomizerQueuedItemEntry = getItemEntry;
SPDLOG_INFO("Queueing Item mod {} item {} from RC {}", getItemEntry.modIndex, getItemEntry.itemId,
static_cast<uint32_t>(rc));
if (
// Skipping ItemGet animation incompatible with checks that require closing a text box to finish
rc != RC_HF_OCARINA_OF_TIME_ITEM && rc != RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST &&
@@ -342,10 +344,12 @@ void RandomizerOnPlayerUpdateForRCQueueHandler() {
getItemEntry.getItemCategory == ITEM_CATEGORY_SKULLTULA_TOKEN ||
getItemEntry.getItemCategory == ITEM_CATEGORY_LESSER))))) {
Item_DropCollectible(gPlayState, &spawnPos, ITEM00_SOH_GIVE_ITEM_ENTRY | 0x8000);
isGiSkipped = 1;
}
}
GameInteractor_ExecuteOnRandomizerItemGivenHooks((uint32_t)rc);
GameInteractor_ExecuteOnRandomizerItemGivenHooks((uint32_t)rc, getItemEntry, isGiSkipped);
randomizerQueuedChecks.pop();
}
@@ -1048,12 +1052,16 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
.suffix = SohUtils::GetItemName(item00->itemEntry.itemId),
});
} else if (item00->itemEntry.modIndex == MOD_RANDOMIZER) {
Notification::Emit({
.message = "You found ",
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.english,
});
if (!(item00->itemEntry.getItemId == RG_ARCHIPELAGO_ITEM_PROGRESSIVE ||
item00->itemEntry.getItemId == RG_ARCHIPELAGO_ITEM_USEFUL ||
item00->itemEntry.getItemId == RG_ARCHIPELAGO_ITEM_JUNK)) {
Notification::Emit({
.message = "You found ",
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)item00->itemEntry.getItemId)
.GetName()
.english,
});
}
}
// This is typically called when you close the text box after getting an item, in case a previous

View File

@@ -14,6 +14,7 @@
#include "soh/Enhancements/randomizer/context.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/Notification/Notification.h"
#include "soh/ShipInit.hpp"
#include "soh/SaveManager.h"
@@ -352,11 +353,21 @@ void InitArchipelagoData(bool isDebug) {
void RegisterArchipelago() {
COND_HOOK(GameInteractor::OnRandomizerItemGivenHooks, IS_ARCHIPELAGO,
[](uint32_t rc) {
[](uint32_t rc, GetItemEntry gi, uint8_t isGiSkipped) {
if (rc == RC_ARCHIPELAGO_RECIEVED_ITEM) {
gSaveContext.ship.quest.data.archipelago.lastReceivedItemIndex++;
} else {
ArchipelagoClient::GetInstance().CheckLocation((RandomizerCheck)rc);
if (isGiSkipped && gi.modIndex == MOD_RANDOMIZER &&
(gi.getItemId == RG_ARCHIPELAGO_ITEM_PROGRESSIVE || gi.getItemId == RG_ARCHIPELAGO_ITEM_USEFUL ||
gi.getItemId == RG_ARCHIPELAGO_ITEM_JUNK)) {
Notification::Emit({
.prefix = std::string(gSaveContext.ship.quest.data.archipelago.locations[rc].itemName),
.message = " for ",
.suffix = std::string(gSaveContext.ship.quest.data.archipelago.locations[rc].playerName)
});
}
}
});
}