Aufgrund einer akuten Spamwelle ist das Editieren für nicht angemeldete Benutzer zur Zeit deaktiviert. Wir bitten um Verständnis.

Scripte:Find OnLine

Aus Clonk Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Allgemein

Eine kleine Einführung die Fortgeschrittenen zeigt wie man sich selbst dynamische Find_ funktionen bauen kann.

  Find_
Kategorie: Scriptintern
Autor: Liech
Behandelt: {{{Behandelt}}}
Empfohlenes Vorwissen: {{{Vorwissen}}}
Benötigt Objektpacks: {{{Packs}}}
Stufe: Experte Experte Experte Experte






Script

C4Script
/* Find_ Funktionen*/

#strict 2


global
 
func
 
Find_OnLine(int
 
x1,int
 
y1,
 
int
 
x2,
 
int
 
y2,int
 
prec)
{
  
//Die Such genauigkeit.
  
if
 
(!prec)
 
prec
 
=
 
5;
  

  
//die Find_ variable mit irgendetwas sinnvollem füllen, sonst kommen unerwünschte meldungen:
  
var
 
Gefunden
 
=
 
Find_AtPoint(x1,y1);
  

  
//jetzt können wir dinge mit Find_And()/Find_Or()/... ein und ausgrenzen.
  
//Für Komplexe dinge eignet sich oft Find_Eval(), das brauchen wir hier aber nicht
  

  
var
 
dis
 
=
 
Distance(x1,y1,GetX()+x2,GetY()+y1);
  
var
 
angle
 
=
 
Angle(x1,y1,GetX()+x2,GetY()+y1);
  

  
//der erste schritt ist bereits getan, deswegen überspringen wir ihn hier (wir fangen bei prec und nicht bei 0 an!):
  
for(var
 
i
 
=
 
prec;i<dis;i+=prec)
 

  
Gefunden
 
=
 
Find_Or(Gefunden,Find_AtPoint(x1+Sin(angle,i),y1+Cos(angle,-i)));
  
//Wie das mit Sin/Cos geht liest du am besten beim Script "Partikelkreis"
  

  
//Das Array ist jetzt mit jede menge Suchkriterien gefüllt, welche man sich so inetwa vorstellen kann:
  
//Find_AtPoint(1,1),Find_AtPoint(2,2),Find_AtPoint(3,3)...
  
return
 
Gefunden;
}


//Um etwas zu verkürzen klappt das natürlich auch wunderbar:
global
 
func
 
Find_Brennholz(int
 
Plr)
{
  
return
 
Find_And(Find_OCF(OCF_Inflammable()),Find_Not(Find_Eval("GBackLiquid()")),Find_Not(Find_Allied(GetOwner(Plr))));
}

Das Script kann beispielsweise in einer Datei in der System.c4g des Szenarios abgelegt werden. Danach lässt sich das jeweilige Such Kriterium wie im Beispiel verwenden.

Beispiel

C4Script
var
 
Material
 
=
 
Find_Objects(Find_Brennholz(),Find_OnLine(0,0,0,400));
for(var
 
e
 
in
 
Material)
 
e->Incinerate();

Dieses Script findet sämtliches als Brennholz geeignetes Material Exakt unter dem Clonk.


Hinweise

Die Find_ funktionen werden in Arrays übersetzt, welche inetwa so aussehen:

C4Script
[SuchKonstante,Bedingungen,...]
Dadurch wäre es möglich den obenstehenden Algorythmus ohne verschachtelungen wesentlich besser zu gestalten, was hier aus verständlichkeits gründen nicht gemacht wird.

In System.c4g/FindObject.c sind dafür viele beispiele vorhanden. Die meisten Konstanten erklären sich dort von selbst.


Die Funktion Find_OnLine() ist bereits (undokumentiert) in FindObjects.c implementiert:

C4Script
Find_OnLine(int
 
x,
 
int
 
y,
 
int
 
x2,
 
int
 
y2)
Scripte des Scripte-Projekts
AnfängerBonbon · Context-Eintrag · EliminateTeam · Flint:Partikelschleuder · Hüpfbonbon · TeamMessage
Fortgeschrittene FortgeschritteneFlint:HitCounter · Flint:Partikelkreis · Flint:Partikelschleuder2 · Is-Funktionen · Menü:Beim Start der Runde · Normaler Flint · Partikel-Linie in den Himmel · Rakete · Random · Relaunch · Return · Sichtweite · Spawn · Startposition
Profi Profi ProfiClantag · Gift-Effekt · Unverwundbarkeit · Scoreboard · Zufallsgespräch
Experte Experte Experte ExperteLebensbalken · Nachrichten bei Sichtkontakt · Object2Overlay · SHA1


Wipfhunt.png Dieser Artikel wurde gemäß der Scriptrichtlinien veröffentlicht.
extern