1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/* Zurückwerfen */
#strict 2
func Activate(pCaster,pRealcaster)
{
var pClonk=pRealcaster;
if(!pClonk) pClonk=pCaster;
// Auswählen wenn möglich
var comDir = pClonk->GetComDir();
var selector;
if ((selector = pClonk->~DoSpellSelect(this,300,pCaster)) && selector->CountTargets() > 1) return 1;
if (selector)
{
pCaster->SpellSucceeded(GetID(), pClonk);
RemoveObject(selector);
}
pClonk->SetComDir(comDir);
// Clonk kann nicht auswählen: Clonk bekommst selbst ein Schild
if (SelectorTarget(pClonk))
return ActivateTarget(pClonk, pClonk);
// ansonsten geth nich
RemoveObject();
return 0;
}
public func ActivateTarget(object pCaller, object pTarget)
{
// Effekt geben
AddEffect("DeflectionPSpell",pTarget,250,1,0,GetID());
// Objekt löschen
return RemoveObject();
}
public func SelectorTarget(object pTarget)
{
// nur außerhalb von Gebäuden
if(Contained(pTarget)) return;
// muss ein Mannschaftsmitglied sein
if(!(GetOCF(pTarget)&OCF_CrewMember)) return;
// muss verbündet sein oder NTMG muss aktiviert sein
if(Hostile(GetOwner(),GetOwner(pTarget)) && !ObjectCount(NTMG)) return;
// sichtbar
if(!Visible(GetOwner(),pTarget)) return;
return 1;
}
func FxDeflectionPSpellStart(pClonk, iEffectNumber, iTemp)
{
if(iTemp) return;
// Zeit setzen
EffectVar(0,pClonk,iEffectNumber)+=720;
}
func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime)
{
// Zeit um
if(!EffectVar(0,pClonk,iEffectNumber)--) return -1;
// Nicht in Gebäuden
if(Contained(pClonk)) return;
var x = GetX(pClonk), y = GetY(pClonk), xdir = GetXDir(pClonk), ydir = GetYDir(pClonk);
x = x + xdir/10;
y = y + ydir/10;
//Funken an der benötigten Stelle
for(var pObj in FindObjects(Find_Not(Find_And(Find_Func("GetContact", 0, -1, CNAT_Bottom)), Find_Not(Find_Func("GetSpeed"))), Find_Layer(GetObjectLayer()), Find_NoContainer(), Find_Category(C4D_Object), Find_Distance(200, GetX(pClonk), GetY(pClonk)), Find_Not(Find_Distance(11, GetX(pClonk), GetY(pClonk)))))
{
// Wenn das Objekt auf den Clonk zufliegt
if( (GetXDir(pObj)<GetXDir(pClonk)) == (GetX(pObj)>GetX(pClonk)) || (GetYDir(pObj)<GetYDir(pClonk)) == (GetY(pObj)>GetY(pClonk)))
{
var ox = GetX(pObj), oy = GetY(pObj), oxdir = GetXDir(pObj), oydir = GetYDir(pObj);
ox = ox + oxdir/10;
oy = oy + oydir/10;
if(ObjectDistance(pClonk, pObj) > 21 && Distance(x, y, ox, oy) > 21) continue;
// Eigenen Stab ignorieren
if(GetEffect("StaffFlight", pObj))
if(EffectVar(0, pObj, GetEffect("StaffFlight", pObj))==pClonk)
continue;
var objDirAngle = Angle180(Angle(GetXDir(pClonk), GetYDir(pClonk), GetXDir(pObj), GetYDir(pObj)));
var objShieldAngle = Angle180(Angle(GetX(pClonk), GetY(pClonk), GetX(pObj), GetY(pObj)));
var diffAngle = Angle180((objShieldAngle - objDirAngle) - 180);
var exitAngle = objShieldAngle + diffAngle;
var objSpeed = GetSpeed(pObj);
var exitSpeed = Distance(0, 0, Sin(exitAngle, objSpeed) + GetXDir(pClonk), -Cos(exitAngle, objSpeed) + GetYDir(pClonk));
if (Abs(diffAngle) >= 90) continue;
SetSpeed(Sin(exitAngle, exitSpeed),-Cos(exitAngle, exitSpeed), pObj);
CreateParticle("NoGravSpark", AbsX(GetX(pObj)), AbsY(GetY(pObj)), 0, 0, 80, RGB(80,50,50));
if(!GetEffect("IntDeflected", pObj))
EffectVar(0,pClonk,iEffectNumber) = Max(EffectVar(0,pClonk,iEffectNumber)-80,0);
AddEffect("IntDeflected", pObj, 1, 20);
Sound("Rip", 0, pObj);
}
}
// Partikel Kreiseffekt
if(iEffectTime % 4) return;
var iAngle = (iEffectTime*10) % 360;
var px= Sin(iAngle, 15);
var py= Cos(iAngle, 15);
CreateParticle("NoGravSpark", px+GetX(pClonk), py+GetY(pClonk), 0, 0, 50, RGB(50,80,50), pClonk);
CreateParticle("NoGravSpark",-py+GetX(pClonk), px+GetY(pClonk), 0, 0, 50, RGB(50,50,80), pClonk);
CreateParticle("NoGravSpark",-px+GetX(pClonk),-py+GetY(pClonk), 0, 0, 50, RGB(50,80,50), pClonk);
CreateParticle("NoGravSpark", py+GetX(pClonk),-px+GetY(pClonk), 0, 0, 50, RGB(50,50,80), pClonk);
return 1;
}
private func FxDeflectionPSpellEffect(string szNewEffectName, object pTarget, int iNumber)
{
// Andere Effekte aufnehmen
if(szNewEffectName == "DeflectionPSpell")
{
return -2;
}
}
private func FxDeflectionPSpellAdd(object pTarget, int iNumber, string szNewEffectName, int iNewEffectTimer, int iChange0, int iChange1, int iChange2, int iTime) {
// Effekt übernehmen
EffectVar(0,pTarget,iNumber) += 360;
}
protected func FxDeflectionPSpellInfo() { return "{{MDFL}} $SpellInfo$"; }
/* Zaubercombo */
public func GetSpellStaff() { return SMAR; }
public func GetSpellStaffCombo() { return ("56"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
|