Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst] Rüstung soll Clonk heilen
- - By Serpens66 (More than 200 posts.) Date 09.10.2014 21:49 Edited 09.10.2014 21:56
Ich habe aus dem Fallout Pack ein paar Rüstungen genommen und sie ein wenig angepasst, meiner Meinung nach deutlich verbessert.

Ich hatte nur arge Probleme dabei, eigene Effekte hinzuzufügen. Die Rüstungen sind Hazard Ausrüstungsgegenstände. Ich wollte halt unter anderem eine Fähigkeit, welche den Clonk vorübergehend heilt und sich dann wieder aufladen muss. Die nötigen Funktionen dazu habe ich. Nur gab es Probleme damit, die Wirkung auf den Clonk zu übertragen. Wenn ich es im Rüstungsskript geschrieben habe, dann war offensichtlich immer die Rüstung selbst vom Effekt betroffen und ich wusste nicht ,wie ich es auf den Clonk übertragen kann.
Deswegen habe ich es jetzt mit globalen Variablen gelöst und diese im Hazardclonkscript unter UpdateCharge() eingefügt.
Da steht nun also z.b :

if(aaaaaaaa2==1)
{DoEnergy(1000,0,true);
AddEffect("Sparkle", this(), 1, 1, 0, GetID());
};

Das Problem ist aber leider, dass dieser Heilungseffekt dann scheinbar für alle Hazardclonks gilt... oder vllt nur für alle mit dergleichen Rüstung an.. keine ahnug. Jedenfalls müsste ich vermutlich anstelle von "this()" eben den Clonk rausfiltern, der die Fähigkeit aktiviert hat. 
Habt ihr da Ideen zu, wie ich das machen kann?  Oder wie ich im Rüstungsskript dafür sorge, dass nicht die Rüstung sondern der Clonk vom effekt getroffen wird? (ich vermute ich muss diese "pClonk" Bezeichnungen nehmen.. damit habe ich mich gerade schon beim Teleporter rumgeschlagen und einiges dazu gelernt..., aber obs reicht?)
Parent - - By Zapper (More than 500 posts.) Date 09.10.2014 21:58

>(ich vermute ich muss diese "pClonk" Bezeichnungen nehmen.. damit habe ich mich gerade schon beim Teleporter rumgeschlagen und einiges dazu gelernt..., aber obs reicht?)


`pClonk` ist nichts magisches, was es einfach so gibt. Du hast das an den entsprechenden Stellen bestimmt immer als Parameter reinbekommen (und selbst so genannt) oder selbst was dazu gesucht und drin gespeichert.

Ich schätze aber, dass die Rüstungen (bzw deren Effekte) irgendwie wissen zu welchem Clonk sie gehören. Du kannst dir ja mal angucken was passiert wenn Rüstungen angelegt werden.
Wird dann ein Effekt erschaffen, der sich den Clonk merkt, oder wird der Clonk irgendwie in einer lokalen Variable gespeichert?
Parent - - By Serpens66 (More than 200 posts.) Date 09.10.2014 22:11 Edited 09.10.2014 22:14
ja... beim Teleporter + Console wurde auch immer (int i,pClonk) weitergegeben. Hat ne weile gedauert, bis ich einigermaßen verstanden habe, wie ich das dann in den MenüEinträgen nutze.  Das einzige, was ich noch nicht verstanden habe, ist wie ich solche Parameter von Funktion zu Funktion weitergebe. Wenn ich das dann verstanden habe, kann ihc glaub ich auch das Rüstungsproblem lösen.

Deswegen nochmal ein Auszug aus dem Geschütz:

public func ConsoleControlled(int i, pClonk)
{
    if(i == 1)
    {
        if(Active) Active = 0;
        else
        {
            Active = 1;
        }

    }
    if(i == 2)
    {
ChooseWeapon(int i, pClonk);Log("ChooseW. wurde aufgerufen");
    };

}

func ChooseWeapon(int i,pClonk)
{
Log("bin aufgerufen");
CreateMenu (GetID(), pClonk, 0, 0, "wähle Waffe", 0,1, 0, 0);
AddMenuItem ("Mit MG ausrüsten", "Arm", MGSA, GetCursor(GetOwner()), 0, 0, "Rüstet das Geschütz mit einer MG aus");
AddMenuItem ("Mit Railgun ausrüsten", "Arm", RGSA, GetCursor(GetOwner()), 0, 0, "Rüstet das Geschütz mit einer Railgun aus");
}


