war3_jass函数重写 - 4

发布时间 2023-04-25 17:26:55作者: Yofoo
  1. 魔兽地图的保存功能不是很好, orpg等地图使用自己写的一些函数, 另外还有一些地图需要平台的插件来运行
    没有平台的插件, 地图打不开, 然后手动去看也很难发现错误
    参考前面文件 JassCompileError, 这里可以获取到详细信息

  2. 插件添加了自己的函数, 这些函数可以修改掉, 然后对一些jass函数重写来替换这些功能
    jass修改

// 这个放到全局变量
gamecache loc_cache=InitGameCache("store")

function DzAPI_Map_SaveServerValue takes player whichPlayer,string key,string value returns boolean
local boolean ssr
set ssr=StoreString(loc_cache,"",key,value)
return ssr
endfunction

function DzAPI_Map_GetServerValue takes player whichPlayer,string key returns string
local string stStr
set stStr=GetStoredString(loc_cache,"",key)
return stStr
endfunction

function DzAPI_Map_HasMallItem takes player whichPlayer,string key returns boolean
local string stStr
local integer vals
set stStr=GetStoredString(loc_cache,"",key)
set vals=S2I(stStr)
if vals>0 then
return true
else
return false
endif
endfunction
  1. 重写的jass函数可以用 StoreString, GetStoredString
AsmHook::HOOK_INFO	_StoreString;
BOOL WINAPIV Hook_StoreString(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	CWar3		*pThis = (CWar3 *)(pUserParam);

#ifdef _WIN64

#else
	LONG_PTR	*param;
	void		*backaddr;
	int			nCache;
	void		*missionKey, *key, *value;
	CHAR		*pMisson, *pKey, *pValue;

	AsmHook::GetCallParam(pReg, backaddr, param);
	nCache = (int)param[0];
	missionKey = (CHAR *)param[1];
	key = (CHAR *)param[2];
	value = (CHAR *)param[3];

	pMisson = RCStringGetText(missionKey);
	pKey = RCStringGetText(key);
	pValue = RCStringGetText(value);

	pThis->OnStoreString(nCache, pMisson, pKey, pValue);
	return TRUE;
#endif

	return TRUE;
}

BOOL WINAPIV Hook_GetStoredString(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	CWar3		*pThis = (CWar3 *)(pUserParam);

#ifdef _WIN64

#else
	LONG_PTR	*param;
	void		*backaddr;
	void		*missionKey, *key, *oText;
	int			nCache;
	CHAR		*pMisson, *pKey;
	BYTE		bzData[4096];
	CHAR		szValue[2048];
	BOOL		bChange;

	AsmHook::GetCallParam(pReg, backaddr, param);
	nCache = (int)param[0];
	missionKey = (CHAR *)param[1];
	key = (CHAR *)param[2];

	pMisson = RCStringGetText(missionKey);
	pKey = RCStringGetText(key);

	pThis->OnGetStoredString(nCache, pMisson, pKey, bChange, szValue);
	if(bChange && Real_StoreString)
	{
		RCStringCreate(szValue, bzData, &oText);
		Real_StoreString(nCache, missionKey, key, oText);
	}

	return TRUE;
#endif

	return TRUE;
}

BOOL	CWar3::OnStoreString(int nCache, CHAR *pMisson, CHAR *pKey, CHAR *pValue)
{
	CHAR		szPath[MAXPATH];

	sprintf(szPath, "%s.%s", pMisson, pKey);
	m_pStore->Set(szPath, pValue);
	m_pStore->SaveFile();

	return TRUE;
}

BOOL	CWar3::OnGetStoredString(int nCache, CHAR *pMisson, CHAR *pKey, BOOL &bChange, CHAR *pResult)
{
	CHAR		szPath[MAXPATH];
	CHAR		szValue[2048];
	BOOL		bRetVal;

	bChange = FALSE;
	sprintf(szPath, "%s.%s", pMisson, pKey);
	bRetVal = m_pStore->Get(szPath, szValue, sizeof(szValue));
	if(bRetVal == FALSE)
	{
		WriteLog("OnGetStoredString: %s", szPath);
		return TRUE;
	}

	bChange = TRUE;
	strcpy(pResult, szValue);
	return TRUE;
}

然后就可以愉快的游戏了