war3_jass函数重写 - 4
-
魔兽地图的保存功能不是很好, orpg等地图使用自己写的一些函数, 另外还有一些地图需要平台的插件来运行
没有平台的插件, 地图打不开, 然后手动去看也很难发现错误
参考前面文件 JassCompileError, 这里可以获取到详细信息 -
插件添加了自己的函数, 这些函数可以修改掉, 然后对一些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
- 重写的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;
}
然后就可以愉快的游戏了