W miarę czytelny skrypt dodający oświetlenie zaklęć trzymanych w dłoni, jak i tych, które są rzucone (pociski).
Mam nadzieję, że komuś się przyda

const int zCParticleFX__Load = 5959152; //0x005AEDF0
const int zCVobLight__zCVobLight = 6323472; //0x607D10
const int zCWorld__AddVobAsChild = 6440352; //0x6245A0
const int zCWorld__RemoveVob = 6441840; //0x624B70
const int oCVisualFX__DoMovements = 4814160; //0x00497550 / 6
const int oCVisualFX__EndEffect = 4803712; //0x00494C80 / 9
const int sizeof_zCVobLight = 392; //0x188
const int SPELL_DYNAMICLIGHT_RANGE = 150; //Range of light for Vobs
const float SPELL_STATICLIGHT_RANGE = 0.004; //Range of light for LevelMesh
func int GetPfxColor(var string pfxname)
{
CALL_zStringPtrParam(pfxname); //zCParticleFX name
CALL__cdecl(zCParticleFX__Load);
var int PFX_ptr; PFX_ptr = CALL_RetValAsInt(); //zCParticleFX
var int ParticleEm; ParticleEm = MEM_ReadInt(PFX_ptr+84); //zCParticleFX.m_pEm
var string ParticleColS; ParticleColS = MEM_ReadString(ParticleEm+412); //zCParticleEmitter.m_sVisTexColorStart
var string ParticleColE; ParticleColE = MEM_ReadString(ParticleEm+432); //zCParticleEmitter.m_sVisTexColorEnd
var int PFXColS[3]; var int PFXColE[3];
PFXColS[0] = STR_ToInt(STR_Split(ParticleColS, " ", 0)); PFXColE[0] = STR_ToInt(STR_Split(ParticleColE, " ", 0));
PFXColS[1] = STR_ToInt(STR_Split(ParticleColS, " ", 1)); PFXColE[1] = STR_ToInt(STR_Split(ParticleColE, " ", 1));
PFXColS[2] = STR_ToInt(STR_Split(ParticleColS, " ", 2)); PFXColE[2] = STR_ToInt(STR_Split(ParticleColE, " ", 2));
return RGBA((PFXColS[0]+PFXColE[0])/2, (PFXColS[1]+PFXColE[1])/2, (PFXColS[2]+PFXColE[2])/2, 255);
};
func int VFX_isSpell(var string vfx) {
var int vfx_l; vfx_l = STR_Len(vfx);
if(vfx_l<10) { return false; };
if(STR_Compare(STR_SubStr(vfx, 0, 3), "MFX")) { return false; };
if(!STR_Compare(STR_SubStr(vfx, vfx_l-5, vfx_l-1), "_INIT"))
||(!STR_Compare(STR_SubStr(vfx, vfx_l-5, vfx_l-1), "_CAST")) { return true; };
return false;
};
func int AddLightToVFX(var int VFXPtr) {
var int lightPtr; lightPtr = MEM_Alloc(sizeof_zCVobLight);
CALL__thiscall(lightPtr, zCVobLight__zCVobLight);
var zCVobLight light; light = _^(lightPtr);
//Configure
light.lightColor = GetPfxColor(MEM_ReadString(ECX+288)); //PFX name
light.range = mkf(SPELL_DYNAMICLIGHT_RANGE);
light.rangeInv = castToIntf(SPELL_STATICLIGHT_RANGE);
light.bitfield = zCVobLight_bitfield_isTurnedOn;
MEM_CopyWords(VFXPtr+60, lightPtr+60, 16);
CALL_PtrParam(MEM_ReadInt(VFXPtr+36)); //zCVisualFX._zCVob_globalVobTreeNode
CALL_PtrParam(lightPtr);
CALL__thiscall(_@(MEM_World), zCWorld__AddVobAsChild);
return lightPtr;
};
func void VisualFX_DoMovements() {
var String PFXName; PFXName = MEM_ReadString(ECX+288);
if(!VFX_isSpell(PFXName)) { return; };
if(MEM_ReadInt(ECX+216)>0) { return; }; //Check if zCVobLight is created
MEM_WriteInt(ECX+216, AddLightToVFX(ECX));
};
func void VisualFX_EndEffect() {
var String PFXName; PFXName = MEM_ReadString(ECX+288);
if(!VFX_isSpell(PFXName)) { return; };
if(MEM_ReadInt(ECX+216)==0) { return; }; //Check if zCVobLight is not created
//Delete zCVobLight
CALL_PtrParam(MEM_ReadInt(ECX+216));
CALL__thiscall(_@(MEM_World), zCWorld__RemoveVob);
};
func void SpellLight_Init() {
HookEngineF(oCVisualFX__DoMovements, 6, VisualFX_DoMovements);
HookEngineF(oCVisualFX__EndEffect, 9, VisualFX_EndEffect);
};
UWAGA: Skrypt do działania wymaga pakietów skryptowych Ikarus&LeGo.
Album