Player: Add PlayerPuppet (#826)

This commit is contained in:
Narr the Reg 2025-12-18 17:52:02 -06:00 committed by GitHub
parent 131c1c8e85
commit f0237ead55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 192 additions and 9 deletions

View file

@ -10,7 +10,7 @@ class DrawContext;
namespace al {
class GraphicsSystemInfo;
class ModelDrawBufferCounter;
struct ModelDrawBufferCounter;
class ModelKeeper;
class ModelDrawDisplayList;
class ModelCtrl;

View file

@ -279,7 +279,7 @@ u32 calcPlayerListOrderByDistance(const LiveActor* actor, const LiveActor** acto
const sead::Vector3f& pos = getTrans(actor);
f32 distances[64];
for (s32 i = 0; i != playerNum; i++) {
for (s32 i = 0; i != (s32)playerNum; i++) {
LiveActor* player = getPlayerActor(actor, i);
f32 distance = sead::Mathf::maxNumber();
if (!isDead(player)) {
@ -289,14 +289,14 @@ u32 calcPlayerListOrderByDistance(const LiveActor* actor, const LiveActor** acto
distances[i] = distance;
}
for (s32 i = 0; i < size; i++) {
for (s32 i = 0; (u32)i < size; i++) {
f32 min_distance = sead::Mathf::maxNumber();
s32 min_index = -1;
for (u32 i = 0; i < playerNum; i++) {
if (distances[i] <= min_distance) {
min_distance = distances[i];
min_index = i;
for (u32 j = 0; j < playerNum; j++) {
if (distances[j] <= min_distance) {
min_distance = distances[j];
min_index = j;
}
}

View file

@ -13,7 +13,7 @@ class SePlayInfo;
class SeResourceSpecificInfo;
class SeResourceRtpcInfo;
class SeRtpcSetting;
class SeUserInfo;
struct SeUserInfo;
} // namespace al
namespace alSeDbFunction {

View file

@ -24,10 +24,13 @@ struct SeUserInfo {
const char* name;
bool isPartsUser = false;
sead::PtrArray<const char*> partsUserNameList;
sead::PtrArray<const char*>* partsUserNameList;
AudioInfoListWithParts<SeEmitterInfo>* emitterInfoList;
AudioInfoListWithParts<SeActionInfo>* actionInfoList;
AudioInfoListWithParts<SePlayInfo>* playInfoList;
AudioInfoListWithParts<SeHitReactionInfo>* hitReactionInfoList;
};
static_assert(sizeof(SeUserInfo) == 0x38);
} // namespace al

View file

@ -0,0 +1,52 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadQuat.h>
#include <math/seadVector.h>
#include <prim/seadSafeString.h>
namespace al {
class HitSensor;
} // namespace al
class IUsePlayerPuppet {
public:
virtual void start(al::HitSensor*, al::HitSensor*) = 0;
virtual void end() = 0;
virtual void cancel() = 0;
virtual void setTrans(const sead::Vector3f&) = 0;
virtual void setPose(const sead::Quatf&) = 0;
virtual void setVelocity(const sead::Vector3f&) = 0;
virtual void resetPosition(const sead::Vector3f&) = 0;
virtual const sead::Vector3f& getTrans() const = 0;
virtual const sead::Vector3f& getVelocity() const = 0;
virtual const sead::Vector3f& getGravity() const = 0;
virtual void calcFront(sead::Vector3f*) const = 0;
virtual void calcUp(sead::Vector3f*) const = 0;
virtual void startAction(const sead::SafeString&) const = 0;
virtual bool isActionEnd() const = 0;
virtual bool isActionPlaying(const char*) const = 0;
virtual void setAnimRate(f32) const = 0;
virtual f32 getAnimFrameMax() const = 0;
virtual void hide() = 0;
virtual void show() = 0;
virtual bool isHidden() const = 0;
virtual void hideSilhouette() = 0;
virtual void showSilhouette() = 0;
virtual void hideShadow() = 0;
virtual void showShadow() = 0;
virtual void requestDamage() = 0;
virtual void clearRequestDamage() = 0;
virtual bool isRequestDamage() const = 0;
virtual void setBindEndOnGround() = 0;
virtual bool isBindEndOnGround() const = 0;
virtual void setBindEndJump(const sead::Vector3f&, s32) = 0;
virtual bool isBindEndJump() const = 0;
virtual void validateCollisionCheck() = 0;
virtual void invalidateCollisionCheck() = 0;
virtual bool isValidCollisionCheck() = 0;
virtual bool isCollidedGround() = 0;
virtual const sead::Vector3f& getCollidedGroundNormal() = 0;
virtual void validateSensor() = 0;
virtual void invalidateSensor() = 0;
};

128
src/Player/PlayerPuppet.h Normal file
View file

@ -0,0 +1,128 @@
#pragma once
#include <basis/seadTypes.h>
#include <math/seadQuat.h>
#include <math/seadVector.h>
#include <prim/seadSafeString.h>
#include "Player/IUsePlayerPuppet.h"
namespace al {
class AreaObj;
class HitSensor;
class LiveActor;
} // namespace al
class ActorDimensionKeeper;
class HackCap;
class IPlayerModelChanger;
class IUsePlayerCollision;
class PlayerAnimator;
class PlayerDamageKeeper;
class PlayerConst;
class PlayerCounterForceRun;
class PlayerEffect;
class PlayerInput;
class WorldEndBorderKeeper;
class PlayerPuppet : public IUsePlayerPuppet {
public:
PlayerPuppet(al::LiveActor*, HackCap*, PlayerAnimator*, IUsePlayerCollision*,
ActorDimensionKeeper*, IPlayerModelChanger*, WorldEndBorderKeeper*,
PlayerCounterForceRun*, PlayerDamageKeeper*, PlayerEffect*, const PlayerInput*,
const PlayerConst*);
void start(al::HitSensor*, al::HitSensor*) override;
void end() override;
void cancel() override;
void setTrans(const sead::Vector3f&) override;
void setPose(const sead::Quatf&) override;
void setVelocity(const sead::Vector3f&) override;
void resetPosition(const sead::Vector3f&) override;
const sead::Vector3f& getTrans() const override;
const sead::Vector3f& getVelocity() const override;
const sead::Vector3f& getGravity() const override;
void calcFront(sead::Vector3f*) const override;
void calcUp(sead::Vector3f*) const override;
void startAction(const sead::SafeString&) const override;
bool isActionEnd() const override;
bool isActionPlaying(const char*) const override;
void setAnimRate(f32) const override;
f32 getAnimFrameMax() const override;
void hide() override;
void show() override;
bool isHidden() const override;
void hideSilhouette() override;
void showSilhouette() override;
void hideShadow() override;
void showShadow() override;
void requestDamage() override;
void clearRequestDamage() override;
bool isRequestDamage() const override;
void setBindEndOnGround() override;
bool isBindEndOnGround() const override;
void setBindEndJump(const sead::Vector3f&, s32) override;
bool isBindEndJump() const override;
void validateCollisionCheck() override;
void invalidateCollisionCheck() override;
bool isValidCollisionCheck() override;
bool isCollidedGround() override;
const sead::Vector3f& getCollidedGroundNormal() override;
void validateSensor() override;
void invalidateSensor() override;
void startPlayerHitReaction(const char*);
void setBindEndWallJump(const sead::Vector3f&, s32);
void validate2D();
void keepOn2D();
void endKeepOn2D();
void requestUpdateRecoveryInfo(bool, bool, const sead::Vector3f&, const sead::Vector3f&,
const al::AreaObj*);
bool tryUpdateRecoveryInfo(bool*, bool*, sead::Vector3f*, sead::Vector3f*, const al::AreaObj**);
bool isBinding() const;
bool isNoCollide() const;
private:
al::LiveActor* mActor;
HackCap* mHackCap;
PlayerAnimator* mPlayerAnimator;
IUsePlayerCollision* mIUsePlayerCollision;
ActorDimensionKeeper* mActorDimensionKeeper;
IPlayerModelChanger* mIPlayerModelChanger;
WorldEndBorderKeeper* mWorldEndBorderKeeper;
PlayerCounterForceRun* mPlayerCounterForceRun;
PlayerDamageKeeper* mPlayerDamageKeeper;
PlayerEffect* mPlayerEffect;
void* _58;
PlayerInput* mPlayerInput;
PlayerConst* mPlayerConst;
al::HitSensor* _70;
al::HitSensor* _78;
bool _80;
bool _81;
bool _82;
sead::Vector3f _84;
sead::Vector3f _90;
al::AreaObj* mAreaObj;
bool mIsBindEndOnGround;
bool mIsBindEndJump;
bool _aa;
bool mIsValidCollisionCheck;
bool _ac;
bool mIsRequestDamage;
bool _ae;
bool mIsSensorValid;
bool _b0;
bool _b1;
bool _b2;
bool _b3;
bool _b4;
bool _b5;
bool _b6;
char filler[0x8];
sead::Vector3f _c8;
};
static_assert(sizeof(PlayerPuppet) == 0xd0);