PDA

View Full Version : [advanced] Ignoring text said by certain players



IzNoGoD
20th December 2014, 22:46
Here's my example code for ignoring text set by certain players by some players(like mute on voicechat). It will allow player A to ignore player B, while player B can still communicate with all others on server, and A can still message B (only impossible option then is B->A)
(its JH-specific code, but you might be able to port it to other mods if you want to)


#include JH\_util;
playerinit()
{
if(self.izno["first_run"])
{
self.izno["ignorelist"] = [];
args = [];
args[0] = self;
add_async_query("SELECT ignore_id FROM ignorelist WHERE player_id = " + self.izno["player_id"], ::createlist, args);
add_async_query("SELECT player_id FROM ignorelist WHERE ignore_id = " + self.izno["player_id"], ::createlist_other, args);
}
}

addignore(player, forever)
{
found = false;
for(i = 0; i < self.izno["ignorelist"].size; i++)
{
if(self.izno["ignorelist"][i] == player.izno["player_id"])
{
found = true;
break;
}
}
if(!found)
self.izno["ignorelist"][self.izno["ignorelist"].size] = player.izno["player_id"];
if(forever)
{
add_async_query_nosave("INSERT IGNORE INTO ignorelist (player_id, ignore_id) VALUES (" + self.izno["player_id"] + ", " + player.izno["player_id"] + ")");
self iprintln("You are persistently ignoring " + player.name);
}
else
self iprintln("You are now ignoring " + player.name);
}

unignore(player, forever)
{
found = false;
for(i = 0; i < self.izno["ignorelist"].size; i++)
{
if(self.izno["ignorelist"][i] == player.izno["player_id"])
{
found = true;
self.izno["ignorelist"][i] = self.izno["ignorelist"][self.izno["ignorelist"].size - 1];
self.izno["ignorelist"][self.izno["ignorelist"].size - 1] = undefined;
break;
}
}
if(!found)
{
self iprintln("You were not ignoring " + player.name);
}
if(forever)
{
add_async_query_nosave("DELETE FROM ignorelist WHERE player_id = " + self.izno["player_id"] + " AND ignore_id = " + player.izno["player_id"]);
self iprintln("You gave up ignoring " + player.name + "^7 forever");
}
else
self iprintln("You gave up ignoring " + player.name);
}

createlist_other(result, args)
{
player = args[0];
if(!isdefined(player))
{
if(isdefined(result))
mysql_free_result(result);
return;
}

if(isdefined(result))
{
players = getentarray("player", "classname");
rowcount = mysql_num_rows(result);
for(i = 0; i < rowcount; i++)
{
row = mysql_fetch_row(result);
if(isdefined(row[0]))
{
for(j = 0; j < players.size; j++)
{
if(isdefined(players[j].izno["login_completed"]))
{
if(players[j].izno["player_id"] == int(row[0]))
{
//this players[j] is ignoring player
players[j].izno["ignorelist"][players[j].izno["ignorelist"].size] = player.izno["player_id"];
break;
}
}
}
}
}
mysql_free_result(result);
}
}

createlist(result, args)
{
player = args[0];
if(!isdefined(player))
{
if(isdefined(result))
mysql_free_result(result);
return;
}
if(isdefined(result))
{
players = getentarray("player", "classname");
rowcount = mysql_num_rows(result);
for(i = 0; i < rowcount; i++)
{
row = mysql_fetch_row(result);
if(isdefined(row[0]))
{
for(j = 0; j < players.size; j++)
{
if(isdefined(players[j].izno["login_completed"]))
{
if(players[j].izno["player_id"] == int(row[0]))
{
//this player is ignoring players[j]
player.izno["ignorelist"][player.izno["ignorelist"].size] = players[j].izno["player_id"];
break;
}
}
}
}
}
mysql_free_result(result);
}
}
above is the _ignore.gsc, which is mainly the list creating script (also it can save to a mysql database if you want to persistently ignore a player)


else if(args[0] == "say")
{
txt = args[1];
for(i = 2; i < args.size; i++)
txt += " " + args[i];
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
ignore = false;
if(isdefined(players[i].izno["login_completed"]))
{
for(j = 0; j < players[i].izno["ignorelist"].size; j++)
{
if(players[i].izno["ignorelist"][j] == self.izno["player_id"])
{
ignore = true;
break;
}
}
}
if(!ignore)
sendgameservercommand(players[i] getentitynumber(), "h \"" + self.name + "^7: " + txt + "\"");
}
return;
}
Above is a snippet in callback_playercommand which handles incoming commands like chatting. As of now it does lack printing to the server console which makes it quite hard to follow any conversation using the serverconsole.




init_async_mysql()
{
host = getcvar("mysql_host");
user = getcvar("mysql_user");
port = getcvarint("mysql_port");
pass = getcvar("mysql_password");
db = getcvar("mysql_database");
mysql_async_initializer(host, user, pass, db, port, 4);
level.mysql_async = [];
while(true)
{
list = mysql_async_getdone_list();
for(i = 0; i < list.size; i++)
{
result = mysql_async_getresult_and_free(list[i]);
if(!isdefined(result))
continue;
if(result == 0)
result = undefined;
f = level.mysql_async["" + list[i]];
if(isdefined(f))
{
if(isdefined(f.function))
thread [[f.function]](result, f.args);
else if(isdefined(result))
mysql_free_result(result);
f = undefined;
}
level.mysql_async["" + list[i]] = undefined;
}
wait .05;
}
}

add_async_query_nosave(q, function, args)
{
if(getcvarint("show_mysql") == 1)
printf("mysql_query async nosave:" + q + "\n");
id = mysql_async_create_query_nosave(q);
f = spawnstruct();
f.query = q;
f.function = function;
f.args = args;
level.mysql_async["" + id] = f;
}

add_async_query(q, function, args)
{
if(getcvarint("show_mysql") == 1)
printf("mysql_query async:" + q + "\n");
id = mysql_async_create_query(q);
f = spawnstruct();
f.query = q;
f.function = function;
f.args = args;
level.mysql_async["" + id] = f;
}

And finally the util file, which does not do much more than handle the mysql stuffs


This code is still in testmode but it seems to work pretty nicely :)

Edit: almost forgot: This is all possible thanks to Mitch his sendgameservercommand libcod function