Beiträge von Jeffry

    Dann erstell zudem noch eine Spielervariable, die du zu 1 setzt, und bei deinem Fraktionsspawn überprüfst du, ob diese 1 ist. Ist das der Fall, wird der Fraktionsspawn nicht aufgerufen, und die Variable wird dann wieder zu 0 gesetzt.


    @[SoA]TheBester:
    SpawnPlayer(playerid); ist benötigt, damit die Health wieder voll ist.


    Man kann es auch weglassen, dann würde ich aber ganz darauf verzichten, die Position bei OnPlayerDeath zu ändern, sonder es erst mit der Variable bei OnPlayerSpawn machen.


    Equ: Verstanden wie ich meine? SpielerVariable: Wenn 1, dann spawn im Knast, wenn 0 dann spawn an der Fraktion.

    Du musst nicht 20 mal den gleichen Teil hinschreiben, ich hab dir das doch so gemacht:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    if(isPlayerInFrakt(killerid,1) || isPlayerInFrakt(killerid,2) || isPlayerInFrakt(killerid,3) && GetPVarInt(playerid,"Wanteds") >= 1)
    {
    new wanted = GetPVarInt(playerid,"Wanteds");
    if(wanted > 0 && wanted <= 20)
    {
    new tmp[128];
    format(tmp, sizeof(tmp), "~w~Gesuchten getötet ~g~+%d $", wanted*150);
    GameTextForPlayer(killerid,tmp,3000,1);
    TextDrawHideForPlayer(playerid,WantedStern[playerid]);
    TextDrawHideForPlayer(playerid,WantedAnzahl[playerid]);
    SetPVarInt(playerid,"Wanteds",0);
    SpawnPlayer(playerid); //Eingefügt
    SetPlayerPos(playerid,2799.8767,2757.6726,10.8203);
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(isPlayerInFrakt(i,1) || isPlayerInFrakt(i,2) || isPlayerInFrakt(i,3))
    {
    new string[128];
    format(string,sizeof(string),"|---| Der Gesuchte %s wurde getötet |---|",SpielerName(killerid));
    SendClientMessage(i,0x548598FF,string);
    format(string,sizeof(string),"HQ: %s hat den Gesuchten %s getötet!",SpielerName(killerid),SpielerName(playerid));
    SendClientMessage(i,0x00489184,string);
    }
    }
    }
    }
    }
    }
    return 1;
    }
    Hab jetzt noch SpawnPlayer eingefügt, das sollte dann tun.

    Oben im Code, unter die includes:
    new ZuletztRuestung[MAX_PLAYERS];


    OnPlayerConnect:
    ZuletztRuestung[playerid] = 0;



    if(strcmp(cmdtext,"/ausrüsten", true)==0)
    {
    if(IsPlayerInRangeOfPoint(playerid,1.0,414.4211,2531.0947,19.1729))
    {
    if(isPlayerInFrakt(playerid,8))
    {
    if(ZuletztRuestung[playerid] + (2*3600) > gettime()) return SendClientMessage(playerid, ROT, "Du kannst es nur alle 2 Stunden kaufen.");
    ZuletztRuestung[playerid] = gettime();
    GivePlayerWeapon(playerid,35,5);
    GivePlayerWeapon(playerid,30,500);
    GivePlayerWeapon(playerid,24,50);
    GivePlayerMoney(playerid,-30000);
    SendClientMessage(playerid,GRÜN,"Deine nächste Ausrüstung kannst du in 2 Stunden abholen");
    return 1;
    }
    SendClientMessage(playerid,ROT,"Du kannst diesen Befehl nicht nutzen");
    return 1;
    }
    }

    Was macht noSchleife?


    Das ist eine, ich nenn es mal Position im Code. Anschaulich sieht das so aus:


    print("1");
    goto WOANDERS;
    print("2");
    WOANDERS:
    print("3");
    Dies würde nun folgendes ausgeben:

    Zitat

    1
    3


    goto gibt die Ausweisung sofort zu WOANDERS zu springen.


    In dem Fall von oben würde somit die Schleife übersprungen werden.

    Ich hau mich weg, hat eigentlich irgendjemand den ersten Post gelesen? Ihm geht es doch gar nicht darum, dass der Server abstürzt wenn ihn NIEMAND tötet, sondern wenn ihn JEMAND tötet, bzw. wenn er jemanden tötet. Einen Bitte: Lest doch bitte den ersten Post.



    Der Fehler ist doch ganz klar ersichtlich:
    SendClientMessage(i,0x548598FF,"|---| Der Gesuchte %s wurde getötet |---|");
    Leerer Platzhalter in SendClientMessage, der gehört da nicht hin.


    Ich hab deinen Code auch gleich mal etwas schöner gemacht:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    if(isPlayerInFrakt(killerid,1) || isPlayerInFrakt(killerid,2) || isPlayerInFrakt(killerid,3) && GetPVarInt(playerid,"Wanteds") >= 1)
    {
    new wanted = GetPVarInt(playerid,"Wanteds");
    if(wanted > 0 && wanted <= 20)
    {
    new tmp[128];
    format(tmp, sizeof(tmp), "~w~Gesuchten getötet ~g~+%d $", wanted*150);
    GameTextForPlayer(killerid,tmp,3000,1);
    TextDrawHideForPlayer(playerid,WantedStern[playerid]);
    TextDrawHideForPlayer(playerid,WantedAnzahl[playerid]);
    SetPVarInt(playerid,"Wanteds",0);
    SetPlayerPos(playerid,2799.8767,2757.6726,10.8203);
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(isPlayerInFrakt(i,1) || isPlayerInFrakt(i,2) || isPlayerInFrakt(i,3))
    {
    new string[128];
    format(string,sizeof(string),"|---| Der Gesuchte %s wurde getötet |---|",SpielerName(killerid));
    SendClientMessage(i,0x548598FF,string);
    format(string,sizeof(string),"HQ: %s hat den Gesuchten %s getötet!",SpielerName(killerid),SpielerName(playerid));
    SendClientMessage(i,0x00489184,string);
    }
    }
    }
    }
    }
    }
    return 1;
    }


    Ich hoffe es tut so. :)

    In dem enum in welchem 'Leben' deklariert ist fehlt bei 'Leben' wohl das Float: .


    Float:Leben,


    Tag Mismatch bedeutet, dass der Tag, also das was vor dem Doppelpunkt steht falsch ist bzw. fehlt.

    @[PA]Piet_Meier: Ne. Das wäre ja bei 1000 health (also voll): 1000 - 100 = 900. 8|
    @[PA]Piet_Meier: Nach deinem edit: Noch weniger, das wäre jetzt: (1000 - 1000) / 10 = 0%.


    new Float:chealth = GetVehicleHealth(vehicleid, chealth);
    zu
    new Float:chealth;
    GetVehicleHealth(vehicleid, chealth);


    Hatte ich nicht gesehen, das dürfte es (mit dem vorherigen Post zusammen) beheben.

    if(health > 600)
    {
    format(string,sizeof(string),"~g~%s",Fahrzeugname[GetVehicleModel(GetPlayerVehicleID(i))-400]);
    TextDrawSetString(Tacho3,string);
    }
    else if(health > 300)
    {
    format(string,sizeof(string),"~y~%s",Fahrzeugname[GetVehicleModel(GetPlayerVehicleID(i))-400]);
    TextDrawSetString(Tacho3,string);
    }
    else
    {
    format(string,sizeof(string),"~r~%s",Fahrzeugname[GetVehicleModel(GetPlayerVehicleID(i))-400]);
    TextDrawSetString(Tacho3,string);
    }


    Falsch!!!
    Es werden dann zwar 100.000 angezeigt aber in der Variable sind noch 100 Euro. Folglich sind innerlich 100 Euro in der Datenbank. Da ich GetPlayerMoney nur für den Anticheat nutze.
    Aber beim Speichern Frage ich das selbe nochmal ab ;)


    Genau, wurde ja bereits gesagt. :)
    Diese Vorraussetzung hatte ich unterschlagen, tut mir Leid. Gehen wir mal davon aus, dass du nicht GetPlayerMoney verwendest, dann wird das Geld natürlich nicht gespeichert, das stimmt. Das war aber aus deinem Code nicht ersichtlich, wie du das machst. Um nicht mit nackten Variablen zu arbeiten, würde sich das da anbieten:


    stock _GetPlayerMoney(playerid)
    {
    return PlayerInfo[playerid][Geld];
    }


    Damit wären dann alle Unklarheiten beseitigt, würde ich sagen, oder? :)

    Leute!!! Er will doch das da:

    und wie kann man das machen das wen die NRG kaputt geht das sie nicht respawnt ?


    Wenn das NRG-500 explodiert, möchte er es NICHT wieder spawnen lassen.


    TheTutoFreak:
    public OnVehicleDeath(vehicleid)
    {
    if(ServerNRG[vehicleid])
    {
    DestroyVehicle(vehicleid);
    ServerNRG[vehicleid] = false;
    }
    return 1;
    }


    Dazu must du noch Folgendes machen:
    new bool:ServerNRG[MAX_VEHICLES]; //Irgendwo direkt unter die #include's setzen


    new id = CreateVehicle(522,x,y,z,rott,0,0,0);
    ändern zu:
    new id = CreateVehicle(522,x,y,z,rott,0,0,0);
    ServerNRG[id] = true;


    Das stimmt aber nicht ganz...du hast zwar Recht, dass wenn die Funktion nicht mehr aufgerufen wird der Cheater auch nciht direkt gebannt wird aber durch diese Variante mit der Geldvariable wird ja beim ausloggen auch die Variable gespeichert und nicht per GetplayerMoney(so würde ich es zumindest machen) und damit nicht sein ercheatetes Geld


    Unter dieser Vorraussetzung ja, da hast du allerdings Recht, wenn es so gemacht wird. :D


    Ich denke mal wir können da noch unendlich weit ins Detail gehen, daher würde ich mal sagen, dass dieser Thread eigentlich beendet ist, zumindest was die Ausgangsfrage betrifft sollte dem Threadstarter ja mehr als geholfen sein. :thumbup:

    [DT]Midoman:
    Ja, mit einem Trick:


    Oben im Code:
    new Float:MarkerPos[100][3]; //100 Map Icons ist ja das Limit


    stock SetPlayerMapIcon_Ex(playerid, iconid, Float:x, Float:y, Float:z, markertype, color, style)
    {
    MapIconPos[iconid][0] = x;
    MapIconPos[iconid][1] = y;
    MapIconPos[iconid][2] = z;
    return SetPlayerMapIcon(playerid, iconid, x, y, z, markertype, color, style);
    }


    Position wird dann so abgefragt:
    printf("Map Icon Nummer 15 ist an der Position: %f, %f, %f.", MapIconPos[15][0], MapIconPos[15][1], MapIconPos[15][2]);


    Man könnte die _Ex Funktion auch hooken, darauf habe ich aber mal verzichtet, das lohnt sich wirklich nicht.