SuperMarioOdysseyOnline/source/server/captureSync.cpp

102 lines
3.4 KiB
C++

#include "server/Client.hpp"
#include "actors/PuppetActor.h"
#include "al/util.hpp"
#include "algorithms/CaptureTypes.h"
#include "logger.hpp"
#include "main.hpp"
#include "actors/PuppetHackActor.h"
#include "al/actor/alPlacementFunction.h"
// Helper Methods
bool isInCaptureList(const char* capture) {
return CaptureTypes::FindType(capture) != CaptureTypes::Type::Unknown;
}
PuppetHackActor *createPuppetHackActorFromFactory(al::ActorInitInfo const &rootInitInfo, const al::PlacementInfo *rootPlacementInfo, PuppetInfo *curInfo, const char *hackType) {
al::ActorInitInfo actorInitInfo = al::ActorInitInfo();
actorInitInfo.initViewIdSelf(rootPlacementInfo, rootInitInfo);
int serverMaxPlayers = Client::getMaxPlayerCount(); // TODO: Find a way around needing to do this, such as creating a single hack actor per puppet that can dynamically switch models
// only use this if player count is 8
if (serverMaxPlayers == 8) {
const char *stageName = "";
if (actorInitInfo.mPlacementInfo._0.tryGetStringByKey(&stageName, "PlacementFileName")) {
if (al::isEqualString(stageName, "ForestWorldHomeStage")) {
return nullptr;
}
}
}
if (serverMaxPlayers > 8) { // disable capture sync if dealing with more than 8 players
return nullptr;
}
al::createActor createActor = actorInitInfo.mActorFactory->getCreator("PuppetHackActor");
if(createActor) {
PuppetHackActor *newActor = (PuppetHackActor*)createActor("PuppetHackActor");
newActor->initOnline(curInfo, hackType); // set puppet info first before calling init so we can get costume info from the info
newActor->init(actorInitInfo);
return newActor;
}else {
return nullptr;
}
}
// Hooks
al::LiveActor *initObjHook(al::ActorInitInfo const &initInfo, al::PlacementInfo const *placement) {
al::ActorInitInfo newInfo = al::ActorInitInfo();
newInfo.initViewIdSelf(placement, initInfo);
const char *className = "";
al::tryGetClassName(&className, newInfo);
if(isInCaptureList(className))
{
int serverMaxPlayers = Client::getMaxPlayerCount();
for (size_t i = 0; i < serverMaxPlayers - 1; i++)
{
PuppetActor* curPuppet = Client::getPuppet(i);
if (curPuppet) {
const char* hackName = tryConvertName(className);
// make sure we only make as many unique puppet hack actors as needed
if(!curPuppet->isInCaptureList(hackName)) {
PuppetHackActor* dupliActor = createPuppetHackActorFromFactory(
initInfo, placement, curPuppet->getInfo(), hackName);
if (dupliActor) {
curPuppet->addCapture(dupliActor, hackName);
}
}
}
}
PuppetActor* debugPuppet = Client::getDebugPuppet();
if (debugPuppet) {
const char* hackName = tryConvertName(className);
if(!debugPuppet->isInCaptureList(hackName)) {
PuppetHackActor *dupliActor = createPuppetHackActorFromFactory(initInfo, placement, debugPuppet->getInfo(), hackName);
if (dupliActor) {
debugPuppet->addCapture(dupliActor, hackName);
}
}
}
}
return al::createPlacementActorFromFactory(initInfo, placement);
}