und hier der Bedienungsausschnit aus der Konsole:
protected func ControlDig(pClonk)
{
  CreateMenu(GetID(target), pClonk, target, 0, Format("$Control$: %s", GetName(target)), 0, 1);
  for(var i = 1, desc ; desc = target->~ConsoleControl(i) ; i++)
  {
    //Aufrufenden Clonk und uns selbst dem Zielobjekt übergeben. Dies kann es in ConsoleController abrufen
//    target->~ConsoleController(this(), pClonk);
    // Zielobjekt muss für ConsoleControl(i) jeweils den Namen der Aktion zurückgeben, wichtig: i beginnt bei 1
    AddMenuItem(desc, Format("ConsoleControlled(%d, %d, %d)", i, ObjectNumber(pClonk), ObjectNumber(this())), GetID(), pClonk, 0, pClonk, "$Control$");
    // Zielobjekt bekommt Aufruf: ConsoleControll(i) und muss das dann verarbeiten
  }
  return(1);
}


So. Das heißt die Console sollte sowohl i , als auch pClonk weitergeben (weil pClonk als 2ter Parameter in AddMenuItem angegeben ist, vorher stand dort 0).
Soweit meckert auch keine Funktion über ein "unknown pClonk". Aber wenn ich es so schreibe, wie hier zu sehen, dann wird über ein "unknown int" gemeckert, welches sich in ConsoleControlled des Geschütz befinden soll.  Demnach gehe ich davon aus, dass alles soweit richtig ist, aber der Aufruf:
if(i == 2)    {ChooseWeapon(int i, pClonk);Log("ChooseW. wurde aufgerufen");    };
so nicht funktioniert. Also wie kann ich korrekt die Daten an die ChooseWeapon Funktion weitergeben?

edit:
(wie an den AddMenuItem Einträgen von ChooseWeapon ersichtlich, habe ich es letzlich nun mit GetCursor gelöst, anstatt pClonk. Aber bei den Rüstungen geht das natürlich nicht ^^)
Parent - - By Luchs (More than 1000 posts.) Date 10.10.2014 16:30
Alle Objekte in Clonk sind durchnummeriert. Diese Nummer taucht etwa im Entwicklermodus auf, wenn man mit dem weißen Cursor über Objekte hovert bzw. in den Eigenschaften-Dialog geht.

Im Script lässt sich diese Nummer auch nutzen, und zwar mit `Object(123)` (gibt das Objekt mit der Nummer zurück) bzw. `ObjectNumber(obj)` (gibt die Nummer des Objekts zurück). Das hilft, um bei Menüs Objekte referenzieren zu können, weil dort ein Kommando in Form einer Zeichenkette übergeben wird.

Die Nummern werden via `Format()` in den String gepackt. In deinem Beispiel erzeugt `Format("ConsoleControlled(%d, %d, %d)", i, ObjectNumber(pClonk), ObjectNumber(this()))` einen String wie `ConsoleControlled(0, 123, 325)`. Um dann wieder die Objekte zurückzubekommen, musst du eben `Object()` verwenden. Probiere es also mal mit dem folgenden Aufruf: `Format("ConsoleControlled(%d, Object(%d), Object(%d))", i, ObjectNumber(pClonk), ObjectNumber(this()))` was dann zu dem Befehl führt `ConsoleControlled(0, Object(123), Object(325))` und somit an die Funktion echte Objekte übergibt und keine Zahlen.

Solche Überraschungen über den Typ kannst du vermeiden, wenn du vor die Parameter den gewünschten Typ schreibst, also hier public func ConsoleControlled(int i, **object** pClonk). Dann bekommst du eine Fehlermeldung und erkennst das Problem früher.
Parent - - By Serpens66 (More than 200 posts.) Date 16.10.2014 14:54
konnte das meiste jetzt mit dem pClonk system lösen :) Aber auch danke für das mit der Objektnummer, könnte auch mal hilfreich sein :)

Nur eine frage habe ich zum pClonk noch:  wie übergebe ich einen Wert an eine Funktion, die regelmäßig über einen Timercall aufgerufen wird?
Parent - By Luchs (More than 1000 posts.) Date 16.10.2014 14:55

>wie übergebe ich einen Wert an eine Funktion, die regelmäßig über einen Timercall aufgerufen wird?


Als lokale Variable speichern.
Up Topic Deutsch / Hilfestellung / [Gelöst] Rüstung soll Clonk heilen

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill