Skip to content

Commit

Permalink
Add player:set_eye_offset() by @MirceaKitsune and clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
BlockMen committed Apr 12, 2014
1 parent a1db924 commit c0ab09a
Show file tree
Hide file tree
Showing 16 changed files with 108 additions and 13 deletions.
3 changes: 3 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -1880,6 +1880,9 @@ Player-only: (no-op for other objects)
^ dig animation key frames
^ walk+dig animation key frames
^ 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
methods:
Expand Down
10 changes: 8 additions & 2 deletions src/camera.cpp
Expand Up @@ -41,7 +41,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define CAMERA_OFFSET_STEP 200

#include "nodedef.h"
#include "game.h" // CameraModes

Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
IGameDef *gamedef):
Expand Down Expand Up @@ -297,8 +296,15 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
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
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->updateAbsolutePosition();

Expand Down
2 changes: 2 additions & 0 deletions src/camera.h
Expand Up @@ -33,6 +33,8 @@ class LocalPlayer;
struct MapDrawControl;
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
and performs view bobbing etc. It also displays the wielded tool in front of the
Expand Down
11 changes: 11 additions & 0 deletions src/client.cpp
Expand Up @@ -1928,6 +1928,17 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
player->local_animations[3] = readV2F1000(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
{
infostream<<"Client: Ignoring unknown command "
Expand Down
2 changes: 1 addition & 1 deletion src/clientmap.cpp
Expand Up @@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapblock.h"
#include "profiler.h"
#include "settings.h"
#include "game.h" // CameraModes
#include "camera.h" // CameraModes
#include "util/mathconstants.h"
#include <algorithm>

Expand Down
7 changes: 7 additions & 0 deletions src/clientserver.h
Expand Up @@ -540,6 +540,13 @@ enum ToClientCommand
v2f1000 walk+dig
f1000 frame_speed
*/

TOCLIENT_EYE_OFFSET = 0x52,
/*
u16 command
v3f1000 first
v3f1000 third
*/
};

enum ToServerCommand
Expand Down
10 changes: 8 additions & 2 deletions src/content_cao.cpp
Expand Up @@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/mathconstants.h"
#include "map.h"
#include "main.h" // g_settings
#include "game.h" // CameraModes
#include "camera.h" // CameraModes
#include <IMeshManipulator.h>
#include <IAnimatedMeshSceneNode.h>
#include <IBoneSceneNode.h>
Expand Down Expand Up @@ -1099,8 +1099,14 @@ class GenericCAO : public ClientActiveObject
walking = true;

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)
m_animation_speed = player->local_animation_speed/2;
m_animation_speed /= 2;

player->last_animation_speed = m_animation_speed;

Expand Down
2 changes: 0 additions & 2 deletions src/game.cpp
Expand Up @@ -977,8 +977,6 @@ bool nodePlacementPrediction(Client &client,
return false;
}

bool is_third_person = false;

static void show_chat_menu(FormspecFormSource* current_formspec,
TextDest* current_textdest, IWritableTextureSource* tsrc,
IrrlichtDevice * device, Client* client, std::string text)
Expand Down
1 change: 0 additions & 1 deletion src/game.h
Expand Up @@ -124,7 +124,6 @@ class InputHandler

class ChatBackend; /* to avoid having to include chat.h */
struct SubgameSpec;
enum CameraModes {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT};

void the_game(
bool &kill,
Expand Down
1 change: 0 additions & 1 deletion src/hud.cpp
Expand Up @@ -30,7 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "tile.h"
#include "localplayer.h"
#include "camera.h"
#include "game.h" // CameraModes

#include <IGUIStaticText.h>

Expand Down
4 changes: 3 additions & 1 deletion src/localplayer.cpp
Expand Up @@ -52,7 +52,9 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef):
m_need_to_get_new_sneak_node(true),
m_can_jump(false),
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
// doesn't support health points
Expand Down
5 changes: 4 additions & 1 deletion src/localplayer.h
Expand Up @@ -27,7 +27,7 @@ class ClientEnvironment;

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
{
Expand Down Expand Up @@ -63,6 +63,9 @@ class LocalPlayer : public Player

float camera_impact;
int camera_mode;
v3f eye_offset_first;
v3f eye_offset_third;

int last_animation;
float last_animation_speed;

Expand Down
33 changes: 32 additions & 1 deletion src/script/lua_api/l_object.cpp
Expand Up @@ -406,7 +406,7 @@ int ObjectRef::l_set_animation(lua_State *L)
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)
{
//NO_MAP_LOCK_REQUIRED;
Expand All @@ -431,6 +431,36 @@ int ObjectRef::l_set_local_animation(lua_State *L)
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)
int ObjectRef::l_set_bone_position(lua_State *L)
{
Expand Down Expand Up @@ -1296,5 +1326,6 @@ const luaL_reg ObjectRef::methods[] = {
luamethod(ObjectRef, set_sky),
luamethod(ObjectRef, override_day_night_ratio),
luamethod(ObjectRef, set_local_animation),
luamethod(ObjectRef, set_eye_offset),
{0,0}
};
5 changes: 4 additions & 1 deletion src/script/lua_api/l_object.h
Expand Up @@ -231,9 +231,12 @@ class ObjectRef : public ModApiBase {
// override_day_night_ratio(self, type, list)
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);

// set_eye_offset(self, v3f first pv, v3f third pv)
static int l_set_eye_offset(lua_State *L);

public:
ObjectRef(ServerActiveObject *object);

Expand Down
23 changes: 23 additions & 0 deletions src/server.cpp
Expand Up @@ -3502,6 +3502,20 @@ void Server::SendLocalPlayerAnimations(u16 peer_id, v2f animation_frames[4], f32
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)
{
Player *player = m_env->getPlayer(peer_id);
Expand Down Expand Up @@ -4605,6 +4619,15 @@ bool Server::setLocalPlayerAnimations(Player *player, v2f animation_frames[4], f
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,
const std::string &type, const std::vector<std::string> &params)
{
Expand Down
2 changes: 2 additions & 0 deletions src/server.h
Expand Up @@ -323,6 +323,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
{ return m_con.GetPeerAddress(peer_id); }

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,
const std::string &type, const std::vector<std::string> &params);
Expand Down Expand Up @@ -364,6 +365,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
void SendPlayerBreath(u16 peer_id);
void SendMovePlayer(u16 peer_id);
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 SendPlayerInventoryFormspec(u16 peer_id);
void SendShowFormspecMessage(u16 peer_id, const std::string &formspec, const std::string &formname);
Expand Down

0 comments on commit c0ab09a

Please sign in to comment.