#include "../MQ2Plugin.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
std::vector <std::string> friends;
std::vector <std::string> enemies;
std::vector <std::string> guilds;
int igSkipPulses = 10;
int igSkipPulse = 0;
int warningRadius = 200;
int playerCount;
bool pauseOnPlayerCount;
bool pauseOnGM;
bool pauseOnRadius;
bool pauseOnEnemy;
bool pauseOnGuild;
bool verbose = false;
bool paused = false;
bool beeped = false;
PreSetup("MQ2Warning");
VOID Tokenize(const string& str, vector<string>& tokens, const string& delimiters = ",")
{
// Skip delimiters at beginning.
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
string::size_type pos = str.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos)
{
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
}
VOID Update_INIFileName() {
sprintf(INIFileName,"%s\\MQ2Warning.ini",gszINIPath);
}
VOID Load_MQ2Radar_INI()
{
std::string _friends;
std::string _enemies;
std::string _guilds;
CHAR szTemp[MAX_STRING]={0};
Update_INIFileName();
GetPrivateProfileString("MQ2Warning","Friends","",&szTemp[0],sizeof(szTemp),INIFileName);
_friends = string(szTemp);
Tokenize(_friends, friends);
WritePrivateProfileString("MQ2Warning","Friends",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","Enemies","",&szTemp[0],sizeof(szTemp),INIFileName);
_enemies = string(szTemp);
Tokenize(_enemies, enemies);
WritePrivateProfileString("MQ2Warning","Enemies",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","Guilds","",&szTemp[0],sizeof(szTemp),INIFileName);
_guilds = string(szTemp);
Tokenize(_guilds, guilds);
WritePrivateProfileString("MQ2Warning","Guilds",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PlayerCount","0",&szTemp[0],sizeof(szTemp),INIFileName);
playerCount = atoi(&szTemp[0]);
sprintf(szTemp, "%d", playerCount);
WritePrivateProfileString("MQ2Warning","PlayerCount",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PauseOnPlayerCount","1",&szTemp[0],sizeof(szTemp),INIFileName);
pauseOnPlayerCount = atoi(&szTemp[0]);
sprintf(szTemp, "%d", pauseOnPlayerCount);
WritePrivateProfileString("MQ2Warning","PauseOnPlayerCount",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","WarningRadius","200",&szTemp[0],sizeof(szTemp),INIFileName);
warningRadius = atoi(&szTemp[0]);
sprintf(szTemp, "%d", warningRadius);
WritePrivateProfileString("MQ2Warning","WarningRadius",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PauseOnRadius","1",&szTemp[0],sizeof(szTemp),INIFileName);
pauseOnRadius = atoi(&szTemp[0]);
sprintf(szTemp, "%d", pauseOnRadius);
WritePrivateProfileString("MQ2Warning","PauseOnRadius",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PauseOnEnemy","1",&szTemp[0],sizeof(szTemp),INIFileName);
pauseOnEnemy = atoi(&szTemp[0]);
sprintf(szTemp, "%d", pauseOnEnemy);
WritePrivateProfileString("MQ2Warning","PauseOnEnemy",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PauseOnGuild","1",&szTemp[0],sizeof(szTemp),INIFileName);
pauseOnGuild = atoi(&szTemp[0]);
sprintf(szTemp, "%d", pauseOnGuild);
WritePrivateProfileString("MQ2Warning","PauseOnGuild",szTemp,INIFileName);
GetPrivateProfileString("MQ2Warning","PauseOnGM","1",&szTemp[0],sizeof(szTemp),INIFileName);
pauseOnGM = atoi(&szTemp[0]);
sprintf(szTemp, "%d", pauseOnGM);
WritePrivateProfileString("MQ2Warning","PauseOnGM",szTemp,INIFileName);
}
BOOL Friend(PSPAWNINFO pSpawn) {
for (int i=0;i<friends.size();i++) {
if (!stricmp(pSpawn->Name,friends[i].c_str())) return true;
}
return false;
}
BOOL Enemy(PSPAWNINFO pSpawn) {
for (int i=0;i<enemies.size();i++) {
if (!stricmp(pSpawn->Name,enemies[i].c_str())) return true;
}
return false;
}
BOOL Guild(PSPAWNINFO pSpawn) {
for (int i=0;i<guilds.size();i++) {
if (!stricmp(pGuildList->GuildName[pSpawn->GuildID],guilds[i].c_str())) return true;
}
return false;
}
VOID ResetBeep(PSPAWNINFO pChar, PCHAR szLine) {
beeped = false;
}
VOID Reset(PSPAWNINFO pChar, PCHAR szLine) {
beeped = false;
paused = false;
DoCommand(pChar,"/mqpause off");
}
VOID Verbose(PSPAWNINFO pChar, PCHAR szLine) {
if (verbose) {
verbose = false;
} else {
verbose = true;
}
}
BOOL InGame() {
return(gGameState == GAMESTATE_INGAME && GetCharInfo2() && GetCharInfo());
}
// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
DebugSpewAlways("Initializing MQ2Warning");
Load_MQ2Radar_INI();
AddCommand("/rtone",ResetBeep);
AddCommand("/wreset",Reset);
AddCommand("/wverbose",Verbose);
}
// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
DebugSpewAlways("Shutting down MQ2Warning");
RemoveCommand("/rtone");
RemoveCommand("/wverbose");
RemoveCommand("/wreset");
}
PLUGIN_API VOID OnPulse(VOID)
{
PSPAWNINFO pSpawn = (PSPAWNINFO)pSpawnList;
PSPAWNINFO pChar = GetCharInfo()->pSpawn;
int beeptype = 0, count = 0;
//HWND EQhWnd = *(HWND*)EQADDR_HWND;
if (InGame()) {// && GetForegroundWindow()==EQhWnd) {
if (igSkipPulse == igSkipPulses) {
igSkipPulse = 0;
while (pSpawn)
{
if (GetSpawnType(pSpawn)==PC) {
count++;
if (pSpawn!=pChar && !Friend(pSpawn)) {
// check radius
if (pauseOnRadius && GetDistance(pChar,pSpawn)<warningRadius)
{
if (verbose) WriteChatf("WARNING: %s within Radius!", pSpawn->Name);
beeptype = 3; // play 1 times
}
// check guilds
if (pauseOnGuild && Guild(pSpawn)) {
if (verbose) WriteChatf("WARNING: Guild %s, player %s in zone!", GetGuildByID(pSpawn->GuildID), pSpawn->Name);
beeptype = 1;
}