mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-26 18:44:33 +00:00
109 lines
3.3 KiB
C++
109 lines
3.3 KiB
C++
#include "Library/MapObj/ConveyerStep.h"
|
|
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/LiveActor/ActorActionFunction.h"
|
|
#include "Library/LiveActor/ActorClippingFunction.h"
|
|
#include "Library/LiveActor/ActorCollisionFunction.h"
|
|
#include "Library/LiveActor/ActorInitUtil.h"
|
|
#include "Library/LiveActor/ActorModelFunction.h"
|
|
#include "Library/LiveActor/ActorMovementFunction.h"
|
|
#include "Library/LiveActor/ActorPoseUtil.h"
|
|
#include "Library/Math/MathUtil.h"
|
|
#include "Library/Nerve/NerveSetupUtil.h"
|
|
#include "Library/Placement/PlacementFunction.h"
|
|
#include "Project/LiveActor/ConveyerKeyKeeper.h"
|
|
|
|
namespace {
|
|
using namespace al;
|
|
|
|
NERVE_IMPL(ConveyerStep, Wait)
|
|
|
|
NERVES_MAKE_STRUCT(ConveyerStep, Wait)
|
|
} // namespace
|
|
|
|
namespace al {
|
|
ConveyerStep::ConveyerStep(const char* name) : LiveActor(name) {}
|
|
|
|
void ConveyerStep::init(const ActorInitInfo& info) {
|
|
initMapPartsActor(this, info, nullptr);
|
|
initNerve(this, &NrvConveyerStep.Wait, 0);
|
|
onDrawClipping(this);
|
|
|
|
makeActorAlive();
|
|
}
|
|
|
|
bool ConveyerStep::receiveMsg(const SensorMsg* message, HitSensor* other, HitSensor* self) {
|
|
if (mHost)
|
|
return mHost->receiveMsg(message, other, self);
|
|
|
|
return false;
|
|
}
|
|
|
|
void ConveyerStep::setHost(LiveActor* host) {
|
|
mHost = host;
|
|
}
|
|
|
|
void ConveyerStep::setConveyerKeyKeeper(const ConveyerKeyKeeper* conveyerKeyKeeper, f32 coord) {
|
|
mConveyerKeyKeeper = conveyerKeyKeeper;
|
|
mMaxCoord = coord;
|
|
}
|
|
|
|
void ConveyerStep::setTransByCoord(f32 coord, bool isForwards) {
|
|
setTransByCoord(coord, isForwards, false);
|
|
}
|
|
|
|
void ConveyerStep::setTransByCoord(f32 coord, bool isForwards, bool isForceReset) {
|
|
f32 newCoord = wrapValue(coord, mMaxCoord);
|
|
s32 index = -1;
|
|
|
|
mConveyerKeyKeeper->calcPosAndQuat(getTransPtr(this), getQuatPtr(this), &index, newCoord);
|
|
|
|
const char* keyHitReactionName = nullptr;
|
|
const char* actionName = nullptr;
|
|
|
|
if (index > -1) {
|
|
const ConveyerKey& conveyerKey = mConveyerKeyKeeper->getConveyerKey(index);
|
|
|
|
if (tryGetStringArg(&keyHitReactionName, *conveyerKey.placementInfo,
|
|
"KeyHitReactionName") &&
|
|
(!mKeyHitReactionName || !isEqualString(mKeyHitReactionName, keyHitReactionName)))
|
|
startHitReaction(this, keyHitReactionName);
|
|
|
|
if (tryGetStringArg(&actionName, *conveyerKey.placementInfo, "ActionName") &&
|
|
(!mActionName || !isEqualString(mActionName, actionName)))
|
|
startAction(this, actionName);
|
|
}
|
|
|
|
mKeyHitReactionName = keyHitReactionName;
|
|
mActionName = actionName;
|
|
|
|
if ((isForwards && newCoord < mCurrentCoord) || (!isForwards && newCoord > mCurrentCoord) ||
|
|
isForceReset)
|
|
resetPosition(this);
|
|
|
|
if (newCoord > mConveyerKeyKeeper->getTotalMoveDistance()) {
|
|
if (mIsExist) {
|
|
mIsExist = false;
|
|
if (getModelKeeper() && !isHideModel(this))
|
|
hideModel(this);
|
|
if (isExistCollisionParts(this))
|
|
invalidateCollisionParts(this);
|
|
}
|
|
} else if (!mIsExist) {
|
|
mIsExist = true;
|
|
if (getModelKeeper() && isHideModel(this))
|
|
showModel(this);
|
|
if (isExistCollisionParts(this))
|
|
validateCollisionParts(this);
|
|
}
|
|
|
|
mCurrentCoord = newCoord;
|
|
}
|
|
|
|
void ConveyerStep::setTransAndResetByCoord(f32 coord) {
|
|
setTransByCoord(coord, true, true);
|
|
}
|
|
|
|
void ConveyerStep::exeWait() {}
|
|
} // namespace al
|