mirror of
https://github.com/CraftyBoss/SuperMarioOdysseyOnline.git
synced 2024-11-17 08:55:10 +00:00
102 lines
3.4 KiB
C++
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);
|
||
|
}
|