osb/source/game/StarNpc.hpp
2024-03-20 01:53:34 +11:00

262 lines
8.5 KiB
C++

#pragma once
#include "StarNpcDatabase.hpp"
#include "StarEntity.hpp"
#include "StarNetElementSystem.hpp"
#include "StarActorMovementController.hpp"
#include "StarHumanoid.hpp"
#include "StarEffectEmitter.hpp"
#include "StarEntitySplash.hpp"
#include "StarDamageBarEntity.hpp"
#include "StarNametagEntity.hpp"
#include "StarPortraitEntity.hpp"
#include "StarScriptedEntity.hpp"
#include "StarChattyEntity.hpp"
#include "StarEmoteEntity.hpp"
#include "StarInteractiveEntity.hpp"
#include "StarLoungingEntities.hpp"
#include "StarToolUserEntity.hpp"
#include "StarLuaComponents.hpp"
#include "StarLuaActorMovementComponent.hpp"
#include "StarItemBag.hpp"
#include "StarArmorWearer.hpp"
#include "StarToolUser.hpp"
#include "StarPhysicsEntity.hpp"
namespace Star {
STAR_CLASS(Item);
STAR_CLASS(RenderCallback);
STAR_CLASS(Npc);
STAR_CLASS(StatusController);
class Npc
: public virtual DamageBarEntity,
public virtual PortraitEntity,
public virtual NametagEntity,
public virtual ScriptedEntity,
public virtual ChattyEntity,
public virtual InteractiveEntity,
public virtual LoungingEntity,
public virtual ToolUserEntity,
public virtual PhysicsEntity,
public virtual EmoteEntity {
public:
Npc(NpcVariant const& npcVariant);
Npc(NpcVariant const& npcVariant, Json const& initialState);
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 mouthOffset(bool ignoreAdjustments = true) const;
Vec2F feetOffset() const;
Vec2F headArmorOffset() const;
Vec2F chestArmorOffset() const;
Vec2F legsArmorOffset() const;
Vec2F backArmorOffset() const;
RectF collisionArea() const override;
pair<ByteArray, uint64_t> writeNetState(uint64_t fromVersion = 0) override;
void readNetState(ByteArray data, float interpolationTime = 0.0f) override;
void enableInterpolation(float extrapolationHint = 0.0f) override;
void disableInterpolation() override;
String description() const override;
String species() const override;
Gender gender() const;
String npcType() const;
Json scriptConfigParameter(String const& parameterName, Json const& defaultValue = Json()) const;
Maybe<HitType> queryHit(DamageSource const& source) const override;
Maybe<PolyF> hitPoly() const override;
void damagedOther(DamageNotification const& damage) override;
List<DamageNotification> applyDamage(DamageRequest const& damage) override;
List<DamageNotification> selfDamageNotifications() override;
bool shouldDestroy() const override;
void destroy(RenderCallback* renderCallback) override;
void update(float dt, uint64_t currentVersion) override;
void render(RenderCallback* renderCallback) override;
void renderLightSources(RenderCallback* renderCallback) override;
void setPosition(Vec2F const& pos);
float maxHealth() const override;
float health() const override;
DamageBarType damageBar() const override;
List<Drawable> portrait(PortraitMode mode) const override;
String name() const override;
Maybe<String> statusText() const override;
bool displayNametag() const override;
Vec3B nametagColor() const override;
Vec2F nametagOrigin() const override;
bool aggressive() const;
Maybe<LuaValue> callScript(String const& func, LuaVariadic<LuaValue> const& args) override;
Maybe<LuaValue> evalScript(String const& code) override;
Vec2F mouthPosition() const override;
Vec2F mouthPosition(bool ignoreAdjustments) const override;
List<ChatAction> pullPendingChatActions() override;
bool isInteractive() const override;
InteractAction interact(InteractRequest const& request) override;
RectF interactiveBoundBox() const override;
Maybe<EntityAnchorState> loungingIn() const override;
List<QuestArcDescriptor> offeredQuests() const override;
StringSet turnInQuests() const override;
Vec2F questIndicatorPosition() const override;
List<LightSource> lightSources() const override;
Maybe<Json> receiveMessage(ConnectionId sendingConnection, String const& message, JsonArray const& args) override;
Vec2F armPosition(ToolHand hand, Direction facingDirection, float armAngle, Vec2F offset = {}) const override;
Vec2F handOffset(ToolHand hand, Direction facingDirection) const override;
Vec2F handPosition(ToolHand hand, Vec2F const& handOffset = {}) const override;
ItemPtr handItem(ToolHand hand) const override;
Vec2F armAdjustment() const override;
Vec2F velocity() const override;
Vec2F aimPosition() const override;
float interactRadius() const override;
Direction facingDirection() const override;
Direction walkingDirection() const override;
bool isAdmin() const override;
Color favoriteColor() const override;
float beamGunRadius() const override;
void addParticles(List<Particle> const& particles) override;
void addSound(String const& sound, float volume = 1.0f, float pitch = 1.0f) override;
bool inToolRange() const override;
bool inToolRange(Vec2F const& position) const override;
void addEphemeralStatusEffects(List<EphemeralStatusEffect> const& statusEffects) override;
ActiveUniqueStatusEffectSummary activeUniqueStatusEffectSummary() const override;
float powerMultiplier() const override;
bool fullEnergy() const override;
float energy() const override;
bool energyLocked() const override;
bool consumeEnergy(float energy) override;
void queueUIMessage(String const& message) override;
bool instrumentPlaying() override;
void instrumentEquipped(String const& instrumentKind) override;
void interact(InteractAction const& action) override;
void addEffectEmitters(StringSet const& emitters) override;
void requestEmote(String const& emote) override;
ActorMovementController* movementController() override;
StatusController* statusController() override;
void setCameraFocusEntity(Maybe<EntityId> const& cameraFocusEntity) override;
void playEmote(HumanoidEmote emote) override;
List<DamageSource> damageSources() const override;
List<PhysicsForceRegion> forceRegions() const override;
using Entity::setUniqueId;
private:
Vec2F getAbsolutePosition(Vec2F relativePosition) const;
void tickShared(float dt);
LuaCallbacks makeNpcCallbacks();
void setupNetStates();
void getNetStates(bool initial);
void setNetStates();
void addChatMessage(String const& message, Json const& config, String const& portrait = "");
void addEmote(HumanoidEmote const& emote);
void setDance(Maybe<String> const& danceName);
bool setItemSlot(String const& slot, ItemDescriptor itemDescriptor);
bool canUseTool() const;
void disableWornArmor(bool disable);
NpcVariant m_npcVariant;
NetElementTopGroup m_netGroup;
NetElementData<StringList> m_dropPools;
NetElementData<Maybe<String>> m_uniqueIdNetState;
NetElementData<EntityDamageTeam> m_teamNetState;
ClientEntityMode m_clientEntityMode;
Humanoid m_humanoid;
NetElementEnum<Humanoid::State> m_humanoidStateNetState;
NetElementEnum<HumanoidEmote> m_humanoidEmoteStateNetState;
NetElementData<Maybe<String>> m_humanoidDanceNetState;
NetElementData<Maybe<String>> m_deathParticleBurst;
ActorMovementControllerPtr m_movementController;
StatusControllerPtr m_statusController;
EffectEmitterPtr m_effectEmitter;
NetElementBool m_aggressive;
List<BehaviorStatePtr> m_behaviors;
mutable LuaMessageHandlingComponent<LuaStorableComponent<LuaActorMovementComponent<LuaUpdatableComponent<LuaWorldComponent<LuaBaseComponent>>>>> m_scriptComponent;
List<ChatAction> m_pendingChatActions;
NetElementEvent m_newChatMessageEvent;
NetElementString m_chatMessage;
NetElementString m_chatPortrait;
NetElementData<Json> m_chatConfig;
bool m_chatMessageUpdated;
NetElementData<Maybe<String>> m_statusText;
NetElementBool m_displayNametag;
HumanoidEmote m_emoteState;
GameTimer m_emoteCooldownTimer;
Maybe<String> m_dance;
GameTimer m_danceCooldownTimer;
GameTimer m_blinkCooldownTimer;
Vec2F m_blinkInterval;
NetElementBool m_isInteractive;
NetElementData<List<QuestArcDescriptor>> m_offeredQuests;
NetElementData<StringSet> m_turnInQuests;
Vec2F m_questIndicatorOffset;
ArmorWearerPtr m_armor;
ToolUserPtr m_tools;
NetElementBool m_disableWornArmor;
NetElementFloat m_xAimPosition;
NetElementFloat m_yAimPosition;
NetElementBool m_shifting;
NetElementBool m_damageOnTouch;
int m_hitDamageNotificationLimiter;
int m_hitDamageNotificationLimit;
};
}