func FxPointingTimer(object target, int index, int time) { if(time > PT0D_Duration) { RemoveObject(target); return -1; } var clonk = GetCursor(EffectVar(0, target, index)); var obj = EffectVar(1, target, index); var msg = EffectVar(2, target, index); // Zeiger hat kein Ziel mehr? Löschen. if(!obj) { RemoveObject(target); return -1; } var ang = Angle(GetX(clonk), GetY(clonk), GetX(obj), GetY(obj)) - 90; var dst = Min(PT0D_Distance, Distance(GetX(clonk), GetY(clonk), GetX(obj), GetY(obj)) / 2); SetR(ang + 90, target); SetPosition(GetX(clonk) + Cos(ang, dst), GetY(clonk) + Sin(ang, dst), target); var r, g, b, a; SplitRGBaValue(GetClrModulation(target), r, g, b, a); a = EvalEase(alphaEase, Min(254, time)); SetClrModulation(RGBa(r, g, b, a), target); Message("<c %x>%s</c>", target, RGBa(r, g, b, 255 - a), msg); return true; }
global func FxFadeInTimer(target, no) { EffectVar(0, target, no)-=EffectVar(2, target, no); SetObjAlpha(EffectVar(0, target, no),target); if (EffectVar(0, target, no) <= EffectVar(1, target, no)) { return -1; } }
func FxPointingStart(object target, int index, int temp, int plr, object obj, string msg) { SetVisibility(VIS_Owner, target); CreateParticle("PSpark", 0, 0, 0, 0, 500, GetClrModulation(), this, true); EffectVar(0, target, index) = plr; EffectVar(1, target, index) = obj; EffectVar(2, target, index) = msg; return true; }
global func FxIntScheduleTimer(object pObj, int iEffect) { // Nur eine bestimmte Anzahl Ausführungen var fDone = (--EffectVar(1, pObj, iEffect) <= 0); // Ausführen eval(EffectVar(0, pObj, iEffect)); return(-fDone); }
global func FxIntScheduleCallTimer(object pObj, int iEffect) { // Nur eine bestimmte Anzahl Ausführungen var fDone = (--EffectVar(1, pObj, iEffect) <= 0); // Ausführen Call(EffectVar(0, pObj, iEffect), EffectVar(3, pObj, iEffect), EffectVar(4, pObj, iEffect), EffectVar(5, pObj, iEffect), EffectVar(6, pObj, iEffect), EffectVar(7, pObj, iEffect)); // Nur eine bestimmte Anzahl Ausführungen return (-fDone); }
global func FxFadeOutStart(target, no, temp, level, amount) { if(!level) { EffectVar(1, target, no) = 255; } else { EffectVar(1, target, no) = level; } EffectVar(2, target, no) = Max(1,amount); }
// Einen Script zeitverzögert und ggf. wiederholt ausführen global func Schedule(string strScript, int iInterval, int iRepeat, object pObj) { // Default if(!iRepeat) iRepeat = 1; if(!pObj) pObj = this(); // Effekt erzeugen var iEffect = AddEffect("IntSchedule", pObj, 1, iInterval, pObj); if(iEffect <= 0) return(false); // Variablen setzen EffectVar(0, pObj, iEffect) = strScript; EffectVar(1, pObj, iEffect) = iRepeat; return(true); }
// AddEffect("Attach", [Objekt das attached werden soll], 1, 1, 0, 0, [Objekt an das attached werden soll]); global func FxAttachStart(object pTarget, int iEffectNumber, int iTemp, object pObj) { if(!iTemp) { if(!pObj || !pTarget) return -1; EffectVar(0, pTarget, iEffectNumber) = pObj; } }
global func FxIntRemoveNotifierStart(object target, int effectNumber, int temp, callback) { if(!temp) { EffectVar(0, target, effectNumber) = callback; } }
global func FxAttachTimer(object pTarget, int iEffectNumber) { var pObj = EffectVar(0, pTarget, iEffectNumber); if(!pObj) return -1; pTarget -> SetPosition(GetX(pObj), GetY(pObj)); pTarget -> SetXDir(GetXDir(pObj)); pTarget -> SetYDir(GetYDir(pObj)); }
// Eine Funktion zeitverzögert und ggf. wiederholt aufrufen global func ScheduleCall(object pObj, string strFunction, int iInterval, int iRepeat, par0, par1, par2, par3, par4) { // Default if(!iRepeat) iRepeat = 1; if(!pObj) pObj = this(); // Effekt erzeugen var iEffect = AddEffect("IntScheduleCall", pObj, 1, iInterval, pObj); if(iEffect <= 0) return(false); // Variablen setzen EffectVar(0, pObj, iEffect) = strFunction; EffectVar(1, pObj, iEffect) = iRepeat; // EffectVar(2): Nur zur Abwärtskompatibilität reserviert EffectVar(2, pObj, iEffect) = pObj; for(var i = 0; i < 5; i++) EffectVar(i + 3, pObj, iEffect) = Par(i + 4); return(true); }
global func FxSmokeTrailTimer(object pTarget, int iEffectNumber, int iEffectTime) { var iStrength = EffectVar(0, pTarget, iEffectNumber); var iAStr = EffectVar(1, pTarget, iEffectNumber); var iX = EffectVar(2, pTarget, iEffectNumber); var iY = EffectVar(3, pTarget, iEffectNumber); var iXDir = EffectVar(4, pTarget, iEffectNumber); var iYDir = EffectVar(5, pTarget, iEffectNumber); iAStr = Max(1,iAStr-iAStr/10+Random(2)); iAStr--; iYDir += GetGravity()*2/3; iYDir += GetWind(iX,iY)/20; var xdir = iXDir*iAStr/iStrength; var ydir = iYDir*iAStr/iStrength; // Neu: Random iX += RandomX(-3,3); iY += RandomX(-3,3); // zuerst zeichnen CreateParticle("Smoke3",iX,iY,RandomX(-2,2),RandomX(-2,2)-3,20+iAStr*8,RGBa(128,128,128,55+35*iAStr/iStrength)); CreateParticle("Blast",iX,iY,0,0,10+iAStr*8,RGBa(250,100+Random(100),100,160)); // dann nächste position berechnen iX += xdir/100; iY += ydir/100; if(GBackSemiSolid(iX,iY)) return -1; if(iAStr <= 1) return -1; EffectVar(1, pTarget, iEffectNumber) = iAStr; EffectVar(2, pTarget, iEffectNumber) = iX; EffectVar(3, pTarget, iEffectNumber) = iY; EffectVar(5, pTarget, iEffectNumber) = iYDir; }
global func ClearScheduleCall(object pObj, string strFunction) { var i, iEffect; // Von Effektzahl abwärts zählen, da Effekte entfernt werden i = GetEffectCount("IntScheduleCall", pObj); while (i--) // Alle ScheduleCall-Effekte prüfen if (iEffect = GetEffect("IntScheduleCall", pObj, i)) // Gesuchte Zielfunktion if (EffectVar(0, pObj, iEffect) S= strFunction) // Effekt löschen RemoveEffect(0, pObj, iEffect); }
global func FxIntRemoveNotifierStop(object target, int effectNumber, int reason, bool temp) { if(!temp) { if(reason == FX_Call_RemoveClear) { Call(EffectVar(0, target, effectNumber), target); } else if(reason == FX_Call_RemoveDeath) { return FX_Stop_Deny; } } }
global func FxFadeOutTimer(target, no) { EffectVar(0, target, no)+= EffectVar(2, target, no); SetObjAlpha(EffectVar(0, target, no),target); if (EffectVar(0, target, no) >= EffectVar(1, target, no)) { if (EffectVar(1, target, no) >= 255) { RemoveObject(target); return -1; } } }
// Variablen: // 0 - Stärke // 1 - momentane Stärke // 2 - X-Position // 3 - Y-Position // 4 - Anfangs-X-Geschwindigkeit // 5 - Anfangs-Y-Geschwindigkeit global func FxSmokeTrailStart(object pTarget, int iEffectNumber, int iTemp, iStrength, iAngle, iX, iY) { if(iTemp) return; if(iAngle%90 == 1) iAngle += 1; iStrength = Max(iStrength,5); EffectVar(0, pTarget, iEffectNumber) = iStrength; EffectVar(1, pTarget, iEffectNumber) = iStrength; EffectVar(2, pTarget, iEffectNumber) = iX; EffectVar(3, pTarget, iEffectNumber) = iY; EffectVar(4, pTarget, iEffectNumber) = +Sin(iAngle,iStrength*40); EffectVar(5, pTarget, iEffectNumber) = -Cos(iAngle,iStrength*40); }
global func FxFadeInStart(target, no, temp, level, amount) { EffectVar(0, target, no) = 255; EffectVar(1, target, no) = level; EffectVar(2, target, no) = Max(1,amount); }
func FxLogTimer(pObj, iNumber) { // Langsam ausfaden if(!--EffectVar(0, pObj, iNumber)) return(-1); CustomMessage(Format(" %s", EffectVar(1, pObj, iNumber)), pObj, NO_OWNER, 20, 0, RGBa(255,255,255,Max(255-EffectVar(0, pObj, iNumber)/4)), 0, 0, MSG_NoLinebreak); }
func FxLogStart(pObj, iNumber, fTmp, szMessage) { if(fTmp) return(); EffectVar(0, pObj, iNumber) = 255*4; EffectVar(1, pObj, iNumber) = szMessage; }
global func DoDmg(int iDmg, int iType, object pTarget, int iPrecision, int dmgplayer, id idKillIcon, int iKillAttachment) { //Existenz bestätigen if(!pTarget) if(!(pTarget = this)) return; if(!iPrecision) iPrecision = 10; var dmg, dmgdealer = dmgplayer-1; if(dmgdealer < 0) dmgdealer = GetController(pTarget); var red = pTarget->~OnDmg(iDmg, iType); dmg = iDmg*(100-red)*iPrecision; if(!dmg || red == 100) return; //Killer setzen if(this && pTarget->GetOCF() & OCF_CrewMember || dmgplayer) SetKiller(dmgdealer, pTarget); if(GetOCF(pTarget) & OCF_CrewMember) { if(!idKillIcon && this)//Kein Killicon? { idKillIcon = this->~GetKillIcon(); if(!idKillIcon) idKillIcon = GetID(this); if(idKillIcon->~IsClonk()) idKillIcon = 0; } if(!idKillIcon) { if(iType) { if(iType == DMG_Fire) idKillIcon = GSAM; else if(iType == DMG_Explosion) idKillIcon = BOOM; else if(iType == DMG_Energy) idKillIcon = ENAM; else if(iType == DMG_Bio) idKillIcon = GLOB; else if(iType == DMG_Projectile) idKillIcon = STAM; } else idKillIcon = KAMB; } pTarget->~KillIcon(idKillIcon); pTarget->~KillAttachment(iKillAttachment, true); } //Schaden machen var pFrom; if(pTarget != this) pFrom = this; if(!pFrom) pFrom = GetCrew(dmgdealer); //Wird gerade eingeblendet: Entfernen if(GetEffect("FadeIn4K", this)) { EffectVar(0, this, GetEffect("FadeIn4K", this)) = 0; SetClrModulation(RGBa(255, 255, 255, 0), this); } pTarget->~LastDamageType(iType); pTarget->~OnHit(dmg/1000, iType, pFrom); if(GetCategory(pTarget) & C4D_Living) return DoEnergy(-dmg, pTarget, true, 0, dmgplayer); return DoDamage(dmg/1000, pTarget, 0, dmgplayer); }
global func FxDisappearTimer(pTarget, iNumber) { if(Contained(pTarget)) return(EffectVar(0, pTarget, iNumber)=0); EffectVar(0, pTarget, iNumber)++; if(EffectVar(0, pTarget, iNumber)>2000) return(RemoveObject(pTarget)); }