Beiträge von Goldkiller

    Verschewendet das nicht mehr Ressourcen Goldkiller?
    Wenn die Variable playerid erst bei OnPlayerEnterVehicle übertragen wird und somit ein Timer nur für diese playerid gesetzt wird ist es Ressourcensparender, als wenn der Timer für alle Spieler gilt?
    Oder habe ich da etwas übersehen?


    Würde ganz klar Nein sagen.
    Du hast dann trotzdem im schlimmsten Fall für jeden Spieler einen Timer.


    Zitat

    Und was hat das mit der Primzahl auf sich? ^^


    Die Timer können sich von den Ticks her nicht überschneiden. Es kommt daher nicht zu Kollision zwischen Timern.
    Wieso das nicht vorkommen soll, dazu müsste ich etwas länger ausführen wie SA:MP Server funktioniert. Ich such einfach mal den Beiträg im Englischem, wo das steht.


    /Edit:
    Tada !
    http://forum.sa-mp.com/showthread.php?t=61322

    Wieso macht ihr denn einen Timer für jeden Spieler ?

    public OnGameModeInit()
    {
    SetTimer("carheal",503,1); // Lieber eine Primzahl nehmen
    return 1;
    }


    forward carheal();
    public carheal()
    {
    new
    _vid;
    for(new i = 0 ; i < MAX_PLAYERS ; i++) {
    _vid = GetPlayerVehicleID(playerid);
    if( _vid ) { // Hier haste gleich IsPlayerConnected indirekt mit drin
    RepairVehicle(_vid);
    }
    }
    return 1;
    }

    GetPlayerHealth(playerid, HEALTH);
    LEBEN = HEALTH + amount;

    Den Teil braucht man nur,wenn issuerid nicht INVALID_PLAYER_ID ist.
    Anstatt
    if( weaponid == 0 )
    if( weaponid == 1 )
    kannst du auch switch - case benutzt oder gleich else if.



    //Edit:
    Wenn ich das richtig verstehe,kann man durch
    #define TEARGAS 0 // Unnötig
    #define MOLOTOV 0 // Unnötig
    #define FLAMETHROWER 0 // Unnötig
    nicht sterben. Denn es wird der Schaden an Energie zurück gegeben und dann bei der weaponid Abfrage wieder minus 0 gerechnet.
    Oder ist die issuerid bei den Waffen immer falsch?


    //Edit2:


    Die Waffen-IDs sind auch falsch.
    if( weaponid == 38 ) return SetPlayerHealth( playerid, LEBEN - SPRAYCAN);
    SPRAYCAN ist aber die 42.

    Zitat

    42
    Fire Extinguisher
    9
    366


    Da sind so ziemlich alle Waffen falsch belegt.

    Na gut,wenn es immer aufgerufen werden soll, dann machste es am besten so:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    /* Wir später sowieso noch aufgerufen. Daher auskommentieren sonst läuft es 2x ab
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    */
    }
    }
    // else if( killerid == INVALID_PLAYER_ID )
    {
    // Der Übersicht halber lasse ich die { und }
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    return 1;
    }

    Müsste so eigentlich richtig sein, jedenfalls ist es die Abfrage mit killerid & INVALID_PLAYER_ID.


    Ob es das wirklich ist,kann ichauch schlecht wissen.
    Denn woher sollte ich z.B. wissen was folgendes bewirkt / ist:
    PlayerInfo[killerid][pHCValue] // 10
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid); // 18
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid); // 19
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid); // 30
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid); // 31


    Denke du müsstest aber noch PlayerInfo[playerid][pContractValue] auf 0 setzen, wenn der Spieler stirbt ( Damit die Abfrage in OnPlayerDeath nicht weiterhin funktioniert , Zeile 3 ). Vorrausgesetzt du hast es nicht schon in OnPlayerSpawn.


    //Edit: Quatsch.Ist nicht richtig.


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    else
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    }
    return 1;
    }
    Ich denke du bräuchtest es so. Wie gesagt, ich kann aber nicht wissen ob es wirklich so bei dir sein soll.Du müsstest wissen, ob folgender Code:
    else
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }

    Nur aufgerufen werden soll, wenn PlayerInfo[playerid][pContractValue] größer als 0 ist.

    Zitat

    Heist dann ja, das es beim format abschmiert..


    Logisch.Wie sollte es auch nicht ?

    Zitat

    Achso ich hab die Zeile kommentiert in der Abgefragt wird ob killerid != INVALID_PLAYER_ID ist
    damit ich mich selbst töten kann.


    Da liegt auch das Problem.
    Du hast wohl nicht gelesen,was ich geschrieben habe.
    Ließ dir nochmal meinen Post durch.

    Zitat

    und es funktioniert immernoch nicht


    Hilft keinem. Was funktioniert denn nicht. Debug Nachrichten eingefügt ? Was soll denn überhaupt passieren?


    Probier mal folgendes und poste was in der Konsole ausgegeben wird.
    public OnPlayerDeath(playerid, killerid, reason)
    {
    printf("OnPlayerDeath(%d,%d,%d)",playerid,killerid,reason);
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    printf("pContractValue > 0");
    if( killerid != INVALID_PLAYER_ID )
    {
    printf("killerid != INVALID_PLAYER_ID #1");
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    printf("killerid != INVALID_PLAYER_ID #2");
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    printf("killerid != INVALID_PLAYER_ID #3");
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    printf("killerid != INVALID_PLAYER_ID #4");
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    printf("killerid != INVALID_PLAYER_ID #5");
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    printf("killerid != INVALID_PLAYER_ID #6");
    }
    }
    else if( killerid == INVALID_PLAYER_ID )
    {
    printf("killerid == INVALID_PLAYER_ID #1");
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    printf("killerid == INVALID_PLAYER_ID #2");
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    printf("killerid == INVALID_PLAYER_ID #3");
    }
    return 1;
    }

    Das Problem ist,dass du nicht überprüfst ob es ein Selbstmord war, oder er getötet wurde von einem Mitspieler.
    Selbstmord.
    playerid 0 - 499 killerid INVALID_PLAYER_ID - 0xFFFF - 65536
    Mitspieler tötet einen.
    playerid 0 - 499 killerid 0 - 499


    Jetzt gucken wir uns deinen Code an.
    Spätestens bei dem format schmiert der Code ab.
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    Bei einem Selbstmord ist killerid 65536. Sieht also so aus:
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[ 65536 ][pHCValue]);
    Da bei dir PlayerInfo niemals die Größe 65537 hat, wird es crashen.
    Eine einfache Abfrage die dir Hilft,könnte so aussehen.
    if( killerid == INVALID_PLAYER_ID ) // Selbstmord

    donate[playerid][dinput] = strval(inputtext);
    Müsste einen Fehler ausgeben.
    "Array must be indexed" wahrscheinlich.


    Mythen hat nicht mal erwähnt, ob der inputtext eine Zahl sein soll.
    donate[playerid][dinput] = inputtext;
    Das würde nur funktionieren , wenn dinput die Gleiche Größe hat wie inputtext. Da die Größe von inputtext aber unbekannt ist, klappt es nicht.
    Die einfachste Lösung wäre format() . Die Funktion strcat wäre auch möglich ( Gibt wahrscheinlich noch ein paar mehr ).


    format( donate[playerid][dinput] , 128 , inputtext );

    Mach den Test richtig,dann kommt da auch kein P** raus.


    Der return funktioniert nicht richtig, ohne eine Array-Größe anzugeben.

    Zitat

    [15:18:17] sName vor return 'a b c d e f g h i j'
    [15:18:17] [gpne] a_b_c_d_e_f_g_h_i_j --> d
    [15:18:17] [gpne] Proccesstime: [0 ms]
    [15:18:17] [gpne2] a_b_c_d_e_f_g_h_i_j --> a b c d e f g h i j
    [15:18:17] [gpne2] Proccesstime: [0 ms]


    Musste beim Herrn PAWN Anfragen,wieso das so zurückgegeben wird.


    stock GetPlayerNameEx( sName[MAX_PLAYER_NAME] )

    Zitat

    [15:21:30] sName vor return 'a b c d e f g h i j'
    [15:21:30] [gpne] a_b_c_d_e_f_g_h_i_j --> a b c d e f g h i j
    [15:21:30] [gpne] Proccesstime: [0 ms]
    [15:21:30] [gpne2] a_b_c_d_e_f_g_h_i_j --> a b c d e f g h i j
    [15:21:30] [gpne2] Proccesstime: [0 ms]



    Test:
    new
    i,
    x[3];
    x[0] = GetTickCount();
    for( i = 0 ; i < 10000 ; i++) {
    GetPlayerNameEx("a_b_c_d_e_f_g_h_i_j");
    }
    x[1] = GetTickCount();
    for( i = 0 ; i < 10000 ; i++) {
    GetPlayerNameEx2("a_b_c_d_e_f_g_h_i_j");
    }
    x[2] = GetTickCount();
    printf("GetPlayerNameEx %dms", x[1] - x[0] );
    printf("GetPlayerNameEx2 %dms", x[2] - x[1] );

    Ausgabe:

    Zitat

    [15:24:31] GetPlayerNameEx 7ms
    [15:24:31] GetPlayerNameEx2 26ms


    Edit: Gut erkannt,BlackAce :D

    Zitat

    Genau sowas hatte ich auch gemacht. :D


    Seh ich hier nirgendwo. Haste also nicht gemacht :-0

    Zitat

    Und dein Code gibt auch irgendwas anderes aus als den Namen.


    Was denn z.B. ?


    Dein Code funktioniert noch nicht mal.Den hast du niemals getestet.Meinen hast du sicherlich auch nicht getestet.
    stock GetPlayerNameEx(playerid)
    {
    new str[MAX_PLAYER_NAME],tmpvar[2];
    GetPlayerName(playerid,str,MAX_PLAYER_NAME);
    tmpvar=strfind(str,"_");
    if(tmpvar>-1) { str[tmpvar]=' '; }
    tmpvar=strfind(str,"_");
    if(tmpvar>-1) { str[tmpvar]=' '; }
    return str;
    }
    Da fehlt der Index bei tmpvar.Wieso tmpvar ein Array ist,fraglich :-0


    //Edit:


    printf("GetPlayerNameEx() '%s'",GetPlayerNameEx(0));
    // GetPlayerNameEx() 'Das ist ein Test'



    stock GetPlayerNameEx(playerid)
    {
    new
    iOffset = 0,
    sName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,sName,sizeof(sName));
    sName = "Das_ist_ein___Test";
    while( ( iOffset = strfind(sName,"_",false,iOffset) ) != -1 ) {
    sName[iOffset] = ' ';
    }
    return sName;
    }

    Zitat

    Keiner würde mehr als 3 Namen schreiben, und für diese Fälle:


    Würde ... Und was ist wenn doch ?
    Hier wie ich es machen würde ,
    stock GetPlayerNameEx(playerid)
    {
    new
    iOffset = 0,
    sName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,sName,sizeof(sName));
    while( ( iOffset = strfind(sName,"_",false,iOffset) ) != -1 ) {
    sName[iOffset] = ' ';
    }
    return sName;
    }


    Ich mach gleich mal n' Speed Test :wacko:

    Liegt daran,dass du nicht explizit 5 / 2 als Float-Teilung definierst. Daher wird immer 5 / 2 als Integer-Teilung genommen.5 / 2 ist in diesem Fall nämlich immer 2.


    printf("normal: %d",floatround(5 / 2.0,floatround_round)); // 3
    printf("hoch: %d",floatround(5 / 2.0,floatround_ceil)); // 3
    printf("runter: %d",floatround(5 / 2.0,floatround_floor)); // 2


    printf("normal: %d",floatround( floatdiv(5 , 2 ) ,floatround_round)); // 3
    printf("hoch: %d",floatround( floatdiv(5 , 2 ) ,floatround_ceil)); // 3
    printf("runter: %d",floatround( floatdiv(5 , 2 ) ,floatround_floor)); // 2


    Machst du aus 2 eine 2.0 , erkennt der Compiler es als Float an. Daher wird 5 durch 2.0 in dieser Teilung 2.5. Danach wird erst gerunden. Empfehle dir aber floatdiv zu benutzten.

    Jetzt interessiert mich aber mal brenned, was folgendes ist:
    enum (+= 1)
    {
    e_Flag_None = 0,
    e_Flag_Race,
    e_Flag_DM_SHIP,
    e_Flag_DM_WAR,
    e_Flag_DM_HANGAR,
    e_Flag_DM_SNIPER,
    e_Flag_BountyHunter,
    e_Flag_SprengMeister,
    e_Flag_Trucking,
    e_Flag_Derby,
    e_Flag_Parcour,
    e_Flag_Fallout,
    e_Flag_Stunting
    }



    public OnFilterScriptInit()
    {
    new
    test;
    test = 1;
    if( test == e_Flag_Race ) {
    printf("test == e_Flag_Race");
    }
    else {
    printf("test != e_Flag_Race");
    }
    return 1;
    }

    Ist das jetzt etwa kein enum mehr ? Eigentlich sagt das Wort schon,was es konkret ist.
    Aufzählungstyp

    Zitat

    Mit enum können Aufzählungstypen definiert werden. Dazu gehören Wochentage oder Farben. Den Elementen eines Aufzählungstyps werden Namen zugeordnet, obwohl sie intern natürlich als Zahlen codiert werden.


    Trifft es eigentlich ganz gut, hier mal eine Verdeutlichung:
    enum e_Test {
    a, // 0 da Index bei 0 startet
    b, // 1
    c, // 2
    d[3] // 3 - 6
    }


    new
    Test[e_Test];

    public OnFilterScriptInit()
    {
    Test[a] = 5;
    printf("Test[a] = %d",Test[a]);
    printf("Test[ e_Test:0] = %d", Test[ e_Test:0] );
    printf("Test[0] = %d", Test[0] ); // tag mismatch
    Test[2] = 13; // tag mismatch
    printf("Test[code=c] = %d",Test[code=c]);
    printf("Test[ e_Test:2] = %d", Test[ e_Test:2] );
    printf("Test[2] = %d", Test[2] ); // tag mismatch
    return 1;
    }


    Edit:
    [pwn]enum e_Test {
    a, // 0 da Index bei 0 startet
    b, // 1
    c, // 2
    d[3] // 3 - 6
    }


    Edit:
    Hier noch etwas:
    enum e_Test {
    a = 2,
    b, // 3
    }
    new
    Test[e_Test];

    public OnFilterScriptInit() {
    printf("sizeof(Test) %d", sizeof(Test) ); // 4 !
    Test[2] = 5 ;
    printf("Test[a] %d", Test[a]);
    }