Re: [Plug-in] SSGM2.02 Ping Plugin [message #439345 is a reply to message #439296] |
Fri, 12 November 2010 13:25 |
|
Xpert
Messages: 1588 Registered: December 2005 Location: New York City
Karma: 0
|
General (1 Star) |
|
|
reborn wrote on Fri, 12 November 2010 04:45 | Did you use my code as an example? I think I fixed the bug in get_part_names for that to work, you should post that too.
Good effort!
|
Ahh yes I forgot about that.
engine_player.cpp
int Get_Part_Names(const char *name1)
{
GenericSLNode *x = BaseGameObjList->HeadNode;
int count = 0;
while (x)
{
GameObject *o = As_ScriptableGameObj((GameObject *)x->NodeData);
if (o && Commands->Is_A_Star(o) && As_SoldierGameObj(o)){
const char *name = Get_Player_Name(o);
if (stristr(name,name1))
{
count++;
}
delete[] name;
}
x = x->NodeNext;
}
return count;
}
const char *Get_Player_Name(GameObject *obj)
{
if (!Commands->Get_ID(obj) || !obj)
{
return newstr("None");
}
GameObject *o = As_SoldierGameObj(obj);
char *c = (char *)o;
if (!o)
{
return newstr("None");
}
c += 0x960;
cPlayer *x = (cPlayer *)*(unsigned int *)c;
if (!x)
{
return newstr("None");
}
return WideCharToChar(x->PlayerName);
}
const char *Get_Player_Name_By_ID(int PlayerID)
{
cPlayer *x = FindPlayer(PlayerID);
if (!x)
{
return 0;
}
return WideCharToChar(x->PlayerName);
}
Creator of NetGuard, an IRC network regulator.
Developer of the CloudyServ 0.982-X project.
Developer of the CloudyServ Ren-X bot.
Part time streamer - https://twitch.tv/gg_wonder
[Updated on: Fri, 12 November 2010 13:26] Report message to a moderator
|
|
|
|
Re: [Plug-in] SSGM2.02 Ping Plugin [message #439451 is a reply to message #439290] |
Sat, 13 November 2010 23:59 |
|
ExEric3
Messages: 746 Registered: February 2005 Location: Slovakia
Karma: 0
|
Colonel |
|
|
Xpert wrote on Fri, 12 November 2010 08:41 | This is an old bump, I know, but I was browsing the forums to see if there's anything I can make use for myself and I came across this. So I decided to show mine, I'll paste it. Maybe if Exeric still browse these forums, you can make use of it too? You don't have to put the whole player's name.
class ConnectionChatCommand : public ChatCommandClass {
void Triggered(int ID,const TokenClass &Text,int ChatType) {
if (!Text[1].empty()) {
GameObject *obj;
std::string name = Text[1].c_str();
std::string sender = Get_Player_Name_By_ID(ID);
int amount = 0;
amount = Get_Part_Names(name.c_str());
if (amount == 1) {
obj = Get_Part_Name(name.c_str());
int PID = Get_Player_ID(obj);
name = Get_Player_Name(obj);
if (ID != PID) {
Console_Input(StrFormat("ppage %d Connection for %s -> Ping: %d; Kbits: %d; Used bandwidth: %d;",ID,name.c_str(),Get_Ping(PID),Get_Kbits(PID),Get_Bandwidth(PID)).c_str());
}
else {
Console_Input(StrFormat("ppage %d Your connection -> Ping: %d; Kbits: %d; Used bandwidth: %d;",ID,Get_Ping(ID),Get_Kbits(ID),Get_Bandwidth(ID)).c_str());
}
}
else if (amount == 0) {
Console_Input(StrFormat("ppage %d Player not found.",ID).c_str());
return;
}
else if (amount > 1) {
obj = Get_GameObj_By_Player_Name(name.c_str());
if (!obj) {
Console_Input(StrFormat("ppage %d There are %i players with that substring, please make the name more unique.",ID,amount).c_str());
return;
}
}
}
else {
Console_Input(StrFormat("ppage %d Your connection -> Ping: %d; Kbits: %d; Used bandwidth: %d;",ID, Get_Ping(ID), Get_Kbits(ID), Get_Bandwidth(ID)).c_str());
}
}
};
ChatCommandRegistrant<ConnectionChatCommand> ConnectionChatCommandReg("!ping;!lag",CHATTYPE_ALL,0,GAMEMODE_ALL);
|
Thanks for your code. For you all works? Because when I use in game !ping partname FDS crash with this:
Exception occurred at 0x38D1B717 (No Owner)
The Renegade FDS tried to write to address 0x38d1b717 (No Owner)
Yeah I updated engine_player.cpp which you posted here.
|
|
|
Re: [Plug-in] SSGM2.02 Ping Plugin [message #439453 is a reply to message #381102] |
Sun, 14 November 2010 01:37 |
|
Xpert
Messages: 1588 Registered: December 2005 Location: New York City
Karma: 0
|
General (1 Star) |
|
|
Get_Part_Name was also fixed by reborn, I forgot to paste that too.
GameObject *Get_Part_Name(const char *name1)
{
GenericSLNode *x = BaseGameObjList->HeadNode;
int count = 0;
GameObject *current = 0;
while (x)
{
GameObject *o = As_ScriptableGameObj((GameObject *)x->NodeData);
if (o && Commands->Is_A_Star(o) && As_SoldierGameObj(o)){
const char *name = Get_Player_Name(o);
if (stristr(name,name1))
{
current = o;
count++;
}
delete[] name;
}
x = x->NodeNext;
}
if ((count == 1) && (current) && (Commands->Get_ID(current)))
{
return current;
}
else
{
return 0;
}
}
It should work now with this.
Creator of NetGuard, an IRC network regulator.
Developer of the CloudyServ 0.982-X project.
Developer of the CloudyServ Ren-X bot.
Part time streamer - https://twitch.tv/gg_wonder
[Updated on: Sun, 14 November 2010 01:38] Report message to a moderator
|
|
|
Re: [Plug-in] SSGM2.02 Ping Plugin [message #439601 is a reply to message #381102] |
Tue, 16 November 2010 05:30 |
|
jnz
Messages: 3396 Registered: July 2006 Location: 30th century
Karma: 0
|
General (3 Stars) |
|
|
That Get_Part_Names function can be exploited, if a player's name has a substring of another player's name then Get_Part_Name will always fail for the substring. IE:
jnz joins the game
jnzkiller joins the game
Get_Part_Names("jnz"); //returns 0
Also note that it would be worth changing stricmp and stristr to strcmp and strstr, I am not sure but I think 2 players can join with the same name but in diffrent case. ("jnz", "JNZ"). If this is not the case then just ignore me.
A fix would be:
GameObject *Get_Part_Name(const char *name1)
{
GenericSLNode *x = BaseGameObjList->HeadNode;
int count = 0;
GameObject *current = 0;
while (x)
{
GameObject *o = As_ScriptableGameObj((GameObject *)x->NodeData);
if (o && Commands->Is_A_Star(o) && As_SoldierGameObj(o)){
const char *name = Get_Player_Name(o);
if(stricmp(name, name1) != 0)
{
delete []name;
return o;
}
if (stristr(name,name1))
{
current = o;
count++;
}
delete[] name;
}
x = x->NodeNext;
}
if ((count == 1) && (current) && (Commands->Get_ID(current)))
{
return current;
}
else
{
return 0;
}
}
|
|
|