MQ2PCSafety
Usage: /PCSafety [help | on | off | status | load | save | add | del | clear | list | cmdadd | cmddel | cmdlist | cmdclear]
Now you can execute commands when non friends zone in, ex /pcsafety cmdadd "/endmacro"
You can add friends to the list so they don't trigger these commands by typing /pcsafety add rawr
Version 1.02
Usage: /PCSafety [help | on | off | status | load | save | add | del | clear | list | cmdadd | cmddel | cmdlist | cmdclear]
Now you can execute commands when non friends zone in, ex /pcsafety cmdadd "/endmacro"
You can add friends to the list so they don't trigger these commands by typing /pcsafety add rawr
Version 1.02
Code:
//Plugin by Unity0110
//A lot of the code was taken from MQ2Autogroup, so credit goes to htw for that
#include "../MQ2Plugin.h"
PreSetup("MQ2PCSafety");
#include <vector>
PLUGIN_VERSION(1.02);
vector<string> PCSafety;
vector<string> PCSafetyCMD;
bool bPCSafety = false;
bool ReadyToSearch = true;
time_t Seconds;
VOID LoadINI(VOID)
{
int KeyIndex;
char KeyName[MAX_STRING], KeyValue[MAX_STRING];
KeyIndex = 1;
PCSafety.clear();
PCSafetyCMD.clear();
do {
sprintf(KeyName, "Name%d", KeyIndex);
GetPrivateProfileString("Names", KeyName, NULL, KeyValue, MAX_STRING, INIFileName);
if(strlen(KeyValue)>0) {
strlwr(KeyValue);
PCSafety.push_back(KeyValue);
}
KeyIndex++;
} while(strlen(KeyValue)>0);
KeyIndex = 1;
do {
sprintf(KeyName, "Command%d", KeyIndex);
GetPrivateProfileString("Commands", KeyName, NULL, KeyValue, MAX_STRING, INIFileName);
if(strlen(KeyValue)>0) {
strlwr(KeyValue);
PCSafetyCMD.push_back(KeyValue);
}
KeyIndex++;
} while(strlen(KeyValue)>0);
WriteChatf("\ayMQ2PCSafety\ax by \arUnity0110\ax", MQ2Version);
WriteChatf("\ayPCSafety\ax is currently: %s.", bPCSafety?"\agON\ax":"\arOFF\ax");
WriteChatf("Names loaded: \at%d\ax.", PCSafety.size());
WriteChatf("Commands loaded: \at%d\ax.", PCSafetyCMD.size());
}
VOID SaveINI(VOID)
{
char KeyName[MAX_STRING];
WritePrivateProfileSection("Names", "", INIFileName);
WritePrivateProfileSection("Commands", "", INIFileName);
for (register unsigned int Index = 0; Index < PCSafety.size(); Index++) {
string& VectorRef = PCSafety[Index];
sprintf(KeyName, "Name%d", Index+1);
WritePrivateProfileString("Names",KeyName,VectorRef.c_str(),INIFileName);
}
for (register unsigned int Index = 0; Index < PCSafetyCMD.size(); Index++) {
string& VectorRef = PCSafetyCMD[Index];
sprintf(KeyName, "Command%d", Index+1);
WritePrivateProfileString("Commands",KeyName,VectorRef.c_str(),INIFileName);
}
WriteChatf("\ayMQ2PCSafety\ax names and commands saved to .ini!");
}
VOID doCommands(VOID)
{
bPCSafety = false;
WriteChatf("\ayPCSafety\ax is now \arOFF\ax.");
PSPAWNINFO pChar = GetCharInfo()->pSpawn;
for (register unsigned int Index = 0; Index < PCSafetyCMD.size(); Index++)
{
string& VectorRef = PCSafetyCMD[Index];
DoCommand(pChar, (PCHAR)VectorRef.c_str());
}
}
VOID PCSafetyCommand(PSPAWNINFO pChar, PCHAR szLine)
{
char szTemp[MAX_STRING], szBuffer[MAX_STRING];
GetArg(szTemp, szLine, 1);
// Turn PCSafety on
if (!stricmp(szTemp, "on")) {
bPCSafety = true;
WriteChatf("\ayPCSafety\ax is now \agON\ax.");
}
// Turn PCSafety off
else if (!stricmp(szTemp, "off")) {
bPCSafety = false;
WriteChatf("\ayPCSafety\ax is now \arOFF\ax.");
}
// Show PCSafety status
else if (!stricmp(szTemp, "status")) {
WriteChatf("\ayPCSafety\ax is currently: %s.", bPCSafety?"\agON\ax":"\arOFF\ax");
}
// Reload .ini
else if (!stricmp(szTemp, "load")) {
LoadINI();
}
// Save current settings & names
else if (!stricmp(szTemp, "save")) {
SaveINI();
}
// Add name
else if (!stricmp(szTemp, "add")) {
GetArg(szBuffer, szLine, 2);
if(strlen(szBuffer)>0) {
PCSafety.push_back(szBuffer);
WriteChatf("\ayMQ2PCSafety\ax: '%s' added.", szBuffer);
}
else
WriteChatf("\ayMQ2PCSafety\ax: Name to add not specified.");
}
// Add command
else if (!stricmp(szTemp, "cmdadd")) {
GetArg(szBuffer, szLine, 2);
if(strlen(szBuffer)>0) {
PCSafetyCMD.push_back(szBuffer);
WriteChatf("\ayMQ2PCSafety\ax: command '%s' added.", szBuffer);
}
else
WriteChatf("\ayMQ2PCSafety\ax: Command to add not specified.");
}
// Delete name #
else if (!stricmp(szTemp, "del")) {
GetArg(szBuffer, szLine, 2);
unsigned int Index = atoi(szBuffer);
if(Index > 0 && Index < PCSafety.size()+1) {
string& VectorRef = PCSafety[Index-1];
WriteChatf("\ayMQ2PCSafety\ax: Name %d (%s) deleted.", Index, VectorRef.c_str());
PCSafety.erase(PCSafety.begin() + (Index-1));
}
else
WriteChatf("\ayMQ2PCSafety\ax: Name %d does not exist.", Index);
}
// Delete command #
else if (!stricmp(szTemp, "cmddel")) {
GetArg(szBuffer, szLine, 2);
unsigned int Index = atoi(szBuffer);
if(Index > 0 && Index < PCSafetyCMD.size()+1) {
string& VectorRef = PCSafetyCMD[Index-1];
WriteChatf("\ayMQ2PCSafety\ax: Command %d (%s) deleted.", Index, VectorRef.c_str());
PCSafetyCMD.erase(PCSafetyCMD.begin() + (Index-1));
}
else
WriteChatf("\ayMQ2PCSafety\ax: Command %d does not exist.", Index);
}
// Clear all names
else if (!stricmp(szTemp, "clear")) {
PCSafety.clear();
WriteChatf("\ayMQ2PCSafety\ax: Names cleared.");
}
// Clear all commands
else if (!stricmp(szTemp, "cmdclear")) {
PCSafetyCMD.clear();
WriteChatf("\ayMQ2PCSafety\ax: Commands cleared.");
}
// List all names
else if (!stricmp(szTemp, "list")) {
WriteChatf("\ayMQ2PCSafety\ax: Names loaded: %d.", PCSafety.size());
for (register unsigned int Index = 0; Index < PCSafety.size(); Index++) {
string& VectorRef = PCSafety[Index];
WriteChatf("%d: %s", Index+1, VectorRef.c_str());
}
}
// List all commands
else if (!stricmp(szTemp, "cmdlist")) {
WriteChatf("\ayMQ2PCSafety\ax: Commands loaded: \at%d\ax.", PCSafetyCMD.size());
for (register unsigned int Index = 0; Index < PCSafetyCMD.size(); Index++) {
string& VectorRef = PCSafetyCMD[Index];
WriteChatf("%d: %s", Index+1, VectorRef.c_str());
}
}
// No parameter is status
else if(!strlen(szTemp)) {
WriteChatf("\ayPCSafety\ax is %s.", bPCSafety?"\agON\ax":"\arOFF\ax");
WriteChatf("\ayMQ2PCSafety\ax: Names loaded: %d.", PCSafety.size());
WriteChatf("\ayMQ2PCSafety\ax: Commands loaded: \at%d\ax.", PCSafetyCMD.size());
WriteChatf("\ayMQ2PCSafety\ax: Type /PCSafety help for usage.");
}
// Otherwise, show help
else {
WriteChatf("\atUsage\ax\ay:\ax \ar/\ax\ayPCSafety\ax \ar[\ax\athelp\ax \ag|\ax \aton\ax \ag|\ax \atoff\ax \ag|\ax \atstatus\ax \ag|\ax \atload\ax \ag|\ax \atsave\ax \ag|\ax \atadd\ax \ag|\ax \atdel\ax \ag|\ax \atclear\ax \ag|\ax \atlist\ax \ag|\ax \atcmdadd\ax \ag|\ax \atcmddel\ax \ag|\ax \atcmdlist\ax \ag|\ax \atcmdclear\ax\ar]\ax");
WriteChatf("\aton\ax \ay=\ax \agTurns ON automatic checking of new PC's.\ax");
WriteChatf("\atoff\ax \ay=\ax \agTurns OFF automatic checking of new PC's.\ax");
WriteChatf("\atstatus\ax \ay=\ax \agShows the current status of PCSafety.\ax");
WriteChatf("\atload\ax \ay=\ax \agLoads options and names from .ini file.\ax");
WriteChatf("\atsave\ax \ay=\ax \agUpdates .ini to match current options and names.\ax");
WriteChatf("\atadd\ax \ay=\ax \agAdd a new char name (ex:\ax '\ar/\ax\ayPCSafety\ax \atadd rawr\ax' \agwould add the name rawr).\ax");
WriteChatf("\atdel\ax \ay=\ax \agDelete a char name (ex:\ax '\ar/\ax\ayPCSafety\ax \atdel 15\ax' \agdeletes name #15).\ax");
WriteChatf("\atclear\ax \ay=\ax \agClears all char names.\ax");
WriteChatf("\atlist\ax \ay=\ax \agLists current char names.\ax");
WriteChatf("\atcmdadd\ax \ay=\ax \agAdds a command that is executed upon unknown PC.\ax");
WriteChatf("\atcmddel\ax \ay=\ax \agDeletes a command that is executed upon unknown PC.\ax");
WriteChatf("\atcmdlist\ax \ay=\ax \agLists all commands executed upon unknown PC.\ax");
WriteChatf("\atcmdclear\ax \ay=\ax \agClears all commands.\ax");
}
}
BOOL CheckNames(PCHAR szName)
{
CHAR szTemp[MAX_STRING];
if (gGameState==GAMESTATE_INGAME) {
if (pCharData) {
strcpy(szTemp, szName);
strlwr(szTemp);
for (register unsigned int Index = 0; Index < PCSafety.size(); Index++) {
string& VectorRef = PCSafety[Index];
if(!stricmp(szTemp, VectorRef.c_str()))
return true;
}
}
}
return false;
}
PLUGIN_API VOID OnAddSpawn(PSPAWNINFO pNewSpawn)
{
if (!ReadyToSearch || time(NULL) < Seconds + 10 ) return;
if (gGameState==GAMESTATE_INGAME && bPCSafety) {
if (pNewSpawn->GM == 1)
{
WriteChatf("%s (\arGM\ax) has entered the zone.", pNewSpawn->DisplayedName);
doCommands();
}
if (GetSpawnType(pNewSpawn) == PC)
if (CheckNames(pNewSpawn->DisplayedName)) WriteChatf("%s (\agFriend\ax) has entered the zone.", pNewSpawn->DisplayedName);
else {
WriteChatf("%s (\arUnknown\ax) has entered the zone.", pNewSpawn->DisplayedName);
doCommands();
}
}
}
int FindS(string strMain, string strWord)
{
int pos;
if (strMain.find(strWord) == 'npos') {
return -1;
} else{
pos = strMain.find(strWord);
return pos;
}
}
PLUGIN_API DWORD OnIncomingChat(PCHAR Line, DWORD Color)
{
if (FindS(Line, "LOADING, PLEASE WAIT...")==0)
{
Seconds = time (NULL);
ReadyToSearch = false;
if(bPCSafety) {
bPCSafety = false;
WriteChatf("\ayPCSafety\ax is now \arOFF\ax.");
}
}
if (FindS(Line, "You have entered")==0)
{
Seconds = time (NULL);
ReadyToSearch = true;
if(bPCSafety) {
bPCSafety = false;
WriteChatf("\ayPCSafety\ax is now \arOFF\ax.");
}
}
return 0;
}
PLUGIN_API VOID InitializePlugin(VOID)
{
DebugSpewAlways("Initializing MQ2PCSafety");
LoadINI();
AddCommand("/pcsafety", PCSafetyCommand);
AddCommand("/pc", PCSafetyCommand);
}
PLUGIN_API VOID ShutdownPlugin(VOID)
{
DebugSpewAlways("Shutting down MQ2PCSafety");
RemoveCommand("/pcsafety");
RemoveCommand("/pc");
}