Files
Shiip-of-Hakinian-Espanol/soh/soh/Network/Anchor/Packets/GiveItem.cpp
Garrett Cox 31ee15dcc8 WIP
2024-12-16 09:18:29 -06:00

105 lines
3.4 KiB
C++

#ifdef ENABLE_REMOTE_CONTROL
#include "soh/Network/Anchor/Anchor.h"
#include <nlohmann/json.hpp>
#include <libultraship/libultraship.h>
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Notification/Notification.h"
#include "soh/Enhancements/randomizer/randomizer.h"
#include "soh/ImGuiUtils.h"
#include "soh/Enhancements/item-tables/ItemTableManager.h"
#include "soh/OTRGlobals.h"
extern "C" {
#include "functions.h"
extern PlayState* gPlayState;
}
/**
* GIVE_ITEM
*/
static bool gettingItem;
static uint8_t incomingIceTraps;
void Anchor::SendPacket_GiveItem(u16 modId, s16 getItemId) {
if (!IsSaveLoaded() || gettingItem) {
return;
}
if (modId == MOD_RANDOMIZER && getItemId == RG_ICE_TRAP && incomingIceTraps > 0) {
incomingIceTraps = MAX(incomingIceTraps - 1, 0);
return;
}
nlohmann::json payload;
payload["type"] = GIVE_ITEM;
payload["targetTeamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default");
payload["addToQueue"] = true;
payload["modId"] = modId;
payload["getItemId"] = getItemId;
SendJsonToRemote(payload);
}
void Anchor::HandlePacket_GiveItem(nlohmann::json payload) {
if (!IsSaveLoaded()) {
return;
}
uint32_t clientId = payload["clientId"].get<uint32_t>();
AnchorClient& client = clients[clientId];
GetItemEntry getItemEntry;
if (payload["modId"].get<u16>() == MOD_NONE) {
getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_NONE, payload["getItemId"].get<s16>());
} else {
getItemEntry = Rando::StaticData::RetrieveItem(payload["getItemId"].get<RandomizerGet>()).GetGIEntry_Copy();
}
gettingItem = true;
if (getItemEntry.modIndex == MOD_NONE) {
if (getItemEntry.getItemId == GI_SWORD_BGS) {
gSaveContext.bgsFlag = true;
}
Item_Give(gPlayState, getItemEntry.itemId);
} else if (getItemEntry.modIndex == MOD_RANDOMIZER) {
if (getItemEntry.getItemId == RG_ICE_TRAP) {
gSaveContext.pendingIceTrapCount++;
incomingIceTraps++;
} else {
Randomizer_Item_Give(gPlayState, getItemEntry);
}
}
// Handle if the player gets a 4th heart piece (usually handled in z_message)
s32 heartPieces = (s32)(gSaveContext.inventory.questItems & 0xF0000000) >> (QUEST_HEART_PIECE + 4);
if (heartPieces >= 4) {
gSaveContext.inventory.questItems &= ~0xF0000000;
gSaveContext.inventory.questItems += (heartPieces % 4) << (QUEST_HEART_PIECE + 4);
gSaveContext.healthCapacity += 0x10 * (heartPieces / 4);
gSaveContext.health += 0x10 * (heartPieces / 4);
gSaveContext.healthAccumulator = 0x140;
}
gettingItem = false;
if (getItemEntry.getItemCategory != ITEM_CATEGORY_JUNK) {
if (getItemEntry.modIndex == MOD_NONE) {
Notification::Emit({
.itemIcon = GetTextureForItemId(getItemEntry.itemId),
.prefix = client.name,
.message = "found",
.suffix = SohUtils::GetItemName(getItemEntry.itemId),
});
} else if (getItemEntry.modIndex == MOD_RANDOMIZER) {
Notification::Emit({
.prefix = client.name,
.message = "found",
.suffix = Rando::StaticData::RetrieveItem((RandomizerGet)getItemEntry.getItemId).GetName().english,
});
}
}
}
#endif // ENABLE_REMOTE_CONTROL