[Gelöst] Auf dem Meeresgrund arbeiten Hazardclonk

Der Aquaclonk kann ja auf dem meeresgrund arbeiten. Ich möchte nun, dass wenn mein Hazardclonk den Pinguinanzug an hat (Grafik aus Quake), dass er das dann ebenfalls kann.

Ich konnte aber leider nicht wirklich ausfindig machen, was ich dafür brauche. Das einzig auffällige beim Aquaclonk ist im Skript:

protected func ContactBottom()
  {
  if (SEqual(GetAction(), "Swim"))
    SetAction("Walk");
  return(1);
  }

Beim Hazardclonk steht sowas ähnliches bereits drin, nur ohne "SEqual". Deswegen habe ich es jetzt so geschrieben:

protected func ContactBottom() {
if(pinguin) {  if (SEqual(GetAction(), "Swim"))
    SetAction("Walk");}
if(pinguin) {  if (SEqual(GetAction(),"SwimArmed"))
    SetAction("WalkArmed");}

if(!(pinguin)) {  if (GetAction() S= "Swim")
    SetAction("Walk");}
if(!(pinguin))  { if (GetAction() S= "SwimArmed")
    SetAction("WalkArmed");}
  return(1);
}

Aber entweder klappt das so nicht, oder ich hab nen Fehler gemacht… jedenfalls kann der Pinguin keine arbeiten verrichten.

Oder hat der Hazardclonk noch eine andere Funktion drin, die es verhindert zu arbeiten?

An sich müsste der Hazardclonk als Pinguin oder als Hazard am Boden laufen können. Das umschreiben hättest du dir allerdings sparen können SEqual(strng1,strng2) vergleicht ob strng1 = strng2 ist. S= macht das selbe. Kann sein das S= erst ab #strict 2 geht und der Aquaclonkscript einfach älter ist und übernommen wurde. Mit am Meeresgrund arbeiten meinst du Gebäude bauen, richtig? Hab gerade mal nachgeschaut; im Hazard ist in der ActMap.txt ein Absatz

[Action]
Name=Build
Procedure=BUILD
Directions=2
FlipDir=1
Length=8
Delay=2
Facet=128,220,16,20,0,0
NextAction=Build
StartCall=Building
InLiquidAction=Swim

Das letzte InLiquidAction könnte wichtig sein. Du willst natürlich nicht, dass er schwimmt statt zu bauen.Probier mal ob's klappt wenn du das raus nimmst. (Am besten nicht am Hazard im Hazardpack arbeiten sondern an ner Kopie in deinem Szenario)

okay, danke, das sollte das Problem tatsächlich lösen :slight_smile:

Ich hab jetzt mal die ActMap ergänzt (dasselbe beim graben usw.):
[Action]
Name=BuildPinguin
Procedure=BUILD
Directions=2
FlipDir=1
Length=8
Delay=2
Facet=128,220,16,20
NextAction=BuildPinguin
StartCall=BuildingPinguin

Nun sind diese ganzen StartCalls aber im clonk geschrieben und der Hazardclonk greift per include darauf zu. Meine lokale Variable "pinguin" wird wie folgt gesteuern:
In der Rüstung wird beim Anziehen folgendes aufgerufen:
pClonk->Pinguinan();    bzw. beim ausziehen: pClonk->Pinguinaus();

Dies sorgt im Hazardclonkskript dafür, dass die dort definierte lokale Variable "pinguin" 1 oder 0 gesetzt wird.
Nun müsste ich normalerweise bei der Funktion "Building()" eine if Funktion reinschreiben, welche dafür sorgt, dass falls pinguin==1 ist, weitergeleitet wird zu "BuildingPinguin()".

Aber wie läuft das nun mit diesem include?  Muss ich jetzt im Clonkskript auch die lokale Variable pinguin definieren? Und wird diese über meine Rüstung dann auch dementsprechend gesetzt? Oder wird sie nur für das Hazardclonkskript gesetzt?  Vllt sollte ich sie aus dem Hazardclonkskript rausnehmen und nur im Clonkskript definieren?

(ich arbeite übrigens immer nur mit kopien und lasse die originalpakete unberührt :wink: wobei… manchmal kann ich nicht anders und bessere Bugs aus, echt unglaublich wieviele Bugs in manchen Paketen noch sind, gab es früher die Engine nicht, die die fehler anzeigt? z.b im "erweiterungspack" ist an vielen stellen "public" falsch geschrieben. Hat jetzt keine schlimmen auswirkungen, sorgt aber für ne lange Liste an Warnungen :D…   auch das Ruf der Wipfe Remake Pack hat einige Fehler, obwohl das doch recht neu ist… z.b. wird der Wert des Mülls nicht halbiert, weil nicht nach dem Müll, sondern nach dem Hilfsobjekt gesucht wird… das wird allerdings auch nirgends in der engine angezeigt, von daher verständlich ,dass das nicht aufgefallen ist )

edit:
habs jetzt mal so probiert wie beschrieben, also das ins normale clonkskript verlagert und bei building() den if befehl gemacht. Klappt aber leider nicht =/  ich könnte mir vorstellen, dass das deshalb nicht klappt, weil ja für einen winzigen Moment Building() aufgerufen wird, welches zur Folge hat, dass der Clonk schwimmt und nicht baut… also müsste ich jetzt irgendwas nändern, dass Building() garnicht erst aufgerufen wird?  ist das denn möglich, oder ist das fest verankert?

Warum nennst du die Action BuildPinguin? Die Pinguingrafik ist eine andere Datei als die Hazardgrafik oder? Oder willst du spezifisch, dass der Hazard nur als Pinguin unterwasser arbeiten kann? Im letzten Fall würde ich die Action wieder Building nennen und dann den StartCall ändern. Also in den Hazardscript:

private fund Building(){
  if(!pinguin){
    SetAction("Swim");
    return;
  }
  _inherited();
}

Das müsste eigentlich die Buildingaction abbrechen wenn der Hazard den Anzug nicht an hat. Das  _inherited(); sorgt dafür, dass im anderen Fall (also wenn pinguin = 1) der Rest der Funktion wie er im ursprünglichen Objekt (also dem normalen Clonk) steht ausgeführt wird.

okay, scheint zu klappen :slight_smile: vielen Dank =)