Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Allow mods to listen to cheat detections using minetest.register_on_c…
…heat()
  • Loading branch information
celeron55 committed Aug 3, 2013
1 parent 7426141 commit 8831669
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 3 deletions.
1 change: 1 addition & 0 deletions builtin/misc_register.lua
Expand Up @@ -319,4 +319,5 @@ minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make
minetest.registered_on_joinplayers, minetest.register_on_joinplayer = make_registration()
minetest.registered_on_leaveplayers, minetest.register_on_leaveplayer = make_registration()
minetest.registered_on_player_receive_fields, minetest.register_on_player_receive_fields = make_registration_reverse()
minetest.registered_on_cheats, minetest.register_on_cheat = make_registration()

3 changes: 3 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -1142,6 +1142,9 @@ minetest.register_on_joinplayer(func(ObjectRef))
^ Called when a player joins the game
minetest.register_on_leaveplayer(func(ObjectRef))
^ Called when a player leaves the game
minetest.register_on_cheat(func(ObjectRef, cheat))
^ Called when a player cheats
^ cheat: {type="moved_too_fast"/"interacted_too_far"/"finished_unknown_dig"/"dug_unbreakable"/"dug_too_fast"}
minetest.register_on_chat_message(func(name, message))
^ Called always when a player says something
minetest.register_on_player_receive_fields(func(player, formname, fields))
Expand Down
5 changes: 4 additions & 1 deletion src/content_sao.cpp
Expand Up @@ -1454,8 +1454,9 @@ std::string PlayerSAO::getPropertyPacket()
return gob_cmd_set_properties(m_prop);
}

void PlayerSAO::checkMovementCheat()
bool PlayerSAO::checkMovementCheat()
{
bool cheated = false;
if(isAttached() || m_is_singleplayer ||
g_settings->getBool("disable_anticheat"))
{
Expand Down Expand Up @@ -1503,8 +1504,10 @@ void PlayerSAO::checkMovementCheat()
<<std::endl;
m_player->setPosition(m_last_good_position);
m_moved = true;
cheated = true;
}
}
return cheated;
}

bool PlayerSAO::getCollisionBox(aabb3f *toset) {
Expand Down
3 changes: 2 additions & 1 deletion src/content_sao.h
Expand Up @@ -262,7 +262,8 @@ class PlayerSAO : public ServerActiveObject
{
return m_dig_pool;
}
void checkMovementCheat();
// Returns true if cheated
bool checkMovementCheat();

// Other

Expand Down
16 changes: 16 additions & 0 deletions src/script/cpp_api/s_player.cpp
Expand Up @@ -81,6 +81,22 @@ void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
}

void ScriptApiPlayer::on_cheat(ServerActiveObject *player,
const std::string &cheat_type)
{
SCRIPTAPI_PRECHECKHEADER

// Get minetest.registered_on_cheats
lua_getglobal(L, "minetest");
lua_getfield(L, -1, "registered_on_cheats");
// Call callbacks
objectrefGetOrCreate(player);
lua_newtable(L);
lua_pushlstring(L, cheat_type.c_str(), cheat_type.size());
lua_setfield(L, -2, "type");
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
}

void ScriptApiPlayer::on_playerReceiveFields(ServerActiveObject *player,
const std::string &formname,
const std::map<std::string, std::string> &fields)
Expand Down
1 change: 1 addition & 0 deletions src/script/cpp_api/s_player.h
Expand Up @@ -34,6 +34,7 @@ class ScriptApiPlayer
bool on_respawnplayer(ServerActiveObject *player);
void on_joinplayer(ServerActiveObject *player);
void on_leaveplayer(ServerActiveObject *player);
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);

void on_playerReceiveFields(ServerActiveObject *player,
const std::string &formname,
Expand Down
14 changes: 13 additions & 1 deletion src/server.cpp
Expand Up @@ -2251,7 +2251,11 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
player->control.LMB = (bool)(keyPressed&128);
player->control.RMB = (bool)(keyPressed&256);

playersao->checkMovementCheat();
bool cheated = playersao->checkMovementCheat();
if(cheated){
// Call callbacks
m_script->on_cheat(playersao, "moved_too_fast");
}

/*infostream<<"Server::ProcessData(): Moved player "<<peer_id<<" to "
<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
Expand Down Expand Up @@ -2811,6 +2815,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
RemoteClient *client = getClient(peer_id);
v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
client->SetBlockNotSent(blockpos);
// Call callbacks
m_script->on_cheat(playersao, "interacted_too_far");
// Do nothing else
return;
}
Expand Down Expand Up @@ -2939,6 +2945,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
<<PP(nocheat_p)<<" and completed digging "
<<PP(p_under)<<"; not digging."<<std::endl;
is_valid_dig = false;
// Call callbacks
m_script->on_cheat(playersao, "finished_unknown_dig");
}
// Get player's wielded item
ItemStack playeritem;
Expand All @@ -2964,6 +2972,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
<<", which is not diggable with tool. not digging."
<<std::endl;
is_valid_dig = false;
// Call callbacks
m_script->on_cheat(playersao, "dug_unbreakable");
}
// Check digging time
// If already invalidated, we don't have to
Expand All @@ -2987,6 +2997,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
<<" completed digging "<<PP(p_under)
<<"too fast; not digging."<<std::endl;
is_valid_dig = false;
// Call callbacks
m_script->on_cheat(playersao, "dug_too_fast");
}
}

Expand Down

0 comments on commit 8831669

Please sign in to comment.