Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement on_rightclickplayer callback (#10775)
Co-authored-by: rubenwardy <rw@rubenwardy.com>
  • Loading branch information
JDiaz and rubenwardy committed Jan 11, 2021
1 parent fcb3ed8 commit 08ee979
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 4 deletions.
1 change: 1 addition & 0 deletions builtin/game/register.lua
Expand Up @@ -617,6 +617,7 @@ core.registered_can_bypass_userlimit, core.register_can_bypass_userlimit = make_
core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration()
core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()

--
-- Compatibility for on_mapgen_init()
Expand Down
10 changes: 7 additions & 3 deletions doc/lua_api.txt
Expand Up @@ -2113,7 +2113,7 @@ Examples
list[current_player;main;0,3.5;8,4;]
list[current_player;craft;3,0;3,3;]
list[current_player;craftpreview;7,1;1,1;]

Version History
---------------

Expand Down Expand Up @@ -4587,6 +4587,10 @@ Call these functions only at load time!
the puncher to the punched.
* `damage`: Number that represents the damage calculated by the engine
* should return `true` to prevent the default damage mechanism
* `minetest.register_on_rightclickplayer(function(player, clicker))`
* Called when a player is right-clicked
* `player`: ObjectRef - Player that was right-clicked
* `clicker`: ObjectRef - Object that right-clicked, may or may not be a player
* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
* Called when the player gets damaged or healed
* `player`: ObjectRef of the player
Expand Down Expand Up @@ -7641,12 +7645,12 @@ Used by `minetest.register_node`.
-- intensity: 1.0 = mid range of regular TNT.
-- If defined, called when an explosion touches the node, instead of
-- removing the node.

mod_origin = "modname",
-- stores which mod actually registered a node
-- if it can not find a source, returns "??"
-- useful for getting what mod truly registered something
-- example: if a node is registered as ":othermodname:nodename",
-- example: if a node is registered as ":othermodname:nodename",
-- nodename will show "othermodname", but mod_orgin will say "modname"
}

Expand Down
13 changes: 13 additions & 0 deletions src/script/cpp_api/s_player.cpp
Expand Up @@ -77,6 +77,19 @@ bool ScriptApiPlayer::on_punchplayer(ServerActiveObject *player,
return readParam<bool>(L, -1);
}

void ScriptApiPlayer::on_rightclickplayer(ServerActiveObject *player,
ServerActiveObject *clicker)
{
SCRIPTAPI_PRECHECKHEADER
// Get core.registered_on_rightclickplayers
lua_getglobal(L, "core");
lua_getfield(L, -1, "registered_on_rightclickplayers");
// Call callbacks
objectrefGetOrCreate(L, player);
objectrefGetOrCreate(L, clicker);
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
}

s32 ScriptApiPlayer::on_player_hpchange(ServerActiveObject *player,
s32 hp_change, const PlayerHPChangeReason &reason)
{
Expand Down
1 change: 1 addition & 0 deletions src/script/cpp_api/s_player.h
Expand Up @@ -47,6 +47,7 @@ class ScriptApiPlayer : virtual public ScriptApiBase
bool on_punchplayer(ServerActiveObject *player, ServerActiveObject *hitter,
float time_from_last_punch, const ToolCapabilities *toolcap,
v3f dir, s16 damage);
void on_rightclickplayer(ServerActiveObject *player, ServerActiveObject *clicker);
s32 on_player_hpchange(ServerActiveObject *player, s32 hp_change,
const PlayerHPChangeReason &reason);
void on_playerReceiveFields(ServerActiveObject *player,
Expand Down
5 changes: 5 additions & 0 deletions src/server/player_sao.cpp
Expand Up @@ -456,6 +456,11 @@ u16 PlayerSAO::punch(v3f dir,
return hitparams.wear;
}

void PlayerSAO::rightClick(ServerActiveObject *clicker)
{
m_env->getScriptIface()->on_rightclickplayer(this, clicker);
}

void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason)
{
if (hp == (s32)m_hp)
Expand Down
2 changes: 1 addition & 1 deletion src/server/player_sao.h
Expand Up @@ -111,7 +111,7 @@ class PlayerSAO : public UnitSAO

u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher,
float time_from_last_punch);
void rightClick(ServerActiveObject *clicker) {}
void rightClick(ServerActiveObject *clicker);
void setHP(s32 hp, const PlayerHPChangeReason &reason);
void setHPRaw(u16 hp) { m_hp = hp; }
s16 readDamage();
Expand Down

0 comments on commit 08ee979

Please sign in to comment.