war3_jass聊天命令动作 - 3

发布时间 2023-04-25 17:16:50作者: Yofoo

Hook到聊天函数, 获取文字, 可以从这个文字作为一些内置命令, 比如传送功能等

  1. 相关函数
    HookChatMessage
    HookRoomChat

  2. 判断以及动作

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

  1. 实现一些功能
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;
}
  1. 基础功能函数
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;
}