Multisend is a replacement for servo. No synchronization is needed, just load and go.
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

#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);
}