Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst] maximale Munition von einzelnen Hazardclonk erhöhen
- - By Serpens66 (More than 200 posts.) Date 20.10.2014 22:09
Ich hab bereits festgestellt, dass die maximale Munitionsmenge in der Munition selbst festgelegt wird, also in dem Objekt mit der ID STAM wird z.b festgelegt, wieviele ein hazardclonk davon maximal tragen kann:
`#strict`
public func IsAmmo()  { return(true); }
public func MaxAmmo() { return(300); }

Aber wenn ich diesen Wert ändere, gilt das ja für alle hazardclonks. Ich möchte aber ein Tool machen, welches die maximale Menge erhöht, sodass dieser Clonk mehr tragen kann.
Im Hazardclonkskript finde ich leider nichts, was irgendwie auf MaxAmmo() zugreift...

Habt ihr da eine Idee, wo der Hazardclonk das ausliest, oder wie ich die Idee umsetzen kann?
Parent - - By Pyrit (More than 200 posts.) Date 21.10.2014 16:42
Im Moment wird ja immer 300 von dieser Funktion zurückgegeben. Lass die Funktion doch einfach mit if() überprüfen, ob dein Hazardclonk dieses tool hat, welches die Munni erhöhen soll. Wenn ja, returnst du return(500) oder so, wenn nein, dann halt normal 300.
Parent - - By Serpens66 (More than 200 posts.) Date 21.10.2014 17:57
danke, das ist eine gute Idee :)

Nur da ich ja noch nicht rausgefunden habe, wo und wie auf diese MaxAmmo funktion zugegriffen wird, weiß ich auch nicht, ob dabei evtl Werte (also der Clonk) übergeben wird. Das wäre jetzt die einzige Möglichkeit die mir einfällt, das für einen spezifischen Clonk zu machen...

Ich meine wie könnte die if Abfrage denn aussehen? Welcher Hazardclonk soll abgefragt werden, ob er das tool hat? oder einfach alle hazardclonks im spiel überprüfen?
Parent - - By Pyrit (More than 200 posts.) Date 21.10.2014 19:17
Tja, weiß ich leider auch nich...

Was ist STAM denn? Ist es ein aufsammelbares Objekt? Wenn sich STAM z.B. im Inventar des Hazardclonks befinden würde, könntest du halt über Contained() den Clonk bekommen, und dann checken, ob der Clonk das Tool hat.
Parent - By Serpens66 (More than 200 posts.) Date 21.10.2014 19:37
STAM ist die Munition selbst. Diese ist kein Objekt welches man einsammeln kann, sondern es wird nur im Display links, bzw. im Menü "Munitionsgürtel" angezeigt. Möglicherweise finde ich dort die nötige Funktion...  Die Munition wird über die Munitionskiste STAP aufgeladen. Diese kann man einsammeln, hat man aber immer nur kurz dabei, ist also nicht geeignet um den Clonk zu finden.
Ich schau mal ob ich im Munitionsgürtel Objekt was finde.. (ist recht unübersichtlich die Dinge zu finden, weil es soviel Kleinkram gibt, welches den Hazardclonk iwie steuert :D)
Parent - - By Luchs (More than 1000 posts.) Date 21.10.2014 20:03

>Im Hazardclonkskript finde ich leider nichts, was irgendwie auf MaxAmmo() zugreift...


In solchen Fällen immer eine Suche über alle Skriptdateien machen, dann müsste dir ziemlich schnell klar werden, wo und wie das verwendet wird.
Parent - By Serpens66 (More than 200 posts.) Date 21.10.2014 20:43
Das war ein guter Tipp :D  Hab ich bisher noch nie gemacht, ist aber wirklich wirklich hilfreich :D

Habs jetzt gefunden, es wird nicht beim Clonk sondern direkt in der Munitionskiste STAP geregelt. Diese lässt sich nicht mehr in Munition zerlegen, wenn das Maximum erreicht wurde.  Und hier findet sich natürlich auch ein Bezug zum Clonk, welcher versucht die Muntion aufzunehmen :)

