Add player:set_eye_offset() by @MirceaKitsune and clean up

This commit is contained in:
BlockMen 2014-04-11 15:32:46 +02:00
parent a1db9242ec
commit c0ab09af74
16 changed files with 108 additions and 13 deletions

@ -1880,6 +1880,9 @@ Player-only: (no-op for other objects)
^ dig animation key frames ^ dig animation key frames
^ walk+dig animation key frames ^ walk+dig animation key frames
^ animation frame speed ^ animation frame speed
- set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}): defines offset value for camera per player
^ in first person view
^ in third person view (max. values {x=-10/10,y=-10,15,z=-5/5})
InvRef: Reference to an inventory InvRef: Reference to an inventory
methods: methods:

@ -41,7 +41,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define CAMERA_OFFSET_STEP 200 #define CAMERA_OFFSET_STEP 200
#include "nodedef.h" #include "nodedef.h"
#include "game.h" // CameraModes
Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control, Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
IGameDef *gamedef): IGameDef *gamedef):
@ -297,8 +296,15 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
fall_bobbing *= g_settings->getFloat("fall_bobbing_amount"); fall_bobbing *= g_settings->getFloat("fall_bobbing_amount");
} }
// Calculate players eye offset for different camera modes
v3f PlayerEyeOffset = player->getEyeOffset();
if (current_camera_mode == CAMERA_MODE_FIRST)
PlayerEyeOffset += player->eye_offset_first;
else
PlayerEyeOffset += player->eye_offset_third;
// Set head node transformation // Set head node transformation
m_headnode->setPosition(player->getEyeOffset()+v3f(0,cameratilt*-player->hurt_tilt_strength+fall_bobbing,0)); m_headnode->setPosition(PlayerEyeOffset+v3f(0,cameratilt*-player->hurt_tilt_strength+fall_bobbing,0));
m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength)); m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength));
m_headnode->updateAbsolutePosition(); m_headnode->updateAbsolutePosition();

@ -33,6 +33,8 @@ class LocalPlayer;
struct MapDrawControl; struct MapDrawControl;
class IGameDef; class IGameDef;
enum CameraModes {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT};
/* /*
Client camera class, manages the player and camera scene nodes, the viewing distance Client camera class, manages the player and camera scene nodes, the viewing distance
and performs view bobbing etc. It also displays the wielded tool in front of the and performs view bobbing etc. It also displays the wielded tool in front of the

@ -1928,6 +1928,17 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
player->local_animations[3] = readV2F1000(is); player->local_animations[3] = readV2F1000(is);
player->local_animation_speed = readF1000(is); player->local_animation_speed = readF1000(is);
} }
else if(command == TOCLIENT_EYE_OFFSET)
{
std::string datastring((char *)&data[2], datasize - 2);
std::istringstream is(datastring, std::ios_base::binary);
LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
player->eye_offset_first = readV3F1000(is);
player->eye_offset_third = readV3F1000(is);
}
else else
{ {
infostream<<"Client: Ignoring unknown command " infostream<<"Client: Ignoring unknown command "

@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapblock.h" #include "mapblock.h"
#include "profiler.h" #include "profiler.h"
#include "settings.h" #include "settings.h"
#include "game.h" // CameraModes #include "camera.h" // CameraModes
#include "util/mathconstants.h" #include "util/mathconstants.h"
#include <algorithm> #include <algorithm>

@ -540,6 +540,13 @@ enum ToClientCommand
v2f1000 walk+dig v2f1000 walk+dig
f1000 frame_speed f1000 frame_speed
*/ */
TOCLIENT_EYE_OFFSET = 0x52,
/*
u16 command
v3f1000 first
v3f1000 third
*/
}; };
enum ToServerCommand enum ToServerCommand

@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/mathconstants.h" #include "util/mathconstants.h"
#include "map.h" #include "map.h"
#include "main.h" // g_settings #include "main.h" // g_settings
#include "game.h" // CameraModes #include "camera.h" // CameraModes
#include <IMeshManipulator.h> #include <IMeshManipulator.h>
#include <IAnimatedMeshSceneNode.h> #include <IAnimatedMeshSceneNode.h>
#include <IBoneSceneNode.h> #include <IBoneSceneNode.h>
@ -1099,8 +1099,14 @@ public:
walking = true; walking = true;
m_animation_speed = player->local_animation_speed; m_animation_speed = player->local_animation_speed;
if(!player->touching_ground &&
g_settings->getBool("free_move") &&
m_gamedef->checkLocalPrivilege("fly") &&
g_settings->getBool("fast_move") &&
m_gamedef->checkLocalPrivilege("fast"))
m_animation_speed *= 1.5;
if(controls.sneak && walking) if(controls.sneak && walking)
m_animation_speed = player->local_animation_speed/2; m_animation_speed /= 2;
player->last_animation_speed = m_animation_speed; player->last_animation_speed = m_animation_speed;

