war3_jass聊天命令动作 - 3
Hook到聊天函数, 获取文字, 可以从这个文字作为一些内置命令, 比如传送功能等
-
相关函数
HookChatMessage
HookRoomChat -
判断以及动作
BOOL CWar3::OnChatMessage(int nPlayerId, CHAR *pMessage, int nType, float fTime)
{
m_nPlayerId = nPlayerId;
if(pMessage[0] == '#')
{
pMessage[0] = 0;
DoCommand(pMessage+1, FALSE);
}
return TRUE;
}
BOOL CWar3::OnRoomChatMessage(CHAR *pUser, CHAR *pText)
{
if(pText[0] == '#')
{
pText[0] = 0;
DoCommand(pText+1, TRUE);
}
return TRUE;
}
- 实现一些功能
BOOL CWar3::DoCommand(CHAR *pText, BOOL bChat)
{
CHAR szItem[16][128];
int nCount;
m_bRoomChat = bChat;
WriteLog("#%s", pText);
nCount = NStr::SplitString(pText, szItem[0], 16, 128, " ,()\t=");
if(stricmp(szItem[0], "h") == 0 || stricmp(szItem[0], "help") == 0)
{
CMD_Help();
}
else if(stricmp(szItem[0], "pos") == 0)
{
CMD_Pos(szItem[1], szItem[2]);
}
else if(stricmp(szItem[0], "log") == 0)
{
CMD_Log(szItem[1]);
}
return TRUE;
}
BOOL CWar3::CMD_Pos(CHAR *pX, CHAR *pY)
{
int hUnit;
CHAR szText[1024];
float x, y;
if(pX[0] == 0 || pY[0] == 0)
{
x = 0.0f;
y = 0.0f;
GetSelectUnit(hUnit);
if(hUnit)
GetUnitPos(hUnit, x, y);
sprintf(szText, "pos_cur: %g, %g", x, y);
}
else
{
x = (float)atof(pX);
y = (float)atof(pY);
GetSelectUnit(hUnit);
if(hUnit)
SetUnitPos(hUnit, x, y);
sprintf(szText, "pos_to : %g, %g", x, y);
}
DisplayTextToPlayer(szText, m_nPlayerId, 30.0f);
return TRUE;
}
BOOL CWar3::CMD_Log(CHAR *pText)
{
int hUnit;
CHAR szText[1024], szName[256];
float x, y;
x = 0.0f;
y = 0.0f;
szName[0] = 0;
GetSelectUnit(hUnit);
if(hUnit)
{
GetUnitPos(hUnit, x, y);
GetUnitName(hUnit, szName);
}
sprintf(szText, "Log %s %s(%g, %g)", pText, szName, x, y);
DisplayTextToPlayer(szText, m_nPlayerId, 30.0f);
return TRUE;
}
- 基础功能函数
BOOL CWar3::GetPlayer(int nPlayerId, int &hPlayer)
{
hPlayer = NULL;
if(InitJassApi() == FALSE)
return FALSE;
hPlayer = _Player(nPlayerId);
return TRUE;
}
BOOL CWar3::DisplayTextToPlayer(CHAR *pText, int nPlayerId, float time, float x, float y)
{
int hPlayer;
BYTE bzBuffer[4096];
void *oText;
if(InitJassApi() == FALSE)
return FALSE;
if(m_bRoomChat)
return RoomChatAddText(pText);
GetPlayer(nPlayerId, hPlayer);
if(hPlayer == NULL)
return FALSE;
RCStringCreate(pText, bzBuffer, &oText);
_DisplayTimedTextToPlayer(hPlayer, &x, &y, &time, oText);
WriteLog("-> %s", pText);
return TRUE;
}
BOOL CWar3::GetSelectUnit(int &hUnit)
{
int hGroup, hPlayer;
if(InitJassApi() == FALSE)
return FALSE;
GetPlayer(m_nPlayerId, hPlayer);
if(hPlayer == NULL)
return FALSE;
hGroup = _CreateGroup();
_GroupEnumUnitsSelected(hGroup, hPlayer, NULL);
hUnit = _FirstOfGroup(hGroup);
_DestroyGroup(hGroup);
return TRUE;
}
BOOL CWar3::GetUnitName(int &hUnit, CHAR *pName)
{
Jstr name;
CHAR *pText;
pName[0] = 0;
name = _GetUnitName(hUnit);
GetJStrText(name.id, &pText);
NStr::CodePageConvert(CP_UTF8, CP_ACP, pText, pName);
return TRUE;
}
BOOL CWar3::GetUnitPos(int &hUnit, float &x, float &y)
{
Jfloat val;
x = 0.0f;
y = 0.0f;
val = _GetUnitX(hUnit);
x = val.fVal;
val = _GetUnitY(hUnit);
y = val.fVal;
return TRUE;
}
BOOL CWar3::SetUnitPos(int &hUnit, float x, float y)
{
_SetUnitPosition(hUnit, &x, &y);
return TRUE;
}