mirror of
https://github.com/CraftyBoss/SuperMarioOdysseyOnline.git
synced 2024-11-22 03:05:16 +00:00
159 lines
No EOL
4.9 KiB
C++
159 lines
No EOL
4.9 KiB
C++
#include <sys/types.h>
|
|
#include "server/Client.hpp"
|
|
#include "al/LiveActor/LiveActor.h"
|
|
#include "al/actor/ActorInitInfo.h"
|
|
#include "al/actor/Placement.h"
|
|
#include "al/byaml/ByamlIter.h"
|
|
#include "al/nerve/Nerve.h"
|
|
#include "al/nerve/NerveExecutor.h"
|
|
#include "al/nerve/NerveKeeper.h"
|
|
#include "al/util.hpp"
|
|
#include "al/util/ControllerUtil.h"
|
|
#include "al/util/LiveActorUtil.h"
|
|
#include "al/util/NerveUtil.h"
|
|
#include "game/Actors/WorldEndBorderKeeper.h"
|
|
#include "game/Layouts/CoinCounter.h"
|
|
#include "game/Player/Actions/PlayerActionGroundMoveControl.h"
|
|
#include "game/Player/PlayerActorHakoniwa.h"
|
|
#include "game/Player/PlayerConst.h"
|
|
#include "game/Player/States/PlayerStateRunHakoniwa.h"
|
|
#include "game/StageScene/StageSceneStateOption.h"
|
|
#include "game/StageScene/StageSceneStatePauseMenu.h"
|
|
#include "game/StageScene/StageSceneStateServerConfig.hpp"
|
|
#include "logger.hpp"
|
|
#include "main.hpp"
|
|
#include "al/byaml/writer/ByamlWriter.h"
|
|
#include "math/seadVector.h"
|
|
#include "rs/util/InputUtil.h"
|
|
#include "sead/prim/seadSafeString.h"
|
|
#include "server/HideAndSeekMode.hpp"
|
|
|
|
bool comboBtnHook(int port) {
|
|
if (Client::isModeActive()) { // only switch to combo if any gamemode is active
|
|
return !al::isPadHoldL(port) && al::isPadTriggerDown(port);
|
|
} else {
|
|
return al::isPadTriggerDown(port);
|
|
}
|
|
}
|
|
|
|
void saveWriteHook(al::ByamlWriter* saveByml) {
|
|
|
|
const char *serverIP = Client::getCurrentIP();
|
|
|
|
if (serverIP) {
|
|
saveByml->addString("ServerIP", serverIP);
|
|
} else {
|
|
saveByml->addString("ServerIP", "0.0.0.0");
|
|
}
|
|
|
|
saveByml->pop();
|
|
}
|
|
|
|
bool saveReadHook(int* padRumbleInt, al::ByamlIter const& saveByml, char const* padRumbleKey) {
|
|
|
|
const char *serverIP = "";
|
|
|
|
if (al::tryGetByamlString(&serverIP, saveByml, "ServerIP")) {
|
|
Client::setLastUsedIP(serverIP);
|
|
}
|
|
|
|
return al::tryGetByamlS32(padRumbleInt, saveByml, padRumbleKey);
|
|
}
|
|
|
|
bool registerShineToList(Shine* shineActor) {
|
|
|
|
if (shineActor->shineId >= 0) {
|
|
Client::tryRegisterShine(shineActor);
|
|
}
|
|
|
|
return al::isAlive(shineActor);
|
|
}
|
|
|
|
void overrideNerveHook(StageSceneStatePauseMenu* thisPtr, al::Nerve* nrvSet) {
|
|
|
|
if (al::isPadHoldZL(-1)) {
|
|
al::setNerve(thisPtr, &nrvStageSceneStatePauseMenuServerConfig);
|
|
} else {
|
|
al::setNerve(thisPtr, nrvSet);
|
|
}
|
|
}
|
|
|
|
StageSceneStateServerConfig *sceneStateServerConfig = nullptr;
|
|
|
|
void initStateHook(StageSceneStatePauseMenu *thisPtr, char const *stateName, al::Scene *host, al::LayoutInitInfo const &initInfo, FooterParts *footer,
|
|
GameDataHolder *data, bool unkBool) {
|
|
thisPtr->mStateOption =
|
|
new StageSceneStateOption(stateName, host, initInfo, footer, data, unkBool);
|
|
|
|
sceneStateServerConfig = new StageSceneStateServerConfig("ServerConfig", host, initInfo, footer, data, unkBool);
|
|
}
|
|
|
|
void initNerveStateHook(StageSceneStatePauseMenu* stateParent, StageSceneStateOption* stateOption,
|
|
al::Nerve const* executingNerve, char const* stateName) {
|
|
|
|
al::initNerveState(stateParent, stateOption, executingNerve, stateName);
|
|
|
|
al::initNerveState(stateParent, sceneStateServerConfig, &nrvStageSceneStatePauseMenuServerConfig, "CustomNerveOverride");
|
|
}
|
|
|
|
// skips starting both coin counters
|
|
void startCounterHook(CoinCounter* thisPtr) {
|
|
if (!Client::isModeActive()) {
|
|
thisPtr->tryStart();
|
|
}
|
|
}
|
|
|
|
// Simple hook that can be used to override isModeE3 checks to enable/disable certain behaviors
|
|
bool modeE3Hook() {
|
|
return Client::isModeActive();
|
|
}
|
|
|
|
// Skips ending the play guide layout if a mode is active, since the mode would have already ended it
|
|
void playGuideEndHook(al::SimpleLayoutAppearWaitEnd* thisPtr) {
|
|
if (!Client::isModeActive()) {
|
|
thisPtr->end();
|
|
}
|
|
}
|
|
|
|
// Gravity Hooks
|
|
|
|
void initHackCapHook(al::LiveActor *cappy) {
|
|
al::initActorPoseTQGSV(cappy);
|
|
}
|
|
|
|
al::PlayerHolder* createTicketHook(StageScene* curScene) {
|
|
// only creates custom gravity camera ticket if hide and seek mode is active
|
|
if (Client::isSelectedMode(GameMode::HIDEANDSEEK)) {
|
|
al::CameraDirector* director = curScene->getCameraDirector();
|
|
if (director) {
|
|
if (director->mFactory) {
|
|
al::CameraTicket* gravityCamera = director->createCameraFromFactory(
|
|
"CameraPoserCustom", nullptr, 0, 5, sead::Matrix34f::ident);
|
|
|
|
HideAndSeekMode* mode = Client::getMode<HideAndSeekMode>();
|
|
|
|
mode->setCameraTicket(gravityCamera);
|
|
}
|
|
}
|
|
}
|
|
|
|
return al::getScenePlayerHolder(curScene);
|
|
}
|
|
|
|
bool borderPullBackHook(WorldEndBorderKeeper* thisPtr) {
|
|
|
|
bool isFirstStep = al::isFirstStep(thisPtr);
|
|
|
|
if (isFirstStep) {
|
|
if (Client::isSelectedMode(GameMode::HIDEANDSEEK) && Client::isModeActive()) {
|
|
|
|
HideAndSeekMode* mode = Client::getMode<HideAndSeekMode>();
|
|
|
|
if (mode->isUseGravity()) {
|
|
killMainPlayer(thisPtr->mActor);
|
|
}
|
|
}
|
|
}
|
|
|
|
return isFirstStep;
|
|
} |