ofs | hex dump | ascii |
---|
0000 | 42 42 33 44 63 8d 00 00 01 00 00 00 42 52 55 53 2e 00 00 00 01 00 00 00 42 72 75 73 68 2e 30 30 | BB3Dc.......BRUS........Brush.00 |
0020 | 31 00 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 00 00 01 00 00 00 00 00 00 00 ff ff | 1....?...?...?...?.............. |
0040 | ff ff 4e 4f 44 45 21 8d 00 00 64 74 72 61 63 6b 5f 73 77 72 73 74 00 00 00 00 00 00 00 00 bf 00 | ..NODE!...dtrack_swrst.......... |
0060 | 00 00 00 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 00 00 a4 85 08 b3 00 00 00 00 4d | ......?...?...?...?............M |
0080 | 45 53 48 e4 8c 00 00 ff ff ff ff 56 52 54 53 0c 77 00 00 01 00 00 00 01 00 00 00 02 00 00 00 74 | ESH........VRTS.w..............t |
00a0 | d4 02 bf 28 5c 0f 3e b4 1b 7c 3d 70 c1 37 bf 5d 8f 2e 3f 20 f1 0f 3e a5 ff 00 3e 24 e4 04 3f 01 | ...(\.>..|=p.7.]..?...>...>$..?. |
00c0 | db 04 bf 28 5c 0f 3e f2 5d 27 bd 6c 1f 36 bf 67 a3 33 3f 35 a1 1a 3d a4 ff 00 3e 2e 13 dd 3e 02 | ...(\.>.]'.l.6.g.3?5..=...>...>. |
00e0 | bf e3 be 28 5c 0f 3e 86 df 06 bd 69 af 34 3f 6b 55 35 3f fe 01 ff 3b 4c 1f 37 3e 34 13 dd 3e 34 | ...(\.>....i.4?kU5?...;L.7>4..>4 |
0100 | 01 e4 be 28 5c 0f 3e 28 05 6e 3d 69 bf 34 3f 6b 47 35 3f 60 01 30 3a 4b 1f 37 3e 27 e4 04 3f 34 | ...(\.>(.n=i.4?kG5?`.0:K.7>'..?4 |
0120 | 01 e4 be 28 5c 0f 3e 28 05 6e 3d 69 bf 34 3f 6b 47 35 3f 60 01 30 3a 4b 1f 37 3e 27 e4 04 3f 99 | ...(\.>(.n=i.4?kG5?`.0:K.7>'..?. |
0140 | d3 e3 be 28 5c 0f 3e 69 5b 1e 3e 6b 83 35 3f 69 83 34 3f dc 01 6e 3b 4a 1f 37 3e b3 3e 1b 3f b1 | ...(\.>i[.>k.5?i.4?..n;J.7>.>.?. |
0160 | 73 f5 be 28 5c 0f 3e 31 55 24 3e 58 2f 2c bf 6f 6b 37 3f 7b 81 3d 3e a7 ff 00 3e b1 3e 1b 3f 74 | s..(\.>1U$>X/,.ok7?{.=>...>.>.?t |
0180 | d4 02 bf 28 5c 0f 3e b4 1b 7c 3d 70 c1 37 bf 5d 8f 2e 3f 20 f1 0f 3e a5 ff 00 3e 24 e4 04 3f 0f | ...(\.>..|=p.7.]..?...>...>$..?. |
01a0 | f3 e6 be c8 ba 22 3d 55 d8 90 3e c7 61 e3 be 29 4b 14 bf 5e f9 2e 3f ca 00 96 3e 3c 99 31 3f a9 | ....."=U..>.a..)K..^..?...><.1?. |
01c0 | bb e4 be c8 ba 22 3d 9b 6a 90 3e 3d a9 1e 3f 2e c1 16 bf 0a c9 04 3f e0 e1 75 3e 40 99 31 3f 99 | ....."=.j.>=..?.......?..u>@.1?. |
01e0 | d3 e3 be c8 ba 22 3d 69 5b 1e 3e 6b 83 35 3f 69 83 34 bf dc 01 6e 3b e4 e1 75 3e b3 3e 1b 3f b1 | ....."=i[.>k.5?i.4...n;..u>.>.?. |
0200 | 73 f5 be c8 ba 22 3d 31 55 24 3e 58 2f 2c bf 6f 6b 37 bf 7b 81 3d 3e cb 00 96 3e af 3e 1b 3f 99 | s...."=1U$>X/,.ok7.{.=>...>.>.?. |
0220 | d3 e3 be 28 5c 0f 3e 69 5b 1e 3e 6b 83 35 3f 69 83 34 3f dc 01 6e 3b 4a 1f 37 3e b3 3e 1b 3f a9 | ...(\.>i[.>k.5?i.4?..n;J.7>.>.?. |
0240 | bb e4 be 28 5c 0f 3e 9b 6a 90 3e 3d a9 1e 3f 2e c1 16 3f 0a c9 04 3f 4a 1f 37 3e 40 99 31 3f 0f | ...(\.>.j.>=..?...?...?J.7>@.1?. |
0260 | f3 e6 be 28 5c 0f 3e 55 d8 90 3e c7 61 e3 be 29 4b 14 3f 5e f9 2e 3f a9 ff 00 3e 3e 99 31 3f b1 | ...(\.>U..>.a..)K.?^..?...>>.1?. |
0280 | 73 f5 be 28 5c 0f 3e 31 55 24 3e 58 2f 2c bf 6f 6b 37 3f 7b 81 3d 3e a7 ff 00 3e b1 3e 1b 3f 0b | s..(\.>1U$>X/,.ok7?{.=>...>.>.?. |
02a0 | a1 05 bf c8 ba 22 3d 75 cd 68 be 67 5f 33 bf 6d 8d 36 bf 75 81 ba 3c ce 00 96 3e fe a8 83 3e 29 | ....."=u.h.g_3.m.6.u..<...>...>) |
02c0 | 95 e2 be c8 ba 22 3d 0c fa 69 be 6b 59 35 3f 69 ad 34 bf 60 01 30 3a f5 e1 75 3e 02 a9 83 3e 74 | ....."=..i.kY5?i.4.`.0:..u>...>t |
02e0 | e7 e2 be c8 ba 22 3d 64 db b6 be 6a df 34 3f 6a 27 35 bf c0 01 e0 ba f9 e1 75 3e d0 e7 2d 3e cc | ....."=d...j.4?j'5.......u>..->. |
0300 | 96 07 bf c8 ba 22 3d 68 db b6 be 6d 99 36 bf 67 55 33 bf 58 01 ac 3c cf 00 96 3e cc e7 2d 3e bc | ....."=h...m.6.gU3.X..<...>..->. |
0320 | 77 05 bf c8 ba 22 3d 2b 9c fc bd 6b a5 35 bf 69 5b 34 bf 97 81 4b 3c ce 00 96 3e 16 5e b0 3e 3f | w...."=+...k.5.i[4...K<...>.^.>? |
0340 | ee e2 be c8 ba 22 3d 77 32 04 be 6b 47 35 3f 69 bb 34 bf 0f 81 07 3c f1 e1 75 3e 1c 5e b0 3e 29 | ....."=w2..kG5?i.4....<..u>.^.>) |
0360 | 95 e2 be c8 ba 22 3d 0c fa 69 be 6b 59 35 3f 69 ad 34 bf 60 01 30 3a f5 e1 75 3e 02 a9 83 3e 0b | ....."=..i.kY5?i.4.`.0:..u>...>. |
0380 | a1 05 bf c8 ba 22 3d 75 cd 68 be 67 5f 33 bf 6d 8d 36 bf 75 81 ba 3c ce 00 96 3e fe a8 83 3e 01 | ....."=u.h.g_3.m.6.u..<...>...>. |
03a0 | db 04 bf c8 ba 22 3d f2 5d 27 bd 6c 1f 36 bf 67 a3 33 bf 35 a1 1a 3d cd 00 96 3e 2e 13 dd 3e 02 | ....."=.]'.l.6.g.3.5..=...>...>. |
03c0 | bf e3 be c8 ba 22 3d 86 df 06 bd 69 af 34 3f 6b 55 35 bf fe 01 ff 3b ed e1 75 3e 34 13 dd 3e 3f | /*
Minetest
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "player.h"
#include <cmath>
#include "threading/mutex_auto_lock.h"
#include "util/numeric.h"
#include "hud.h"
#include "constants.h"
#include "gamedef.h"
#include "settings.h"
#include "log.h"
#include "porting.h" // strlcpy
Player::Player(const char *name, IItemDefManager *idef):
inventory(idef)
{
strlcpy(m_name, name, PLAYERNAME_SIZE);
inventory.clear();
inventory.addList("main", PLAYER_INVENTORY_SIZE);
InventoryList *craft = inventory.addList("craft", 9);
craft->setWidth(3);
inventory.addList("craftpreview", 1);
inventory.addList("craftresult", 1);
inventory.setModified(false);
// Can be redefined via Lua
inventory_formspec = "size[8,7.5]"
//"image[1,0.6;1,2;player.png]"
"list[current_player;main;0,3.5;8,4;]"
"list[current_player;craft;3,0;3,3;]"
"listring[]"
"list[current_player;craftpreview;7,1;1,1;]";
// Initialize movement settings at default values, so movement can work
// if the server fails to send them
movement_acceleration_default = 3 * BS;
movement_acceleration_air = 2 * BS;
movement_acceleration_fast = 10 * BS;
movement_speed_walk = 4 * BS;
movement_speed_crouch = 1.35 * BS;
movement_speed_fast = 20 * BS;
movement_speed_climb = 2 * BS;
movement_speed_jump = 6.5 * BS;
movement_liquid_fluidity = 1 * BS;
movement_liquid_fluidity_smooth = 0.5 * BS;
movement_liquid_sink = 10 * BS;
movement_gravity = 9.81 * BS;
local_animation_speed = 0.0;
hud_flags =
HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE |
HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE |
HUD_FLAG_BREATHBAR_VISIBLE | HUD_FLAG_MINIMAP_VISIBLE |
HUD_FLAG_MINIMAP_RADAR_VISIBLE | HUD_FLAG_BASIC_DEBUG;
hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT;
m_player_settings.readGlobalSettings();
// Register player setting callbacks
for (const std::string &name : m_player_settings.setting_names)
g_settings->registerChangedCallback(name,
&Player::settingsChangedCallback, &m_player_settings);
}
Player::~Player()
{
// m_player_settings becomes invalid, remove callbacks
for (const std::string &name : m_player_settings.setting_names)
g_settings->deregisterChangedCallback(name,
&Player::settingsChangedCallback, &m_player_settings);
clearHud();
}
void Player::setWieldIndex(u16 index)
{
const InventoryList *mlist = inventory.getList("main");
m_wield_index = MYMIN(index, mlist ? mlist->getSize() : 0);
}
ItemStack &Player::getWieldedItem(ItemStack *selected, ItemStack *hand) const
{
assert(selected);
const InventoryList *mlist = inventory.getList("main"); // TODO: Make this generic
const InventoryList *hlist = inventory.getList("hand");
if (mlist && m_wield_index < mlist->getSize())
*selected = mlist->getItem(m_wield_index);
if (hand && hlist)
*hand = hlist->getItem(0);
// Return effective tool item
return (hand && selected->name.empty()) ? *hand : *selected;
}
u32 Player::addHud(HudElement *toadd)
{
MutexAutoLock lock(m_mutex);
u32 id = getFreeHudID();
if (id < hud.size())
hud[id] = toadd;
else
hud.push_back(toadd);
return id;
}
HudElement* Player::getHud(u32 id)
{
MutexAutoLock lock(m_mutex);
if (id < hud.size())
return hud[id];
return NULL;
}
HudElement* Player::removeHud(u32 id)
{
MutexAutoLock lock(m_mutex);
HudElement* retval = NULL;
if (id < hud.size()) {
retval = hud[id];
hud[id] = NULL;
}
return retval;
}
void Player::clearHud()
{
MutexAutoLock lock(m_mutex);
while(!hud.empty()) {
delete hud.back();
hud.pop_back();
}
}
#ifndef SERVER
u32 PlayerControl::getKeysPressed() const
{
u32 keypress_bits =
( (u32)(jump & 1) << 4) |
( (u32)(aux1 & 1) << 5) |
( (u32)(sneak & 1) << 6) |
( (u32)(dig & 1) << 7) |
( (u32)(place & 1) << 8) |
( (u32)(zoom & 1) << 9)
;
// If any direction keys are pressed pass those through
if (direction_keys != 0)
{
keypress_bits |= direction_keys;
}
// Otherwise set direction keys based on joystick movement (for mod compatibility)
else if (isMoving())
{
float abs_d;
// (absolute value indicates forward / backward)
abs_d = abs(movement_direction);
if (abs_d < 3.0f / 8.0f * M_PI)
keypress_bits |= (u32)1; // Forward
if (abs_d > 5.0f / 8.0f * M_PI)
keypress_bits |= (u32)1 << 1; // Backward
// rotate entire coordinate system by 90 degree
abs_d = movement_direction + M_PI_2;
if (abs_d >= M_PI)
abs_d -= 2 * M_PI;
abs_d = abs(abs_d);
// (value now indicates left / right)
if (abs_d < 3.0f / 8.0f * M_PI)
keypress_bits |= (u32)1 << 2; // Left
if (abs_d > 5.0f / 8.0f * M_PI)
keypress_bits |= (u32)1 << 3; // Right
}
return keypress_bits;
}
#endif
void PlayerControl::unpackKeysPressed(u32 keypress_bits)
{
direction_keys = keypress_bits & 0xf;
jump = keypress_bits & (1 << 4);
aux1 = keypress_bits & (1 << 5);
sneak = keypress_bits & (1 << 6);
dig = keypress_bits & (1 << 7);
place = keypress_bits & (1 << 8);
zoom = keypress_bits & (1 << 9);
}
void PlayerSettings::readGlobalSettings()
{
free_move = g_settings->getBool("free_move");
pitch_move = g_settings->getBool("pitch_move");
fast_move = g_settings->getBool("fast_move");
continuous_forward = g_settings->getBool("continuous_forward");
always_fly_fast = g_settings->getBool("always_fly_fast");
aux1_descends = g_settings->getBool("aux1_descends");
noclip = g_settings->getBool("noclip");
autojump = g_settings->getBool("autojump");
}
void Player::settingsChangedCallback(const std::string &name, void *data)
{
((PlayerSettings *)data)->readGlobalSettings();
}
|