Clonk-Center Titelbild

Inserate / Script für Inventarerhaltung.




SchreiberAchazLord
Datum26.10.2008 10:30:06
KategorieClonkscript:Allgemein
StatusAbgeschlossen
Interessiertekeine


ich bräuchte ein script, das die Ausrüstung (das Inventar und das Geld) eines Clonkes speichert und ihm beim start eines neuen szenarios diese gibt. (nein es ist nicht zum cheaten sondern für ein Abenteuerprojekt)
ich kann leider nicht mehr als ein großes Dankeschön und bis zu 50 clunker entbehren


25 Kommentare


28.10.2008 19:16 von Kevda:
Ja das ließe sich auch machen Methos, wobei man die ganzen Extrasymbole einbeziehen müsste. Im Endeffekt finde ich aber trotzdem meine Idee sinnvoller.

28.10.2008 18:00 von Methos:
@Kevda

Es ließe sich aber jedem Buchstaben eine Zahl zuordnen, die dann per Script gelesen und zusammengesetzt, bis sich daraus die gesuchte ID ergibt.

28.10.2008 17:37 von Kevda:
http://www.clonk.de/docs/de/sdk/script/Typechecks.html

Int kann nicht zu ID umgewandelt werden, außer die ID besteht nur aus Zahlen.

IDs sind nicht Szenarioabhängig, aber Objektnummern.

28.10.2008 16:58 von Feuermonster:
Ich meine mein ueberarbeitetes Script (nicht das, was da steht.)
Das schreibt CastInt(id) in die ExtraDaten und CastC4ID um wieder umzuwandlen.
Aber dabei kommt auch nur Mist raus. (und ich denke, IDs sind wohl kaum Szenarioabhaengig)

28.10.2008 16:14 von Kevda:
Feuermosnter eine Objektnummer ist immer Szenarioabhängig, wie Sven2 schon gesagt hat. Die Objektnummern werden verteilt je nachdem, wann ein Objket erzeugt wurde. Somit sind Objektnummern ID unabhängig.

28.10.2008 7:49 von AchazLord:
bei mir hat es gefunzt kann aber auch sein das ich was falsch eingestellt hatte (startsachen)

27.10.2008 23:38 von Sven2:
Das Script von Feuermonster braucht erstens einen Berg Variablen und speichert zweitens offenbar Objjektnummern. Das kann eigentlich nur gehen, so lange man es im gleichen Szenario verwendet und die Objektnummern gleich bleiben.

Warum du casten willst, weiß ich nicht. Das Script von Kevda sieht eigentlich besser aus.

27.10.2008 22:25 von Feuermonster:
Nun. Es speichert es in den ExtraDaten eines Spielers. Leider koennen da irgendwie keine IDs gespeichert werden. Also hab ich versucht, sie in eine Ganzzahl via CastInt zu bringen, um sie anschliessend mit CastC4ID wieder umzuwandeln. Aber irgendwie failt CastInt oder CastC4ID. (Koennte ein Entwickler mal dazu Stellung nehmen, bitte?) Und ja, das Script funktioniert. Wenn die Umwandlung funktionieren wuerde. Notfalls muss ich zu uebleren Hacks greifen und mir die Int<->ID Umwandlungs Funktion selber schreiben. (Das waere zwar auch nicht die Welt.)

Es ist so, dass das Script die Daten schreibt (wie es sie schreiben sollte, es werden Ganzzahlen gespeichert). Aber LoadContents (was dann CastC4ID verwendet) kann sie nicht wieder richtig umwandeln. Ich muss das mal noch genauer testen.

Eine zweite Moeglichkeit waere C4Id zu nehmen, und Strings zu speichern.
Da man Strings aber nicht speichern kann, muesste ich zusaetzlich noch etwas bauen, was die Strings zuverlaessig codiert damit ich sie speichern kann.
Zuletzt geändert: 27.10.2008 22:31

27.10.2008 19:55 von Kevda:
Feuermonster erklär dein Script mal genauer, was speichert er und wo erzeugt er die gesp. Objekte?

27.10.2008 19:21 von Feuermonster:
Ich teste es mal.

Edit: Ok, hab es ueberarbeitet.
Aber irgendwie failt was bei CastInt(CastC4ID());
was ich bislang mal als Enginefail betitle ;)
Zuletzt geändert: 27.10.2008 19:42

27.10.2008 18:06 von AchazLord:
ich wende mich an euch falls noch fragen usw aufkommen

27.10.2008 18:05 von AchazLord:
ne ich hab es selber getestet

27.10.2008 16:57 von Quit:
>>GetLength geht doch nur für Arrays..?

>Nein.

