H_Interiors 1.1 - Interiorengine

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
  • Schönen Nachmittag,
    ich hatte vor ein paar Tagen einen Thread hier gelesen: Klick
    Dort viel mir auf, wie viele Zeilen ein einziges Interior mit Pickups benötigt. Das macht dem code unübersichtlich und verbraucht viel Zeit ( unnötig ).


    Desshalb habe ich die Funktion AddInterior erstellt. Damit lässt sich ein Interior mit Eingangspickup und Ausgangspickup mit nur einer Zeile erstellen!
    Es basiert auf einem Filterscript, und einer include für den Gamemode und andere Filterscripts.
    Somit lassen sich die Interiors wunderbar dynamisch nutzen!


    Enthaltene Funktionen:

    AddInterior ( iM[ ] , iVW , iI , Float:iX , Float:iY , Float:iZ , Float:iA , iPT , iPM , iG , iAK , oM[ ] , oVW , oI , Float:oX , Float:oY , Float:oZ , Float:oA , oPT , oPM , oG , oAK )
    RemoveInterior ( interior )


    Das mag auf den ersten Blick nicht viel aussagen, aber es ist wirklich sehr simpel!


    Funkionserklärung:
    AddInterior ( ... )
    [table=2]
    [*]Parameter[*]Beschreibung
    [*]iM[*]Nachricht, die dem Spieler gesendet wird, wenn er das Interior betritt. Die Nachricht wird als Textdraw angezeigt
    [*]iVW[*]Die VirtualWorld vom Interior. Somit kann man ein Interior mehrmals nutzen.
    [*]iI[*]Die Interior ID.
    [*]iX[*]X Position von Eingangs-Pickup. Gleichzeiting ist dies auch die X Koordinate für den Ausgang.
    [*]iY[*]Y Position von Eingangs-Pickup. Gleichzeiting ist dies auch die Y Koordinate für den Ausgang.
    [*]iZ[*]Z Position von Pickup. Gleichzeiting ist dies auch die Z Koordinate für den Ausgang.
    [*]iA[*]Die BlickrichtuEingangs-ng des Spielers, wenn er das Interior verlässt.
    [*]iPT[*]Der Pickup Typ vom Eingang. Im Normalfall ist es NULL, was dem standard entspricht. Ein anderer Wert setzt setzt den Typ auf den gewählten Wert.
    [*]iPM[*]Das Pickup Model vom Eingang. Im Normalfall ist es NULL, was dem weißem Pfeil entspricht. Eine andere ID ändert das Model.
    [*]iG[*]Der GameTextStyle vom Eingang. Normalerweise ist es NULL, was dem standard entspricht. Ein anderer Wert ändern den Style.
    [*]iAK[*]Ob zusätzlich ein Tastendruck auf ENTER das Interior begehbar machen soll. Wenn ja setze es auf YES wenn nein auf NO. Wenn YES, wird dem Textdraw eine weitere Zeile hinzugefügt, die im Script definiert ist.
    [*]oM[*]Nachricht, die dem Spieler gesendet wird, wenn er das Interior verlässt. Die Nachricht wird ebenfalls als Textdraw angezeigt
    [*]oVW[*]Die VirtualWorld vom Ausgang. Im Normalfall NULL, kann alllerdings auch angepasst werden.
    [*]oI[*]Die Interior ID vom Ausgang. Im Normalfall NULL, kann allerdings angepasst werden, um einen Eingang zu einem Interior von einem Interior zu erstellen.
    [*]oX[*]X Position von Ausgangs-Pickup. Gleichzeiting ist dies auch die X Koordinate für den Eingang.
    [*]oY[*]Y Position von Ausgangs-Pickup. Gleichzeiting ist dies auch die Y Koordinate für den Eingang.
    [*]oZ[*]Z Position von Ausgangs-Pickup. Gleichzeiting ist dies auch die Z Koordinate für den Eingang.
    [*]oA[*]Die Blickrichtung des Spielers, wenn er das Interior betritt.
    [*]oPT[*]Der Pickup Typ vom Ausgang. Im Normalfall ist es NULL, was dem standard entspricht. Ein anderer Wert setzt setzt den Typ auf den gewählten Wert.
    [*]oPM[*]Das Pickup Model vom Ausgang. Im Normalfall ist es NULL, was dem weißem Pfeil entspricht. Eine andere ID ändert das Model.
    [*]oG[*]Der GameTextStyle vom Ausgang. Normalerweise ist es NULL, was dem standard entspricht. Ein anderer Wert ändern den Style.
    [*]oAK[*]Ob zusätzlich ein Tastendruck auf ENTER das Interior verlassbar machen soll. Wenn ja setze es auf YES wenn nein auf NO. Wenn YES, wird dem Textdraw eine weitere Zeile hinzugefügt, die im Script definiert ist.[/table]
    Gibt die ID des neu erstelltem Inteirors zurück, wenn es erstellt werden konnte. Wenn es nicht erstellt werden konnte wird -1 zurückgegeben.


    RemoveInterior( ... )
    [table=2]
    [*]Parameter[*]Beschreibung
    [*]interior[*]ID des Interiors, welches gelöscht werden soll.[/table]
    Gibt true zurück, wenn es gelöscht wurde. Gibt false zurück, wenn das Interior nicht existiert.


    Enthaltene Callbacks:

    OnPlayerEnterInterior ( playerid , interior , method )
    OnPlayerLeaveInterior ( playerid , interior , method )
    OnPlayerEnteredInterior ( playerid , interior , method )
    OnPlayerLeavedInterior ( playerid , interior , method )


    Callback Erklärung:
    [table=6]
    [*]Callback[*]Parameter 1[*]Parameter 2[*]Parameter 3[*]Aufruf[*]Return
    [*]OnPlayerEnterInterior[*]Spieler ID[*]Interior[*]Methode ( METHOD_PICKUP = Pickup aufgesammelt & METHOD_KEY = ENTER gedrückt )[*]Wenn der Spieler versucht das Interior zu betreten.[*]return 1; Bei 0 kommt der Spieler nicht ins Interior
    [*]OnPlayerEnteredInterior[*]Spieler ID[*]Interior[*]Methode ( METHOD_PICKUP = Pickup aufgesammelt & METHOD_KEY = ENTER gedrückt )[*]Nach dem Betreten des Interiors[*]return 1; (Keine abhängiges Ereignis)
    [*]OnPlayerLeaveInterior[*]Spieler ID[*]Interior[*]Methode ( METHOD_PICKUP = Pickup aufgesammelt & METHOD_KEY = ENTER gedrückt )[*]Wenn der Spieler versucht das Interior zu verlassen[*]return 1; Bei 0 kommt der Spieler nicht aus dem Interior
    [*]OnPlayerLeavedInterior[*]Spieler ID[*]Interior[*]Methode ( METHOD_PICKUP = Pickup aufgesammelt & METHOD_KEY = ENTER gedrückt )[*]Nach dem Verlassen des Interiors[*]return 1; (Keine abhängiges Ereignis)
    [/table]


    Beispielcode:
    Hier kann man sehen, wie einfach AddInterior und RemoveInterior sind! Bei diesem kleinem Text wird beim Starten des Servers ein Haus erstellt. ( Koordinaten -> siehe Video ). Mit Commands lässt sich das Haus löschen und wieder neu erstellen!
    #include <a_samp>
    #include <h_interiors>


    new AdminHouse;


    public OnGameModeInit()
    {
    AdminHouse = AddInterior ( "Welcome Admin!" , NULL , 0 , 1953.704956 , 1342.881958 , 15.374607 , 86.697219 , NULL , NULL , NULL , YES , "byee" , NULL , 3 , 235.407196 , 1187.490844 , 1080.257812 , 83.480270 , NULL , NULL , NULL , YES );
    return 1;
    }


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if ( !strcmp ( "/remove house" , cmdtext ) )
    {
    RemoveInterior ( AdminHouse);
    return 1;
    }


    if ( !strcmp ( "/addhouse",cmdtext))
    {
    AdminHouse = AddInterior ( "Welcome home!" , NULL , 0 , 1953.704956 , 1342.881958 , 15.374607 , 86.697219 , NULL , NULL , NULL , YES , "byee" , NULL , 3 , 235.407196 , 1187.490844 , 1080.257812 , 83.480270 , NULL , NULL , NULL , YES );
    return 1;
    }
    return 0;
    }


    public OnPlayerEnterInterior(playerid ,interior ,method)
    {
    if ( interior == AdminHouse && !IsPlayerAdmin ( playerid )
    {
    SendClientMessage(playerid,0x666666AA,"Dieses Haus darf nur von Admins betreten werden!");
    return 0;
    }
    return 1;
    }


    public OnPlayerEnteredInterior(playerid ,interior ,method)
    {
    new string[ 128 ] , name[ MAX_PLAYER_NAME ] , Method[ 32 ];
    GetPlayerName ( playerid , name , MAX_PLAYER_NAME );
    if ( method == METHOD_KEY )
    format ( Method , 32 , "pressing ENTER key" );
    else
    format ( Method , 32 , "picking up pickup" );
    format ( string , 128 , "Player: %s entered interior: %d by %s" , name , interior , Method );
    SendClientMessage ( playerid , 0x666666AA , string );
    return 1;
    }


    public OnPlayerLeaveInterior(playerid, interior, method)
    {
    return 1;
    }


    public OnPlayerLeavedInterior(playerid, interior, method)
    {
    new string[ 128 ] , name[ MAX_PLAYER_NAME ] , Method[ 32 ];
    GetPlayerName ( playerid , name , MAX_PLAYER_NAME );
    if ( method == METHOD_KEY )
    format ( Method , 32 , "pressing ENTER key" );
    else
    format ( Method , 32 , "picking up pickup" );
    format ( string , 128 , "Player: %s leaved interior: %d by %s" , name , interior , Method );
    SendClientMessage ( playerid , 0x666666AA , string );
    return 1;
    }


    Optional - AddInteriors Generator:
    Ich habe eine 2. Version des Filterscripts erstellt, welches einen über defines ein- und ausschaltbaren inGame AddInterior ( ... ) Generator enthält. Damit lässt sich der Code inGame über Dialoge generieren!
    Es wird eine adi Datei unter Scriptfiles erstellt.
    Befehle sind:

    Code
    #help
    #new
    #setenter
    #setexit
    #spp


    Hier ein Video davon:
    [video='H Interiors',center]

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    [/video]


    Filterscript Einstellungen:
    Im Filterscript enthalten sind einige defines die vor dem Benutzen etwas angepasst werden können / müssen. Bearbeitet werden sollte nu das Custom setup und ggf. das Additional setup. Das Developer setup sollte nicht geändert werden.
    Custom setup
    [table=2]
    [*]Name[*]Beschreibung
    [*]INTERIOR_QUANTITY[*]Anzahl maximaler verwendbarer Interiors.
    [*]LANG[*]Text der zusätlich angezeigt wird, wenn ein Pickup auch mit der ENTER Taste benutzt werden darf.
    [*]WAIT_TIME[*]Zeit in der der Gametext angezeigt wird. Zudem ist das die Wartezeit bis das Eingangspickup nach dem Verlassen des Interiors ( und andersherum ) nicht benutzt werden kann. ( Damit man nicht direkt wieder ins Interior geportet wird.[/table]
    Die Filterscriptversion mit dem AddInterior Creator hat noch eine zusätliche Option:
    [table=2]
    [*]Name[*]Beschreibung
    [*]INTERIOR_INTERIOR_CREATOR[*]Wenn true ist der AddInterior Generator aktiviert. Wenn false deaktiviert.[/table]
    Additional setup
    [table=2]
    [*]Name[*]Beschreibung
    [*]STANDARD_PICKUPMODEL[*]Standard Pickup Model. Wird ersetzt mit NULL.
    [*]STANDARD_PICKUPTYPE[*]Standard Pickup Typ. Wird ersetzt mit NULL.
    [*]STANDARD_INTERIOR[*]Standard Interior ID. Wird ersetzt mit NULL.
    [*]STANDARD_VIRTUALWORLD[*]Standard Virtual World. Wird ersetzt mit NULL.
    [*]STANDARD_GAMETEXTSTYLE[*]Standard Gametext Style. Wird ersetzt mit NULL.
    [*]_CreatePickup[*]CreatePickup Funktion. Kann für z.B. streamer ersetzt werden.[/table]



    Update 1.1:
    Nun wurden 4 Callbacks eingefügt. Mit diesen Callbacks lassen sich nun sehr einfach Haussysteme erstellen.
    Zudem muss folgender Code ins Script eingefügt werden:

    public OnPlayerEnterInterior(playerid ,interior ,method)
    {
    return 1;
    }


    public OnPlayerEnteredInterior(playerid ,interior ,method)
    {
    return 1;
    }


    public OnPlayerLeaveInterior(playerid, interior, method)
    {
    return 1;
    }


    public OnPlayerLeavedInterior(playerid, interior, method)
    {
    return 1;
    }




    Downloads:
    Ohne AddInterior generator 1.1
    Ohne AddInterior generator 1.1 - Pastebin
    Mit AddInterior generator 1.1
    Mit AddInterior generator 1.1 - Pastebin



    Feedback, sowie Testberichte und Bugmeldungen erwünscht :)
    Vielleicht hat ja jemand mal Lust damit ein Tutorial zu erstellen, wie man damit ein Haussystem macht? - Wenn ja nur zu! Sonst mache ich das irgendwann mal :)


    Viel Spaß damit!


    Edit: Fehler behoben
    Edit: 1.1 update
    Edit: Fehler behoben
    Edit: Aussagekräftigere Überschrift gewählt.

    PAWNit gratis nutzen?
    Geschenkcode: 2017VQXPKB8V3KA

    Hier könnte Ihre Werbung stehen.

    11 Mal editiert, zuletzt von |-|auke ()

  • Danke fürs Feedback :)
    Es sollte kein dynamisches System werden, es sollte einfach nur die Funktionen von SA:MP erweitern ;)
    Aber klar kannst du damit ein "Hauskauf System" bauen. Z.b. so:

    new playerhouses[MAX_PLAYERS];
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if(strcmp(cmdtext,"/buyhouse"))
    {
    GivePlayerMoney(playerid,-50000);
    SendClientMessage(playerid,0x666666AA,"Du hast dir ein Haus gekauft!");
    playerhouses[playerid] = AddInterior ( "Welcome home!" , NULL , 0 , 1953.704956 , 1342.881958 , 15.374607 , 86.697219 , NULL , NULL , NULL , YES , "byee" , NULL , 3 , 235.407196 , 1187.490844 , 1080.257812 , 83.480270 , NULL , NULL , NULL , YES );
    }
    }


    So in der Art, musst du dann natürlich erweitern ;)


    Edit: Bei Interesse könnte ich noch ein OnPlayerEnterInterior ( playerid , interior ) callback machen...

    PAWNit gratis nutzen?
    Geschenkcode: 2017VQXPKB8V3KA

    Hier könnte Ihre Werbung stehen.

  • Ähnlich ist nicht gleich gleich. Somit tendiere ich zu einzigartiges Filterscripts, womit die Bewertung höchst positiv ausfällt. (10/10 sobald User Wünsche intigriert werden)


    Advertising has us chasing cars and clothes, working jobs we hate so we can buy shit we don’t need.
    – Tyler Durden


    Sobald Werbung im Spiel ist, bist du, die Nutzerin, der Nutzer, das Produkt.


  • Wieder mal saubere Arbeit :)
    Wusste garnicht, dass du sowas programmiert hattest.
    Mach weiter so!

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • lol wie gebt ihr das ein das das geht ?
    so bei dem normalen grandlarc gamemode gehts aber bei fusion wenn ich da z.b. mich als rcon einlogge halt


    und dann #test mach schreib ich admin:test


    und kein h_interior feld kommt


    vllt kann mir da jemand helfen bei dem gm fusion


    hm das is rotz das funzt nicht ma weil dann imemr errors kommen im compilen

    2 Mal editiert, zuletzt von rocco95 ()

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