aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content_cao.cpp1
-rw-r--r--src/content_sao.cpp3
-rw-r--r--src/localplayer.cpp3
-rw-r--r--src/localplayer.h2
-rw-r--r--src/object_properties.cpp5
-rw-r--r--src/object_properties.h1
-rw-r--r--src/script/common/c_content.cpp4
7 files changed, 15 insertions, 4 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index 8bc9ad88e..861dc83e7 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -1260,6 +1260,7 @@ void GenericCAO::processMessage(const std::string &data)
collision_box.MaxEdge *= BS;
player->setCollisionbox(collision_box);
player->setCanZoom(m_prop.can_zoom);
+ player->setEyeHeight(m_prop.eye_height);
}
if ((m_is_player && !m_is_local_player) && m_prop.nametag.empty())
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 819c63ac3..31ee21e58 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -809,6 +809,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
m_prop.colors.clear();
m_prop.colors.emplace_back(255, 255, 255, 255);
m_prop.spritediv = v2s16(1,1);
+ m_prop.eye_height = 1.625f;
// end of default appearance
m_prop.is_visible = true;
m_prop.makes_footstep_sound = true;
@@ -834,7 +835,7 @@ void PlayerSAO::finalize(RemotePlayer *player, const std::set<std::string> &priv
v3f PlayerSAO::getEyeOffset() const
{
- return v3f(0, BS * 1.625f, 0);
+ return v3f(0, BS * m_prop.eye_height, 0);
}
std::string PlayerSAO::getDescription()
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index eb99d0062..e501fac1b 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -718,7 +718,8 @@ v3s16 LocalPlayer::getLightPosition() const
v3f LocalPlayer::getEyeOffset() const
{
- float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f;
+ float eye_height = camera_barely_in_ceiling ?
+ m_eye_height - 0.125f : m_eye_height;
return v3f(0, BS * eye_height, 0);
}
diff --git a/src/localplayer.h b/src/localplayer.h
index a3c97db5d..8e4378dfa 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -138,6 +138,7 @@ public:
v3f getPosition() const { return m_position; }
v3f getEyePosition() const { return m_position + getEyeOffset(); }
v3f getEyeOffset() const;
+ void setEyeHeight(float eye_height) { m_eye_height = eye_height; }
void setCollisionbox(const aabb3f &box) { m_collisionbox = box; }
@@ -181,6 +182,7 @@ private:
aabb3f m_collisionbox = aabb3f(-BS * 0.30f, 0.0f, -BS * 0.30f, BS * 0.30f,
BS * 1.75f, BS * 0.30f);
bool m_can_zoom = true;
+ float m_eye_height = 1.625f;
GenericCAO *m_cao = nullptr;
Client *m_client;
diff --git a/src/object_properties.cpp b/src/object_properties.cpp
index ae0305019..ffb1ecb43 100644
--- a/src/object_properties.cpp
+++ b/src/object_properties.cpp
@@ -67,6 +67,7 @@ std::string ObjectProperties::dump()
os << ", pointable=" << pointable;
os << ", can_zoom=" << can_zoom;
os << ", static_save=" << static_save;
+ os << ", eye_height=" << eye_height;
return os.str();
}
@@ -99,7 +100,7 @@ void ObjectProperties::serialize(std::ostream &os) const
writeARGB8(os, color);
}
writeU8(os, collideWithObjects);
- writeF1000(os,stepheight);
+ writeF1000(os, stepheight);
writeU8(os, automatic_face_movement_dir);
writeF1000(os, automatic_face_movement_dir_offset);
writeU8(os, backface_culling);
@@ -111,6 +112,7 @@ void ObjectProperties::serialize(std::ostream &os) const
writeU8(os, can_zoom);
writeS8(os, glow);
writeU16(os, breath_max);
+ writeF1000(os, eye_height);
// Add stuff only at the bottom.
// Never remove anything, because we don't want new versions of this
@@ -162,5 +164,6 @@ void ObjectProperties::deSerialize(std::istream &is)
try {
glow = readS8(is);
breath_max = readU16(is);
+ eye_height = readF1000(is);
} catch (SerializationError &e) {}
}
diff --git a/src/object_properties.h b/src/object_properties.h
index fcf03383c..8ccce589f 100644
--- a/src/object_properties.h
+++ b/src/object_properties.h
@@ -59,6 +59,7 @@ struct ObjectProperties
//! For dropped items, this contains item information.
std::string wield_item;
bool static_save = true;
+ float eye_height = 1.625f;
ObjectProperties();
std::string dump();
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 1bbfac25f..73661a7b6 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -266,6 +266,7 @@ void read_object_properties(lua_State *L, int index,
if (getfloatfield(L, -1, "stepheight", prop->stepheight))
prop->stepheight *= BS;
getboolfield(L, -1, "can_zoom", prop->can_zoom);
+ getfloatfield(L, -1, "eye_height", prop->eye_height);
getfloatfield(L, -1, "automatic_rotate", prop->automatic_rotate);
lua_getfield(L, -1, "automatic_face_movement_dir");
@@ -359,7 +360,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
lua_setfield(L, -2, "stepheight");
lua_pushboolean(L, prop->can_zoom);
lua_setfield(L, -2, "can_zoom");
-
+ lua_pushnumber(L, prop->eye_height);
+ lua_setfield(L, -2, "eye_height");
lua_pushnumber(L, prop->automatic_rotate);
lua_setfield(L, -2, "automatic_rotate");
if (prop->automatic_face_movement_dir)
/span> old_bar ~= nil then old_bar:delete() end local function game_buttonbar_button_handler(fields) for key,value in pairs(fields) do for j=1,#pkgmgr.games,1 do if ("game_btnbar_" .. pkgmgr.games[j].id == key) then mm_texture.update("singleplayer", pkgmgr.games[j]) core.set_topleft_text(pkgmgr.games[j].name) core.settings:set("menu_last_game",pkgmgr.games[j].id) menudata.worldlist:set_filtercriteria(pkgmgr.games[j].id) local index = filterlist.get_current_index(menudata.worldlist, tonumber(core.settings:get("mainmenu_last_selected_world"))) if not index or index < 1 then local selected = core.get_textlist_index("sp_worlds") if selected ~= nil and selected < #menudata.worldlist:get_list() then index = selected else index = #menudata.worldlist:get_list() end end menu_worldmt_legacy(index) return true end end end end local btnbar = buttonbar_create("game_button_bar", game_buttonbar_button_handler, {x=-0.3,y=5.9}, "horizontal", {x=12.4,y=1.15}) for i=1,#pkgmgr.games,1 do local btn_name = "game_btnbar_" .. pkgmgr.games[i].id local image = nil local text = nil local tooltip = core.formspec_escape(pkgmgr.games[i].name) if pkgmgr.games[i].menuicon_path ~= nil and pkgmgr.games[i].menuicon_path ~= "" then image = core.formspec_escape(pkgmgr.games[i].menuicon_path) else local part1 = pkgmgr.games[i].id:sub(1,5) local part2 = pkgmgr.games[i].id:sub(6,10) local part3 = pkgmgr.games[i].id:sub(11) text = part1 .. "\n" .. part2 if part3 ~= nil and part3 ~= "" then text = text .. "\n" .. part3 end end btnbar:add_button(btn_name, text, image, tooltip) end end else function current_game() return nil end end local function get_formspec(tabview, name, tabdata) local retval = "" local index = filterlist.get_current_index(menudata.worldlist, tonumber(core.settings:get("mainmenu_last_selected_world")) ) retval = retval .. "button[4,3.95;2.6,1;world_delete;".. fgettext("Delete") .. "]" .. "button[6.5,3.95;2.8,1;world_configure;".. fgettext("Configure") .. "]" .. "button[9.2,3.95;2.5,1;world_create;".. fgettext("New") .. "]" .. "label[4,-0.25;".. fgettext("Select World:") .. "]".. "checkbox[0.25,0.25;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. dump(core.settings:get_bool("creative_mode")) .. "]".. "checkbox[0.25,0.7;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. dump(core.settings:get_bool("enable_damage")) .. "]".. "checkbox[0.25,1.15;cb_server;".. fgettext("Host Server") ..";" .. dump(core.settings:get_bool("enable_server")) .. "]" .. "textlist[4,0.25;7.5,3.7;sp_worlds;" .. menu_render_worldlist() .. ";" .. index .. "]" if core.settings:get_bool("enable_server") then retval = retval .. "button[8.5,4.8;3.2,1;play;".. fgettext("Host Game") .. "]" .. "checkbox[0.25,1.6;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. dump(core.settings:get_bool("server_announce")) .. "]" .. "label[0.25,2.2;" .. fgettext("Name/Password") .. "]" .. "field[0.55,3.2;3.5,0.5;te_playername;;" .. core.formspec_escape(core.settings:get("name")) .. "]" .. "pwdfield[0.55,4;3.5,0.5;te_passwd;]" local bind_addr = core.settings:get("bind_address") if bind_addr ~= nil and bind_addr ~= "" then retval = retval .. "field[0.55,5.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. core.formspec_escape(core.settings:get("bind_address")) .. "]" .. "field[2.8,5.2;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" else retval = retval .. "field[0.55,5.2;3.5,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" end else retval = retval .. "button[8.5,4.8;3.2,1;play;".. fgettext("Play Game") .. "]" end return retval end local function main_button_handler(this, fields, name, tabdata) assert(name == "local") local world_doubleclick = false if fields["sp_worlds"] ~= nil then local event = core.explode_textlist_event(fields["sp_worlds"]) local selected = core.get_textlist_index("sp_worlds") menu_worldmt_legacy(selected) if event.type == "DCL" then world_doubleclick = true end if event.type == "CHG" and selected ~= nil then core.settings:set("mainmenu_last_selected_world", menudata.worldlist:get_raw_index(selected)) return true end end if menu_handle_key_up_down(fields,"sp_worlds","mainmenu_last_selected_world") then return true end if fields["cb_creative_mode"] then core.settings:set("creative_mode", fields["cb_creative_mode"]) local selected = core.get_textlist_index("sp_worlds") menu_worldmt(selected, "creative_mode", fields["cb_creative_mode"]) return true end if fields["cb_enable_damage"] then core.settings:set("enable_damage", fields["cb_enable_damage"]) local selected = core.get_textlist_index("sp_worlds") menu_worldmt(selected, "enable_damage", fields["cb_enable_damage"]) return true end if fields["cb_server"] then core.settings:set("enable_server", fields["cb_server"]) return true end if fields["cb_server_announce"] then core.settings:set("server_announce", fields["cb_server_announce"]) local selected = core.get_textlist_index("srv_worlds") menu_worldmt(selected, "server_announce", fields["cb_server_announce"]) return true end if fields["play"] ~= nil or world_doubleclick or fields["key_enter"] then local selected = core.get_textlist_index("sp_worlds") gamedata.selected_world = menudata.worldlist:get_raw_index(selected) if core.settings:get_bool("enable_server") then if selected ~= nil and gamedata.selected_world ~= 0 then gamedata.playername = fields["te_playername"] gamedata.password = fields["te_passwd"] gamedata.port = fields["te_serverport"] gamedata.address = "" core.settings:set("port",gamedata.port) if fields["te_serveraddr"] ~= nil then core.settings:set("bind_address",fields["te_serveraddr"]) end --update last game local world = menudata.worldlist:get_raw_element(gamedata.selected_world) if world then local game, index = pkgmgr.find_by_gameid(world.gameid) core.settings:set("menu_last_game", game.id) end core.start() else gamedata.errormessage = fgettext("No world created or selected!") end else if selected ~= nil and gamedata.selected_world ~= 0 then gamedata.singleplayer = true core.start() else gamedata.errormessage = fgettext("No world created or selected!") end return true end end if fields["world_create"] ~= nil then local create_world_dlg = create_create_world_dlg(true) create_world_dlg:set_parent(this) this:hide() create_world_dlg:show() mm_texture.update("singleplayer", current_game()) return true end if fields["world_delete"] ~= nil then local selected = core.get_textlist_index("sp_worlds") if selected ~= nil and selected <= menudata.worldlist:size() then local world = menudata.worldlist:get_list()[selected] if world ~= nil and world.name ~= nil and world.name ~= "" then local index = menudata.worldlist:get_raw_index(selected) local delete_world_dlg = create_delete_world_dlg(world.name,index) delete_world_dlg:set_parent(this) this:hide() delete_world_dlg:show() mm_texture.update("singleplayer",current_game()) end end return true end if fields["world_configure"] ~= nil then local selected = core.get_textlist_index("sp_worlds") if selected ~= nil then local configdialog = create_configure_world_dlg( menudata.worldlist:get_raw_index(selected)) if (configdialog ~= nil) then configdialog:set_parent(this) this:hide() configdialog:show() mm_texture.update("singleplayer",current_game()) end end return true end end local on_change if enable_gamebar then function on_change(type, old_tab, new_tab) if (type == "ENTER") then local game = current_game() if game then menudata.worldlist:set_filtercriteria(game.id) core.set_topleft_text(game.name) mm_texture.update("singleplayer",game) end singleplayer_refresh_gamebar() ui.find_by_name("game_button_bar"):show() else menudata.worldlist:set_filtercriteria(nil) local gamebar = ui.find_by_name("game_button_bar") if gamebar then gamebar:hide() end core.set_topleft_text("") mm_texture.update(new_tab,nil) end end end -------------------------------------------------------------------------------- return { name = "local", caption = fgettext("Start Game"), cbf_formspec = get_formspec, cbf_button_handler = main_button_handler, on_change = on_change }