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
|
/*-- Teleport --*/
#strict
func Range()
{
var range=225;
return range;
}
protected func Activate(object pCaster, object pRealCaster)
{
// Effekt erzeugen
if(!pRealCaster) pRealCaster = pCaster;
var possibleTargets = [];
var found=0;
var range=Range();
for(var obj in FindObjects(Find_Distance(range),Find_OCF(OCF_CrewMember),Find_Hostile(GetOwner(pRealCaster)),Sort_Distance()))
{
var dir=-1;
if(GetDir(obj) == DIR_Left)dir=1;
if(GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)))
|| GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)+5))
|| GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)-9)))continue;
if(!PathFree(GetX(obj),GetY(obj),GetX(obj)+15*dir,GetY(obj) + 5))continue;
var priority = 20 + ObjectDistance(pRealCaster, obj);
if(GBackSemiSolid(AbsX(obj->GetX()), AbsY(obj->GetY())))
priority += 100;
possibleTargets[GetLength(possibleTargets)] = [obj, priority];
}
if(!GetLength(possibleTargets))
{
var x = AbsX(GetX(pRealCaster));
var y = AbsY(GetY(pRealCaster));
var tim = CreateObject(TIM1, x, y, pRealCaster->GetOwner());
tim->SetVisibility(VIS_Owner);
AddEffect("ScheduledRemove", tim, 1, 35 * 5, 0, MATT);
CreateParticle("RangeSpark", 0, 0, 0, 0,((range)*1000/200)*2, RGB(200, 200, 100), tim, true);
Sound("Error",0,0,0,GetOwner(pRealCaster));
RemoveObject();
return;
}
// find lowest prio target from list
var currentLowest = 0xffffff;
for(var pt in possibleTargets)
{
if(pt[1] >= currentLowest) continue;
currentLowest = pt[1];
found = pt[0];
}
var dir=-1;
if(GetDir(found) == DIR_Left)dir=1;
for(var cnt=0;cnt<5;cnt++)
{
CreateParticle("PSpark",AbsX(GetX(pRealCaster)+RandomX(-5,5)),AbsY(GetY(pRealCaster)+RandomX(-10,10)),0,0,150,GetColorDw(pRealCaster));
CreateParticle("PSpark",AbsX(GetX(found)+15*dir+RandomX(-5,5)),AbsY(GetY(found)+RandomX(-10,10)),0,0,150,GetColorDw(pRealCaster));
}
SetSpeed(GetXDir(found),GetYDir(found),pRealCaster);
SetPosition(GetX(found)+7*dir,GetY(found),pRealCaster);
Sound("Scream");
return(RemoveObject());
}
func FxScheduledRemoveStop(target, effect, reason, temp)
{
if(temp) return;
if(!target) return;
target->RemoveObject();
}
/* Zaubercombo */
public func GetSpellClass(object pMage) { return(AIR1); }
public func GetSpellCombo(pMage) { return ("222"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
|