MQ2PCSafety

unity0110

Lifetimer
Joined
Mar 23, 2007
Messages
594
Reaction score
0
Points
0
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
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");
}
 

Attachments

  • MQ2PCSafety.dll
    188.5 KB · Views: 0
Sounds great man, thanks.

Per unity0110, added to our compile, will be in next release.

htw
 
This looks really sweet, will give it a try and let ya know what I think:)
 
Looks nifty! Just curious though, is there a way to pause macros with this and then resume them when said non-friend person leaves the zone? I like to use the afk TS macs a lot but would be disappointed if I went to sleep for a while and come back and the mac had ended before it was finished lol.
 
pause sure, resume, no, i might add in a resume option later though