Skip to content

Commit b58a8c6

Browse files
committed
Project2DFX v3.0
1 parent a00c1d5 commit b58a8c6

File tree

4 files changed

+182
-319
lines changed

4 files changed

+182
-319
lines changed

IIILodLights/dllmain.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,32 @@ void CLODLightManager::III::ApplyMemoryPatches()
185185

186186
if (MaxDrawDistanceForNormalObjects)
187187
{
188-
injector::WriteMemory<float>(0x5F72A4, MaxDrawDistanceForNormalObjects, true);
188+
//injector::WriteMemory<float>(0x5F72A4, MaxDrawDistanceForNormalObjects, true);
189+
injector::WriteMemory(0x4A8AB1, &MaxDrawDistanceForNormalObjects, true);
190+
injector::WriteMemory(0x4A8AC6, &MaxDrawDistanceForNormalObjects, true);
191+
injector::WriteMemory(0x4A8AD9, &MaxDrawDistanceForNormalObjects, true);
192+
injector::WriteMemory(0x4A8B0E, &MaxDrawDistanceForNormalObjects, true);
193+
injector::WriteMemory(0x4A8B21, &MaxDrawDistanceForNormalObjects, true);
194+
injector::WriteMemory(0x4A8B34, &MaxDrawDistanceForNormalObjects, true);
195+
injector::WriteMemory(0x4A8B82, &MaxDrawDistanceForNormalObjects, true);
196+
injector::WriteMemory(0x4A8B97, &MaxDrawDistanceForNormalObjects, true);
197+
injector::WriteMemory(0x4A8BAA, &MaxDrawDistanceForNormalObjects, true);
198+
injector::WriteMemory(0x4A8BDF, &MaxDrawDistanceForNormalObjects, true);
199+
injector::WriteMemory(0x4A8BF2, &MaxDrawDistanceForNormalObjects, true);
200+
injector::WriteMemory(0x4A8C05, &MaxDrawDistanceForNormalObjects, true);
201+
injector::WriteMemory(0x4A8DA6, &MaxDrawDistanceForNormalObjects, true);
202+
injector::WriteMemory(0x4AA391, &MaxDrawDistanceForNormalObjects, true);
203+
injector::WriteMemory(0x4AA3A6, &MaxDrawDistanceForNormalObjects, true);
204+
injector::WriteMemory(0x4AA3B9, &MaxDrawDistanceForNormalObjects, true);
205+
injector::WriteMemory(0x4AA3EE, &MaxDrawDistanceForNormalObjects, true);
206+
injector::WriteMemory(0x4AA401, &MaxDrawDistanceForNormalObjects, true);
207+
injector::WriteMemory(0x4AA414, &MaxDrawDistanceForNormalObjects, true);
208+
injector::WriteMemory(0x4AA462, &MaxDrawDistanceForNormalObjects, true);
209+
injector::WriteMemory(0x4AA477, &MaxDrawDistanceForNormalObjects, true);
210+
injector::WriteMemory(0x4AA48A, &MaxDrawDistanceForNormalObjects, true);
211+
injector::WriteMemory(0x4AA4BF, &MaxDrawDistanceForNormalObjects, true);
212+
injector::WriteMemory(0x4AA4D2, &MaxDrawDistanceForNormalObjects, true);
213+
injector::WriteMemory(0x4AA4E5, &MaxDrawDistanceForNormalObjects, true);
189214
}
190215

191216
if (EnableDrawDistanceChanger)
@@ -445,6 +470,11 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD reason, LPVOID /*lpReserved*/)
445470
injector::WriteMemory<unsigned char>(0x40A6E6, 0xBD, true); //mov ebp
446471
injector::WriteMemory(0x40A6E6 + 0x1, nLevelPortland, true);
447472

473+
//opcode
474+
injector::MakeNOP(0x5887FD, 5, true);
475+
injector::MakeNOP(0x588809, 5, true);
476+
injector::MakeNOP(0x58881A, 5, true);
477+
448478
injector::WriteMemory(0x4A8F79 + 0x1, &nLevelPortland, true);
449479

450480
injector::WriteMemory(0x4B61BC, nLevelPortland, true);