Damit ist das Rätsel gelöst :)
Parent - - By B_E (More than 200 posts.) Date 21.10.2014 20:45 Edited 21.10.2014 22:07
Die eigentliche Interaktion mit der Munition geschieht in einem Clonk-AppendTo unter Hazard.c4d/System.c4g/Ammo.c, der Zugriff auf MaxAmmo zur Einsammelkontrolle in der Munitionskiste STAP (MayTransfer). Wie Pyrit jedoch angemerkt hat, solltest du den allgemeinen Code idealerweise nicht anfassen sondern die Modifikation auf STAP-Ebene bauen, da du ja zum Beispiel für unterschiedliche Munitionsarten unterschiedliche Mengenerhöhungen willst. Das oben genannte AppendTo ist sehr abstrakt definifert und sollte eigentlich nicht "hartgecodet" für ein einzelnes Objekt erweitert werden. Alternativ entwirfst du einen eigenen Callback, den du im genannten Skript ähnlich wie ->~MaxAmount().
Parent - - By Serpens66 (More than 200 posts.) Date 22.10.2014 11:42
soweit ich sehe, ist das kein Appento sondern 3 globale funktionen, die aber sehr hilfreich sein können.

Die Gürtelfunktion an sich hab ich jetzt so gemacht, dass wenn der Gürtel angelegt wird, eine locale Variable im benutzendem Clonk gesetzt wird. Und wenn diese gesetzt ist, kann er von dieser bestimmten Munition mehr tragen (wird in der Munition selbst dann geprüft und je nach Variable eine andere Gesamtmenge ausgegeben).
Dafür muss ich bei 9 verschiedenen Munitionsarten und einem Allrounder Gürtel und zusätzlich einer kleinen und großen Variante insg. 20 Gürtel erstellen. Das heißt auch 20 lokale Variablen im Hazardclonk.   Man könnte es sicher auch über eine Funktion mit zahlreichen if Verschaltelungen lösen, aber das dauert länger und ist fehleranfälliger.
Oder es geht bestimmt auch mit einem Arraysystem, aber das kann ich noch nicht und noch komme ich so zurecht, auch wenn ich manchmal 100 lokale Variablen in einem Objekt habe :D

Die erwähnten globalen Funktionen brauche ich nun vermutlich, wenn der Gürtel abgelegt wird. Denn angenommen normal ist eine Menge von 300Munition. Mit nem Gürtel kann er sie dann auf 600 aufstocken. Nimmt er den Gürtel wieder ab, bleibt der bestand bei 600 und er könnte mit dem nächsten Gürtel dann letzlich alles aufstocken, was natürlich nicht so geplant ist :D  deswegen brauche ich vermutlich im TimerCall UpdateCharge vom Hazardclonk eine Überprüfung wieviel Munition gerade getragen wird und ob das die maximale  Menge übersteigt.  Mit DoAmmo könnte ich die Munition dann wieder reduzieren und dafür Munitionskisten erscheinen lassen.
Problem ist: Wie überprüfe ich die aktuelle Menge? 
Es gibt noch die 2 globalen Funktionen:

global func GetAmmo(id ammoid, object target)
{
  // gar keine Munition
  if(!(ammoid->~IsAmmo())) return(0);

  // Kann 0 sein bei Objektlokalen Aufrufen.
  if(!target) target=this();
  // Entsprechendes Munitionslagerobjekt suchen
  var obj = target ->~ AmmoStoring();
  if(!obj) obj = target;
  // no ammo rule
  if(ObjectCount(NOAM))
    if(obj ->~ IsAmmoStorage())
      return(0);
  var ammo;
  if(ammo=FindContents(ammoid, obj))
    return(ammo->Local(0));
  else
    return(0);
}

global func CheckAmmo(id ammoid, int count) {

  if(!ammoid) return(false);

  // gar keine Munition
  if(!(ammoid->~IsAmmo())) return(false);

  if(!Par(2)) Par(2) = this();
  var iSum = 0;

  // search
  for(var i=2; i<10 && Par(i); ++i) {
    // no ammo rule
    var obj = Par(i) ->~ AmmoStoring();
    if(!obj) obj = Par(i);
    if(ObjectCount(NOAM))
      if(obj ->~ IsAmmoStorage())
        return(true);
    iSum += GetAmmo(ammoid,obj);
  }

  if(iSum >= count)
    return(true);
  return(false);
}


Wäre eine der beiden Funktionen hilfreich, um auf die Menge zu kommen? Die zweite gibt ja nur true oder false aus, also vermutlich nicht, oder? Und die erste gibt return(ammo->Local(0)); aus, wobei ich nicht weiß, was das nun tatsächlich heißt...
Parent - By Serpens66 (More than 200 posts.) Date 03.11.2014 17:47
Problem ist übrigens gelöst, GetAmmo() war die hilfreiche funktion in diesem Fall :)
Up Topic Deutsch / Hilfestellung / [Gelöst] maximale Munition von einzelnen Hazardclonk erhöhen

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill