Einfach Interiors setzen

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 Morgen


    Da ich ma wieder etwas Langeweile habe, zeige/erkläre ich euch, wie ihr einfach und codesparend Interiors erstellt.
    Was Benötigt ihr?
    etwas erfahrung
    Coordinaten von den eingang/ausgang des Interiors
    ein Script :D


    als erstes brauchen wir ein #define, da die Interiors nach ID aufgelistet werden und auch eine Zuordnug benötigen
    Wie ihr ein define erstellt brauch ich ja nicht erklären aber ich mach hier mal ein Muster hin:
    #define MAX_INTERIORS 1
    Ich habe da jetzt eine 1 hingeschrieben, da ich als erstes 1 Testinterior verwenden werde
    WICHTIG! wenn ihr 10 Interiors in der liste habt undbedingt den define darauf anpassen!!


    So wir haben jetzt den define da
    als nächstes benötigen wir ein Enum dazu
    In den Enum werden dann die Floats und Labels bestimmt
    Enum was das ist sollten einige wissen aber ich erklärs so gut ich weiß
    Ein Enum ist sowas wie eine Deklairung
    man Speichert in den Werten von den enum was ein sagen wir spieler so alles hat
    in den fall halt die daten für die interiors
    ich mach wieder ein Muster Beispiel:
    enum InteriorEnum
    {
    Float:enterX,
    Float:enterY,
    Float:enterZ,
    Float:exitX,
    Float:exitY,
    Float:exitZ,
    InteriorID,
    InteriorVirtualWorld,
    InteriorLabel[40]
    }
    so hier stehen jetzt einige dinge drin
    kein Problem ich sag euch eben was was ist
    enterX-Z sind die Coordinaten wo der eingang eines Interiors ist.
    exitX-Z sind die Coordinaten von den Ausgang eines Interior
    InteriorID sollte klar sein die interiorid des interiors
    InteriorVirtualWorld wenn ihr das Interior mehrmals verwenden wollt nutzt einfach die Virtualworld ansonsten auf 0 lassen
    InteriorLabel[40] Legt einen Text fest der 40 Zeichen haben darf


    So da haben wir das Grundgerüst jetzt fangen wir an mit den Setzen das ist aber auch nicht schwer zu machen
    wir brauchen eine Deklairung wo wir die interiors setzen
    deklairung = in den meisten fällen ein new:
    Ich zeig es euch mal
    new IntInt[MAX_INTERIORS][InteriorEnum]=
    Ihr seht da steht der define und der Enum wieder mit drin
    das ist ja auch der sinn jetzt hier bei
    Aber wie setzen wir jetzt ein Interior darin?
    Ganz einfach ihr macht erstmal die deklairung zuende:
    das sollte dann so enden:
    new IntInt[MAX_INTERIORS][InteriorEnum]=
    {


    };
    wenn ihr es jetzt Compilt dann erscheinen fehler
    diese beheben wir im näschten schritt
    jetzt geht es darum das interior zu setzen:
    Ich machs mal so, das ich einfach eins hier nehme und es etwas erkläre was ich aber hoffentlich nicht brauch
    {-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"}
    so das währe jetzt was was wir eintragen können
    die reinfolge der coordinaten sind ja oben nach den enum
    erst enterX dann enterY dann enterZ als näschtes dann exitX, exitY, exitZ, dann kommt die interiorID, dann die Virtualworld und dann der text der Später am eingang steht
    wenn ihr das eingefügt habt sollte es jetzt so aussehen:
    new IntInt[MAX_INTERIORS][InteriorEnum]=
    {
    {-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"}
    };
    wenn ihr darunter ein neues erstellt MÜSST ihr es mit einen , am ende haben sprich so als Muster:
    new IntInt[MAX_INTERIORS][InteriorEnum]=
    {
    {-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"},//Hier das Komma
    {-2424.7744,337.3339,37.0022, 1519.9705,-1155.4916,1013.0959 ,0 ,0 ,"Arbeitsamt"} //Hier nicht da es das letzte is
    };
    also der letzte wert darf KEIN komma am ende haben!
    wenn ihr es jetzt compilt, dann sagt er euch das IntInt nicht verwendet wird
    das ist auch richtig, da wir es nicht angewendet haben
    als Näschten gehen wir zu OnGameModeInit
    denn da erstellen wir jetzt das Pickup und den 3D Text.
    Ich mach es jetzt fertig rein, denn ich weiß jetzt, das viele sich da errors reinjagen ohne ende
    so sollte es sein:
    for(new g;g<MAX_INTERIORS;g++)
    {
    CreatePickup(1239,1,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ],0);
    Create3DTextLabel(IntInt[g][InteriorLabel],FARBE,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ],10.0,0,1);
    CreatePickup(1239,1,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ],0);
    Create3DTextLabel("Ausgang",FARBE,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ],10.0,0,1);
    }
    hier werden jetzt nur die Pickups und Labels erstellt
    wenn ihr das eingefügt habt, und das script neu Compilt, sollte es fehlerfrei seinwenn ihr dan im Spiel guckt, werdet ihr merken das es die Pickups und Labels gibt
    aber wenn ihr dahin geht passiert nix
    kein Wunder wir haben es ja auch noch nicht festgelegt
    das ist unser nächster schritt.
    wir gehen jetzt irgendwo hin wo nix ist, denn wir erstellen jetzt 2 neue stocks
    einmal für den enter und für den exit punkt zu finden, denn wir wollen ja auch das richtige interior haben ;)
    gut wenn ihr eine stelle habt dann macht mal das erstmal rein:
    stock GetInteriorEnter(playerid)
    {
    return -1;
    }
    hier seht ihr eine Funktion die -1 returnt ist
    wiso?
    Die erste Interior id ist 0 da Pawn ab 0 Zählt und wenn er an keinen punkt ist von einen Interior soll ja nix passieren
    daher -1 da -1 nicht als interior ID gilt.
    als näschtes machen wir ne schleife die durch alle interiors geht (der define)
    und fragen ab in welchen Punkt er ist
    das sollte so sein:
    stock GetInteriorEnter(playerid)
    {
    for(new g;g<MAX_INTERIORS;g++)
    {
    if(IsPlayerInRangeOfPoint(playerid,1.0,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ]))
    {
    return g;
    }
    }
    return -1;
    }
    wenn er in den Punkt ist returnt es g
    wiso?
    g gibt die ID des interiors aus und stzt den dann später in das richtige Interior
    den 2. stock machen wir vom Prinzip genau so
    Ich brauch es jetzt eigendlich nicht erklären, denn das einzigste was da anders ist, sind die coordinaten und die Virtualworld
    aber so sollte es mal aussehen:
    stock GetInteriorExit(playerid)
    {
    for(new g;g<MAX_INTERIORS;g++)
    {
    if((IsPlayerInRangeOfPoint(playerid,2.9,IntInt[g][exitX],IntInt[g][exitY],IntInt[g][exitZ]))&&(GetPlayerVirtualWorld(playerid)==IntInt[g][InteriorVirtualWorld]))
    {
    return g;
    }
    }
    return -1;
    }
    seht ihr ist fast das selbe wie oben
    so das waren die 2 stocks die wir brauchten
    jetzt gehen wir mal zu:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    in den Public werden die Tasten angewendet hier für uns nehmen wir mal die Taste Enter oder Taste F
    die haben beide die newkeys id 16.
    in den public werden wir jetzt den Key abfragen das so sein soll/muss:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & 16)
    {

    }
    return 1;
    }
    so das ist die Taste enter/f
    jetzt werden wir eine deklairung darein setzen, um die stocks aufzurufen
    so schaut die dann aus:
    new player = GetInteriorEnter(playerid);
    hier speichern wir die Interior ID Zwischen
    um den spieler gleich richtig zu setten.
    jetzt fragen wir ab ob die player id nicht -1 ist das sollte so sein:
    if(player!=-1)
    so !=-1 sprich wenn es 0 ist geht es ist es -1 geht es nicht
    so jetzt ist es nurnoch den player setten das aber jeder wissen sollte
    so soll es aussehen dann mit den enter Punkt:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & 16)
    {
    new player = GetInteriorEnter(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
    SetPlayerInterior(playerid,enteEnte[chid][InteriorID]);
    SetPlayerVirtualWorld(playerid,IntInt[player][InteriorVirtualWorld])
    }
    }
    return 1;
    }
    ihr seht, er kommt an die interior pos/id/virtualworld
    ihr könnt es wieder compilen und testen ihr kommt zwar rein aber nicht raus
    nach der 2 klammer über den return 1 im muster, machen wir ein enter und machen das darein:
    player = GetInteriorExit(playerid);
    auch hier speichern wir die id zwischen um den da raus zu holen
    so hier ist es das selbe wie oben erklärt, deswegen schreib ich darüber nix, denn wir setzen den an den Punkt wo der Pickup ist am eingang und setzen die
    interior id und virtualworld wieder auf 0
    so sollte das dann sein:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & 16)
    {
    new player = GetInteriorEnter(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
    SetPlayerInterior(playerid,enteEnte[chid][InteriorID]);
    SetPlayerVirtualWorld(playerid,IntInt[player][InteriorVirtualWorld])
    }
    player = GetInteriorExit(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0)
    }
    }
    return 1;
    }


    wenn ihr es jetzt compilt, dann sollten keine Fehler kommen und ihr habt ein einfaches Interiorsystem
    Ich nutze diese variante gerne, da es einfach übersichtlicher ist und dadurch spammt man OnGameModeInit nicht so zu, indem
    ihr da für 20 Interiors 40 Pickups verwendet
    hier sind es lediglich nur 7 einträge bei OnGameModeInit und ihr habt oben nur die deklairung für die Interiors


    So ich hoffe, das ich euch helfen konnte und bin für Feedbacks und hilfen gerne bereit zu helfen


    MFG
    und viel erfolgt wünscht euch


    Chris. aka RedJoker

    All in all it's just another brick in the wall

  • Es sind ein paar Errors drinnen, aber ich denke mal die sind Absicht um dummes C&P zu verhindern ;)


    Von der Grundstruktur und der Umsetzung finde ich es eigentlich gut gelungen !


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • SetPlayerInterior(playerid,enteEnte[chid][InteriorID]);


    Was habe ich da falsch?
    Errors:
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(324) : error 017: undefined symbol "enteEnte"
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(324) : error 017: undefined symbol "chid"
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(324) : error 029: invalid expression, assumed zero
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(324) : fatal error 107: too many error messages on one line


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



    4 Errors.

  • Wo ist bitte der Sinn! ?
    Du machst im TuTo "enteEnte" aber tragst es nicht ein?!


    Der sinn ist einfach das ihr nicht alles Kopieren sollt was man schreibt
    Meint ihr etwa, das man durch das Kopieren was lernt?
    unter garantie nicht


    Und den Feher hab ich absichtlich reingebaut, um das Kopieren zu verhindern, denn wozu lernt ihr Lesen?

    All in all it's just another brick in the wall

  • Was habe ich hier falsch?


    new player = GetInteriorEnter(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[playerid][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
    SetPlayerInterior(playerid,IntInt[playerid][InteriorID]);
    SetPlayerVirtualWorld(playerid,IntInt[playerid][InteriorVirtualWorld]);
    }
    player = GetInteriorExit(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[g][enterX],IntInt[g][enterY],IntInt[g][enterZ]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0)
    }
    }
    }
    return 1;


    ____________________________


    Errors:


    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(327) : warning 217: loose indentation
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(330) : error 017: undefined symbol "g"
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(333) : error 001: expected token: ";", but found "}"
    C:\Users\Kadri\Desktop\Streets of San\gamemodes\SoS.pwn(336) : error 010: invalid function or declaration
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    3 Errors.

  • new player = GetInteriorEnter(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
    SetPlayerInterior(playerid,IntInt[player][InteriorID]);
    SetPlayerVirtualWorld(playerid,IntInt[player][InteriorVirtualWorld]);
    }
    player = GetInteriorExit(playerid);
    if(player!=-1)
    {
    SetPlayerPos(playerid,IntInt[player][enterX],IntInt[player][enterY],IntInt[player][enterZ]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0)
    }
    }
    }


    So sollte es sein

    All in all it's just another brick in the wall

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen