Beiträge von IPrototypeI

    case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring));
    zu
    case 3: format(SektorInfo[i][sName], 16, "%s",tmpstring);


    Dann sollte es gehen. strlen gibt dir ja nur die Länge des namens zurück.


    meiner meinung nach gehört sowieso jeder geschlagen der zwei strings mit format zusammenfügen möchte.
    für was gibt es memcpy oder strcat. Nur ist hierzu zu beachten das man die länge angibt da sizeof in dem fall bei den optionalen Parametern eine Funktion nix nutzt.

    #include <a_samp>
    #include <streamer>
    #include <a_mysql_r6>
    #include <sscanf2>






    new c_handler;


    #define MAX_SECTOR 10


    enum sektor_daten {
    sCID,
    sName[16],
    Float:sX1,
    Float:sY1,
    Float:sX2,
    Float:sY2,
    sArt,
    sSektorGZ,
    sSektorA,
    };
    new SektorInfo[MAX_SECTOR][sektor_daten];



    enum {
    CREATE_SEKTOR= 1,
    };


    CreateConnection(){
    c_handler = mysql_connect("localhost","root","sektors","");
    mysql_debug(1);
    if(!mysql_ping(c_handler))return printf("Could not connect to the database!");
    return printf("Connect with the database");
    }
    main(){


    }
    public OnQueryFinish(query[], resultid, extraid, connectionHandle)
    {
    switch(resultid)
    {
    case CREATE_SEKTOR:
    {
    mysql_store_result(connectionHandle);
    printf(" %d Sektoren geladen.",mysql_num_rows(connectionHandle));
    new i, result[128];
    while(mysql_fetch_row_format(result,"|",connectionHandle)){
    sscanf(result,"p<|>e<is[16]ffffi-ii->",SektorInfo[i]);
    SektorInfo[i][sSektorGZ]= GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    SektorInfo[i][sSektorA]= CreateDynamicRectangle(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    ++i;
    }
    mysql_free_result(connectionHandle);
    }
    }
    return 1;
    }
    public OnPlayerEnterDynamicArea(playerid, areaid){
    new i,str[30];
    for(; i != MAX_SECTOR; ++i){
    if(areaid != i)continue;
    format(str,30,"Zone %s betreten",SektorInfo[i][sName]);
    SendClientMessage(playerid,-1,str);
    break;
    }
    return 1;


    }
    public OnPlayerLeaveDynamicArea(playerid, areaid){
    new i,str[30];
    for(; i != MAX_SECTOR; ++i){
    if(areaid != i)continue;
    format(str,30,"Zone %s verlassen",SektorInfo[i][sName]);
    SendClientMessage(playerid,-1,str);
    break;
    }
    return 1;
    }


    CreateTable(){
    mysql_query("CREATE TABLE IF NOT EXISTS `sektor`(`ID` INT AUTO_INCREMENT, `Name` VARCHAR(16),`X1` FLOAT, `Y1` FLOAT,`X2` FLOAT,`Y2` FLOAT, `Kind` TINYINT, PRIMARY KEY(`ID`)) AUTO_INCREMENT = 1, ENGINE = MYISAM;");
    return 1;
    }



    public OnGameModeInit()
    {
    CreateConnection();
    CreateTable();
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'No-Name',344.7781,-2115.6372,654.8240,-1579.5255,1);",0,0,c_handler);
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'DM-Zone',278.3560,-1721.2578,331.6490,-1677.0620,2);",0,0,c_handler);
    // mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'Test',309.0497,-1792.3577,335.5938,-1772.6873,0);",0,0,c_handler);
    mysql_query("SELECT * FROM `sektor`;",CREATE_SEKTOR,0,c_handler);
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
    }


    public OnGameModeExit()
    {
    mysql_close(c_handler);
    return 1;
    }


    Hier bitte das ganze funktioniert so wie es soll

    Um noch Goldkillers post zu ergänzen


    um tabellen übergreifend zu arbeiten oder datenbank übergreifend nutzt man einen . um somit einen art pfad zu erstellen.


    datenbank.tabelle.spalte

    echt? ich hatte mir unter textdraws immer was anderes vorgestellt ^^


    Nur um dir vieles zu erleichtern gibt es sogenannte Textdraweditoren womit das ganz einfach geht.


    siehe:
    Ipleomaxtextdraweditor:
    http://forum.sa-mp.com/showthread.php?t=376758


    Zamaroht textdraweditor:
    http://forum.sa-mp.com/showthread.php?t=290640


    Ich persönlich präferiere den von Ipleomax, jedoch sollte dir auch bewusst sein das dieser aufgrund des Plugin nur auf deinem localen server nutzbar ist.

    Das liegt an deiner if abfrage im Timer


    Orten[playerid] = giveplayerid;
    Orten[playerid] hat die Id welche geortet werden soll.



    if(Orten[i] == 1)
    Der Spiler könnte nur die ID 1 orten.


    Daher deklarier das Array Orten anderes und zwar so


    new Orten[MAX_PLAYERS] = {-1,... };


    somit hast du einen default wert
    dann kannst du das so abfragen



    if(Orten[i] != -1)


    Zu dem würde ich den Timer beenden wenn kein spieler irgend jemadn sucht und die verwendung von MAX_PLAYERS ist schneller als die funktion GetMaxPlayers zu benutzen
    da MAX_PLAYERS ein define ist und ein konstanter wert.
    jedoch macht es sinn MAX_PLAYERS deiner slotzahl anzupassen.

    Um dir mal bewusst zu machen das dein code reiner schrott ist.


    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    Warum ein konstante in den string packen nur um ihn abzusenden wo ist der sinn dahinter ?


    Zu dem sendest du zwei querys ab einmal nur zum zählen das zweite beschränkt nur zum auslesen.
    format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
    format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);


    Nun das aller traurigste ist die for-schleife + die while-schleife
    for(new i = 0; i <mysql_num_rows(); i++)


    die while-schleife in verbindung mit mysql_fetch_row oder mysql_fetch_row_format wo der einzigste Unterschied darin besteht das du den delimiter ändern kannst.
    Geht durch alle Einträge durch und ließt diese je nach dem absgesendeten query aus, da mysql_fetch_row wie auch mysql_retrieve_row zur nächsten zeile springt falls diese vorhanden ist wird 1 zurück gegeben falls nicht 0 daher wird die while schleife auch abgebrochen.


    Zu dem benötigst du keine 1024 zeichen ich geh mal davon aus so grob gezählt reichen dort locker 100 Zeichen(ausgelesenen string die Zeichen durchzählen).


    Ich hoffe du nimmst dir die Punkte zu herzen oder auch nicht.



    stock CreateSektor()
    {
    new str[128],i;
    mysql_query("SELECT * FROM `sektor`;");
    mysql_store_result();
    printf("%d Sektoren gelesen.", mysql_num_rows());
    while(mysql_fetch_row(str))
    {
    sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
    Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
    printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],i,str);
    ++i;
    }
    mysql_free_result();
    }


    //edit
    Wenn du zum hochzählen System[SektorOnline] vorgesehen hast kannst du dies auch anstelle von i benutzen.

    Bitte hilft mir!


    Das liegt daran das dein deklarierter string zu klein ist und nur 128 Zeichen maximal fassen kann. Jedoch benötigt der Sql-Befehl, welchen du ausführen lassen möchtest 351 zeichen.
    Das resultat du sendest ein abgehacktes query an den mysql server, dieser kann den befehl nicht verarbeiten und es sollte dir eine Fehlermeldung ausgegeben werden in der mysqllog.
    Solltest du die mysqllog nicht haben so liegt dies daran das du diese nicht unter OnGameModeInit aktiviert hast mit der funktion.


    mysql_log(LOG_DEBUG,LOG_TYPE_TEXT);


    Dennoch kannst du die Fehler auch anzeigen lassen in der Konsole dazu einfach das callback OnQueryError hinzufügen.


    public OnQueryError(errorid, error[], callback[], query[], connectionHandle) {
    printf("Errorid %d",errorid);
    print(error);
    print(callback);
    print(query);
    return 1;
    }

    Das ist möglich, jedoch benötigst du kenntnisse in Mathematik.


    Dazu musst du erstmal ermitteln wohin der spieler schießt durch Cameraberechnungen.
    siehe dazu
    http://wiki.sa-mp.com/wiki/GetPlayerCameraFrontVector


    danach musst du halt die position von den objekten auslesen und die größe um eine sogesehen virtuelle hitbox um das objekt zu erstellen
    http://forum.sa-mp.com/showthread.php?t=407909


    nun solltest du nurnoch abgleichen ob sich das ganze schneidet.


    Dazu kannst du dir ja mal Vektorenberechnungen anschauen.


    Um das ganze noch zusammenzufassen berechnest du ob eine Gerade einen Körper schneidet,

    Da ich einen kleinen Fehler gemacht habe beim komprimieren des alten arrays habe ich das ganze heute mal aktualisiert und kleine Unstimmigkeiten bei den skins auch beseitigt.


    stock const static SkinArray[100]={
    0x80200,0x140803,
    0x200E06,0x401E0E,0x4C2411,0x582A14,0x643017,
    0x70361A,0x803C1D,0x8C4421,0xA84A24,0xB4582B,
    0xC05E2E,0xCC6431,0xE87234,0xF4783B,0x10C843E,
    0x11C8C44,0x1389248,0x144A04F,0x150A652,0x17CBC56,
    0x188C260,0x194C863,0x1A0CE66,0x1ACD469,0x1B8DA6C,
    0x1C4E06F,0x1D0E672,0x1DCEC75,0x1E8F278,0x1F4F87B,
    0x200FE7E,0x2190A84,0x2251087,0x2411E8E,0x2552692,
    0x26D3499,0x27D3C9C,0x28942A0,0x29548A3,0x2A14EA6,
    0x2B556AA,0x2C15EAE,0x2D166B1,0x2DD6CB5,0x2E972B8,
    0x2F578BB,0x32D94C8,0x3419CCC,0x365A4D1,0x375BCDC,
    0x391C6DF,0x3A9CCE5,0x3BDD8EB,0x3C9E2F0,0x3E5F0F7,
    0x3F5F8FA,0x409FEFE,0x4160903,0x4261106,0x432170A,
    0x43E1D0D,0x44A2310,0x4562913,0x4622F16,0x46E3519,
    0x47A3B1C,0x486411F,0x4924722,0x49E4D25,0x4AE5328,
    /////////////////////Männer//////////////////////
    0x2C1409,0x7C1A0C,0xA04E26,
    0xD86A29,0xFC7037,0x1148240,0x134984B,0x160AE55,
    0x16CB459,0x204BA5C,0x2290682,0x235188B,0x2592891,
    0x2753097,0x2C958A9,0x3017EBE,0x30D84C1,0x3198AC4,
    0x33592C7,0x351A6CF,0x35DACD5,0x36DB4D8,0x389C2E0,
    0x3A5D0E7,0x3CDDCED,0x3D9EAF4,0x40600FB,0x25507,
    /////////////////////Frauen//////////////////////
    };


    Dazu noch ein kleines define um die skins auszulesen


    #define GetSkin(%0) ((SkinArray[(ArrayMarker[%0] >> 8)] >>> ((ArrayMarker[%0] & ~(0xFF<<8))*9))& ~(0xFFFFFF<<9))


    Das ist sogesehen meine Basis für ein dynamisches Skinshopsystem, was ich irgendwann mal releasen werden je nachdem wie es mir zeitlich passt.

    Also wie Logan bereits erwähnt hat du kannst das mit irgend welchen fremden vergessen. Da kommt es nur zu gezicke oder sonst was. Daher kann man das auch nur mit paar Kumpels durchziehen die sich kennen.


    Aber das witzigste find ich ja immer die begründung wie solch eine gruppe an einem skript arbeiten soll. Die lösung ist ganz simple und zwar mit includes jeder schreibt sei eigene vom skript unabhängige include stichwort dazu hooking.

    Wie Kaliber schon erwähnte ist es sehr sinnvoll. Ich mach diesauch zu dem hast du nicht nur eine bessere Überblick sondern kannst auch einfach Systeme entfernen oder bearbeiten ohne sich durch tausende zeilen zu kämpfen. Ein weitere Vorteil ist das erleichterte zusammen skripten jeder kümmert sich um ein system das letztendlich implementiert wird.


    Dieser meinung stimme ich voll und ganz zu, warum sollte ich den leuten was erklären wenn sie es selber rausfinden können durch den code, somit denken sie ja wohl nach, wenn sie wollen..
    Also wie hauke sagt, eigeninitiative zeigen, zudem falls fragen bestehen kann man die immer noch schritt weise beantworten.


    Genau das ist sogesehen auch das Problem "die Eigeninitiative zeigen". Es gibt Leute die mit dem kompletten Code mehranfangen können als einer ausgeschriebenen Erklärung.
    Da sie diesen analysieren und vergleichen was sie falsch gemacht haben um die Lösung nachzuvollziehen. Andere hingegen kopieren den code raus und hoffen das es geht da bringt auch das spicken mit Kommentaren nix. Die meisten lesen sich ja nichtmal den Text den man verfasst hat durch sofern er nicht fett, rot und mit einer schriftgröße von 36px geschrieben ist, sondern sehen nur den Code.


    ++warum kommt mein Freund in mein Server, und dann sehe ich nur wie er rumsteht aber er sagt er bewegt sich und neben ihm ist so ein Ladezeichen also das er im Pausemenü oder so ist..
    Wie mache ich das ich ihn wieder sehe er sieht mich auch nciht wie ich mich bewege..


    Dann wirst du wohl bei OnPlayerUpdate 0 returnen anstatt 1.
    Weil über dieses Callback läuft die synchronisation mit anderen spielern.

    Deshalb sagte ich ja auch ich erwarte keine Großartige Bewertung wollte nur mal wieder was probieren und es evtl. als vorlage etc. bieten


    Dazu würde es auch reichen wenn du nur die Images hier hochladen würdest und ich denke das jeder Depp in den Stileditor gehen und die Images ändern kann.
    Also wenn du schon was probieren und als Vorlage veröffentlichen möchtest solltest du schon mehr bieten.
    Darunter wäre wenigstens zu verstehen die Container zu ändern , MainMenu, Footer und den Main bereich um sich von dem Standartstil zu differenzieren.