[Gelöst] Fahrzeuge aus mehreren Teilen

Ich habe ein Problem mit Fahrzeugen aus mehreren Teilen. Z.b das Hazard Shuttle hat ein Extraobjekt "entrance".  Es gibt noch viele weitere Fahrzeuge, die aus noch viel mehr Teilen bestehen.

Beim aktivieren so eines Fahrzeuges, welches in einem Gebäude steckt (z.b weil gekauft oder gebaut), werden diese Extrateile leider alle mit angezeigt.
Zum einen ist das natürlich beim rausholen selbst störend, weil das ganze Fahrzeug nutzlos wird, wenn man ausversehen so ein Einzelteil rauslässt. Lässt man hingegen nur das Fahrzeug selbst raus, gehen die Einzelteile offensichtlich automatisch mit und das Fahrzeug ist fahrtüchtig.

Zum anderen kann man diese Fahrzeuge auch nicht "beamen" mit dem Uplinksystem, weil dort tatsächlich nur ein einzelnes Teil gebeamt wird und das Fahrzeug in jedem Fall nutzlos wird.

Wenn man so ein Fahrzeug kauft, wird im Kaufmenü nur das Hauptfahrzeug angezeigt, aber nicht der ganze Kleinkram. Wie kann ich es erreichen, dass der ganze Kleinkram auch nicht mehr im Aktivieren-Menü angezeigt wird? Oder falls das nicht geht: eine Möglichkeit, dass immer das vollständige Fahrzeug aktiviert wird, egal welches einzelteil man rauslässt.

Für das Beamen werde ich vermutlich ohnehin die Teile irgendwie kombinieren müssen… Zurzeit fällt mir nur ein, für jedes Fahrzeug eine Ausnahmeregelung zu schreiben, wodurch dann immer alle Teile aufeinmal gesendet werden… keine ahnug ob das klappen würde.

Habt ihr noch Ideen dazu?

Guck mal das Hazard-Licht an.

Beim Beamen musst du sicherstellen, dass nur das Hauptobjekt gebeamt werden kann und nicht die Hilfsobjekte. Wenn da ATTACH verwendet wird, dürfte das keine Probleme machen.

