#include "collision.h"
#include "environment.h"
#include "settings.h"
-#include "profiler.h"
#include "serialization.h" // For compressZlib
#include "tool.h" // For ToolCapabilities
#include "gamedef.h"
m_armor_groups_sent(false),
m_animation_speed(0),
m_animation_blend(0),
+ m_animation_loop(true),
m_animation_sent(false),
m_bone_position_sent(false),
m_attachment_parent_id(0),
v3f p_acceleration = m_acceleration;
moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
pos_max_d, box, m_prop.stepheight, dtime,
- p_pos, p_velocity, p_acceleration,
+ &p_pos, &p_velocity, p_acceleration,
this, m_prop.collideWithObjects);
// Apply results
}
if((m_prop.automatic_face_movement_dir) &&
- (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)){
- m_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset;
+ (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001))
+ {
+ float optimal_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI
+ + m_prop.automatic_face_movement_dir_offset;
+ float max_rotation_delta =
+ dtime * m_prop.automatic_face_movement_max_rotation_per_sec;
+
+ if ((m_prop.automatic_face_movement_max_rotation_per_sec > 0) &&
+ (fabs(m_yaw - optimal_yaw) > max_rotation_delta)) {
+
+ m_yaw = optimal_yaw < m_yaw ? m_yaw - max_rotation_delta : m_yaw + max_rotation_delta;
+ } else {
+ m_yaw = optimal_yaw;
+ }
}
}
if(m_animation_sent == false){
m_animation_sent = true;
- std::string str = gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend);
+ std::string str = gob_cmd_update_animation(
+ m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
// create message and add to list
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
writeU8(os, 4 + m_bone_position.size()); // number of messages stuffed in here
os<<serializeLongString(getPropertyPacket()); // message 1
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
- os<<serializeLongString(gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend)); // 3
+ os<<serializeLongString(gob_cmd_update_animation(
+ m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
}
std::string LuaEntitySAO::getStaticData()
{
- verbosestream<<__FUNCTION_NAME<<std::endl;
+ verbosestream<<FUNCTION_NAME<<std::endl;
std::ostringstream os(std::ios::binary);
// version
writeU8(os, 1);
return m_armor_groups;
}
-void LuaEntitySAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend)
+void LuaEntitySAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop)
{
m_animation_range = frame_range;
m_animation_speed = frame_speed;
m_animation_blend = frame_blend;
+ m_animation_loop = frame_loop;
m_animation_sent = false;
}
-void LuaEntitySAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend)
+void LuaEntitySAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop)
{
*frame_range = m_animation_range;
*frame_speed = m_animation_speed;
*frame_blend = m_animation_blend;
+ *frame_loop = m_animation_loop;
}
void LuaEntitySAO::setBonePosition(const std::string &bone, v3f position, v3f rotation)
*rotation = m_attachment_rotation;
}
+void LuaEntitySAO::addAttachmentChild(int child_id)
+{
+ m_attachment_child_ids.insert(child_id);
+}
+
+void LuaEntitySAO::removeAttachmentChild(int child_id)
+{
+ m_attachment_child_ids.erase(child_id);
+}
+
+std::set<int> LuaEntitySAO::getAttachmentChildIds()
+{
+ return m_attachment_child_ids;
+}
+
ObjectProperties* LuaEntitySAO::accessObjectProperties()
{
return &m_prop;
m_is_singleplayer(is_singleplayer),
m_animation_speed(0),
m_animation_blend(0),
+ m_animation_loop(true),
m_animation_sent(false),
m_bone_position_sent(false),
m_attachment_parent_id(0),
m_attachment_sent(false),
- m_nametag_color(video::SColor(255, 255, 255, 255)),
- m_nametag_sent(false),
// public
m_physics_override_speed(1),
m_physics_override_jump(1),
{
m_player->setPlayerSAO(NULL);
m_player->peer_id = 0;
- m_env->savePlayer(m_player->getName());
- m_env->removePlayer(m_player->getName());
+ m_env->savePlayer((RemotePlayer*)m_player);
+ m_env->removePlayer(m_player);
}
}
writeU8(os, 6 + m_bone_position.size()); // number of messages stuffed in here
os<<serializeLongString(getPropertyPacket()); // message 1
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
- os<<serializeLongString(gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend)); // 3
+ os<<serializeLongString(gob_cmd_update_animation(
+ m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
}
os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak,
m_physics_override_sneak_glitch)); // 5
- os << serializeLongString(gob_cmd_update_nametag_attributes(m_nametag_color)); // 6
+ os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
}
else
{
if(m_animation_sent == false){
m_animation_sent = true;
- std::string str = gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend);
+ std::string str = gob_cmd_update_animation(
+ m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
// create message and add to list
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
}
-
- if (m_nametag_sent == false) {
- m_nametag_sent = true;
- std::string str = gob_cmd_update_nametag_attributes(m_nametag_color);
- // create message and add to list
- ActiveObjectMessage aom(getId(), true, str);
- m_messages_out.push(aom);
- }
}
void PlayerSAO::setBasePosition(const v3f &position)
return m_armor_groups;
}
-void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend)
+void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop)
{
// store these so they can be updated to clients
m_animation_range = frame_range;
m_animation_speed = frame_speed;
m_animation_blend = frame_blend;
+ m_animation_loop = frame_loop;
m_animation_sent = false;
}
-void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend)
+void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop)
{
*frame_range = m_animation_range;
*frame_speed = m_animation_speed;
*frame_blend = m_animation_blend;
+ *frame_loop = m_animation_loop;
}
void PlayerSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation)
*rotation = m_attachment_rotation;
}
-ObjectProperties* PlayerSAO::accessObjectProperties()
+void PlayerSAO::addAttachmentChild(int child_id)
{
- return &m_prop;
+ m_attachment_child_ids.insert(child_id);
}
-void PlayerSAO::notifyObjectPropertiesModified()
+void PlayerSAO::removeAttachmentChild(int child_id)
{
- m_properties_sent = false;
+ m_attachment_child_ids.erase(child_id);
}
-void PlayerSAO::setNametagColor(video::SColor color)
+std::set<int> PlayerSAO::getAttachmentChildIds()
{
- m_nametag_color = color;
- m_nametag_sent = false;
+ return m_attachment_child_ids;
}
-video::SColor PlayerSAO::getNametagColor()
+ObjectProperties* PlayerSAO::accessObjectProperties()
{
- return m_nametag_color;
+ return &m_prop;
+}
+
+void PlayerSAO::notifyObjectPropertiesModified()
+{
+ m_properties_sent = false;
}
Inventory* PlayerSAO::getInventory()
bool PlayerSAO::collideWithObjects(){
return true;
}
-