Clonk-Center Titelbild

Inserate / Script Fehler finden




SchreiberSimsi
Datum26.06.2008 18:29:47
KategorieClonkscript:Scripthilfe
StatusVeraltet
Interessiertekeine


Ich brauch Hilfe für mein Script.
Es sollte machen, dass wenn man einen fremden Hazard "sieht" (freier pfad) dann wird sie erst sichtbar.

hier das Script:    //VERALTET, downloadlink gibts unten

/*-- Sichtbarkeits-Script --*/

#strict

func Initialize() {
  for(var i in FindObjects(Find_ID(HZCK)))  {     //sucht alle Hazards
    i->SetVisibility(VIS_Owner);                  //jeder clonk wird nur für den besitzer sichtbar
    Local(1, i) = CreateArray(GetPlayerCount());  //erstellt ein array wo für jeden "echten" spieler ein element drin ist
    Local(1, i)[GetOwner(i)+1] = 1;               //Stellt die sichtbarkeit für den besitzer im array schonmal auf 1
  }                                               //(1 = Sichtbar, 0 = Unsichtbar)
  return(1);
}

func Timer() {
  for(var i in FindObjects(Find_ID(HZCK)))  //Sucht alle Hazards
    for(var OwnClonk in FindObjects(Find_ID(HZCK), Find_Not(Find_Owner(GetOwner(i)))))  //Sucht noch die anderen
      if(PathFree(GetX(i), GetY(i), GetX(OwnClonk), GetY(OwnClonk)) && ObjectDistance(i,OwnClonk) <= 50) //Freier weg und nicht zu weit?
        if(GetPlayerType(GetOwner(OwnClonk)) == C4PT_User) //wird der Hazard überhaupt von einem "echten" spieler gesteuert?
          if(Local(1, i)[GetOwner(OwnClonk)+1] == 0) //ist die entsprechende variable für den Spieler noch auf 0?
            {
            Local(1, i)[GetOwner(OwnClonk)+1] = 1;   //so wird sie auf 1 gesetzt
            Log(Format("%s hat einen Terroristen entdeckt",GetPlayerName(GetOwner(OwnClonk))));  //und eine nachricht ausgegeben
            }
  for(var i in FindObjects(Find_ID(HZCK)))  //sucht alle Hazards
    for(var x = 0; x <= GetLength(Local(1, i)); x++)  //guckt die lokale variable durch
      if(Local(1, i)[x] == 1)                         //guckt, ob i für irgendeinen spieler schon sichtbar ist
        Local(0, i) = Local(0, i)+GetBit_vSimsi(x);   //dann wird die nächste local neu gesetzt.
  i->SetVisibility(VIS_Local);                        //und der clonk entsprechend sichtbar gemacht.
}

private func GetBit_vSimsi(int iZahl) {
  var iZahl2 = iZahl-1;
  if(iZahl == 1) return(1);
  else
    return(2**iZahl2);
}    

ich denk es ist gut auskommentiert zum besser verstehen.
Syntax-Errors oder so sind keine drin, es geht rein ums logische.
Bisher blinkt der eigene Clonk immer, und wenn man einen fremden "sieht" dann wird zwar die nachricht geloggt, aber er wird nicht sichtbar.

Ich wär bereit bis zu 70 Clunker zahlen.
20 gehen auf Sven2s Konto, er hat geholfen aber halt nur teilweise

hier der downloadlink:
http://rapidshare.de/files/39885779/Left_Research.c4s.html
einfach nach dem start ein team auswählen, den clonk an die richtige position setzen und dann "Hazards()" und "CreateObject(VIS_)" eingeben. dann kann man die verlorene forschungsstation erforschen ;)


7 Kommentare


21.11.2008 17:27 von mralmani:
>Es sollte machen, dass wenn man einen fremden Hazard "sieht" (freier pfad) dann wird sie erst sichtbar.


Bisschen schwer zu verstehn der Satz. Schreib: Dann wird dieser Hazardclonk erst sichtbar. Aber ist ne gute Idee von dir. sollte man mit ALLEN Objekten machen :)

22.10.2008 10:15 von M4ddin:
Dieser Script wird einen unheimlichen Lag verursachen.

29.06.2008 9:55 von Simsi:
stimmt, aber wie kann ich das ändern?

EDIT:
also jez bin ich soweit, dass man ein clonk "entdecken" kann, und der dann auch sichtbar wird.
in dem link oben, hab ich eine hilfsfunktion die zwei hazards erstellt, und man kann aber komischerweise nur den rechten "entdecken" obwohl beide eigentlich identisch sind.
woran kann das liegen.
die nachricht wird beim linken auch geloggt.
hier mal der ablauf:
wenn man erst den rechten "entdeckt" dann wird er sichtbar, die nachricht wird geloggt, alles läuft bestens. wenn man dann den linken "entdeckt", wird die nachricht geloggt, und beide werden unsichtbar!?
wenn man erst den linken "entdeckt" wird die nachricht geloggt, und er wird nicht sichtbar, entdeckt man dann den rechten wird der sichtbar, und die nachricht wird auch geloggt.
Zuletzt geändert: 01.07.2008 19:23

27.06.2008 18:50 von Sven2:
Naja; dann ist es auch logisch falsch: Es wird nur einmal die Lognachricht ausgegeben, aber das Bit in Local(0) wird jedes Mal wieder addiert.


Zuletzt geändert: 27.06.2008 18:50

27.06.2008 18:14 von Simsi:
also es ist ein objekt, das halt eine timer funktion namens "Timer" hat.
das mit dem Find_Exclude wer ich nochmal überarbeiten.
GetPlayerType() kannte ich bisher noch nicht =) werds aber auch einbauen.

27.06.2008 18:08 von Sven2:
Ist das Script im Szenario oder im Hazardclonk, oder in einer Spielregel??

Wenn es im Hazardclonk ist, geht das nicht, weil du bei der Initialisierung jedes Hazardclonks die Arrays für alle anderen Hazardclonks neu erstellst.

Wenn es ein Szenarienscript oder das Script eines anderen Objektes (Spielregel?) ist: Was ruft die Funktion "Timer" auf? Und warum machst du Find_Exclude(), wenn es nicht mi Hazardclonk steht?

Ansonsten sehe ich noch, dass "GetOwner(OwnClonk) <= GetPlayerCount()-1" Quatsch ist. Nimm dafür if (GetPlayerType(GetOwner(OwnClonk)) == C4PT_User).

Dann steht noch " i->SetVisibility(VIS_Local);     " ganz nach der Schleife. Hast du den {...}-Block vergessen?

Dann noch diese GetBit-Sache: "2^iZahl2" ist nicht die Potenz sondern bitweises Xor. Du meinst vermutlich 2**iZahl2, oder besser einfach 2<<iZahl2.
Zuletzt geändert: 27.06.2008 18:10

27.06.2008 17:37 von Kevda:
Was hat es denn mit diesen "in" aufsich? Muss man aber sowieso nicht bei den for Schleifen Semikolons benutzen?