#pragma once #include "StarEntity.hpp" #include "StarNetElementSystem.hpp" #include "StarEntityRendering.hpp" #include "StarActorMovementController.hpp" #include "StarNetworkedAnimator.hpp" #include "StarEffectEmitter.hpp" #include "StarMonsterDatabase.hpp" #include "StarDamageBarEntity.hpp" #include "StarNametagEntity.hpp" #include "StarPortraitEntity.hpp" #include "StarAggressiveEntity.hpp" #include "StarScriptedEntity.hpp" #include "StarChattyEntity.hpp" #include "StarPhysicsEntity.hpp" #include "StarBehaviorState.hpp" #include "StarLuaComponents.hpp" #include "StarLuaAnimationComponent.hpp" #include "StarLuaActorMovementComponent.hpp" namespace Star { STAR_CLASS(Monster); STAR_CLASS(StatusController); class Monster : public virtual DamageBarEntity, public virtual AggressiveEntity, public virtual ScriptedEntity, public virtual PhysicsEntity, public virtual NametagEntity, public virtual ChattyEntity, public virtual InteractiveEntity { public: struct SkillInfo { String label; String image; }; Monster(MonsterVariant const& variant, Maybe level = {}); Monster(Json const& diskStore); Json diskStore() const; ByteArray netStore(); EntityType entityType() const override; ClientEntityMode clientEntityMode() const override; void init(World* world, EntityId entityId, EntityMode mode) override; void uninit() override; Vec2F position() const override; RectF metaBoundBox() const override; Vec2F velocity() const; Vec2F mouthOffset() const; Vec2F feetOffset() const; RectF collisionArea() const override; pair writeNetState(uint64_t fromVersion = 0) override; void readNetState(ByteArray data, float interpolationTime = 0.0f) override; void enableInterpolation(float extrapolationHint) override; void disableInterpolation() override; String description() const override; List lightSources() const override; Maybe queryHit(DamageSource const& source) const override; Maybe hitPoly() const override; void hitOther(EntityId targetEntityId, DamageRequest const& damageRequest) override; void damagedOther(DamageNotification const& damage) override; List applyDamage(DamageRequest const& damage) override; List selfDamageNotifications() override; List damageSources() const override; bool shouldDie(); void knockout(); bool shouldDestroy() const override; void destroy(RenderCallback* renderCallback) override; void update(float dt, uint64_t currentStep) override; void render(RenderCallback* renderCallback) override; void renderLightSources(RenderCallback* renderCallback) override; void setPosition(Vec2F const& pos); Maybe receiveMessage(ConnectionId sendingConnection, String const& message, JsonArray const& args) override; float maxHealth() const override; float health() const override; DamageBarType damageBar() const override; float monsterLevel() const; SkillInfo activeSkillInfo() const; List portrait(PortraitMode mode) const override; String name() const override; String typeName() const; MonsterVariant monsterVariant() const; Maybe statusText() const override; bool displayNametag() const override; Vec3B nametagColor() const override; Vec2F nametagOrigin() const override; bool aggressive() const override; Maybe callScript(String const& func, LuaVariadic const& args) override; Maybe evalScript(String const& code) override; virtual Vec2F mouthPosition() const override; virtual Vec2F mouthPosition(bool ignoreAdjustments) const override; virtual List pullPendingChatActions() override; List forceRegions() const override; InteractAction interact(InteractRequest const& request) override; bool isInteractive() const override; Vec2F questIndicatorPosition() const override; using Entity::setKeepAlive; using Entity::setUniqueId; private: Vec2F getAbsolutePosition(Vec2F relativePosition) const; void updateStatus(float dt); LuaCallbacks makeMonsterCallbacks(); void addChatMessage(String const& message, String const& portrait = ""); void setupNetStates(); void getNetStates(bool initial); void setNetStates(); NetElementTopGroup m_netGroup; NetElementData> m_uniqueIdNetState; NetElementData m_teamNetState; MonsterVariant m_monsterVariant; Maybe m_monsterLevel; NetworkedAnimator m_networkedAnimator; NetworkedAnimator::DynamicTarget m_networkedAnimatorDynamicTarget; ActorMovementControllerPtr m_movementController; StatusControllerPtr m_statusController; EffectEmitter m_effectEmitter; // The set of damage source kinds that were used to kill this entity. StringSet m_deathDamageSourceKinds; bool m_damageOnTouch; bool m_aggressive; bool m_knockedOut; double m_knockoutTimer; String m_deathParticleBurst; String m_deathSound; String m_activeSkillName; Json m_dropPool; Vec2F m_questIndicatorOffset; List m_behaviors; mutable LuaMessageHandlingComponent>>>> m_scriptComponent; LuaAnimationComponent>> m_scriptedAnimator; NetElementData> m_physicsForces; NetElementData> m_monsterLevelNetState; NetElementBool m_damageOnTouchNetState; NetElementData m_animationDamageParts; NetElementData> m_damageSources; NetElementData m_dropPoolNetState; NetElementBool m_aggressiveNetState; NetElementBool m_knockedOutNetState; NetElementString m_deathParticleBurstNetState; NetElementString m_deathSoundNetState; NetElementString m_activeSkillNameNetState; NetElementData> m_name; NetElementBool m_displayNametag; NetElementBool m_interactive; List m_pendingChatActions; NetElementEvent m_newChatMessageEvent; NetElementString m_chatMessage; NetElementString m_chatPortrait; NetElementData m_damageBar; NetElementHashMap m_scriptedAnimationParameters; }; }