#pragma once #include "StarHumanoid.hpp" #include "StarNetElementSystem.hpp" #include "StarItemDescriptor.hpp" #include "StarStatusTypes.hpp" #include "StarLightSource.hpp" #include "StarDamage.hpp" #include "StarEffectEmitter.hpp" #include "StarEntityRenderingTypes.hpp" #include "StarPhysicsEntity.hpp" namespace Star { STAR_CLASS(ObjectItem); STAR_CLASS(ToolUserEntity); STAR_CLASS(Item); STAR_CLASS(World); STAR_CLASS(ToolUser); class ToolUser : public NetElementSyncGroup { public: ToolUser(); Json diskStore() const; void diskLoad(Json const& diskStore); void init(ToolUserEntity* user); void uninit(); ItemPtr primaryHandItem() const; ItemPtr altHandItem() const; ItemDescriptor primaryHandItemDescriptor() const; ItemDescriptor altHandItemDescriptor() const; List lightSources() const; void effects(EffectEmitter& emitter) const; List statusEffects() const; Maybe toolRadius() const; // FIXME: There is a render method in ToolUser, why can't this be rendered // with the rest of everything else, there are TILE previews and OBJECT // previews, but of course one has to go through the render method and the // other has to be rendered separately. List renderObjectPreviews(Vec2F aimPosition, Direction walkingDirection, bool inToolRange, Color favoriteColor) const; // Returns the facing override direciton if there is one Maybe setupHumanoidHandItems(Humanoid& humanoid, Vec2F position, Vec2F aimPosition) const; void setupHumanoidHandItemDrawables(Humanoid& humanoid) const; Vec2F armPosition(Humanoid const& humanoid, ToolHand hand, Direction facingDirection, float armAngle, Vec2F offset) const; Vec2F handOffset(Humanoid const& humanoid, ToolHand hand, Direction facingDirection) const; Vec2F handPosition(ToolHand hand, Humanoid const& humanoid, Vec2F const& handOffset) const; bool queryShieldHit(DamageSource const& source) const; void tick(float dt, bool shifting, HashSet const& moves); void beginPrimaryFire(); void beginAltFire(); void endPrimaryFire(); void endAltFire(); bool firingPrimary() const; bool firingAlt() const; List damageSources() const; List forceRegions() const; void render(RenderCallback* renderCallback, bool inToolRange, bool shifting, EntityRenderLayer renderLayer); void setItems(ItemPtr primaryHandItem, ItemPtr altHandItem); void suppressItems(bool suppress); Maybe receiveMessage(String const& message, bool localMessage, JsonArray const& args = {}); float beamGunRadius() const; private: class NetItem : public NetElement { public: void initNetVersion(NetElementVersion const* version = nullptr) override; void netStore(DataStream& ds) const override; void netLoad(DataStream& ds) override; void enableNetInterpolation(float extrapolationHint = 0.0f) override; void disableNetInterpolation() override; void tickNetInterpolation(float dt) override; bool writeNetDelta(DataStream& ds, uint64_t fromVersion) const override; void readNetDelta(DataStream& ds, float interpolationTime = 0.0) override; void blankNetDelta(float interpolationTime) override; ItemPtr const& get() const; void set(ItemPtr item); bool pullNewItem(); private: void updateItemDescriptor(); NetElementData m_itemDescriptor; ItemPtr m_item; NetElementVersion const* m_netVersion = nullptr; bool m_netInterpolationEnabled = false; float m_netExtrapolationHint = 0; bool m_newItem = false; mutable DataStreamBuffer m_buffer; }; void initPrimaryHandItem(); void initAltHandItem(); void uninitItem(ItemPtr const& item); void netElementsNeedLoad(bool full) override; void netElementsNeedStore() override; float m_beamGunRadius; unsigned m_beamGunGlowBorder; float m_objectPreviewInnerAlpha; float m_objectPreviewOuterAlpha; ToolUserEntity* m_user; NetItem m_primaryHandItem; NetItem m_altHandItem; bool m_fireMain; bool m_fireAlt; bool m_edgeTriggeredMain; bool m_edgeTriggeredAlt; bool m_edgeSuppressedMain; bool m_edgeSuppressedAlt; NetElementBool m_suppress; NetElementFloat m_primaryFireTimerNetState; NetElementFloat m_altFireTimerNetState; NetElementFloat m_primaryTimeFiringNetState; NetElementFloat m_altTimeFiringNetState; NetElementBool m_primaryItemActiveNetState; NetElementBool m_altItemActiveNetState; }; }