87 changes: 33 additions & 54 deletions src/content_sao.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serverobject.h"
#include "itemgroup.h"
#include "object_properties.h"
#include "constants.h"

class UnitSAO: public ServerActiveObject
{
public:
UnitSAO(ServerEnvironment *env, v3f pos):
ServerActiveObject(env, pos),
m_hp(-1), m_yaw(0) {}
UnitSAO(ServerEnvironment *env, v3f pos);
virtual ~UnitSAO() {}

virtual void setYaw(const float yaw) { m_yaw = yaw; }
Expand All @@ -46,6 +43,29 @@ class UnitSAO: public ServerActiveObject
protected:
s16 m_hp;
float m_yaw;

bool m_properties_sent;
struct ObjectProperties m_prop;

ItemGroupList m_armor_groups;
bool m_armor_groups_sent;

v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;

// Stores position and rotation for each bone name
UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;

int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
};

/*
Expand Down Expand Up @@ -81,7 +101,7 @@ class LuaEntitySAO : public UnitSAO
void setHP(s16 hp);
s16 getHP() const;
void setArmorGroups(const ItemGroupList &armor_groups);
ItemGroupList getArmorGroups();
const ItemGroupList &getArmorGroups();
void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop);
void setBonePosition(const std::string &bone, v3f position, v3f rotation);
Expand All @@ -90,7 +110,7 @@ class LuaEntitySAO : public UnitSAO
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id);
UNORDERED_SET<int> getAttachmentChildIds();
const UNORDERED_SET<int> &getAttachmentChildIds();
ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified();
/* LuaEntitySAO-specific */
Expand All @@ -103,45 +123,24 @@ class LuaEntitySAO : public UnitSAO
void setSprite(v2s16 p, int num_frames, float framelength,
bool select_horiz_by_yawpitch);
std::string getName();
bool getCollisionBox(aabb3f *toset);
bool collideWithObjects();
bool getCollisionBox(aabb3f *toset) const;
bool collideWithObjects() const;
private:
std::string getPropertyPacket();
void sendPosition(bool do_interpolate, bool is_movement_end);

std::string m_init_name;
std::string m_init_state;
bool m_registered;
struct ObjectProperties m_prop;

v3f m_velocity;
v3f m_acceleration;

ItemGroupList m_armor_groups;

bool m_properties_sent;
float m_last_sent_yaw;
v3f m_last_sent_position;
v3f m_last_sent_velocity;
float m_last_sent_position_timer;
float m_last_sent_move_precision;
bool m_armor_groups_sent;

v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;

UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;

int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
};

/*
Expand Down Expand Up @@ -235,7 +234,7 @@ class PlayerSAO : public UnitSAO
u16 getBreath() const { return m_breath; }
void setBreath(const u16 breath, bool send = true);
void setArmorGroups(const ItemGroupList &armor_groups);
ItemGroupList getArmorGroups();
const ItemGroupList &getArmorGroups();
void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop);
void setBonePosition(const std::string &bone, v3f position, v3f rotation);
Expand All @@ -244,7 +243,7 @@ class PlayerSAO : public UnitSAO
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id);
UNORDERED_SET<int> getAttachmentChildIds();
const UNORDERED_SET<int> &getAttachmentChildIds();
ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified();

Expand Down Expand Up @@ -315,13 +314,13 @@ class PlayerSAO : public UnitSAO
m_is_singleplayer = is_singleplayer;
}

bool getCollisionBox(aabb3f *toset);
bool collideWithObjects();
bool getCollisionBox(aabb3f *toset) const;
bool collideWithObjects() const { return true; }

void initialize(RemotePlayer *player, const std::set<std::string> &privs);

v3f getEyePosition() const { return m_base_position + getEyeOffset(); }
v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); }
v3f getEyeOffset() const;

private:
std::string getPropertyPacket();
Expand All @@ -346,31 +345,11 @@ class PlayerSAO : public UnitSAO

int m_wield_index;
bool m_position_not_sent;
ItemGroupList m_armor_groups;
bool m_armor_groups_sent;

bool m_properties_sent;
struct ObjectProperties m_prop;
// Cached privileges for enforcement
std::set<std::string> m_privs;
bool m_is_singleplayer;

v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;

// Stores position and rotation for each bone name
UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;

int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
u16 m_breath;
f32 m_pitch;
f32 m_fov;
Expand Down
7 changes: 3 additions & 4 deletions src/script/lua_api/l_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,8 @@ int ObjectRef::l_remove(lua_State *L)
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
return 0;

UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
UNORDERED_SET<int>::iterator it;
const UNORDERED_SET<int> &child_ids = co->getAttachmentChildIds();
UNORDERED_SET<int>::const_iterator it;
for (it = child_ids.begin(); it != child_ids.end(); ++it) {
// Child can be NULL if it was deleted earlier
if (ServerActiveObject *child = env->getActiveObject(*it))
Expand Down Expand Up @@ -396,8 +396,7 @@ int ObjectRef::l_get_armor_groups(lua_State *L)
if (co == NULL)
return 0;
// Do it
ItemGroupList groups = co->getArmorGroups();
push_groups(L, groups);
push_groups(L, co->getArmorGroups());
return 1;
}

Expand Down
8 changes: 4 additions & 4 deletions src/serverobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ class ServerActiveObject : public ActiveObject

virtual void setArmorGroups(const ItemGroupList &armor_groups)
{}
virtual ItemGroupList getArmorGroups()
{ return ItemGroupList(); }
virtual const ItemGroupList &getArmorGroups()
{ static const ItemGroupList rv; return rv; }
virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity)
{}
virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop)
Expand All @@ -166,8 +166,8 @@ class ServerActiveObject : public ActiveObject
{}
virtual void removeAttachmentChild(int child_id)
{}
virtual UNORDERED_SET<int> getAttachmentChildIds()
{ return UNORDERED_SET<int>(); }
virtual const UNORDERED_SET<int> &getAttachmentChildIds()
{ static const UNORDERED_SET<int> rv; return rv; }
virtual ObjectProperties* accessObjectProperties()
{ return NULL; }
virtual void notifyObjectPropertiesModified()
Expand Down