Danke =)
Die meisten Probleme (also das aktivieren und auch das verkaufen über Uplinksystem (indem ich den DefCore Eintrag Noget als Ausnahme definiert habe) konnte ich mit "NoGet" lösen :slight_smile:

Leider leider ist das beim beamen nicht ganz so einfach =/  Hier mal ein Skriptauszug und danach noch meine Erklärungen dazu:

private func TransferIn(par0, target, selection)
{
  // Objekte holen
  xferTarget = target;
  var xferT2 = target;
  if (target->~IsUplink())
    xferT2 = GetActionTarget(0,target);
  CreateMenu(GetID(xferTarget), caller);
  AddMenuItem("Senden-Modus aktivieren", "TransferOut", XFER,caller, 0,xferTarget, "Wechseln in den Senden-Modus",2,1); // wechselt den Modus
  // nichts versendbares
if (!(FindObject(0,0,0,0,0,OCF_Collectible(),0,0,xferT2)) && !FindObject2(Find_Func("IsTransferabl")))
    return(1);
  AddMenuItem("Alles holen", "TransferInAll", XFER,caller, 0,0, "Alles hier herein transferieren",2,2);

  // Auflistung   --> Hier kommt jetzt der wichtige Teil für das Problem:
// Clonks gesondert nach Namen sortieren
for(var clonk in FindObjects(Find_Container(xferT2),Find_Or(Find_ID(HZCK),Find_ID(CLNK))))
    {AddMenuItem(Format("Den %v senden",GetName(clonk)), "DoTransferIn", GetID(clonk),caller, 0,clonk);}

//Shuttle und Panzer gesondert auflisten
for(var vehicle in FindObjects(Find_Container(xferT2),Find_Or(Find_ID(SHTL),Find_ID(TANK))))
    {AddMenuItem(Format("Das %v senden",GetName(vehicle)), "DoTransferIn", GetID(vehicle),caller, 0,vehicle);}

  var i, count, bool;
  var obj, objID;
  var num = 2;
  while (obj = Contents(i,xferT2))
  {
    bool =  (FindObjects(Find_Or(Find_Func("IsTransferabl"),Find_OCF(OCF_Collectible))));
    objID = GetID(obj);

// hat leider keine Wirkung. wenn weiter unten nicht die IDs Shuttle und Panzer rausgefiltert werden würden , erschiene dennoch ein Eintrag mit "3mal Shuttle".
//if(GetDefCoreVal("NoGet", "DefCore", objID)) return(1); 

    count = 1;
    ++i;
    while ((obj = Contents(i,xferT2)) && (GetID(obj) == objID))
    {
      ++count;
      ++i;
    }
// Clonks und die Fahrzeuge haben wir bereits. Die "noGet" Bedingung hat leider auch hier keinerlei wirkung, keine Ahnung warum.
    if(objID!=CLNK && objID!=HZCK && objID!=SHTL  && objID!=TANK && (!(GetDefCoreVal("NoGet", "DefCore", objID))) ) 
  if (bool)
    {
      AddMenuItem("%s holen", "DoTransferIn", objID,caller, count,num);
      ++num;
    }
  }
// Hier selection =1 setzen, wenn es ein Objekt ist. Das ist merkwürdigerweise nämlich der Fall, wenn wir das gesondert aufgelistete Shuttle/Panzer versenden. Bei Clonks tritt das Problem nicht auf.  !!! Edit: wie der deaktiviert, weil das an der DoTransferIn Funktion lag, die ich vergessen hatte anzupassen.
//if (selection && GetType(selection)==C4V_C4Object()) selection=1;
  while (selection >= num)
    --selection;
  SelectMenuItem(selection,caller); 
}


Die meisten Erklärungen habe ich mal ins Skript reinkommentiert. Der grobe Aufbau der funktion war schon vorher so, ich habe nur die Funktion "IsTransferabl" , die gesonderten Clonks und Fahrzeuge, sowie den Versuch zu "NoGet" hinzugefügt.
Bevor ich die Clonks gesondert geliste habe, wurden halt alle Clonks in einem Button mit ihrer Anzahl angegeben und man konnte im Prinzip nur einen zufälligen Clonk senden (oder den, der zuletzt aufgelsitet wurde, wie auch immer)  Dasselbe passiert halt auch mit den Shuttle Objekten, wenn ich sie nicht gesondert aufliste. Habe ich 1 Shuttle, dann steht dort "Shuttle 3" , als gäbe es drei Shuttle.  Wenn ich das dann versende, kommt ein Shuttle ohne die Einzelteile beim Empfänger an.

Nun da ich das Shuttle gesondert betrachte, wird mir da zwar keine "3" mehr angezeigt, aber das Shuttle kommt dennoch ohne die Einzelteile an, ist also nicht betretbar =(
Wie kann ich das ändern? ich hab nun schon dafür gesorgt, dass nur das Hauptshuttle versendet wird, aber es klappt trzd. nicht…  =/

EDIT: Ich teste nochmal eben was, denn es wird ja die Funktion "DoTransferIn" aufgerufen. Beim gesonderten Clonk hatte ich da auch was verändert, wenn ein Clonk gesendet wird…
So, hier jetzt nochmal meine Funktion "DoTransferIn", für Clonks klappt alles einwandfrei, aber fürs Shuttle gehts nun leider immernoch nicht, dass es komplett geschickt wird =/ :

private func DoTransferIn(objID, num)
{
if (objID!=CLNK && objID!=HZCK && objID!=SHTL && objID!=TANK)
{
  // Fehlerprüfung
  var obj;
  if (xferTarget->~IsUplink()) obj = FindContents(objID, GetActionTarget(0,xferTarget));
                          else obj = FindContents(objID, xferTarget);
  if (!obj || (ObjectDistance(xferTarget) > 500 && !xferTarget->~IsUplink()))
    return(Message("Transfer nicht möglich", this()));
  // Transport starten
  var transport = CreateObject(TRNS, GetX(xferTarget)-GetX(), GetY(xferTarget)-GetY(), GetOwner());
  transport->Init(this());
  Enter(transport, obj);
  // Menü wieder öffnen
  return(TransferIn(0,xferTarget,num));}

if (objID==CLNK || objID==HZCK|| objID==SHTL || objID==TANK)
{
  // Fehlerprüfung
  var obj=num;                     // damit auch genau der Clonk hergestellt wird, der losgeschickt wurde
  if (!obj || (ObjectDistance(xferTarget) > 500 && !xferTarget->~IsUplink()))
    return(Message("Transfer nicht möglich", this()));
  // Transport starten
  var transport = CreateObject(TRNS, GetX(xferTarget)-GetX(), GetY(xferTarget)-GetY(), GetOwner());
  transport->Init(this());
  Enter(transport, obj);
  // Menü wieder öffnen
  return(TransferIn(0,xferTarget));}   // hier wird kein "num" wert übertragen, weil es ja nur einen Clonk mit dem namen gab und der ist nun weggeschickt
}


Fertig editiert.

Unwichtige Anmerkung:
Die Bedingung if(bool) finde ich sehr unglücklich geschrieben, weil das doch heißen würde, falls ich bei bool=… noch eine weitere Bedingung hinzufüge wie z.b dass es kein "NoGet" sein darf, hätte das zur Folge, dass garnichts mehr afgelistet wird, sobald auch nur ein einziges NoGet Objekt in meiner Hütte ist, richtig?
Das nur allgemein zu meinem Verständnis, sollte aber mit der Problemstellung nichts zu tun haben.

Deine Bedingung if (bool) macht überhaupt keinen Sinn, da du dort nicht (wie der Variablenname implizieren wüde) einen boolschen Wert (also true oder false) speicherst, sondern das Ergebnis einer FindObjects-Suche, die auch wenn kein Objekt gefunden wurde ein Array zurückgibt, was dem true-Wert entspricht. (jetzt habe ich irgendwie nur die unwichtige Anmerkung beantwortet, sorry :sad:)

im Original war es mal
bool = (GetOCF(obj) & OCF_Collectible());
ergibt das mehr Sinn?   Wenn ja, dann habe ich wohl den Sinn entzogen :smiley: ich wollte halt, dass auch meine transferFunktion berücksichtigt wird.

Kannst du denn noch was zum tatsächlichen Problem sagen, oder hast du da auch keine Idee? =/

So Problem umgangen:

Das beamen funktioniert eigentlich so, dass das zu beamende Objekt in ein Hilfsobjekt gepackt wird, das Hilfsobjekt zum Ziel befördert wird, und dort das beamobjekt wieder ausgeladen wird.  Keine Ahnung warum dabei die Einzelteile verloren gehen, ist halt so…

Ich habe nun für alle mir bekannten Objekte aus mehreren Einzelteilen eine Ausnahme eingefügt, ähnlich dem, was ich schon hier fürs Shuttle und dem Panzer gemacht habe. Zusätzlich wird das Objekt nun einfach entfernt und beim Ziel ein neues Objekt (z.b Shuttle) erstellt. Dadurch klappt alles soweit :slight_smile: