@@ -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 (¤tCamera);
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+
145269void __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
195328void 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