IVLodLights/dllmain.cpp

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,60 @@ void CLODLightManager::IV::IncreaseCoronaLimit()
6969
WriteMemory<unsigned int>(aslr_ptr(0x7E1072 + 0x2), nCoronasLimit);
7070
WriteMemory<unsigned int>(aslr_ptr(0x7E1189 + 0x1), nCoronasLimit * 64);
7171
}
72+
else
73+
{
74+
AdjustPointer(aslr_ptr(0x89A104), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
75+
AdjustPointer(aslr_ptr(0x89A0FE), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
76+
AdjustPointer(aslr_ptr(0x8995C5), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
77+
AdjustPointer(aslr_ptr(0x89A112), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
78+
AdjustPointer(aslr_ptr(0x89A120), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
79+
AdjustPointer(aslr_ptr(0x89A184), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
80+
AdjustPointer(aslr_ptr(0x89A18C), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
81+
AdjustPointer(aslr_ptr(0x89A194), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
82+
AdjustPointer(aslr_ptr(0x89A19D), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
83+
AdjustPointer(aslr_ptr(0x8997B2), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
84+
AdjustPointer(aslr_ptr(0x89A0B1), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
85+
AdjustPointer(aslr_ptr(0x89A149), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
86+
AdjustPointer(aslr_ptr(0x89A15C), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
87+
AdjustPointer(aslr_ptr(0x89A16A), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
88+
AdjustPointer(aslr_ptr(0x89A0D1), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
89+
AdjustPointer(aslr_ptr(0x89A0EA), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
90+
AdjustPointer(aslr_ptr(0x89A0C5), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
91+
AdjustPointer(aslr_ptr(0x89A0BB), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
92+
AdjustPointer(aslr_ptr(0x89A0DD), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
93+
AdjustPointer(aslr_ptr(0x89A0AA), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
94+
AdjustPointer(aslr_ptr(0x89A132), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
95+
AdjustPointer(aslr_ptr(0x89A170), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
96+
AdjustPointer(aslr_ptr(0x89A1A3), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
97+
AdjustPointer(aslr_ptr(0x89A1BB), &aCoronas[0], aslr_ptr(0x111A040), aslr_ptr(0x111A040 + 0x3C));
98+
99+
AdjustPointer(aslr_ptr(0x8996DB), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
100+
AdjustPointer(aslr_ptr(0x899BCA), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
101+
AdjustPointer(aslr_ptr(0x8996E9), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
102+
AdjustPointer(aslr_ptr(0x8996F7), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
103+
AdjustPointer(aslr_ptr(0x8996FF), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
104+
AdjustPointer(aslr_ptr(0x899BD2), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
105+
AdjustPointer(aslr_ptr(0x89972D), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
106+
AdjustPointer(aslr_ptr(0x899BDA), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
107+
AdjustPointer(aslr_ptr(0x899705), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
108+
AdjustPointer(aslr_ptr(0x899D81), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
109+
AdjustPointer(aslr_ptr(0x89970B), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
110+
AdjustPointer(aslr_ptr(0x899BB5), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
111+
AdjustPointer(aslr_ptr(0x899715), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
112+
AdjustPointer(aslr_ptr(0x899BBC), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
113+
AdjustPointer(aslr_ptr(0x899725), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
114+
AdjustPointer(aslr_ptr(0x899BC3), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
115+
AdjustPointer(aslr_ptr(0x899733), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
116+
AdjustPointer(aslr_ptr(0x899A28), &aCoronas2[0], aslr_ptr(0x110E040), aslr_ptr(0x110E040 + 0x1B));
117+
118+
WriteMemory<unsigned char>(aslr_ptr(0x8996CF + 0x2), NewLimitExponent);
119+
WriteMemory<unsigned char>(aslr_ptr(0x899A1E + 0x2), NewLimitExponent);
120+
WriteMemory<unsigned char>(aslr_ptr(0x899BAA + 0x2), NewLimitExponent);
121+
122+
WriteMemory<unsigned int>(aslr_ptr(0x89A089 + 0x2), nCoronasLimit);
123+
WriteMemory<unsigned int>(aslr_ptr(0x8996A2 + 0x2), nCoronasLimit);
124+
WriteMemory<unsigned int>(aslr_ptr(0x8997B9 + 0x1), nCoronasLimit * 64);
125+
}
72126
}
73127

74128

@@ -142,6 +196,76 @@ void CLODLightManager::IV::RenderLODLights()
142196
}
143197
}
144198

199+
void CLODLightManager::EFLC::RenderLODLights()
200+
{
201+
if (*CurrentTimeHours > 19 || *CurrentTimeHours < 7)
202+
{
203+
unsigned char bAlpha;
204+
float fRadius;
205+
unsigned int nTime = *CurrentTimeHours * 60 + *CurrentTimeMinutes;
206+
unsigned int curMin = *CurrentTimeMinutes;
207+
//CoronaFarClip = autoFarClip ? **fCurrentFarClip : CoronaFarClip;
208+
GetRootCam(&currentCamera);
209+
210+
if (nTime >= 20 * 60)
211+
bAlpha = static_cast<unsigned char>((5.0f / 6.0f)*nTime - 1000.0f);
212+
else if (nTime < 3 * 60)
213+
bAlpha = 200;
214+
else
215+
bAlpha = static_cast<unsigned char>((-5.0f / 6.0f)*nTime + 350.0f);
216+
217+
for (auto it = m_pLampposts->cbegin(); it != m_pLampposts->cend(); it++)
218+
{
219+
Vector3 pCamPos;
220+
GetCamPos(currentCamera, &pCamPos.X, &pCamPos.Y, &pCamPos.Z);
221+
222+
if (GetDistance((RwV3d*)&it->vecPos, (RwV3d*)&pCamPos) <= CoronaFarClip)
223+
{
224+
if ((it->vecPos.z >= -15.0f) && (it->vecPos.z <= 1030.0f))
225+
{
226+
if (CamIsSphereVisible(currentCamera, it->vecPos.x, it->vecPos.y, it->vecPos.z, 5.0f))
227+
{
228+
float fDistSqr = (pCamPos.X - it->vecPos.x)*(pCamPos.X - it->vecPos.x) + (pCamPos.Y - it->vecPos.y)*(pCamPos.Y - it->vecPos.y) + (pCamPos.Z - it->vecPos.z)*(pCamPos.Z - it->vecPos.z);
229+
230+
if ((fDistSqr > 250.0f*250.0f && fDistSqr < CoronaFarClip*CoronaFarClip) || it->nNoDistance)
231+
{
232+
if (!it->nNoDistance)
233+
fRadius = (fDistSqr < 300.0f*300.0f) ? (0.07f)*sqrt(fDistSqr) - 17.5f : 3.5f; // http://goo.gl/vhAZSx
234+
else
235+
fRadius = 3.5f;
236+
237+
if (SlightlyIncreaseRadiusWithDistance)
238+
fRadius *= min((0.0025f)*sqrt(fDistSqr) + 0.25f, 4.0f); // http://goo.gl/3kDpnC
239+
240+
if (it->fCustomSizeMult != 0.45f)
241+
{
242+
DrawCorona(it->vecPos.x, it->vecPos.y, it->vecPos.z, (fRadius * it->fCustomSizeMult * CoronaRadiusMultiplier) * 127.5f, 0, 0.0f, (bAlpha / 500.0f) * it->colour.r, (bAlpha / 500.0f) * it->colour.g, (bAlpha / 500.0f) * it->colour.b);
243+
}
244+
else
245+
{
246+
if ((curMin > 0 && curMin < 10) || (curMin > 20 && curMin < 30) || (curMin > 40 && curMin < 50))
247+
{
248+
if ((int)it->vecPos.x % 2 || (int)it->vecPos.y % 2)
249+
DrawCorona(it->vecPos.x, it->vecPos.y, it->vecPos.z, (fRadius * it->fCustomSizeMult * CoronaRadiusMultiplier) * 127.5f, 0, 0.0f, (bAlpha / 500.0f) * 255u, (bAlpha / 500.0f) * 0, (bAlpha / 500.0f) * 0);
250+
else
251+
DrawCorona(it->vecPos.x, it->vecPos.y, it->vecPos.z, (fRadius * it->fCustomSizeMult * CoronaRadiusMultiplier) * 127.5f, 0, 0.0f, (bAlpha / 500.0f) * 0, (bAlpha / 500.0f) * 255u, (bAlpha / 500.0f) * 0);
252+
}
253+
else
254+
{
255+
if ((int)it->vecPos.x % 2 || (int)it->vecPos.y % 2)
256+
DrawCorona(it->vecPos.x, it->vecPos.y, it->vecPos.z, (fRadius * it->fCustomSizeMult * CoronaRadiusMultiplier) * 127.5f, 0, 0.0f, (bAlpha / 500.0f) * 0, (bAlpha / 500.0f) * 255u, (bAlpha / 500.0f) * 0);
257+
else
258+
DrawCorona(it->vecPos.x, it->vecPos.y, it->vecPos.z, (fRadius * it->fCustomSizeMult * CoronaRadiusMultiplier) * 127.5f, 0, 0.0f, (bAlpha / 500.0f) * 255u, (bAlpha / 500.0f) * 0, (bAlpha / 500.0f) * 0);
259+
}
260+
}
261+
}
262+
}
263+
}
264+
}
265+
}
266+
}
267+
}
268+
145269
void __declspec(naked) CLODLightManager::IV::LoadObjectInstanceHook()
146270
{
147271
_asm
@@ -190,6 +314,15 @@ void CLODLightManager::IV::GetMemoryAddresses()
190314
CLODLightManager::IV::CamIsSphereVisible = (bool(__cdecl *)(int camera, float pX, float pY, float pZ, float radius))(aslr_ptr(0xBB9340).get());
191315
CLODLightManager::IV::GetCamPos = (void(__cdecl *)(int camera, float *pX, float *pY, float *pZ))(aslr_ptr(0xBB8510).get());
192316
}
317+
else
318+
{
319+
CLODLightManager::EFLC::CurrentTimeHours = injector::aslr_ptr(0x10C9398).get();
320+
CLODLightManager::EFLC::CurrentTimeMinutes = injector::aslr_ptr(0x10C9394).get();
321+
CLODLightManager::EFLC::DrawCorona = (int(__cdecl *)(float, float, float, float, unsigned int, float, unsigned char, unsigned char, unsigned char))(aslr_ptr(0xAA3100).get());
322+
CLODLightManager::EFLC::GetRootCam = (void(__stdcall *)(int *camera))(aslr_ptr(0xAFA7E0).get());
323+
CLODLightManager::EFLC::CamIsSphereVisible = (bool(__cdecl *)(int camera, float pX, float pY, float pZ, float radius))(aslr_ptr(0xC27DD0).get());
324+
CLODLightManager::EFLC::GetCamPos = (void(__cdecl *)(int camera, float *pX, float *pY, float *pZ))(aslr_ptr(0xC26FA0).get());
325+
}
193326
}
194327

195328
void CLODLightManager::IV::Init()
@@ -229,6 +362,22 @@ void CLODLightManager::IV::Init()
229362

230363
injector::MakeCALL(aslr_ptr(0x00402D6C), RenderLODLights, true);
231364
}
365+
else
366+
{
367+
if (SkipIntro) { injector::WriteMemory<uint8_t>(aslr_ptr(0x473439), 0xEB, true); }
368+
if (DoNotPauseOnMinimize) { injector::MakeNOP(aslr_ptr(0x402D5A), 2, true); }
369+
370+
if (DisableDefaultLodLights) { injector::WriteMemory<unsigned char>(aslr_ptr(0x00975860), 0xC3u, true); }
371+
if (DisableCoronasWaterReflection) { injector::MakeNOP(aslr_ptr(0xC8E183), 5, true); }
372+
373+
injector::MakeJMP(aslr_ptr(0x0091C851), LoadObjectInstanceHook, true);
374+
hookJmpAddr = (uintptr_t)injector::aslr_ptr(0x91C857).get<void>();
375+
376+
injector::MakeJMP(aslr_ptr(0x00918891), ParseIdeObjsHook, true);
377+
hookJmpAddr2 = (uintptr_t)injector::aslr_ptr(0x918897).get<void>();
378+
379+
injector::MakeCALL(aslr_ptr(0x0047361F), CLODLightManager::EFLC::RenderLODLights);
380+
}
232381
}
233382
}
234383

0 commit comments

Comments
 (0)