@ -977,8 +977,6 @@ bool nodePlacementPrediction(Client &client,
return false; return false;
} }
bool is_third_person = false;
static void show_chat_menu(FormspecFormSource* current_formspec, static void show_chat_menu(FormspecFormSource* current_formspec,
TextDest* current_textdest, IWritableTextureSource* tsrc, TextDest* current_textdest, IWritableTextureSource* tsrc,
IrrlichtDevice * device, Client* client, std::string text) IrrlichtDevice * device, Client* client, std::string text)

@ -124,7 +124,6 @@ public:
class ChatBackend; /* to avoid having to include chat.h */ class ChatBackend; /* to avoid having to include chat.h */
struct SubgameSpec; struct SubgameSpec;
enum CameraModes {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT};
void the_game( void the_game(
bool &kill, bool &kill,

@ -30,7 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "tile.h" #include "tile.h"
#include "localplayer.h" #include "localplayer.h"
#include "camera.h" #include "camera.h"
#include "game.h" // CameraModes
#include <IGUIStaticText.h> #include <IGUIStaticText.h>

@ -52,7 +52,9 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef):
m_need_to_get_new_sneak_node(true), m_need_to_get_new_sneak_node(true),
m_can_jump(false), m_can_jump(false),
camera_mode(0), camera_mode(0),
last_animation(NO_ANIM) last_animation(NO_ANIM),
eye_offset_first(v3f(0,0,0)),
eye_offset_third(v3f(0,0,0))
{ {
// Initialize hp to 0, so that no hearts will be shown if server // Initialize hp to 0, so that no hearts will be shown if server
// doesn't support health points // doesn't support health points

@ -27,7 +27,7 @@ class ClientEnvironment;
class ClientActiveObject; class ClientActiveObject;
enum localPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM}; // no local animation, walking, digging, both enum LocalPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM}; // no local animation, walking, digging, both
class LocalPlayer : public Player class LocalPlayer : public Player
{ {
@ -63,6 +63,9 @@ public:
float camera_impact; float camera_impact;
int camera_mode; int camera_mode;
v3f eye_offset_first;
v3f eye_offset_third;
int last_animation; int last_animation;
float last_animation_speed; float last_animation_speed;

@ -406,7 +406,7 @@ int ObjectRef::l_set_animation(lua_State *L)
return 0; return 0;
} }
// set_local_animation(self, {stand/ilde}, {walk}, {dig}, {walk+dig}, frame_speed) // set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed)
int ObjectRef::l_set_local_animation(lua_State *L) int ObjectRef::l_set_local_animation(lua_State *L)
{ {
//NO_MAP_LOCK_REQUIRED; //NO_MAP_LOCK_REQUIRED;
@ -431,6 +431,36 @@ int ObjectRef::l_set_local_animation(lua_State *L)
return 0; return 0;
} }
// set_eye_offset(self, v3f first pv, v3f third pv)
int ObjectRef::l_set_eye_offset(lua_State *L)
{
//NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
Player *player = getplayer(ref);
if (player == NULL)
return 0;
// Do it
v3f offset_first = v3f(0, 0, 0);
v3f offset_third = v3f(0, 0, 0);
if(!lua_isnil(L, 2))
offset_first = read_v3f(L, 2);
if(!lua_isnil(L, 3))
offset_third = read_v3f(L, 3);
// Prevent abuse of offset values (keep player always visible)
offset_third.X = rangelim(offset_third.X,-10,10);
offset_third.Z = rangelim(offset_third.Z,-5,5);
/* TODO: if possible: improve the camera colision detetion to allow Y <= -1.5) */
offset_third.Y = rangelim(offset_third.Y,-10,15); //1.5*BS
if (!getServer(L)->setPlayerEyeOffset(player, offset_first, offset_third))
return 0;
lua_pushboolean(L, true);
return 0;
}
// set_bone_position(self, std::string bone, v3f position, v3f rotation) // set_bone_position(self, std::string bone, v3f position, v3f rotation)
int ObjectRef::l_set_bone_position(lua_State *L) int ObjectRef::l_set_bone_position(lua_State *L)
{ {
@ -1296,5 +1326,6 @@ const luaL_reg ObjectRef::methods[] = {
luamethod(ObjectRef, set_sky), luamethod(ObjectRef, set_sky),
luamethod(ObjectRef, override_day_night_ratio), luamethod(ObjectRef, override_day_night_ratio),
luamethod(ObjectRef, set_local_animation), luamethod(ObjectRef, set_local_animation),
luamethod(ObjectRef, set_eye_offset),
{0,0} {0,0}
}; };

@ -231,9 +231,12 @@ private:
// override_day_night_ratio(self, type, list) // override_day_night_ratio(self, type, list)
static int l_override_day_night_ratio(lua_State *L); static int l_override_day_night_ratio(lua_State *L);
// set_local_animation(self, {stand/ilde}, {walk}, {dig}, {walk+dig}, frame_speed) // set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed)
static int l_set_local_animation(lua_State *L); static int l_set_local_animation(lua_State *L);
// set_eye_offset(self, v3f first pv, v3f third pv)
static int l_set_eye_offset(lua_State *L);
public: public:
ObjectRef(ServerActiveObject *object); ObjectRef(ServerActiveObject *object);

@ -3502,6 +3502,20 @@ void Server::SendLocalPlayerAnimations(u16 peer_id, v2f animation_frames[4], f32
m_clients.send(peer_id, 0, data, true); m_clients.send(peer_id, 0, data, true);
} }
void Server::SendEyeOffset(u16 peer_id, v3f first, v3f third)
{
std::ostringstream os(std::ios_base::binary);
writeU16(os, TOCLIENT_EYE_OFFSET);
writeV3F1000(os, first);
writeV3F1000(os, third);
// Make data buffer
std::string s = os.str();
SharedBuffer<u8> data((u8 *)s.c_str(), s.size());
// Send as reliable
m_clients.send(peer_id, 0, data, true);
}
void Server::SendPlayerPrivileges(u16 peer_id) void Server::SendPlayerPrivileges(u16 peer_id)
{ {
Player *player = m_env->getPlayer(peer_id); Player *player = m_env->getPlayer(peer_id);
@ -4605,6 +4619,15 @@ bool Server::setLocalPlayerAnimations(Player *player, v2f animation_frames[4], f
return true; return true;
} }
bool Server::setPlayerEyeOffset(Player *player, v3f first, v3f third)
{
if (!player)
return false;
SendEyeOffset(player->peer_id, first, third);
return true;
}
bool Server::setSky(Player *player, const video::SColor &bgcolor, bool Server::setSky(Player *player, const video::SColor &bgcolor,
const std::string &type, const std::vector<std::string> &params) const std::string &type, const std::vector<std::string> &params)
{ {

@ -323,6 +323,7 @@ public:
{ return m_con.GetPeerAddress(peer_id); } { return m_con.GetPeerAddress(peer_id); }
bool setLocalPlayerAnimations(Player *player, v2f animation_frames[4], f32 frame_speed); bool setLocalPlayerAnimations(Player *player, v2f animation_frames[4], f32 frame_speed);
bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
bool setSky(Player *player, const video::SColor &bgcolor, bool setSky(Player *player, const video::SColor &bgcolor,
const std::string &type, const std::vector<std::string> &params); const std::string &type, const std::vector<std::string> &params);
@ -364,6 +365,7 @@ private:
void SendPlayerBreath(u16 peer_id); void SendPlayerBreath(u16 peer_id);
void SendMovePlayer(u16 peer_id); void SendMovePlayer(u16 peer_id);
void SendLocalPlayerAnimations(u16 peer_id, v2f animation_frames[4], f32 animation_speed); void SendLocalPlayerAnimations(u16 peer_id, v2f animation_frames[4], f32 animation_speed);
void SendEyeOffset(u16 peer_id, v3f first, v3f third);
void SendPlayerPrivileges(u16 peer_id); void SendPlayerPrivileges(u16 peer_id);
void SendPlayerInventoryFormspec(u16 peer_id); void SendPlayerInventoryFormspec(u16 peer_id);
void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname); void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname);