Bitte um Hilfe mit script

Hi könnte jemand mir bei meinen Scripts helfen, bin dabei eine "Ant-Mod" zu erstellen aber bekomme zwei Funktionen nicht hin -
1. Bei meiner Königin Ameise soll Bevor die Funktion ausgeführt wird geprüft werden ob ein Gebäude näher ist als ca. 50 Pics und wenn ja soll dieses nicht ausgeführt werden.
Hier das Script:

func sayHello(pClonk)
{
conhello(); // Wird über ein Spezial Menü aktiviert
}
func conhello(pClonk)
{
    CreateConstruction( BRKA, 6,6,  GetOwner(),100,1,1);
        CreateContents(MUSH,FindObject(BRKA, 0,0,0,0, 0, 0,0, 0, 0),5);
    var nclnk = CreateObject(ANTK, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
  RemoveObject();
}

und 2. Habe ich in einem Gebäude vor meinen Clonk Automatisch "Pilze" einzusammeln zu lassen und in dieses zu bringen
- das klappt auch aber ich möchte das der "Clonk" dieses so lange macht wie Pilze in der nähe sind (ca.200 tiks) sind,
bis jetzt holt er immer nur 1 Pilz und muss dan wieder über das Gebäude-Menü ausgeführt werden…
Hier das Script:

public ContextCutWood:
  [Pilze sammeln|Image=MUSH|Condition=HasKnowledge]
  SetLocal(9,GetX(GetCursor() ) );
Pilzesammeln();
  return(0);

public Pilzesammeln: // C4Object *pCaller
  SetLocal(0,3);
  if(Local(7)) SetVar(0,FindTreeToChopWald());
  if(Not(Local(7))) SetVar(0,FindTreeToChop());
  if(Not(Var(0))) Message("Kein Pilz zum Sammeln bereit",GetCursor() );
  if(Not(Var(0))) SetLocal(7,2);
  if(Not(Var(0))) return(0);
  SetVar(1, FindObject(BRKA,0,0,0,0,0,0,0,NoContainer(),Var(1)));
  Message("Pilze sammeln",GetCursor() );
  AppendCommand(GetCursor(),"Get",Var(0));
  AppendCommand(GetCursor(),"Wait",0,0,0,0,10);
  AppendCommand(GetCursor(),"Enter",this(),0);
  AppendCommand(GetCursor(),"Wait",0,0,0,0,10);
  AppendCommand(GetCursor(),"Put",this(),0);
  AppendCommand(GetCursor(),"Wait",0,0,0,0,10);
  return(0);

Danke schon mal im Vorraus :slight_smile:

Zu 1.
Schau dir mal http://www.clonk.de/docs/de/sdk/script/fn/ObjectDistance.html sowie http://www.clonk.de/docs/de/sdk/script/fn/FindObjects.html an.

Zu 2.
Wieso benutzt du nicht #strict / #strict 2 Syntax?
Ansonsten: http://www.clonk.de/docs/de/sdk/script/for.html

:cool:
Danke hab das mit dem 2. Problem Lösen können danke Jok :slight_smile:

mmmm 1. sieht jetzt so aus funkst aber nich wo hab ich den fehler?

func sayHello(pClonk)
{
if(this()->ObjectDistance(FindObjects(Find_Category(C4D_Structure))) < 25)
conhello();
}
func conhello(pClonk)
{
    CreateConstruction( BRKA, 6,6,  GetOwner(),100,1,1);
        CreateContents(MUSH,FindObject(BRKA, 0,0,0,0, 0, 0,0, 0, 0),5);
    var nclnk = CreateObject(ANTA, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
  RemoveObject();
}

FindObjects liefert dir array, du brauchst aber object. Einfach mit for alle Elemente des Arrays durchgehen (Beispiele gibt es im for- und FindObjects-Artikel).

@ObjectDistance
Ich seh grad, dass FindObjects ein eigenes Suchkriterium dafür hat: http://www.clonk.de/docs/de/sdk/script/fn/Find_Distance.html

>if(this()->ObjectDistance(FindObjects(Find_Category(C4D_Structure))) < 25)


Bin mir nicht ganz sicher ob this->ObjectDistance(...) reicht.
Ich würde den zweiten Parameter angeben: ObjectDistance(obj1,this());

Und dann würde ich nicht FindObjects (gibt ein array aller Objekte aus, die die Find_Kriterien erfüllen) nutzen, da FindObject2 (gibt nur ein Objekt, das alle Find_Kriterien entspricht aus) reichen würde.

Alles in allem würde FindObject2 reichen.

Langere Rede, kurzer Sinn:
if(this()->FindObject2(Find_Category(C4D_Structure),Find_Distance(25)) ) <- probier mal das.

>Bin mir nicht ganz sicher ob this->ObjectDistance(...) reicht.


Tut es. "Ist pObj 0, Wird die Distanz zwischen dem aufrufenden Objekt und pObj2 gemessen."

>if(this()->FindObject2(Find_Category(C4D_Structure),Find_Distance(25)) ) <- probier mal das.


this()->? :(

mmm habe das jetzt so ausprobiert aber die funktion geht dan nich…

func sayHello(pClonk)
{
if(this()->ObjectDistance(FindObjects(Find_Category(C4D_Structure))) < 25)
conhello();
}
func conhello(pClonk)
{
    CreateConstruction( BRKA, 6,6,  GetOwner(),100,1,1);
        CreateContents(MUSH,FindObject(BRKA, 0,0,0,0, 0, 0,0, 0, 0),5);
    var nclnk = CreateObject(ANTK, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
    var nclnk = CreateObject(ANTA, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
  RemoveObject();
}

… Mach ich noch irgendwas Falsch??? …

Uhm, es hat sich in sayHello ueberhaupt nichts geaendert…?

mmm hab auch das hier ausprobiert aber nix geht…

func sayHello(pClonk)
{
if(FindObject2(Find_Distance(22), Find_OCF(OCF_Construct))
Message("Zu nah an Baustelle",this());
return(0)
if(!FindObject2(Find_Distance(22), Find_OCF(OCF_Construct))
conhello();
}

------------------------------- und das hier 
func sayHello(pClonk)
{
if(ObjectDistance(FindObjects(Find_Category(C4D_Structure)),this()) < 25)
conhello();
}

ich bekomm die funktion leider immer noch nich zum Laufen… Hat noch jemand einen vorschlag wie ich die zum Laufen bekommen könnt?

hubs ja :slight_smile: war wohl noch die alte Variante im Strg+c :wink:

Zur ersten Variante:

Wenn du das Spiel mit einem fehlerhaften Skript startest (am Bestem im Entwicklermodus ueber den Editor), erscheinen im Log Hinweise, was schief laueft. Hier hast du ein paar einfach zu behebende Syntax-Fehler eingebaut, die eigentlich recht genau im Log stehen muessten. Guck mal nach und versuche, sie zu loesen.

Du musst ausserdem beachten, dass if()  im Normalfall nur ein einziges Kommando konditional ausfuehrt. Wenn du mehrere hast, brauchst du {}. Und du kannst anstatt die Bedingung nochmal zu wiederholen, else verwenden ("ansonsten"), etwa so:

if(…) {
  // Befehle
} else {
  // Befehle, die ansonsten ausgefuehrt werden.
}

:frowning: Bekomms irgendwie nich hin…
kann mir jemand nen if - else script erstellen wo if Prüft ob in der nähe ca. 20 ein gebäude is?
Währe echt net :wink:

Das gibt dann aber keinen Lerneffekt, wie wenn du es dir selbst erarbeitest :frowning:

Du hast es doch schon fast geschafft!

:sad:
Ok…

:wink:
Dann Bitte mit Hilfe
hab jetzt dies hier aber da kommt immer ein Fehler…

{
if(FindObject2(Find_Distance(22), Find_OCF(OCF_Construct))
  conhello();
}

ERROR: syntax error: see previous parser error for details.
by: sayHello(BAU4) (obj Sato #83) (F:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Königin Ameise.c4d\Script.c:74)
by: MenuCommand in F:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Königin Ameise.c4d\Script.c (obj Sato #83)

Also wenn ich das hier richtig Interpretiere Liegt der Fehler im Script meiner Ameisen Königin in Zeile 74
dies wäre dan die Zeile mit dem Funktions Aufruf conhello(); aber ich weiß nich was daran Falsch sein soll
wenn ich die Suchfunktion also das If(etc…) Rausnehme gehts einziges Manko is halt das wenn man schon
ein Gebäude in der Nähe hat dieses nicht erstellt wird aber der Rest der Funktion apläuft…
D.H. Momentan wird beim ersten Aufruf genau das Gemacht was ich möcht:

                                                                              - “Brutkammer” Bauen wenn Bauplatz OK
                                                                              - 5xPilze in die Brutkammer legen damit man schneller Bauen kann(is das Baumaterial bei den Ameisen)
                                                                              - “Arbeiter Ameise” Erschaffen und ins Team Holen
                                                                              - “Königin” Verschwinden lassen (Weil is ja in der Brutkammer)

aber wenn ich die Funktion dan ein Zweites mal ausführen will und meine Königin die Eigentlich eine Neue Brutkammer Bauen soll
zu dicht an einem Gebäude is Kommt keine Brutkammer aber die Königin verschwinded, die Arbeite Ameise wird erschaffen
und die Pilze werden dem nächstliegendem Gebäude dazu gerechnet…

Hier das script dazu:

func conhello(pClonk)
{
    CreateConstruction( BRKA, 6,6,  GetOwner(),100,1,1); // lasse hier über die Letzte zahl in der klammer zusätzlich Prüfen ob Platz zum Bauen is sonnst Baut sich das Gebäude auch in andere rein…
        CreateContents(MUSH,FindObject(BRKA, 0,0,0,0, 0, 0,0, 0, 0),5);
    var nclnk = CreateObject(ANTK, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
    var nclnk = CreateObject(ANTA, 0, 0, GetOwner());
   MakeCrewMember(nclnk, GetOwner());
  RemoveObject();
}

Noch irgendjemand einen Hinweis was ich Falsch mach?

Auch wenn ich das hier Probiere

{
if(FindObject2(Find_Distance(22), Find_OCF(OCF_Construct))
  Call(“conhello”);

}

kommt nur…

ERROR: ‘,’ or ‘)’ expected, but found identifier (in sayHello, F:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Königin Ameise.c4d\Script.c:69:7)

Dies wäre genau Hinter dem Call vor der Klammer…

und die Funktion conhello wird nicht ausgeführt…

Hab mal dies Hier ausprobiert…

func sayHello(pClonk)
{
if(CreateConstruction(BRKA, 6,6,  GetOwner(),100,1,1) == 0)
Message(“Kein Geeigneter Bauplatz”,this());
if(!CreateConstruction(BRKA, 6,6,  GetOwner(),100,1,1) == 0)
conhello();
}

dabei passiert folgendes:
                           Wenn Platz wird eine Brutkammer gebaut - sonst nix
                           Wenn etwas neben einer Brutkammer wird eine Meldung ausgegeben das kein Platz ist - sonst nix
                           Wenn direkt vor einer Brutkammer - wird ein Arbeiter erstellt, die Königin entfernt und Pilze eingelagert

Hier steht : http://www.clonk.de/docs/de/sdk/script/fn/CreateConstruction.html#CreateConstruction
das wenn die Position Ungeeignet ist das die Funktion 0 zurückgibt…

Immer wenn bei Fehlern zur Laufzeit
ERROR: syntax error: see previous parser error for details.
kommt, steht weiter oben im Log genau wo der Fehler ist. Vor dem Spielstart und nachdem die ganzen Objekte geladen werden muss irgendwo eine Stelle kommen, bei der steht X Warnings, X Errors wobei natuerlich bei beiden Faellen für das X eine 0 stehen sollte :wink:
Wenn du da noch Fehler hast, lohnt es meistens garnicht das Objekt zu testen, weil dir da genau gesagt wird wo der Fehler ist und man ihn dann ganz leicht beheben kann. Du solltest dich bemühen, dass du immer bei 0 Warnings & 0 Errors bleibst!

In deinem Fall fehlt einfach eine Klammer. In der Fehlermeldung steht das sogar - obwohl ich nicht weiss, ob sich der Fehler hierdrauf bezieht (weil ich nicht den ganzen Script habe):
ERROR: ',' or ')' expected, but found identifier (in sayHello, F:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Königin Ameise.c4d\Script.c:69:7)
Übersetzt: "In Königin Ameise.c4d\Script.c in Zeile 69 an der 7. Stelle will ich eine Klammer oder ein Komma, aber irgendwas anderes kommt"
Genauer kann man es eigentlich nie bekommen :wink:

Jede Klammer, die auf geht, muss auch wieder zugehen!
{
if(FindObject2(Find_Distance(22), Find_OCF(OCF_Construct)))
  conhello();
}

Ahhh Danke ich Probiers gleich aus aber auch für die gute erklärung :happy:
Hab mich bis jetzt immer nur darum gekümmert das es im Spiel klappt…
Hab dann wohl doch noch mehr zu tun 66 Warnungen 3 Errors…
Vielen Dank noch mal an alle die mir bis hierhin schon so gut geholfen haben wenn ich's Fertig bekomme
Schau ich mal wo ichs hochladen kann (auf ccan geht nich bin nur nen freeware player)
Würde mich dann Natürlich auch über "Tester" Freuen :wink:

Hi ich versuche die Fehler nach und nach auszumerzen und habe hier noch einen Error

ERROR: declaration expected, but found identifier 'puplic' (E:\Clonk Rage\Ant-Mod.c4d\Structures.c4d\Pilzfarm.c4d\Markierung.c4d\Script.c:13:12)

Erklärung erwartet, fand aber Bezeichner 'puplic'

Was wird den mit einer Erklärung bezeichnet?

script sieht wie folgt aus:

#strict

local Number,Forsthaus;

protected func Init(pHut,iNum)
{
  // 1: Lo; | 2: Lu; | 3: Ro; | 4: Ru;
  Number= iNum;
  Forsthaus= pHut;
  SetAction("A1");
}

puplic func Move(iChange) // Hier soll die "Erklärung" hin…
{
  if(Number== 1) SetPosition(GetX()-iChange,GetY()-iChange);
  if(Number== 2) SetPosition(GetX()-iChange,GetY()+iChange);
  if(Number== 3) SetPosition(GetX()+iChange,GetY()-iChange);
  if(Number== 4) SetPosition(GetX()+iChange,GetY()+iChange);
}

Eigentlich hat dein Parser (also das Teil, was den Code "umwandelt") an der Stelle eine Funktionserklärung (function declaration) erwartet - das deutsche Wort ist zwar ein bisschen Panne, aber macht ja nix :wink:
Eine function declaration ist in dem Fall alles mit func - so wie bei dir! Eigentlich…! Wieder mal nur ein Tippfehler, es sollte eigentlich public func sein!

PS: Im Prinzip kannst du übrigens in C4Script die ganzen Zugriffsbezeichner (public, protected, private) weglassen und nur immer "func" nehmen. Letztendlich macht das da in der Praxis keinen Unterschied

Ah!! Danke Zapper!
:tongue:
Wenn man Stundenlang immer auf's Script Glotzt übersieht man sowas schnell :grin:
Werd mich dann weiter auf Fehler behebung begeben :happy:

HI nochmal…
Hab die Errors alle wegbekommen jetzt bleiben mir noch ~ 66 Warnungen
mir ist aufgefallen das es "Eigentlich" nur 22 sind aber diese in meinen 3 Scripts in meinen "Clonks"  (Arbeiter-,Wöchter- und Königin- Ameise)
und die sehen wie folgt aus:

WARNING: Error getting Action Walk: StartCall function 'CheckContents' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action KneelDown: AbortCall function 'AbortSpell' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action KneelUp: EndCall function 'CheckMagicStart' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action KneelUp: AbortCall function 'AbortSpell' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action DiveBack: EndCall function 'CheckMagicStart' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action DiveBack: AbortCall function 'AbortSpell' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action FlatUp: AbortCall function 'AbortSpell' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action Magic: PhaseCall function 'CheckMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action Magic: EndCall function 'AfterMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action Magic: AbortCall function 'AfterMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action JumpMagic: PhaseCall function 'CheckMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action JumpMagic: EndCall function 'AfterMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action JumpMagic: AbortCall function 'AfterMagicJump' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action RideMagic: PhaseCall function 'CheckMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action RideMagic: EndCall function 'AfterMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action RideMagic: AbortCall function 'AfterMagic' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action Cast: StartCall function 'Glow' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action Cast: AbortCall function 'AbortCasting' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action HoverCast: StartCall function 'HoverGlow' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action HoverCast: AbortCall function 'AbortCasting' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action RideCast: StartCall function 'Glow' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)
WARNING: Error getting Action RideCast: AbortCall function 'AbortCasting' (E:\Clonk Rage\Ant-Mod.c4d\Crew.c4d\Arbeiter Ameise.c4d\Script.c)

Bin mir nich sicher was damit gemeint ist…
soll das bedeuten dass die Actionen Fehlen oder nicht Funktionieren?
(das Grund Script hatte ich mal von nem Clonk Kopiert und mit den Funktionen erweitert)

Schau mal in der ActMap.txt deiner "Clonks" nach. Dort sind bei verschiedenen Aktionen Zeilen im Format StartCall=CheckContents. Die Zeilen bewirken im normalen Clonk, dass zu Beginn der Aktion (also z.B. wenn der Clonk anfängt zu laufen oder wenn er hüpft) eine Funktion in dessen Script.c aufgerufen wird.

Du hast die ActMap übernommen, ohne dass diese Funktionen in deiner Script.c definiert sind. Wenn du also die entsprechende Funktionalität nicht brauchst (also wenn dir nichts fehlt), dann kannst du diese Zeilen einfach aus der ActMap löschen, dann verschwinden die Warnungen.