#pragma once #include "aostate.h" #include "llcontrol.h" #include "lleventtimer.h" class AOSystem final : public LLSingleton { friend class LLSingleton; friend class AOInvTimer; friend class LLFloaterAO; AOSystem(); ~AOSystem(); public: static void start(); // Runs the necessary actions to get the AOSystem ready, then initializes it. void initSingleton() override; static void typing(bool start); int stand_iterator; bool isStanding() const { return stand().playing; } void updateStand(); int cycleStand(bool next = true, bool random = true); void toggleSwim(bool underwater); void doMotion(const LLUUID& id, bool start); void startMotion(const LLUUID& id) { doMotion(id, true); } void stopMotion(const LLUUID& id) { doMotion(id, false); } void stopCurrentStand() const { stand().play(false); } void stopAllOverrides() const; protected: struct struct_stands { LLUUID ao_id; std::string anim_name; }; typedef std::vector stands_vec; stands_vec mAOStands; struct overrides { virtual bool overrideAnim(bool swimming, const LLUUID& anim) const = 0; virtual const LLUUID& getOverride() const { return ao_id; } virtual bool play_condition() const; // True if prevented from playing virtual bool isLowPriority() const { return false; } void play(bool start = true); LLUUID ao_id; LLPointer setting; bool playing; virtual ~overrides() {} protected: overrides(const char* setting_name); }; friend struct override_low_priority; friend struct override_single; friend struct override_sit; struct override_stand final : public overrides { override_stand() : overrides(nullptr) {} bool overrideAnim(bool swimming, const LLUUID& anim) const override; bool play_condition() const override; bool isLowPriority() const override { return true; } void update(const stands_vec& stands, const int& iter) { if (stands.empty()) ao_id.setNull(); else ao_id = stands[iter].ao_id; } }; std::array mAOOverrides; override_stand& stand() const { return static_cast(*mAOOverrides[STATE_AGENT_IDLE]); } private: std::array mConnections; class AOStandTimer final : public LLEventTimer { friend class AOSystem; public: AOStandTimer() : LLEventTimer(F32_MAX) {} ~AOStandTimer() { // LL_INFOS() << "dead" << LL_ENDL; } BOOL tick() override { // LL_INFOS() << "tick" << LL_ENDL; if (auto ao = AOSystem::getIfExists()) ao->cycleStand(); return false; } void reset(); }; AOStandTimer mAOStandTimer; static void requestConfigNotecard(bool reload = true); static void parseNotecard(LLVFS* vfs, const LLUUID& asset_uuid, LLAssetType::EType type, S32 status, bool reload); };