From 853eeae473d3bd8c5ae7a0fde1e4dfd97bd0c57e Mon Sep 17 00:00:00 2001 From: Mittendrein Markus Date: Sat, 13 Feb 2016 00:34:23 +0100 Subject: Dragonbreath doesn't incinerate the caster --- TemplePushing.c4s/System.c4g/Clonk.c | 6 ++ TemplePushing.c4s/System.c4g/FBreath.c | 105 ++++++++++++++++++++++++++++++ TemplePushing.c4s/System.c4g/Firebreath.c | 17 +++++ 3 files changed, 128 insertions(+) create mode 100644 TemplePushing.c4s/System.c4g/FBreath.c create mode 100644 TemplePushing.c4s/System.c4g/Firebreath.c (limited to 'TemplePushing.c4s') diff --git a/TemplePushing.c4s/System.c4g/Clonk.c b/TemplePushing.c4s/System.c4g/Clonk.c index 09c4b20..cad2f5f 100644 --- a/TemplePushing.c4s/System.c4g/Clonk.c +++ b/TemplePushing.c4s/System.c4g/Clonk.c @@ -10,6 +10,7 @@ local removeOnDeath; protected func Initialize() { AddEffect("CheckStuck2", this, 20, 1, this); + AddEffect("CheckBurn", this, 101, 0, this); SetPhysical("Fight", 75000, PHYS_Temporary, this); SetPhysical("Scale", 60000, PHYS_Temporary, this); SetPhysical("Hangle", 60000, PHYS_Temporary, this); @@ -101,3 +102,8 @@ private func FxCheckStuck2Timer(object pTarget, int iEffectNumber, int iEffectTi if ((d == -1 && GetComDir(pTarget) != COMD_Left) || (d == 1 && GetComDir(pTarget) != COMD_Right)) SetComDir(COMD_Up, pTarget); } } + +func FxCheckBurnEffect(string newEffectName, object target, int effectNumber, int newEffectNumber, int causedBy, bool fBlasted, object incineratingObject) +{ + if (newEffectName == "Fire" && incineratingObject && incineratingObject->~QueryIncinerateObject(target)) return FX_Effect_Deny; +} diff --git a/TemplePushing.c4s/System.c4g/FBreath.c b/TemplePushing.c4s/System.c4g/FBreath.c new file mode 100644 index 0000000..ce0b116 --- /dev/null +++ b/TemplePushing.c4s/System.c4g/FBreath.c @@ -0,0 +1,105 @@ +/*-- Dont inflame caster --*/ +#strict 2 +#appendto FBRT + +local pTarget; + +func Activate(pTrg,iTime,iXPos,iYPos,iAngle,iAngleDir,int iExtraSpeed, bool fDeadly) { + iLifetime=iTime; // Zeit bis das Ding gelöscht wird + iX=iXPos; // Von der Mitte abweichende Position (X) + iY=iYPos; // Von der Mitte abweichende Position (Y) + iSpeed = FBRT_BaseSpeed + iExtraSpeed;// Geschwindigkeit: Basisgeschwindigkeit + Zusatz + SetR(iAngle); + SetRDir(iAngleDir); // Rotationsgeschwindigkeit + SetAction("Exist",pTrg); // Objekt an dass es pseudo-attached wird + fLethal = fDeadly; + pTarget = pTrg; +} + +protected func InflameTimer() +{ + DoCon(+20); + // In Material, was Feuer löscht (Wasser): löschen + if(GetMaterialVal("Extinguisher","Material",GetMaterial(0,0))) + { + Smoke(0, 0, 24); + return RemoveObject(); + } + // Zeug anzünden + var obj; + while (obj = FindObject(0, 0,1, 0,0, OCF_Inflammable, 0,0, NoContainer(), obj)) + if (!OnFire(obj) && obj != pTarget) if (!Random(GetDefContactIncinerate(GetID(obj)))) + Incinerate(obj); +} + +func Timer() { // alle 4 Frames + var iXDir,iYDir,iAngle; + var pActTarget = GetActionTarget(); + // Kein Feuer-Spucker: löschen + if(!pActTarget) return(RemoveObject()); + // Magischer Feuerspucker muss die ganze Zeit zaubern + var iMLength=GetActMapVal("Length",GetAction(pActTarget),GetID(pActTarget)); + if(GetActMapVal("Name","Magic",GetID(pActTarget))) { + // z.B. während des Zauberns durch einen Stein getroffen + if(!DoesMagic(pActTarget)) return(RemoveObject()); + // Zauberaktion für das zaubernde Objekt: Es wird angenommen, dass diese + // in einem Raum von etwa 2/6 bis 5/6 der Zauberaktion spielt + if(GetPhase(pActTarget) >= iMLength*5/6) SetPhase(iMLength*2/6,pActTarget); + } + + // In Material, was Feuer löscht (Wasser): löschen + if(GetMaterialVal("Extinguisher","Material",GetMaterial(0,0))) + { + Sound("Pshshsh"); + return RemoveObject(); + } + // löschen + if(GetActTime()>iLifetime) return(RemoveObject()); + + // Pseudo-Attach + SetPosition(GetX(pActTarget),GetY(pActTarget)); + + // Größe+Drehung des Zielobjektes in die Position einbeziehen + var iX2 = (Cos(GetR(pActTarget), iX*GetCon(pActTarget)) - Sin(GetR(pActTarget), iY*GetCon(pActTarget)))/100; + var iY2 = (Sin(GetR(pActTarget), iX*GetCon(pActTarget)) + Cos(GetR(pActTarget), iY*GetCon(pActTarget)))/100; + + // Optionales Vertex-Attachment am Trägerobjekt (überschreibt vorhergehende Ausrichtungsfunktionen) + if (fVertexAttach) + { + iX2 = pActTarget->GetVertex(iAttachVertex, 0); + iY2 = pActTarget->GetVertex(iAttachVertex, 1); + } + + for(var i=iSpeed/60+1; i>0 ;--i) { + + iAngle=RandomX(-12,+12); + + // Winkel usw berechnen + if(!Random(3)) iAngle=RandomX(-12,+12); + iXDir=Sin(GetR()+iAngle,iSpeed) + GetXDir(GetActionTarget()); + iYDir=-Cos(GetR()+iAngle,iSpeed) + GetYDir(GetActionTarget()); + + // Effekt + CreateParticle("DBFire",iX2,iY2,iXDir,iYDir,RandomX(50,100),RGB(255,255,255)); + + // Anzünd-Objekte in die Richtung verschießen + var inflamer = CreateObject(FBRT, + iX2+Sin(GetR()+iAngle,10), + iY2-Cos(GetR()+iAngle,18), + GetOwner()); + LocalN("pTarget", inflamer) = pTarget; + inflamer->ActivateInflamer(iXDir, iYDir, fLethal); + } +} + +func QueryOwnCatchBlow(object target) +{ + if (target == pTarget) return true; + else return _inherited(target, ...); +} + +func QueryIncinerateObject(object target) +{ + if (target == pTarget) return true; + else return _inherited(target, ...); +} diff --git a/TemplePushing.c4s/System.c4g/Firebreath.c b/TemplePushing.c4s/System.c4g/Firebreath.c new file mode 100644 index 0000000..deffe2c --- /dev/null +++ b/TemplePushing.c4s/System.c4g/Firebreath.c @@ -0,0 +1,17 @@ +/*-- Dont inflame caster --*/ +#strict 2 +#appendto MDBT + +public func ActivateAngle(object pCaller, int iAngle) +{ + DebugLog("%v", pCaller); + if (GetAction(pCaller) == "HoverCast") return 0; + + /*if (!GetDir(pCaller) && iAngle>0) CreateFireBreath(pCaller, 40, Sin(iAngle, 10), -Cos(iAngle, 10) - (Abs(iAngle) > 90) * 4, -Abs(iAngle)-90); + else*/ CreateFireBreath(pCaller, 40, Sin(iAngle, 10), -Cos(iAngle, 10) - (Abs(iAngle) > 90) * 4, iAngle); + + Sound("DragonFire"); + + RemoveObject(); + return 1; +} -- cgit v1.2.3-54-g00ecf