Beiträge 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...

    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.

    Ich habe gestern Abend wegen schlechtem Wetter und Langeweile ein paar alte Threads gelesen.
    Dabei habe ich diesen entdeckt.
    Da viel mir gleich auf, dass es eine riesige Menge an Code ist, immer für 1 Interior ein Pickup für den Eingang und eins für den Ausgang zu erstellen.
    Und da, wie schon gesagt, schlechtes Wetter war, und mir langweilig war habe ich mir überlegt: "Ein AddInterior ( ... ) müsste es geben...". Und genau das habe ich dann erstellt.
    Es ist nur ein Filterscript mit einer include für den Gamemode.
    Bisher hat es 2 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 sieht jetzt vielleicht etwas kompliziert aus, aber das ist es überhaupt nicht.
    Mit AddInterior lässt sich mit einer Zeile ein ganzes Interior mit Eingang und Ausgang erstellen.
    Hier eine kleine Parametererklärung:


    AddInterior gibt eine spezielle ID zurück, womit es auch möglich ist, das Interior mit RemoveInterior zu löschen.
    Das gesamte Filterscript ist nur ~ 160 Zeilen groß! Damit es aber noch einfacher wird, habe ich eben einen Optionalen Zusatzteil gecodet, mitdem man inGame die AddInterior Funktion generieren kann. Nun ist das Filterscript ca. 550 Zeilen groß :D


    Um euch zu verdeutlichen, wie das in etwa funktioniert habe ich mal ein Video gemacht:
    [video='h interiors',left]

    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]





















    Was haltet ihr davon? Würdet ihr es nutzen, wenn ich es release-fertig mache und lelease?


    Edit: Funktion hinzugefügt.

    Das ist doch nicht schwer.
    Such dir die PHP Datei von der Globalen Ankündigung und erstelle eine neue Variable (z.b. $online) die du mit den AssignVariables übergibst.
    Dann einfach im Template der Globalen Ankünsingung die neue Variable Abfragen. Z.b. so: {if $online == 1}Server online!{else}Server offline{/if}

    Ich habe mich vor einer Woche oder wann das war ja schon zurückgehalten und meinen eigentlich geschriebenen Beitrag lieber nicht abgesendet. Nun versuche ich mal eine abgespickte und freundliche Version davon nachzuverfassen...
    ID, Passwort, isBeta, BetaAktiv.. jop und nun? Das kannst du in 2 Sekunden via WPE oder sonstige sniffing Tools herausfinden.
    Ich weiß nicht, was dein Anliegen ist, diesen Thread mit deinem deutschem Lorem Ipsum zu füllen.
    Wenn du uns wirklich nur auf Sicherheitslücken nett Hinweisen möchtest, weiß ich nicht, wieso du das öffentlich in diesem Thread tust? Wo ist da der Sinn? - Wenn ich ehrlich bin möchte ich das garnicht wissen..
    Wenn du noch etwas möchtest, machs entweder via PN oder über ICQ. Hier meine ICQ Nummer: 111222333


    Und nun mal wieder b2Topic bitte! :)
    An das gesamte Feedback: Dankesehr, ich finde es schön das ihr einen Nutzen für dieses Tool habt. Ich werde mal mit Linaks besprechen ob wir die Entwicklung an einer weiteren Version beginnen werden, oder ab SAMPit 1.2 die letzte gewesen sein wird.

    Naja, du weißt ja nicht was seine Bekannten für PC´s haben. Normal ist relativ, vielleicht ist es in seinem Umkreis normal 64GB Ram zu haben :D


    @ Raphael.K: Quatsch, das kommt auf Prozessor und Mainboard an. Es gibt auch schon Laptops mit 24 & 32GB RAM.

    Nein, eigentlich müsste da immernoch ein Sourcecode mitgeliefert werden, aber Gnade vor Recht.


    Dafür sind wir auch sehr dankbar :)


    (Übrigens kann man auch mit OpenSource Programmen gutes Geld verdienen.)


    Hmm.. bei Software mit großen Kundenzahlen und Unternehmen kann ich mir das durch Spenden ect. gut vorstellen, aber bei ca. 200 Benutzern von dem Tool lohnt es sich wohl (noch) nicht.

    Dann zeig mal was die Funktion mysql_GetString macht.
    Denn einen kompletten String mit = zu setzen ist nicht möglich ;)
    Wenn die Funktion einen String zurück gibt, mach es so:

    format(HausInfo[hausid][haus_besitzer],MAX_PLAYER_NAME,mysql_GetString("haus", "besitzer", "Haus Nr.", valstrex(hausid)));

    Das sieht zwar ganz nett aus, aber welcher Serverbetreiber möchte sowas schon gerne auf seinem Server haben? Also bei einem Server der mehr als 5 Benutzer haben soll ist sowas schon fehl am Platz.

    Es gibt viele Möglichkeiten Werte zu übergeben. Hier mal 2:
    1.Als _GET Parameter

    PHP
    <?php
    echo '<form method="post" action="index.php?user='.$benutzername.'">
    <input type="submit" value="Bearbeiten" />
    </form>';
    ?>


    2.Als verstecktes Feld per _POST

    PHP
    <?php
    echo '<form method="post" action="index.php">
    <input type="hidden" name="user" value="'.$benutzername.'" />
    <input type="submit" value="Bearbeiten" />
    </form>';
    ?>

    Wie ich schon sagte, ohne code injection wird das wohl nichts. Du musst dich genau da ins Programm reinbringen wo die Nachrichten vom Server empfangen werden. Das bekommst du nur hin wenn du die nötigen Adressen und Offsets hast. Die musst du dir dann natürlich erst vorher auslesen... Und schon hast du mehr Zeit damit verbracht ein Tool zu schreiben als 3 Nächte durchgehend immer auf Payday zu warten.