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

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

View File

@ -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:

View File

@ -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();

View File

@ -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

View File

@ -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 "

View File

@ -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>

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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,

View File

@ -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>

View File

@ -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

View File

@ -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;

View File

@ -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}
}; };

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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);