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 :)
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.