Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarNpc.hpp
blob: 381b943384d96fc231eb9537157b058056aa161d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#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(Songbook);
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(ByteArray const& netStore, NetCompatibilityRules rules = {});
  Npc(NpcVariant const& npcVariant);
  Npc(NpcVariant const& npcVariant, Json const& initialState);

  Json diskStore() const;
  ByteArray netStore(NetCompatibilityRules rules = {});

  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, NetCompatibilityRules rules = {}) override;
  void readNetState(ByteArray data, float interpolationTime = 0.0f, NetCompatibilityRules rules = {}) 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;
  String nametag() 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;
  Songbook* songbook();
  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;
  SongbookPtr m_songbook;

  NetElementBool m_disableWornArmor;

  NetElementFloat m_xAimPosition;
  NetElementFloat m_yAimPosition;

  NetElementBool m_shifting;
  NetElementBool m_damageOnTouch;

  int m_hitDamageNotificationLimiter;
  int m_hitDamageNotificationLimit;
};

}