[Tutorial] Zollsystem [Anfänger]

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link



  • Guten Tag liebe Leser dieses Tutorial.
    Diesen Tutorial befasst sich mit dem erstellen eines Zollsystems , welches sehr einfach erweiterbar ist in der hinsicht auf
    weitere
    Zollschranken. Zu dem wird hier auch noch gezeigt wie man diese
    Zollschranken auch ganz einfach per Dialog verschließen kann.


    Da dies mein erstes Tutorial ist , welches ich als offizielles Tutorial hier in diesem Bereich
    zur Verfügung stelle. Möchte ich zu mal die Schwierigkeitgrade der System, welche hier wo möglich noch von
    mir beschrieben und vorgestellt werden erläutern.Dies soll dazu dienen das
    man weiß, ob man mit diesem Tutorial auf Grund seiner eigenen Leistungen
    bewältigen kann und somit noch was dazu lernt.Mein Ansicht ist dazu das es nichts
    bringt , wenn man ein Tutorial absolvierr, da man nicht
    weiß was man macht beziehungsweise nicht weiß , welche Elemente genau dafür benutzt werden und warum.


    [tabmenu]


    [tab='Einsteiger']
    Wenn man frisch in PAWN ist, so bist du bei solch einem Tutorial genau richtig hier werden
    nicht so fortgeschrittenere Themen aufgezogen und sämtliche
    Funktionen/Callbacks/Operator... und ihre funktionen werden hier genau
    erklärt und verdeutlicht.
    [tab='Anfänger']
    Solltest du schon ein bisschen Ahnung haben von PAWN von den
    Callbacks/Funktionen/Operator und den meisten Keywords haben so bist du
    bei diesen Schwierigkeitsgrad genau richtig. Hier werden nur untypische Verwendungen Erklärt.
    [tab='Fortgeschritten']
    Solltest du Ahnung von PAWN haben den meisten
    Callbacks/Functionen/Operator/Keyword .. haben so bist du bei diesem
    Schwierigkeitsgrad genau richtig.
    Hier heißt es selbst mit denken sehr schwierge Bereiche werden
    angesprochen die meist in Ausnahmefällen ihre ständige verwendet
    erfordert.
    [/tabmenu]




    [tabmenu]


    [tab='Bilder']

    Bilder









    [/tabmenu]


    Inhaltsverzeichniss


    • 1.0 Vorraussetzungen
    • 1.1 Basis zum Zollsystem
    • 1.2 Erstellen der Zollschranken zum Zollsystem
    • 1.3 Command zum Zollsystem
    • 1.4 Timer für die Zollschranken
    • 2. Command zum schließen der Zollschranken | Aufruf des Dialoges
    • 2.1 Dialog zum schließen/öffnen der Zollschranken

    Vorraussetzungen

    Bevor wir Anfangen benötigen wir erstmal 2 Plugins das sscanf & streamer plugin , welche auf folgenden Link zu finden sind

    1.1 Basis zum Zollsystem


    Nun erstellen wir erstmal die Basis. Dazu benötigen wir zu mal ein enum, welches als index für das folgende 2D Array dient.

    Das enum beinhaltet 12 Floats da wir die X- Koordinate, Y- Koordinate, Z- Koordinate, RoatationX- Koordinate,

    RoatationY- Koordinate und die RoatationZ- Koordinate brauchen und dies zwei mal da wir in das Array die
    Position des
    Zollschranken eintragen einmal geschlossen und einmal offen.
    zObject wird für die Modelid genutzt und zID ist nicht umbedingt nözig jedoch

    schreibe ich dies einfach dazu da wir die ID des Objektes in einer Variabel speichern müssen,
    um das Object mit MoveDynamicObject zu verschieben.

    zState ist der Status der Zollschranke, welchen wir abfragen werden beim "/zoll" Befehl damit das Skript
    erkennt das die jeweiligen Zollschranke gesperrt ist.



    Nun
    haben wir den Index für die zweite Dimension des Arrays , welches wir
    natürlich auch nun erstellen. Der Vorteil mit einem Array zu arbeiten in
    diesem falle
    ist das dies sehr übersichtlich ist und somit kann man neue Zollschranken ganz leicht hinzufügen mit nur einer Zeile.


    Code
    new ZollInfo[MAX_ZOLLGATES][zollsys] = {
    {0,978,53.61148071,-1525.98864746,4.87745094,0.00000000,0.00000000,83.37002563,53.61148071,-1525.98864746,-6.87745094,0.00000000,0.00000000,83.37002563,false},
    {1,978,55.77261353,-1539.03112793,4.95321989,0.00000000,0.50000000,79.91503906,55.77261353,-1539.03112793,-6.95321989,0.00000000,0.50000000,79.91503906,false},
    };


    Wie
    man hier schon sieht habe ich schon zwei Tore hinzugefügt und es
    existiert hier schon MAX_ZOLLGATES was man natürlich noch definieren
    muss mit

    Code
    #define MAX_ZOLLGATES (Toranzahl)


    in meinem Falle

    Code
    #define MAX_ZOLLGATES (2)


    Die
    defines sind konstante Werte und existieren beim Kompielen in der AMX
    nicht mehr da diese ersetzt werden durch den Wert, String , Code oder
    Farbcode, welcher sich dahinter verbirgt.


    Beispiel:

    Code
    for(; i < MAX_ZOLLGATES; ++i)


    wird zu

    Code
    for(; i < 2; ++i)


    Die Klammern sind nicht nötig beim deklarieren von Zahlen.
    Was
    man jedoch auch noch zum Thema Array wissen sollte ist, das dies
    weniger Memory verbraucht als das deklarieren von mehreren Variabeln.
    Der Grund dafür ist das Arrays beim compilen keine einzelne Zeile einnimmt pro Wert.

    Code
    new array[5] ={1, ...};
    1,1,1,1,1


    Code
    new var1=1,var2=1,var3=1,var4=1,var5=1;
    1
    1
    1
    1
    1


    1.2 Erstellen der Zollschranken zum Zollsystem


    So
    nun haben wir das Array mit den Toren nun sollten diese auch erstellt
    werden unter OnGameModeInit dies tuhen wir mit einer for-Schleife(loop).


    Code
    new i;
    for(;
     i < MAX_ZOLLGATES; ++i)ZollInfo[i][zID] = 
    CreateDynamicObject(ZollInfo[i][zObject],ZollInfo[i][zCX],ZollInfo[i][zCY],ZollInfo[i][zCZ],
    ZollInfo[i][zCRx],ZollInfo[i[zCRy],ZollInfo[i][zCRz]);


    Was
    man hier sieht ist das , das i außerhalb der for-schleife deklariert
    habe. Was bewirken soll, dass die for-Schleife schneller ist. Ob dies
    der fall ist
    garantiere ich nicht jedoch war dies bei mir so nach
    mehreren Tests, dass diese Art der For-schleife schneller war, als die
    alt bekannte Variante
    for(new i; i < MAX_ZOLLGATES; ++i). Jetzt
    werden sich auch bestimmt ein paar Fragen warum ++i und nicht i++ das
    ist in PAWN Leider das selbe.
    Normal ist das erhöhen von einem Werte
    mit ++i dem Inkrement Operator schneller als mit dem Dekrement Operator,
    da der Postfix-Version
    eine Kopie von sich anlegen, erst dann kann sie sich Inkrementieren. Das muss die Präfix-Version nicht daher ist sie schneller.
    Jedoch gilt dies nicht meines Erachtens in PAWN.


    1.3 Command
    zum öffen/schließen der Zollschranken



    Zum Befehl hin könnt ihr natürlich auch einen Commandprozessor verwenden ob YCMD, ZCMD , RCMD , OCMD ... es ist völlig egal,
    jedoch gibts hier unterschiede in der Geschwindigkeit. Der schnellste Commandprozessor ist YCMD.
    Nun mal zum Aufruf des Befehls allgemein mit strcmp.
    Es gibt ja viele möglichkeiten dies zu tun

    Code
    if (!strcmp(cmdtext,"/zoll"))


    Code
    if (!strcmp(cmdtext,"/zoll", true))


    Code
    if (strcmp("/zoll", cmdtext, true, 5) == 0)


    Aber warum geht den dies überhaupt mit dem Ausrufezeichen (!) ?


    Es geht daher, da es wie bei jedem anderen code auch die selbe abkürzung für 1 ist. Was meine ich damit genau ?

    Code
    new var = 1; 
    if(var){ 
    
    
    }


    Hier sieht man die vereinfachung von

    Code
    if(var == 1)


    Also sähe das ursprünglich bei dem strcmp befehl so aus

    Code
    if (!strcmp(cmdtext,"/zoll", true) == 1)


    beziehungsweise in der richtigen Form

    Code
    if (strcmp(cmdtext,"/zoll", true) != 1)


    Also alles außer 1 und da strcmp beim Vergleich unterschiedliche werte zurück gibt, wie sollte der string identisch sein so wird der wert 0 wieder gegeben.
    Daher kann man sich merken sollte eine Funktion die man benutz oder eine Variabel den wert 1 haben so
    ist dies die mögliche Abfrageform.


    Nun gehen wir zum weiteren Teil des Command hier wird eine for-schleife benutzt die durch die ganzen Werte geht , welche in de Array enthalten sind.
    Manche werden sich bestimmt fragen, warum hier ein boolean benutz wird. Nun gut lasst es mich erklären. Ich benutze dies um
    falls der Spieler nicht in der nähe einer Zollschranke ist zum Schluss die Nachricht auszugeben das der Spieler nicht am Zollschranke ist.
    Daher wird der wert das Boolean auf den wert true gesetzt und wie man vorher lernen konnte ist dies auch dies zum Schluss eine mögliche Abfrageform ob der Wert 1 ist.
    Sollte dies sein, so bekommt der Spieler die Nachricht. Nun sollte der Spieler an einer Zollschranke sein
    so wird der Code an der Stelle abgebrochen und daher auch der Wert auf 0 gesetzt in dem Falle hier false. (false = 0 | true = 1)
    Nun beim Timer ist dies so das hier die Ordnungszahl des jeweiligen Tores an das public per SetTimerEx übergeben wird.
    Was man hier noch von eurer Seite hinzufügen kann ist das automatisch beim betätigen des Command der jeweilige Timer Abgebrochen
    und danach neu Aufgerufen wird, dass hätte den Vorteil ,das nicht aufeinmal die Zollschranke zu geht nachdem man die Zollgebühr bezahlt hat.
    Aber ich hab dies mit absicht weg gelassen. Sollte jemand das Tutorial bis hier in ausführlich gelesen haben so ist er auch dementsprechend
    informiert und sollte/könnte dies auch noch hinzufügen.







    1.4 Timer zum schließen der Zollschranke







    Code
    forward CloseZollGate(zollid); 
    public CloseZollGate(zollid) MoveDynamicObject(ZollInfo[zollid][zID],ZollInfo[zollid][zCX],ZollInfo[zollid][zCY],ZollInfo[zollid][zCZ],2.0,ZollInfo[zollid][zCRx],ZollInfo[zollid][zCRy],ZollInfo[zollid][zCRz]);


    Hier wird die Zollschrank auf ihre ursprünglich Position gesetzt. Man braucht dafür keine Klammern solang nur einmal
    ein Aufruf einer Funktion statt findet oder die Veränderung eines Wertes usw... .


    Daher ist sowas auch möglich man kann sich somit auch die Klammern sparen

    Code
    for(new i; i < MAX_PLAYERS; ++i)if(IsPlayerConnected(i))SetPlayerPos(i,0.0,0.0,0.0);


    geht auch so


    Code
    for(new i; i < MAX_PLAYERS; ++i) 
    	if(IsPlayerConnected(i)) 
       	SetPlayerPos(i,0.0,0.0,0.0);


    Das macht jedoch kein Unterschied zur Benutzung mit Klammern in dem Fall.





    Command zum schließen der Zollschranke






    Code
    else if (!strcmp(cmdtext,"/cgate")){ 
    ShowPlayerDialog(playerid,DIALOG_CLOSE_ZOLL,DIALOG_STYLE_LIST,"Zollverwaltung",ZOLLCSTRING,"Auswählen","Schließen"); 
    return 1; 
    }



    Nun gut hier wird ein Dialog aufgerufen mit der jeweiligen ID, welche wir mit einem #define festgelegt haben. Da ich mir noch was kleines Einfallen lassen hab verwenden wir hier einen schlauen String "ZOLLCSTRING". Der ist in sofern schlau da er die größe des String beim compilen festlegt. Daher auch

    Code
    new ZOLLCSTRING[(MAX_ZOLLGATES*50)];


    Beim compilen multipliziert er 50 mit der Anzahl von MAX_ZOLLGATES sollte dies 2 Sein so ist der String 100 Zeichen groß.


    Jedoch das der string das was wir wollen enthält so müssen wir den String natürlich erstmal formatieren

    Code
    stock ZollDialogText() 
    { 
    strdel(ZOLLCSTRING,0,sizeof(ZOLLCSTRING)); 
    new i; 
    for(; i < MAX_ZOLLGATES; ++i)format(ZOLLCSTRING,sizeof(ZOLLCSTRING),"%s{FFFFFF}Zoll %d | %s\n",ZOLLCSTRING,i,((ZollInfo[i][zState])?("{FF0000}geschlossen"):("{00FF00}offen"))); 
    }


    Dazu will ich noch anmerken das man 1 String für alles benutzen kann solange man ihn vor der Verwendung leert.
    Um vorzubeugen das andere Elemente doch im string enthalten sind. Da hier der string formatiert werden muss wegen dem Status der Schranke ist man gezwungen format zu benutzen sollte dies nicht der Fall sein so empfehle ich die string Functionen zu benutzen da dies meist schneller sind als format.

  • 2.1 Dialog zum schließen des Zolles



    Ich benutz meist für die Dialogids case und für die listitems if-Statements
    das ist jedem dennoch selbst überlassen es schenkt sich im großen und
    ganzen sag ich mal nix es sind nur kleine unterschied und zwar das
    else if abfragen schneller sind als die Verwendung von switch. Jedoch
    wenn man die möglichkeit hat Ternäre Operatoren zu verwenden was eine vereinfachung von


    Code
    if(...)
    ...
    else
    ....


    ist und sind zu dem noch schneller da er keine Anweisung durchführen muss, sondern nur
    Werte zurück gibt. Was man hier nun noch beachten sollte ist das man
    bei der Verwendung von mehreren if-Abfragen ein else if benutzt da dies
    schneller ist als ständig neue if abfragen aufzurufen da die
    hinzugefügten else if zur if abfrage dazu gehören


    der code geht
    solange weiter bis eines davon richtig ist. Daher kann man einer if
    Bedingung unendlich viele else if Bedingung anhängen jedoch nur eine
    "else".


    Nun ruf ich danach eine for-schleife und lass auch danasch die richtige Zahl in einer variabel Temporär speichern unter


    Code
    ZollClickID[MAX_PLAYERS char];


    Das char reduziert den Memory Verbrauch (RAM) vom Skript von normale 2000
    bytes auf 500 der einzigste nachteil ist nun das nur Zahlen von 0 bis
    255 gespeichert werden. Das bedeutet das eine Zelle nur 8 Bits fast.
    Dies genügt um ein Zeichen zu Speichern oder eine Zahl. Mann kan
    dies auch noch tun in dem man den deklarierten variabeln gleich noch
    ihren Datentyp zuweisst.Jeder normale deklarierte Integer wird als langer
    Integerwert gehandelt und verbraucht 4 bytes durch new int:....; werden
    nur 2 bytes verbraucht jedoch können nur Werte von -32 768 .. 32 767 gespeichert werden.


    Die for-schleife geht nun von 0 - MAX_ZOLLGATES besser gesagt bis 1 sollte
    nun das gedrückte listitem der Zahl entsprechen so wird die Schleife abgebrochen.
    Die jeweilige deklarierten Variabeln-Array wird der jeweiligen Wert
    zurgeordnet und ein Icon wird auf der map angezeigt. Dies ist hier nur als kleines
    zusätzliches
    Feature drinne das man ungefähr weiß wo dies liegt und um die Schleife
    abzubrechen rufe ich per return gleich den Dialog auf.


    Dort kann man nun den jeweiligen wert eingeben den man will daher benutze
    ich auch sscanf um die eingabe zu überprufen nun kann man true , false ,
    1 , 0 eingeben dies dient zum verändern des Status der Zollschranke, ob diese dann zu oder offen ist.
    Jedoch kann man auch andere Werte eingeben, jedoch kann man die Zollschranke nur noch mit 0 oder false entsperren.
    Nun wird noch eine stock-function aufgerufen um nochmal den string zu formatieren.



    Code
    stock ZollDialogText()
    {
    	strdel(ZOLLCSTRING,0,sizeof(ZOLLCSTRING));
    	new i;
    
    
    	for(; i < MAX_ZOLLGATES; 
    ++i)format(ZOLLCSTRING,sizeof(ZOLLCSTRING),"%s{FFFFFF}Zoll %d | 
    %s\n",ZOLLCSTRING,i,((ZollInfo[i][zState])?("{FF0000}geschlossen"):("{00FF00}offen")));
    }


    hier
    wird der string gecleart damit keine unerwünschte Inhalte im String
    enthalten sind und mit format demenstprechend formatiert hier wird noch
    ein Operator verwendet
    der Ternäre Operator mit Farbcode er vereinfacht das typische

    Code
    if(...){
    
    
    }else{
    
    
    }


    ist
    jedoch weit aus schneller und sehr praktisch der erste ist der true
    wert nach dem ? der zweite der false wert , eine erklärung dazu ist ja
    schon oben erfolgt,
    wie das posten des Codes.



    Ich hoffe das Tutorial war ausführlich genug erklärt.
    Sollte es Probleme geben könnt ihr dies gerne posten


    Mit freundlichen Grüßen IPrototypeI



    Edits:


    Dieser Teil ist ebenso von IPrototypeI

  • Um hier noch was zu ergänzen dieses Grundsystem kann man natürlich dafür verwenden um ein Torsystem zu erstellen.
    dazu müsste man nur das enum und das array erweitern mit den fraktionen und diese auch noch beim Command abfragen

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Danke falls es ihrgend welche unklarheiten geben sollte können auch gerne Fragen gestellt werden.


    um einen teil zu korrigieren switch ist in Pawn schneller als else if
    In C++ ist das nicht so das sind else if abfragen schneller als switch jedoch ist beides nicht so schnell wie der Ternäre Operator

  • habe ein Problem


    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(113) : error 017: undefined symbol "MAX_ZOLLGATES"
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(217) : error 017: undefined symbol "Toranzahl"
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(219 -- 221) : error 028: invalid subscript (not an array or too many subscripts): "i"
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(221) : warning 215: expression has no effect
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(221) : error 001: expected token: ";", but found "]"
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(221) : error 029: invalid expression, assumed zero
    C:\Users\Chris\Desktop\0.3x\gamemodes\Script.pwn(221) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    6 Errors.


    Was ich bis jetzt habe


    Oben im Script:
    //ZollSysthem
    enum zollsys {
    zID,
    zObject,
    Float:zCX,
    Float:zCY,
    Float:zCZ,
    Float:zCRx,
    Float:zCRy,
    Float:zCRz,
    Float:zOX,
    Float:zOY,
    Float:zOZ,
    Float:zORx,
    Float:zORy,
    Float:zORz,
    bool:zState,
    };
    new ZollInfo[MAX_ZOLLGATES][zollsys] = {
    {0,973,1754.4000244,525.9000244,27.2999992,0.0000000,0.0000000,160.0000000,false},
    {1,973,1745.9000244,528.9000244,27.2999992,0.0000000,0.0000000,160.0000000,false},
    {2,973,1737.5999756,532.2999878,27.2999992,0.0000000,0.0000000,340.0000000,false},
    {3,973,1729.4000244,535.4000244,27.2999992,0.0000000,0.0000000,340.0000000,false},
    {4,979,433.3999939,597.4000244,18.7999992,0.0000000,0.0000000,34.0000000,false},
    {5,979,-139.5000000,473.2000122,11.8999996,0.0000000,0.0000000,346.0000000,false},
    {6,978,-1303.8994141,934.0000000,45.7000008,0.0000000,0.0000000,315.9997559,false},
    {7,978,-1309.5999756,939.5000000,45.5999985,0.0000000,0.0000000,316.0000000,false},
    {8,978,-1297.5000000,927.2000122,45.7000008,0.0000000,0.0000000,136.0000000,false},
    {9,978,-1291.3000488,921.9000244,45.7000008,0.0000000,0.0000000,136.0000000,false},
    {10,978,-2686.3999023,1275.8000488,55.2999992,0.0000000,0.0000000,0.0000000,false},
    {11,978,-2695.1999512,1275.5999756,55.2999992,0.0000000,0.0000000,0.0000000,false},
    {12,978,-2677.0000000,1275.0999756,55.2999992,0.0000000,0.0000000,180.0000000,false},
    {13,978,-2667.3000488,1275.0999756,55.2999992,0.0000000,0.0000000,180.0000000,false},
    {14,978,-2256.3999023,2681.6000977,55.0000000,0.0000000,0.0000000,270.0000000,false},
    {15,978,-2256.8000488,2672.5000000,54.7999992,0.0000000,0.0000000,270.0000000,false},
    {16,978,-2254.8000488,2644.5000000,55.2000008,0.0000000,0.0000000,90.0000000,false},
    {17,978,-2254.5000000,2635.8999023,55.2000008,0.0000000,0.0000000,90.0000000,false}
    };


    #define MAX_ZOLLGATES (Toranzahl)


    bei OnGameModeInit:
    //Zoll
    for(new i; i < MAX_ZOLLGATES; ++i)
    {
    ZollInfo[i][zID] =
    CreateDynamicObject(ZollInfo[i][zObject],ZollInfo[i][zCX],ZollInfo[i][zCY],ZollInfo[i][zCZ],
    ZollInfo[i][zCRx],ZollInfo[i[zCRy],ZollInfo[i][zCRz]);
    }


    Ich bin das Tutorial einige male durchgegangen und habe jetzt immer noch einige errors ich glaube ich muss mich noch anders schlau machen :/

  • Du hast dir eindeutig hier nix durchgelesen, Alles rein kopiert, deine koordinaten eingefügt und dich darauf vllt gefreut das es geht.


    1. Schau dir das define an
    #define MAX_ZOLLGATES


    - Die gehört über das Array, zu dem steht da nicht ohn egrund das wort Toranzahl dran die Anzahl der Zolltore die du in deinem array verwendest hier kommt eine Zahl rein.


    2. Schau dir mal das enum an und danach die eingetragenen Werte in das array ich hoffe dir fällt was auf



    zID,zObject,Float:zCX,Float:zCY,Float:zCZ,Float:zCRx,Float:zCRy,Float:zCRz,Float:zOX,Float:zOY,Float:zOZ,Float:zORx,Float:zORy,Float:zORz,bool:zState,
    0,973,1754.4000244,525.9000244,27.2999992,0.0000000,0.0000000,160.0000000,false


    3. Den Letzten Fehler darfst du selbst suchen die Zeile ist ja schon angegeben das war mit mutwillen gegen copy paster den man nur durch
    selbst schreiben des codes nicht macht oder durch genaues hinschauen kurz ergänzen kann.

  • nach dem öfteren anschauen ist mir auch aufgefallen das ich die in meinem falle (19) bei MAX_ZOLLGATES vergessen habe


    auch das mit den Kordinaten ich dachte das währen nur die Positionen und rotationen vom Ori Gate aber da muss ich ja auch noch die eintragen wie es ist wenn es unten ist habe ich also auch eingetragen


    Ich hatte nach diesen beiden Fehlerbehebungen immer noch genau die selben errors gerade bei diesem: for(new i; i < MAX_ZOLLGATES; ++i)
    {
    ZollInfo[i][zID] =
    CreateDynamicObject(ZollInfo[i][zObject],ZollInfo[i][zCX],ZollInfo[i][zCY],ZollInfo[i][zCZ],
    ZollInfo[i][zCRx],ZollInfo[i[zCRy],ZollInfo[i][zCRz]);
    }
    bei diesem Teil muss ich zugeben das ich es wirklich nur ins Script eingefügt habe da ich nocht weis was das ist und soll und bringt



    ALLES ANDERE HABE ICH MIR DUCHGELESEN VERSUCHT ES ZU VERSTEHEN UND NICHT NUR KOPIERT

  • Schau dir den code doch mal an und zerleg ihn in seine einzelteile ab dem error abschnitt



    for(new i; i < MAX_ZOLLGATES; ++i){
    ZollInfo[i][zID] = CreateDynamicObject(ZollInfo[i][zObject]
    ,ZollInfo[i][zCX]
    ,ZollInfo[i][zCY]
    ,ZollInfo[i][zCZ]
    ,ZollInfo[i][zCRx]
    ,ZollInfo[i[zCRy]
    ,ZollInfo[i][zCRz]
    );
    }


    Es sticht ja so gesehen schon raus oder besser gesagt rein