#pragma once #include "StarNetElementSystem.hpp" #include "StarEntity.hpp" #include "StarNetworkedAnimator.hpp" #include "StarMovementController.hpp" #include "StarLuaComponents.hpp" #include "StarLoungingEntities.hpp" #include "StarScriptedEntity.hpp" #include "StarLuaAnimationComponent.hpp" namespace Star { STAR_EXCEPTION(VehicleException, StarException); STAR_CLASS(Vehicle); class Vehicle : public virtual LoungeableEntity, public virtual InteractiveEntity, public virtual PhysicsEntity, public virtual ScriptedEntity { public: Vehicle(Json baseConfig, String path, Json dynamicConfig); String name() const; Json baseConfig() const; Json dynamicConfig() const; Json diskStore() const; void diskLoad(Json diskStore); EntityType entityType() const override; ClientEntityMode clientEntityMode() const override; List damageSources() const override; Maybe queryHit(DamageSource const& source) const override; Maybe hitPoly() const override; List applyDamage(DamageRequest const& damage) override; List selfDamageNotifications() override; void init(World* world, EntityId entityId, EntityMode mode) override; void uninit() override; Vec2F position() const override; RectF metaBoundBox() const override; RectF collisionArea() const override; Vec2F velocity() const; pair writeNetState(uint64_t fromVersion) override; void readNetState(ByteArray data, float interpolationTime = 0) override; void enableInterpolation(float extrapolationHint) override; void disableInterpolation() override; void update(float dt, uint64_t currentStep) override; void render(RenderCallback* renderer) override; void renderLightSources(RenderCallback* renderer) override; List lightSources() const override; bool shouldDestroy() const override; void destroy(RenderCallback* renderCallback) override; Maybe receiveMessage(ConnectionId sendingConnection, String const& message, JsonArray const& args) override; RectF interactiveBoundBox() const override; bool isInteractive() const override; InteractAction interact(InteractRequest const& request) override; size_t anchorCount() const override; LoungeAnchorConstPtr loungeAnchor(size_t positionIndex) const override; void loungeControl(size_t positionIndex, LoungeControl loungeControl) override; void loungeAim(size_t positionIndex, Vec2F const& aimPosition) override; List forceRegions() const override; size_t movingCollisionCount() const override; Maybe movingCollision(size_t positionIndex) const override; Maybe callScript(String const& func, LuaVariadic const& args) override; Maybe evalScript(String const& code) override; void setPosition(Vec2F const& position); private: struct MasterControlState { Set slavesHeld; bool masterHeld; }; struct LoungePositionConfig { // The NetworkedAnimator part and part property which should control the // lounge position. String part; String partAnchor; Maybe exitBottomOffset; JsonObject armorCosmeticOverrides; Maybe cursorOverride; Maybe suppressTools; bool cameraFocus; NetElementBool enabled; NetElementEnum orientation; NetElementData> emote; NetElementData> dance; NetElementData> directives; NetElementData> statusEffects; Map masterControlState; Vec2F masterAimPosition; Set slaveOldControls; Vec2F slaveOldAimPosition; Set slaveNewControls; Vec2F slaveNewAimPosition; }; struct MovingCollisionConfig { PhysicsMovingCollision movingCollision; Maybe attachToPart; NetElementBool enabled; }; struct ForceRegionConfig { PhysicsForceRegion forceRegion; Maybe attachToPart; NetElementBool enabled; }; struct DamageSourceConfig { DamageSource damageSource; Maybe attachToPart; NetElementBool enabled; }; enum class VehicleLayer { Back, Passenger, Front }; EntityRenderLayer renderLayer(VehicleLayer vehicleLayer) const; LuaCallbacks makeVehicleCallbacks(); Json configValue(String const& name, Json def = {}) const; String m_typeName; Json m_baseConfig; String m_path; Json m_dynamicConfig; RectF m_boundBox; float m_slaveControlTimeout = 0.0f; OrderedHashMap m_loungePositions; OrderedHashMap m_movingCollisions; OrderedHashMap m_forceRegions; ClientEntityMode m_clientEntityMode; NetElementTopGroup m_netGroup; NetElementBool m_interactive; MovementController m_movementController; NetworkedAnimator m_networkedAnimator; NetworkedAnimator::DynamicTarget m_networkedAnimatorDynamicTarget; LuaMessageHandlingComponent>>> m_scriptComponent; LuaAnimationComponent>> m_scriptedAnimator; NetElementHashMap m_scriptedAnimationParameters; Map m_aliveMasterConnections; bool m_shouldDestroy = false; NetElementData m_damageTeam; OrderedHashMap m_damageSources; GameTimer m_slaveHeartbeatTimer; }; }