SuperMarioOdysseyOnline/source/puppets/PuppetMain.cpp

73 lines
2.5 KiB
C++

#include "server/Client.hpp"
#include "logger.hpp"
#include "main.hpp"
al::LiveActor *createPuppetActorFromFactory(al::ActorInitInfo const &rootInitInfo, al::PlacementInfo const &rootPlacementInfo, bool isDebug) {
al::ActorInitInfo actorInitInfo = al::ActorInitInfo();
actorInitInfo.initViewIdSelf(&rootPlacementInfo, rootInitInfo);
al::createActor createActor = actorInitInfo.mActorFactory->getCreator("PuppetActor");
if(createActor) {
PuppetActor *newActor = (PuppetActor*)createActor("PuppetActor");
if(!isDebug) {
if(Client::tryAddPuppet(newActor)) {
PuppetInfo *curInfo = Client::getLatestInfo();
if(!curInfo) {
Logger::log("Puppet Info is Null!\n");
}else {
newActor->initOnline(curInfo); // set puppet info first before calling init so we can get costume info from the info
newActor->init(actorInitInfo);
}
}
} else {
Logger::log("Creating Test Puppet.\n");
newActor->initOnline(Client::getDebugPuppetInfo());
newActor->init(actorInitInfo);
newActor->mIsDebug = true;
newActor->makeActorAlive();
if (Client::tryAddDebugPuppet(newActor)) {
Logger::log("Debug Puppet Created!\n");
}
}
return newActor;
}else {
return nullptr;
}
}
// Hooks
void initPuppetActors(al::Scene *scene, al::ActorInitInfo const &rootInfo, char const *listName) {
al::StageInfo *stageInfo = al::getStageInfoMap(scene, 0);
int placementCount = 0;
al::PlacementInfo rootPlacement = al::PlacementInfo();
al::tryGetPlacementInfoAndCount(&rootPlacement, &placementCount, stageInfo, "PlayerList");
// check if default placement count for PlayerList is greater than 0 (so we can use the placement info of the player to init our custom puppet actors)
if(placementCount > 0) {
al::PlacementInfo playerPlacement = al::PlacementInfo();
al::getPlacementInfoByIndex(&playerPlacement, rootPlacement, 0);
for (size_t i = 0; i < Client::getMaxPlayerCount(); i++)
{
createPuppetActorFromFactory(rootInfo, playerPlacement, false);
}
// create a debug puppet for testing purposes
createPuppetActorFromFactory(rootInfo, playerPlacement, true);
}
al::initPlacementObjectMap(scene, rootInfo, listName); // run init for ObjectList after we init our puppet actors
}