Skip to content

Commit 8831669

Browse files
committedAug 3, 2013
Allow mods to listen to cheat detections using minetest.register_on_cheat()
1 parent 7426141 commit 8831669

File tree

7 files changed

+40
-3
lines changed

7 files changed

+40
-3
lines changed
 

‎builtin/misc_register.lua

+1
Original file line numberDiff line numberDiff line change
@@ -319,4 +319,5 @@ minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make
319319
minetest.registered_on_joinplayers, minetest.register_on_joinplayer = make_registration()
320320
minetest.registered_on_leaveplayers, minetest.register_on_leaveplayer = make_registration()
321321
minetest.registered_on_player_receive_fields, minetest.register_on_player_receive_fields = make_registration_reverse()
322+
minetest.registered_on_cheats, minetest.register_on_cheat = make_registration()
322323

‎doc/lua_api.txt

+3
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,9 @@ minetest.register_on_joinplayer(func(ObjectRef))
11421142
^ Called when a player joins the game
11431143
minetest.register_on_leaveplayer(func(ObjectRef))
11441144
^ Called when a player leaves the game
1145+
minetest.register_on_cheat(func(ObjectRef, cheat))
1146+
^ Called when a player cheats
1147+
^ cheat: {type="moved_too_fast"/"interacted_too_far"/"finished_unknown_dig"/"dug_unbreakable"/"dug_too_fast"}
11451148
minetest.register_on_chat_message(func(name, message))
11461149
^ Called always when a player says something
11471150
minetest.register_on_player_receive_fields(func(player, formname, fields))

‎src/content_sao.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -1454,8 +1454,9 @@ std::string PlayerSAO::getPropertyPacket()
14541454
return gob_cmd_set_properties(m_prop);
14551455
}
14561456

1457-
void PlayerSAO::checkMovementCheat()
1457+
bool PlayerSAO::checkMovementCheat()
14581458
{
1459+
bool cheated = false;
14591460
if(isAttached() || m_is_singleplayer ||
14601461
g_settings->getBool("disable_anticheat"))
14611462
{
@@ -1503,8 +1504,10 @@ void PlayerSAO::checkMovementCheat()
15031504
<<std::endl;
15041505
m_player->setPosition(m_last_good_position);
15051506
m_moved = true;
1507+
cheated = true;
15061508
}
15071509
}
1510+
return cheated;
15081511
}
15091512

15101513
bool PlayerSAO::getCollisionBox(aabb3f *toset) {

‎src/content_sao.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ class PlayerSAO : public ServerActiveObject
262262
{
263263
return m_dig_pool;
264264
}
265-
void checkMovementCheat();
265+
// Returns true if cheated
266+
bool checkMovementCheat();
266267

267268
// Other
268269

‎src/script/cpp_api/s_player.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,22 @@ void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
8181
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
8282
}
8383

84+
void ScriptApiPlayer::on_cheat(ServerActiveObject *player,
85+
const std::string &cheat_type)
86+
{
87+
SCRIPTAPI_PRECHECKHEADER
88+
89+
// Get minetest.registered_on_cheats
90+
lua_getglobal(L, "minetest");
91+
lua_getfield(L, -1, "registered_on_cheats");
92+
// Call callbacks
93+
objectrefGetOrCreate(player);
94+
lua_newtable(L);
95+
lua_pushlstring(L, cheat_type.c_str(), cheat_type.size());
96+
lua_setfield(L, -2, "type");
97+
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
98+
}
99+
84100
void ScriptApiPlayer::on_playerReceiveFields(ServerActiveObject *player,
85101
const std::string &formname,
86102
const std::map<std::string, std::string> &fields)

‎src/script/cpp_api/s_player.h

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class ScriptApiPlayer
3434
bool on_respawnplayer(ServerActiveObject *player);
3535
void on_joinplayer(ServerActiveObject *player);
3636
void on_leaveplayer(ServerActiveObject *player);
37+
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
3738

3839
void on_playerReceiveFields(ServerActiveObject *player,
3940
const std::string &formname,

‎src/server.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -2251,7 +2251,11 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
22512251
player->control.LMB = (bool)(keyPressed&128);
22522252
player->control.RMB = (bool)(keyPressed&256);
22532253

2254-
playersao->checkMovementCheat();
2254+
bool cheated = playersao->checkMovementCheat();
2255+
if(cheated){
2256+
// Call callbacks
2257+
m_script->on_cheat(playersao, "moved_too_fast");
2258+
}
22552259

22562260
/*infostream<<"Server::ProcessData(): Moved player "<<peer_id<<" to "
22572261
<<"("<<position.X<<","<<position.Y<<","<<position.Z<<")"
@@ -2811,6 +2815,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
28112815
RemoteClient *client = getClient(peer_id);
28122816
v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
28132817
client->SetBlockNotSent(blockpos);
2818+
// Call callbacks
2819+
m_script->on_cheat(playersao, "interacted_too_far");
28142820
// Do nothing else
28152821
return;
28162822
}
@@ -2939,6 +2945,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
29392945
<<PP(nocheat_p)<<" and completed digging "
29402946
<<PP(p_under)<<"; not digging."<<std::endl;
29412947
is_valid_dig = false;
2948+
// Call callbacks
2949+
m_script->on_cheat(playersao, "finished_unknown_dig");
29422950
}
29432951
// Get player's wielded item
29442952
ItemStack playeritem;
@@ -2964,6 +2972,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
29642972
<<", which is not diggable with tool. not digging."
29652973
<<std::endl;
29662974
is_valid_dig = false;
2975+
// Call callbacks
2976+
m_script->on_cheat(playersao, "dug_unbreakable");
29672977
}
29682978
// Check digging time
29692979
// If already invalidated, we don't have to
@@ -2987,6 +2997,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
29872997
<<" completed digging "<<PP(p_under)
29882998
<<"too fast; not digging."<<std::endl;
29892999
is_valid_dig = false;
3000+
// Call callbacks
3001+
m_script->on_cheat(playersao, "dug_too_fast");
29903002
}
29913003
}
29923004

0 commit comments

Comments
 (0)
Please sign in to comment.