Exemple #1
0
int CExoResMan__Exists(CExoResMan *pthis, char* resRef, unsigned short resType, int *tableType)
{
	if(resman.ResourceExists(resRef, (NwnResType) resType))
		return 1;
	else
		return CExoResMan__Exists_orig(pthis, resRef, resType, tableType);
}
static int HandleDemandResourceEvent(uintptr_t p)
{
    char resPath[MAXPATH + 17];

    ResManDemandEvent *event = reinterpret_cast<ResManDemandEvent*>(p);
    const char *ext = strchr(event->resRefWithExt, '.');
    if (!ext) { return 0; }
    ++ext;
    snprintf(resPath, MAXPATH, "%s/%s/%s", resman.GetSourcePath(), ext, event->resRefWithExt);
    time_t modtime = GetLastModTime(resPath);
    if (modtime == -1 || event->minimum_mtime > modtime) {
        return 0;
    }

    FILE *pTemp = fopen(resPath, "rb");
    if (pTemp == NULL) {
        resman.Log(3, "o Skip - Unable to open file: %s\n", resPath);
        return 0;
    }

    fseek(pTemp, 0, SEEK_END);
    unsigned long size = ftell(pTemp);
    fseek(pTemp, 0, SEEK_SET);

    char *pScriptBuffer = new char[size];
    if (fread(pScriptBuffer, size, 1, pTemp) != 1) {
        resman.Log(3, "o Skip - Error reading file: %s\n", resPath);
        delete[] pScriptBuffer;
        pScriptBuffer = NULL;
    }

    fclose(pTemp);

    if (pScriptBuffer) {
        event->mtime = modtime;
        event->pData = (unsigned char*)pScriptBuffer;
        event->size = size;
        return 1;
    }
    return 0;
}
Exemple #3
0
char* DemandRes(CExoResMan * pthis, CResStruct* cRes)
{
    lastRet = resman.DemandRes(pthis, cRes, lastResRef, lastResType);
	if(lastRet)
		return lastRet;
	else
		return DemandRes_orig(pthis, cRes);
/*
  resman.Log(0, "cRes(pClass=%08lX, pResData=%08lX, pResName=%08lX), lastResRef=%s, lastResType=%d, ret=%d\n", 
    cRes->pClass, cRes->pResData, cRes->pResName, lastResRef, lastResType, lastRet );
*/
}
static int HandleResourceExistsEvent(uintptr_t p)
{
    char resPath[MAXPATH + 17];

    ResManExistsEvent *exists = reinterpret_cast<ResManExistsEvent*>(p);
    const char *ext = strchr(exists->resRefWithExt, '.');
    if (!ext) { return 0; }
    ++ext;
    snprintf(resPath, MAXPATH, "%s/%s/%s", resman.GetSourcePath(), ext, exists->resRefWithExt);
    time_t modtime = GetLastModTime(resPath);

    if (modtime == -1) { return 0; }

    exists->exists = true;
    exists->mtime = std::max(exists->mtime, modtime);

    return 0;
}
Exemple #5
0
int HookFunctions()
{
  unsigned long old_RetrieveResEntry = FindHookRetrieveResEntry();
	if (old_RetrieveResEntry)
	{
    resman.Log(0, "o RetrieveResEntry hooked at %x.\n", old_RetrieveResEntry);
    d_redirect (old_RetrieveResEntry, (unsigned long)RetrieveResEntry, d_ret_code_res, 12);
	*(unsigned long*)&RetrieveResEntry_orig = (unsigned long)&d_ret_code_res;
	}
  else
  {
    resman.Log(0, "! RetrieveResEntry locate failed.\n");
    return 0;
  }
  
  unsigned long old_DemandRes = FindHookDemandRes();
	if (old_DemandRes)
	{
    resman.Log(0, "o DemandRes hooked at %x.\n", old_DemandRes);
    d_redirect (old_DemandRes, (unsigned long)DemandRes, d_ret_code_dem, 12);
	*(unsigned long*)&DemandRes_orig = (unsigned long)&d_ret_code_dem;
	}
  else
  {
    resman.Log(0, "! DemandRes locate failed.\n");
    return 0;
  }

  unsigned long old_Exists = 0x082B393C;
	if (old_Exists)
	{
    resman.Log(0, "o CExoResMan::Exists hooked at %x.\n", old_Exists);
    d_redirect (old_Exists, (unsigned long)CExoResMan__Exists, d_ret_code_exi, 11);
	*(unsigned long*)&CExoResMan__Exists_orig = (unsigned long)&d_ret_code_exi;
	}
  else
  {
    resman.Log(0, "! CExoResMan::Exists locate failed.\n");
    return 0;
  }


  lastResRef[0] = 0x0;
	return 1;
}