Luanti 5.17.0-dev
Loading...
Searching...
No Matches
unit_sao.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4// Copyright (C) 2013-2020 Minetest core developers & community
5
6#pragma once
7
8#include "object_properties.h"
10#include <quaternion.h>
11#include <AnimSpec.h>
12#include "util/numeric.h"
13
15{
16public:
17
19 scene::TrackAnimSpec spec;
28 };
29 struct Animation {
30 std::unordered_map<scene::TrackId, TrackAnimation> tracks;
31 };
32
33 UnitSAO(ServerEnvironment *env, v3f pos);
34 virtual ~UnitSAO() = default;
35
36 u16 getHP() const override { return m_hp; }
37 // Use a function, if isDead can be defined by other conditions
38 bool isDead() const { return m_hp == 0; }
39
40 // Rotation
41 void setRotation(v3f rotation) { m_rotation = rotation; }
42 const v3f &getRotation() const { return m_rotation; }
43 const v3f getTotalRotation() const {
44 // This replicates what happens clientside serverside
45 core::matrix4 rot;
47 v3f res;
48 // First rotate by m_rotation, then rotate by the automatic rotate yaw
49 (core::quaternion(v3f(0, -m_rotation_add_yaw * core::DEGTORAD, 0))
50 * core::quaternion(rot.getRotationRadians()))
51 .toEuler(res);
52 return res * core::RADTODEG;
53 }
54 v3f getRadRotation() { return m_rotation * core::DEGTORAD; }
55
56 // Deprecated
57 f32 getRadYawDep() const { return (m_rotation.Y + 90.) * core::DEGTORAD; }
58
59 // Armor groups
60 inline bool isImmortal() const
61 {
62 return itemgroup_get(getArmorGroups(), "immortal");
63 }
64 void setArmorGroups(const ItemGroupList &armor_groups) override;
65 const ItemGroupList &getArmorGroups() const override;
66
67 // Animation
68 void setAnimation(const scene::TrackId &track, scene::TrackAnimSpec anim_spec) override;
69 void stopAnimation(const scene::TrackId &track) override;
70 std::optional<scene::TrackAnimSpec> getAnimation(const scene::TrackId &track) const override;
71 std::vector<std::pair<scene::TrackId, scene::TrackAnimSpec>>
72 getAllAnimations() const override;
73 void setAnimationSpeed(const scene::TrackId &track, f32 fps) override;
74 const Animation &getAnimation() const { return m_animation; }
75
76 // Bone position
77 void setBoneOverride(const std::string &bone, const BoneOverride &props) override;
78 BoneOverride getBoneOverride(const std::string &bone) override;
79 const std::unordered_map<std::string, BoneOverride>
80 &getBoneOverrides() const override { return m_bone_override; };
81
82 // Attachments
83 ServerActiveObject *getParent() const override;
84 inline bool isAttached() const { return m_attachment_parent_id != 0; }
85 void setAttachment(object_t parent_id, const std::string &bone, v3f position,
86 v3f rotation, bool force_visible) override;
87 void getAttachment(object_t *parent_id, std::string *bone, v3f *position,
88 v3f *rotation, bool *force_visible) const override;
89 void clearChildAttachments() override;
90 void addAttachmentChild(object_t child_id) override;
91 void removeAttachmentChild(object_t child_id) override;
92 const std::unordered_set<object_t> &getAttachmentChildIds() const override {
94 }
95
96 // Object properties
98 void notifyObjectPropertiesModified() override;
99 bool isAttachmentOutdated() const { return !m_attachment_sent; }
100 void sendOutdatedData();
101
102 // Update packets
103 std::string generateUpdateAttachmentCommand() const;
104 std::string generateUpdateAnimationSpeedCommand(const scene::TrackId &track) const;
105 std::string generateUpdateAnimationCommand(const scene::TrackId &track) const;
106 std::string generateStopAnimationCommand(const scene::TrackId &track) const;
107 std::string generateUpdateArmorGroupsCommand() const;
108 static std::string generateUpdatePositionCommand(const v3f &position,
109 const v3f &velocity, const v3f &acceleration, const v3f &rotation,
110 bool do_interpolate, bool is_movement_end, f32 update_interval);
111 std::string generateSetPropertiesCommand(const ObjectProperties &prop) const;
112 static std::string generateUpdateBoneOverrideCommand(
113 const std::string &bone, const BoneOverride &props);
114 void sendPunchCommand();
115
116protected:
117 u16 m_hp = 1;
118
121
123
124 // Object properties
125 bool m_properties_sent = true;
127
128 // Stores position and rotation for each bone name
129 std::unordered_map<std::string, BoneOverride> m_bone_override;
130
132
133 void clearAnyAttachments();
142
143private:
144 void onAttach(ServerActiveObject *parent);
145 void onDetach(ServerActiveObject *parent);
146
147 std::string generatePunchCommand(u16 result_hp) const;
148
149 // Used to detect nested calls to setAttachments(), which can happen due to
150 // Lua callbacks
152
153 // Armor groups
155
156 // Animation
158
159 // Bone positions
161
162 // Attachments
163 std::unordered_set<object_t> m_attachment_child_ids;
164 std::string m_attachment_bone = "";
167 bool m_attachment_sent = false;
168 bool m_force_visible = false;
169};
u16 object_t
Definition activeobject.h:158
Definition serveractiveobject.h:42
virtual void onMarkedForDeactivation()
Definition serveractiveobject.h:257
ServerActiveObject(ServerEnvironment *env, v3f pos)
Definition serveractiveobject.cpp:12
virtual void onMarkedForRemoval()
Definition serveractiveobject.h:258
Definition serverenvironment.h:113
void setArmorGroups(const ItemGroupList &armor_groups) override
Definition unit_sao.cpp:27
static std::string generateUpdateBoneOverrideCommand(const std::string &bone, const BoneOverride &props)
Definition unit_sao.cpp:339
bool m_bone_override_sent
Definition unit_sao.h:160
void sendPunchCommand()
Definition unit_sao.cpp:471
void clearChildAttachments() override
Definition unit_sao.cpp:260
f32 m_rotation_add_yaw
Definition unit_sao.h:120
std::vector< std::pair< scene::TrackId, scene::TrackAnimSpec > > getAllAnimations() const override
Definition unit_sao.cpp:70
u16 getHP() const override
Definition unit_sao.h:36
bool isDead() const
Definition unit_sao.h:38
u8 m_attachment_call_counter
Definition unit_sao.h:151
std::string generateSetPropertiesCommand(const ObjectProperties &prop) const
Definition unit_sao.cpp:453
ItemGroupList m_armor_groups
Definition unit_sao.h:122
std::unordered_map< std::string, BoneOverride > m_bone_override
Definition unit_sao.h:129
UnitSAO(ServerEnvironment *env, v3f pos)
Definition unit_sao.cpp:11
virtual void onMarkedForRemoval() override
Definition unit_sao.h:138
void notifyObjectPropertiesModified() override
Definition unit_sao.cpp:320
const v3f & getRotation() const
Definition unit_sao.h:42
bool m_properties_sent
Definition unit_sao.h:125
const ItemGroupList & getArmorGroups() const override
Definition unit_sao.cpp:35
std::unordered_set< object_t > m_attachment_child_ids
Definition unit_sao.h:163
ObjectProperties m_prop
Definition unit_sao.h:126
v3f m_attachment_rotation
Definition unit_sao.h:166
bool isAttached() const
Definition unit_sao.h:84
f32 getRadYawDep() const
Definition unit_sao.h:57
void onAttach(ServerActiveObject *parent)
Definition unit_sao.cpp:285
static std::string generateUpdatePositionCommand(const v3f &position, const v3f &velocity, const v3f &acceleration, const v3f &rotation, bool do_interpolate, bool is_movement_end, f32 update_interval)
Definition unit_sao.cpp:429
ObjectProperties * accessObjectProperties() override
Definition unit_sao.cpp:315
u16 m_hp
Definition unit_sao.h:117
void setBoneOverride(const std::string &bone, const BoneOverride &props) override
Definition unit_sao.cpp:98
std::string m_attachment_bone
Definition unit_sao.h:164
const std::unordered_map< std::string, BoneOverride > & getBoneOverrides() const override
Definition unit_sao.h:80
BoneOverride getBoneOverride(const std::string &bone) override
Definition unit_sao.cpp:105
v3f m_attachment_position
Definition unit_sao.h:165
void setRotation(v3f rotation)
Definition unit_sao.h:41
void getAttachment(object_t *parent_id, std::string *bone, v3f *position, v3f *rotation, bool *force_visible) const override
Definition unit_sao.cpp:239
bool isAttachmentOutdated() const
Definition unit_sao.h:99
ServerActiveObject * getParent() const override
Definition unit_sao.cpp:17
bool m_force_visible
Definition unit_sao.h:168
virtual ~UnitSAO()=default
void removeAttachmentChild(object_t child_id) override
Definition unit_sao.cpp:280
void sendOutdatedData()
Definition unit_sao.cpp:114
v3f getRadRotation()
Definition unit_sao.h:54
std::string generateUpdateArmorGroupsCommand() const
Definition unit_sao.cpp:417
std::string generateUpdateAnimationCommand(const scene::TrackId &track) const
Definition unit_sao.cpp:385
bool m_armor_groups_sent
Definition unit_sao.h:154
void setAttachment(object_t parent_id, const std::string &bone, v3f position, v3f rotation, bool force_visible) override
Definition unit_sao.cpp:152
std::string generateUpdateAnimationSpeedCommand(const scene::TrackId &track) const
Definition unit_sao.cpp:373
bool m_attachment_sent
Definition unit_sao.h:167
const v3f getTotalRotation() const
Definition unit_sao.h:43
std::string generateStopAnimationCommand(const scene::TrackId &track) const
Definition unit_sao.cpp:407
Animation m_animation
Definition unit_sao.h:157
void setAnimation(const scene::TrackId &track, scene::TrackAnimSpec anim_spec) override
Definition unit_sao.cpp:40
bool isImmortal() const
Definition unit_sao.h:60
void stopAnimation(const scene::TrackId &track) override
Definition unit_sao.cpp:48
const Animation & getAnimation() const
Definition unit_sao.h:74
std::string generateUpdateAttachmentCommand() const
Definition unit_sao.cpp:325
std::string generatePunchCommand(u16 result_hp) const
Definition unit_sao.cpp:461
virtual void onMarkedForDeactivation() override
Definition unit_sao.h:134
object_t m_attachment_parent_id
Definition unit_sao.h:131
void clearAnyAttachments()
Definition unit_sao.cpp:249
v3f m_rotation
Definition unit_sao.h:119
const std::unordered_set< object_t > & getAttachmentChildIds() const override
Definition unit_sao.h:92
void setAnimationSpeed(const scene::TrackId &track, f32 fps) override
Definition unit_sao.cpp:81
void onDetach(ServerActiveObject *parent)
Definition unit_sao.cpp:298
void addAttachmentChild(object_t child_id) override
Definition unit_sao.cpp:275
core::vector3df v3f
Definition irr_v3d.h:11
std::unordered_map< std::string, int > ItemGroupList
Definition itemgroup.h:10
static int itemgroup_get(const ItemGroupList &groups, const std::string &name)
Definition itemgroup.h:12
ServerActiveObject::object_t object_t
Definition l_object.cpp:32
void setPitchYawRoll(core::matrix4 &m, v3f rot)
Definition numeric.h:467
Definition activeobject.h:70
Definition object_properties.h:39
Definition unit_sao.h:29
std::unordered_map< scene::TrackId, TrackAnimation > tracks
Definition unit_sao.h:30
Definition unit_sao.h:18
State state
Definition unit_sao.h:27
scene::TrackAnimSpec spec
Definition unit_sao.h:19
State
Definition unit_sao.h:20
@ STOPPED
animation has been stopped (not paused), emit AO_CMD_STOP_ANIMATION
Definition unit_sao.h:24
@ NEEDS_RESEND
animation has been started, emit AO_CMD_SET_ANIMATION
Definition unit_sao.h:22
@ SENT
animation state on clients is up to date, nothing to do
Definition unit_sao.h:21
@ NEEDS_SPEED_RESEND
speed has been changed, emit AO_CMD_SET_ANIMATION_SPEED
Definition unit_sao.h:23