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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* 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)
{
var hyper = EffectVar(1, pClonk, iEffectNumber);
// 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;
var categoryCondition = Find_Category(C4D_Object);
if(hyper)
{
categoryCondition = Find_And(Find_Or(categoryCondition, Find_Func("HyperDeflectable", pClonk)), Find_Not(Find_Func("HyperDeflectionIgnore", pClonk)));
}
for(var pObj in FindObjects(Find_Not(Find_And(Find_Func("GetContact", 0, -1, CNAT_Bottom))), Find_Layer(GetObjectLayer()), Find_NoContainer(), categoryCondition, 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);
if(hyper)
{
pObj->~HyperDeflection(exitAngle, exitSpeed, pClonk);
}
//Funken an der benötigten Stelle
CreateParticle("NoGravSpark", AbsX(GetX(pObj)), AbsY(GetY(pObj)), 0, 0, 80, [RGB(80,50,50), GetColorDw(pClonk)][hyper]);
if(!GetEffect("IntDeflected", pObj))
EffectVar(0,pClonk,iEffectNumber) = Max(EffectVar(0,pClonk,iEffectNumber)-80,0);
AddEffect("IntDeflected", pObj, 1, 1);
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);
if(hyper)
{
var color = GetColorDw(pClonk);
var h, s, l, a;
SplitRGBaValue(RGB2HSL(color), h, s, l, a);
CreateParticle("NoGravSpark", px+GetX(pClonk), py+GetY(pClonk), 0, 0, 50, HSL(h, s, Max(0, l - 30)), pClonk);
CreateParticle("NoGravSpark",-py+GetX(pClonk), px+GetY(pClonk), 0, 0, 50, color, pClonk);
CreateParticle("NoGravSpark",-px+GetX(pClonk),-py+GetY(pClonk), 0, 0, 50, HSL(h, s, Max(0, l - 30)), pClonk);
CreateParticle("NoGravSpark", py+GetX(pClonk),-px+GetY(pClonk), 0, 0, 50, color, pClonk);
}
else
{
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;
EffectVar(1,pTarget,iNumber) += true; // hyper deflection
}
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)
|