*/
#include "content_cao.h"
+#include "clientlinkableobject.h"
/*
PlayerCAO
*/
-class PlayerCAO : public ClientActiveObject
+class PlayerCAO : public ClientActiveObject, public ClientLinkableObject
{
private:
core::aabbox3d<f32> m_selection_box;
void step(float dtime, ClientEnvironment *env)
{
- pos_translator.translate(dtime);
- updateNodePos();
+ if(!isLinked()) {
+ pos_translator.translate(dtime);
+ updateNodePos();
+ }
if(m_damage_visual_timer > 0){
m_damage_visual_timer -= dtime;
m_damage_visual_timer = 0.5;
updateTextures("^[brighten");
}
+ else if (handleLinkUnlinkMessages(cmd,&is,this->m_env))
+ {
+ //Link unlink already done in handleLinkUnlinkMessages!
+ }
+
}
void updateTextures(const std::string &mod)
}
}
}
+ void setPosition(v3f toset, float dtime){
+ if (isLinked()) {
+ this->m_position = toset + this->m_linkOffset;
+ pos_translator.update(this->m_position,false);
+ updateNodePos();
+
+ if(m_is_local_player) {
+ m_local_player->setPosition(this->m_position);
+ }
+ }
+ else {
+ errorstream<<"Got linked position update but not linked"<< std::endl;
+ }
+ }
+
+ void updateLinkState(bool value) {
+ if(m_is_local_player) {
+ m_local_player->Link(value);
+ }
+ }
+
inline v3f getPosition() { return m_position; }
Get the speed the player is going
*/
bool is_climbing = lplayer->is_climbing;
+ bool linked = lplayer->m_linked;
f32 player_speed = lplayer->getSpeed().getLength();
/*
Stuff that has a maximum time increment
*/
+ //TODO at this position possibly a better solution is required!
+ if (!linked) {
+ u32 loopcount = 0;
+ do
+ {
+ loopcount++;
- u32 loopcount = 0;
- do
- {
- loopcount++;
+ f32 dtime_part;
+ if(dtime_downcount > dtime_max_increment)
+ {
+ dtime_part = dtime_max_increment;
+ dtime_downcount -= dtime_part;
+ }
+ else
+ {
+ dtime_part = dtime_downcount;
+ /*
+ Setting this to 0 (no -=dtime_part) disables an infinite loop
+ when dtime_part is so small that dtime_downcount -= dtime_part
+ does nothing
+ */
+ dtime_downcount = 0;
+ }
- f32 dtime_part;
- if(dtime_downcount > dtime_max_increment)
- {
- dtime_part = dtime_max_increment;
- dtime_downcount -= dtime_part;
- }
- else
- {
- dtime_part = dtime_downcount;
/*
- Setting this to 0 (no -=dtime_part) disables an infinite loop
- when dtime_part is so small that dtime_downcount -= dtime_part
- does nothing
+ Handle local player
*/
- dtime_downcount = 0;
- }
-
- /*
- Handle local player
- */
-
- {
- v3f lplayerpos = lplayer->getPosition();
- // Apply physics
- if(free_move == false && is_climbing == false)
{
- // Gravity
- v3f speed = lplayer->getSpeed();
- if(lplayer->swimming_up == false)
- speed.Y -= 9.81 * BS * dtime_part * 2;
+ v3f lplayerpos = lplayer->getPosition();
- // Water resistance
- if(lplayer->in_water_stable || lplayer->in_water)
+ // Apply physics
+ if(free_move == false && is_climbing == false)
{
- f32 max_down = 2.0*BS;
- if(speed.Y < -max_down) speed.Y = -max_down;
+ // Gravity
+ v3f speed = lplayer->getSpeed();
+ if(lplayer->swimming_up == false)
+ speed.Y -= 9.81 * BS * dtime_part * 2;
- f32 max = 2.5*BS;
- if(speed.getLength() > max)
+ // Water resistance
+ if(lplayer->in_water_stable || lplayer->in_water)
{
- speed = speed / speed.getLength() * max;
+ f32 max_down = 2.0*BS;
+ if(speed.Y < -max_down) speed.Y = -max_down;
+
+ f32 max = 2.5*BS;
+ if(speed.getLength() > max)
+ {
+ speed = speed / speed.getLength() * max;
+ }
}
+
+ lplayer->setSpeed(speed);
}
- lplayer->setSpeed(speed);
+ /*
+ Move the lplayer.
+ This also does collision detection.
+ */
+ lplayer->move(dtime_part, *m_map, position_max_increment,
+ &player_collisions);
}
-
- /*
- Move the lplayer.
- This also does collision detection.
- */
- lplayer->move(dtime_part, *m_map, position_max_increment,
- &player_collisions);
}
- }
- while(dtime_downcount > 0.001);
+ while(dtime_downcount > 0.001);
+
+ //std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
- //std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
-
- for(core::list<CollisionInfo>::Iterator
- i = player_collisions.begin();
- i != player_collisions.end(); i++)
- {
- CollisionInfo &info = *i;
- if(info.t == COLLISION_FALL)
+ for(core::list<CollisionInfo>::Iterator
+ i = player_collisions.begin();
+ i != player_collisions.end(); i++)
{
- //f32 tolerance = BS*10; // 2 without damage
- f32 tolerance = BS*12; // 3 without damage
- f32 factor = 1;
- if(info.speed > tolerance)
+ CollisionInfo &info = *i;
+ if(info.t == COLLISION_FALL)
{
- f32 damage_f = (info.speed - tolerance)/BS*factor;
- u16 damage = (u16)(damage_f+0.5);
- if(lplayer->hp > damage)
- lplayer->hp -= damage;
- else
- lplayer->hp = 0;
-
- ClientEnvEvent event;
- event.type = CEE_PLAYER_DAMAGE;
- event.player_damage.amount = damage;
- event.player_damage.send_to_server = true;
- m_client_event_queue.push_back(event);
+ //f32 tolerance = BS*10; // 2 without damage
+ f32 tolerance = BS*12; // 3 without damage
+ f32 factor = 1;
+ if(info.speed > tolerance)
+ {
+ f32 damage_f = (info.speed - tolerance)/BS*factor;
+ u16 damage = (u16)(damage_f+0.5);
+ if(lplayer->hp > damage)
+ lplayer->hp -= damage;
+ else
+ lplayer->hp = 0;
+
+ ClientEnvEvent event;
+ event.type = CEE_PLAYER_DAMAGE;
+ event.player_damage.amount = damage;
+ event.player_damage.send_to_server = true;
+ m_client_event_queue.push_back(event);
+ }
}
}
}
if(send_recommended == false)
return;
+ if(isLinked())
+ return;
+
+
if(m_position_not_sent)
{
m_position_not_sent = false;
std::ostringstream os(std::ios::binary);
// command (0 = update position)
- writeU8(os, 0);
+ writeU8(os,AO_Message_type::SetPosition );
// pos
writeV3F1000(os, getPosition());
// yaw
{
std::ostringstream os(std::ios::binary);
// command (1 = punched)
- writeU8(os, 1);
+ writeU8(os, AO_Message_type::Punched);
// damage
writeS16(os, hitprop.hp);
// create message and add to list
return hp;
}
+bool ServerRemotePlayer::sendLinkMsg(ServerActiveObject* parent,v3f offset) {
+ std::ostringstream os(std::ios::binary);
+ writeU8(os, AO_Message_type::Link);
+ // parameters
+ writeU16(os, parent->getId());
+ writeV3F1000(os, offset);
+ // create message and add to list
+ ActiveObjectMessage aom(getId(), true, os.str());
+ m_messages_out.push_back(aom);
+ return true;
+}
+
+bool ServerRemotePlayer::sendUnlinkMsg() {
+ std::ostringstream os(std::ios::binary);
+ writeU8(os, AO_Message_type::UnLink);
+ // create message and add to list
+ ActiveObjectMessage aom(getId(), true, os.str());
+ m_messages_out.push_back(aom);
+ return true;
+}