You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
8.0 KiB
278 lines
8.0 KiB
#include "MultiSend.h" |
|
|
|
bool MultiSend::HandleCommand(const char* command, int32_t type) |
|
{ |
|
std::string arg; |
|
const char* com = command + GetArg(command, &arg); |
|
if ((_strnicmp(command, "/ms", 3)) |
|
&& (_stricmp(arg.c_str(), "/multisend"))) |
|
{ |
|
return false; |
|
} |
|
|
|
if (strlen(com) < 2) return true; |
|
if ((_stricmp(arg.c_str(), "/ms") == 0) |
|
|| (_stricmp(arg.c_str(), "/multisend")) == 0) |
|
{ |
|
com++; |
|
com += GetArg(com, &arg); |
|
} |
|
|
|
if ((_stricmp(arg.c_str(), "send") == 0) |
|
|| (_stricmp(arg.c_str(), "/mss") == 0)) |
|
{ |
|
|
|
if (strlen(com) < 2) return true; |
|
SendCommand(0xFFFF0000, com + 1); |
|
return true; |
|
} |
|
|
|
else if ((_stricmp(arg.c_str(), "sendto") == 0) |
|
|| (_stricmp(arg.c_str(), "/mst") == 0)) |
|
{ |
|
if (strlen(com) < 2) |
|
{ |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Invalid command."); |
|
return true; |
|
} |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
arg = SubValues(arg); |
|
|
|
Claim(&(MMF_Pointer->Name.ProcessID), 0); |
|
for (int x = 0; x < 100; x++) |
|
{ |
|
if (MMF_Pointer->Name.Names[x].Active) |
|
{ |
|
if (_stricmp((const char*)&(MMF_Pointer->Name.Names[x].Name), arg.c_str()) == 0) |
|
{ |
|
SendCommand(MMF_Pointer->Name.Names[x].Process, com + 1); |
|
InterlockedExchange(&(MMF_Pointer->Name.ProcessID), 0); |
|
return true; |
|
} |
|
} |
|
} |
|
|
|
InterlockedExchange(&(MMF_Pointer->Name.ProcessID), 0); |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Character not found."); |
|
return true; |
|
} |
|
|
|
else if ((_stricmp(arg.c_str(), "sendgroup") == 0) |
|
|| (_stricmp(arg.c_str(), "/msg") == 0)) |
|
{ |
|
if (strlen(com) < 3) |
|
{ |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Invalid command."); |
|
return true; |
|
} |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
for (std::map<uint16_t, string>::iterator it = m_Group.Map.begin(); it != m_Group.Map.end(); it++) |
|
{ |
|
if (_stricmp((*it).second.c_str(), arg.c_str()) == 0) |
|
{ |
|
SendCommand(0x8FFF0000 + (*it).first, com + 1); |
|
return true; |
|
} |
|
} |
|
|
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Group not found."); |
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "followme") == 0) |
|
{ |
|
if (strlen(com) < 2) return true; |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
if (_stricmp(arg.c_str(), "on") == 0) |
|
{ |
|
InterlockedExchange(&(MMF_Pointer->Follow.FollowID), GetCurrentProcessId()); |
|
if (!Zoning) |
|
{ |
|
Following = false; |
|
uint16_t myindex = m_AshitaCore->GetDataManager()->GetParty()->GetMemberTargetIndex(0); |
|
uint32_t mPosX = (uint32_t)floor(m_AshitaCore->GetDataManager()->GetEntity()->GetLocalX(myindex) * 100); |
|
uint32_t mPosZ = (uint32_t)floor(m_AshitaCore->GetDataManager()->GetEntity()->GetLocalZ(myindex) * 100); |
|
MMF_Pointer->Follow.PosX = mPosX; |
|
MMF_Pointer->Follow.PosZ = mPosZ; |
|
MMF_Pointer->Follow.Follow = 1; |
|
} |
|
else |
|
{ |
|
Following = false; |
|
MMF_Pointer->Follow.Follow = 3; |
|
} |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Followme enabled."); |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "off") == 0) |
|
{ |
|
InterlockedExchange(&(MMF_Pointer->Follow.FollowID), 0); |
|
MMF_Pointer->Follow.Follow = 0; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Followme disabled."); |
|
} |
|
|
|
else |
|
{ |
|
m_AshitaCore->GetChatManager()->Writef("MultiSend: Followme is currently %s.", (MMF_Pointer->Follow.FollowID == GetCurrentProcessId()) ? "enabled" : "disabled"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "follow") == 0) |
|
{ |
|
if (strlen(com) < 2) return true; |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
if (_stricmp(arg.c_str(), "on") == 0) |
|
{ |
|
FollowEnabled = true; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Follow enabled. Note that if someone is not currently using followme, no movement will occur."); |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "off") == 0) |
|
{ |
|
FollowEnabled = false; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Follow disabled."); |
|
} |
|
|
|
else |
|
{ |
|
m_AshitaCore->GetChatManager()->Writef("MultiSend: Follow is currently %s.", FollowEnabled ? "enabled" : "disabled"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "ignoreself") == 0) |
|
{ |
|
if (strlen(com) < 2) return true; |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
if (_stricmp(arg.c_str(), "on") == 0) |
|
{ |
|
IgnoreSelf = true; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Now ignoring self-published commands."); |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "off") == 0) |
|
{ |
|
IgnoreSelf = false; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Now accepting self-published commands."); |
|
} |
|
|
|
else |
|
{ |
|
m_AshitaCore->GetChatManager()->Writef("MultiSend: Ignore self is currently %s.", IgnoreSelf ? "enabled" : "disabled"); |
|
} |
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "debug") == 0) |
|
{ |
|
if (strlen(com) < 2) return true; |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
if (_stricmp(arg.c_str(), "on") == 0) |
|
{ |
|
_Debug = true; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Debug prints enabled."); |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "off") == 0) |
|
{ |
|
_Debug = false; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Debug prints disabled."); |
|
} |
|
|
|
else |
|
{ |
|
m_AshitaCore->GetChatManager()->Writef("MultiSend: Debug prints currently %s.", _Debug ? "enabled" : "disabled"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "safemode") == 0) |
|
{ |
|
if (strlen(com) < 2) return true; |
|
com++; |
|
com += GetArg(com, &arg); |
|
|
|
if (_stricmp(arg.c_str(), "on") == 0) |
|
{ |
|
_SafeMode = true; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Safe mode enabled."); |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "off") == 0) |
|
{ |
|
_SafeMode = false; |
|
m_AshitaCore->GetChatManager()->Write("MultiSend: Safe mode disabled."); |
|
} |
|
|
|
else |
|
{ |
|
m_AshitaCore->GetChatManager()->Writef("MultiSend: Safe mode currently %s.", _SafeMode ? "enabled" : "disabled"); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "reload") == 0) |
|
{ |
|
LoadGroups(); |
|
return true; |
|
} |
|
|
|
else if (_stricmp(arg.c_str(), "help") == 0) |
|
{ |
|
m_AshitaCore->GetChatManager()->Write("Multisend Command Listing"); |
|
m_AshitaCore->GetChatManager()->Write("/ms send [command] - Sends [command] to all characters with multisend loaded."); |
|
m_AshitaCore->GetChatManager()->Write("/ms sendto [char name] [command] - Sends [command] to all characters with multisend loaded named [char name]."); |
|
m_AshitaCore->GetChatManager()->Write("/ms sendgroup [group name] [command] - Sends [command] to all characters with multisend loaded that are defined within the group [group name]."); |
|
m_AshitaCore->GetChatManager()->Write("/ms follow on/off - When enabled, the current character will obey followme."); |
|
m_AshitaCore->GetChatManager()->Write("/ms followme on/off - When enabled, all characters with follow enabled will follow this character. Only one character can have this active at a time, if you activate it on a second the first will deactivate automatically."); |
|
m_AshitaCore->GetChatManager()->Write("/ms reload - Reloads group file without reloading MultiSend."); |
|
m_AshitaCore->GetChatManager()->Write("/ms ignoreself on/off - When enabled, send and sendgroup commands sent by this character will not execute on this character."); |
|
m_AshitaCore->GetChatManager()->Write("/ms debug on/off - When enabled, debug prints will be visible."); |
|
m_AshitaCore->GetChatManager()->Write("/ms safemode on/off - When enabled, '/echo' will be inserted for commands missing the leading '/' to prevent chatlog spam."); |
|
return true; |
|
} |
|
|
|
return (_strnicmp(command, "/ms ", 4) == 0); |
|
} |
|
|
|
uint32_t MultiSend::GetArg(const char* text, std::string* buffer) |
|
{ |
|
std::string working(text); |
|
|
|
if (working[0] == '"') |
|
{ |
|
size_t second = working.substr(1).find_first_of('"'); |
|
if (second != string::npos) |
|
{ |
|
*buffer = working.substr(1, second); |
|
return second + 1; |
|
} |
|
} |
|
|
|
size_t space = working.find_first_of(' '); |
|
if (space != string::npos) |
|
{ |
|
*buffer = working.substr(0, space); |
|
return space; |
|
} |
|
|
|
*buffer = string(text); |
|
return strlen(text); |
|
} |