kA, die Onlinedoku will nicht weil ich mal wieder gebannt worden bin .

27.10.2008 16:45 von Kevda:
Feuermonsters Script funktioniert wirklich? Sieht für mich sehr unübersichtlich aus, aber wenns klappt. :D

AchazLord was genau meinst du mit "meiner Quelle"? Vielleicht hat diese Quelle auch die Scripts vertauscht :P

27.10.2008 15:58 von mo_sc:
Schon ins Forum geguckt?

27.10.2008 14:01 von AchazLord:
Laut mir und ein paar Freunden funzt Feuermonsters script gut.
Ich verteile die 50 CLunker so
40 an Feuermonster für das script
10 für Kevda für die mühe
Zuletzt geändert: 27.10.2008 18:06

27.10.2008 9:40 von AchazLord:
ich werde es testen.

27.10.2008 7:50 von Feuermonster:
/* Inventar Speichern */

global func SaveContents(object pClonk,string szPrefix) {
  var _len = 0;
  for(var i = 0; i < ContentsCount(pClonk);i++) {
    var strP = Format("%s%i",szPrefix,i);
    SetPlrExtraData(GetOwner(pClonk),strP,Contents(i,pClonk)); ++_len;
  }
  SetPlrExtraData(GetOwner(pClonk),Format("%s%s",szPrefix,"InvCount"),_len);
}

/* Inventar loeschen */

global func DeleteContents(int iPlayer,szPrefix) {
  var _len = GetPlrExtraData(iPlayer,Format("%s%s",szPrefix,"InvCount"));
  for(var i = 0; i < _len; i++) {
    var strP = Format("%s%i",szPrefix,i);
    SetPlrExtraData(GetOwner(pClonk),strP,0));  
  }
}


/* Laden */

global func LoadContents(int iPlayer,string szPrefix) {
  var aResult = []; var i = -1;
  while(aResult[(i+1)] = GetPlrExtraData(iPlayer,Format("%s%i",szPrefix,++i)));
  return(aResult);
}

Koennte so klappen. Ist jetzt jedoch voellig aus dem Kopf gemacht, da Schule und ich da kein Clonk habe ;)
Zuletzt geändert: 27.10.2008 07:50

27.10.2008 7:17 von AchazLord:
sry aber das script soll ALLE Inventarobjecte und nicht nur die ausgewählten speichern. Das Geld soll auch mit übernommen werden. ich zahl dir alles wenn das script kommplett fertig ist

26.10.2008 21:04 von Deffi:
>GetLength geht doch nur für Arrays..?

Nein.

26.10.2008 20:49 von Methos:
AchazLord, den könntest du in System.c4g, dem Szen oder dem Clonk reintuen. Allerdings müsstest du dann dementsprechend erst beim Ende des Szens speichern, zudem musst du das Objekt dementsprechend wählen.

26.10.2008 18:13 von AchazLord:
Kevda wo muss ich des deinermeinung Reintun ?? In den Clonk oder des szen

26.10.2008 13:37 von Quit:
GetLength geht doch nur für Arrays..?

26.10.2008 13:05 von AchazLord:
ich teste es und schreibe dir dann ob es klappt vie viel willst du für deine Leistung?

26.10.2008 12:44 von Kevda:
Ich kann es leider nicht testen, da ich kein Clonk Rage habe und hier eine Clonk Rage Funktion verwendet wurde, aber sollte eigentlich klappen. Sag mir bitte bescheid ob es klappt oder nicht.


global func SaveObjInventar(pObj)  
{
  var pClonk = pObj;
  
  //Alle Inventaritems werden abgeklappert
  var strInvData = "";
  var iInvCount = ContentsCount ( 0, pClonk);
  var pInv;
  for(var i=0; i < iInvCount; i++)
   {
    pInv = Contents (i, pClonk);
    strInvData = Format ("%s%i", strInvData, GetID(pInv));
   }
  
  //Daten werden gespeichert
  SetCrewExtraData (pClonk, "Complete_Inventar_Save", strInvData);
  return(1);
}

global func LoadObjInventar(pObj)  
{
var pClonk = pObj;
var strInvData = GetCrewExtraData ( pClonk, "Complete_Inventar_Save");
var iStrLength = GetLength(strInvData);
var pNewObj="";

for(var i=0; i < iStrLength; i++)
  {
   pNewObj = Format ( "%s%s", pNewObj, GetCharString ( GetChar ( strInvData,i));
   if ( GetLength(pNewObj)==4)
    {
     CreateContents ( C4Id (pNewObj), pClonk);
     pNewObj="";
    }
  }

return(1);
}

global func GetCharString(c){return(Format("%c",c));}
Zuletzt geändert: 26.10.2008 12:46