Headshot-System?

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
  • Hallo! Ich habe hier ein Headshot Filterscript, jedoch stirbt der Spieler da durch SetHP 0.
    Ich verwende parallel ein Hitmansystem - allerdings kann der Hitman seinen Contra´ct nicht erfüllen, wenn er einen Sniper-Headshot macht, weil wegen 1) Filterscript und 2) SetHP 0.


    Hat jemand Ideen wie ich es anpassen kann? Wenn was benötigt wird bescheid geben!

    Liebe Grüße


    Marcel

  • Menno menno menno, beschäftigt ihr euch eigentlich mit Pawn :D Was ist wenn du onplayerdeath manuell ausführst und als killerid die playerid übergibst, oder den part wo der spieler durch einen anderen stirbt nochmal extra in einer var abspeicherst und dann aufrufst?

    nanosMalte


    Zitat

    Zitat von Goldkiller




    Obwohl MiniYoda das Wörtchen "Dynamisch" in der Deutschen SA-MP szene mit durchaus fatalen Folgen verbreitete, so hat er dennoch bewiesen, dass er das Handwerk PAWN hervorragend beherrscht. Er gehört definitiv zu den kompetentesten Scriptern die man bei SA-MP.DE finden kann.

  • da PVars zwischen Filterscripts und Gamemode komunizieren können

    Seit wann tun das die Spielervariablen denn?
    Das wäre mir aber gewaltig neu...



    Was schreibst du eigentlich für einen Unsinn?


    Man sollte dich sofort wegen Spam verwarnen.
    Für dich Amateuer mal ein Link, wie die Abfrage der HP funktioniert.


    http://wiki.sa-mp.com/wiki/GetPlayerHealth


    Was ist wenn du onplayerdeath manuell ausführst und als killerid die playerid übergibst, oder den part wo der spieler durch einen anderen stirbt nochmal extra in einer var abspeicherst und dann aufrufst?

    Das ist die einzig wahre Antwort.


    Nochmal zusammengefasst:


    In der Funktion OnPlayerDeath() fragst du die Killer ID ab.
    Ist diese ID dann die ID deines Hitmans und die Player ID,
    die des Gesuchten, erfüllst du den Auftrag.


    Das ist doch nicht schwer oder?


    Wer kann dir sonst leider niemand helfen, da wir entsprechende
    Zeilen und Inhalte, sowie die Variablen dazu nicht kennen.
    :|


  • Teste es mal
    Du kannst pvars die im gamemode ein Wert zugelegt bekommen haben im filterscript Auslesen

    All in all it's just another brick in the wall

  • Aber wie kann ich denn OnPlayerDeath manuell aufrufen?
    Hier mal ein paar Zeilen:


    stock Headshot_ErmittleZielperson(playerid) {
    // Erstellen der Speicherstellen für die Koordinaten des Vektors und der Kamera
    new Float:x,Float:y,Float:z,Float:FrontX,Float:FrontY,Float:FrontZ,Float:CamX,Float:CamY,Float:CamZ;
    // Setzen der Koordinaten in die Variablen
    // Funktionen werden im Tutorial erklärt
    GetPlayerCameraFrontVector(playerid, FrontX, FrontY, FrontZ);
    GetPlayerCameraPos(playerid, CamX, CamY, CamZ);
    for(new Float:i = 0.0; i < 100; i = i + 0.5) {
    // Berechnung der Koordinaten mit Hilfe einer bekannten Rechnung
    x = FrontX * i + CamX; y = FrontY * i + CamY; z = FrontZ * i + CamZ;
    for(new zielperson = 0; zielperson < MAX_PLAYERS; zielperson ++) {
    if(IsPlayerConnected(zielperson)) {
    // Spieler kann sich zwar nicht selber anschießen, aber wir gehen auf eine Nummer sicher
    if(zielperson != playerid) {
    // Falls die Zielperson geduckt
    if(SPIELER_GEDUCKT(zielperson)) {
    // Überprüfen, ob die Zielperson tatsächlich auf den berechneten Koodinaten ist
    if(IsPlayerInRangeOfPoint(zielperson, 0.4, x, y, z)) {
    GameTextForPlayer(playerid, "~r~HEADSHOT", 2000, 6); // GameText für den Spieler
    GameTextForPlayer(zielperson, "~r~HEADSHOT!", 2000, 6); // GameText für die Zielperson
    TOETESPIELER(zielperson); // Töten der Tielperson
    #if defined SENDE_NACHRICHT
    SendDeathMessage(playerid, zielperson, 34);
    #endif
    }
    }
    // Falls die Zielperson steht
    else {
    // Überprüfen, ob die Zielperson tatsächlich auf den berechneten Koodinaten ist
    if(IsPlayerInRangeOfPoint(zielperson, 0.4, x, y, z - 0.7)){
    GameTextForPlayer(playerid, "~r~HEADSHOT", 2000, 6); // GameText für den Spieler
    GameTextForPlayer(zielperson, "~r~HEADSHOT", 2000, 6); // GameText für die Zielperson
    TOETESPIELER(zielperson); // Töten der Tielperson
    #if defined SENDE_NACHRICHT
    SendDeathMessage(playerid, zielperson, 34);
    #endif
    }
    }
    }
    }
    }
    }
    return 1;
    }


    Der wichtigste Teil vom Headshotscript (über dem hier)


    OnPlayerDeath:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(IsPlayerNPC(playerid))return 1;
    SetTimerEx("TotPos",1000,0,"i",playerid);
    ResetPlayerWeapons(playerid);
    M_OnPlayerDeath(playerid,killerid,reason);
    FirstSpawn[playerid]=0;
    new string[128];
    //new kll[128];
    //new td[128];
    PlayerInfo[playerid][pTot] = 1;
    PlayerInfo[killerid][pKills]+=1;
    /*if(PlayerInfo[playerid][DM]==1)
    {
    GetPlayerName(killerid, kll, sizeof(kll));
    format(string, 256,"~r~Sie wurden von >>%s<< getoetet",kll);
    GameTextForPlayer(playerid,string, 2500, 3);
    ClearCrime(killerid);
    }
    if(PlayerInfo[killerid][DM]==1)
    {
    GetPlayerName(playerid, td, sizeof(td));
    format(string, 256,"~g~%s ~w~getoetet ~g~$25",td);
    GameTextForPlayer(killerid,string, 2500, 3);
    GivePlayerMoney(killerid,25);
    ClearCrime(killerid);
    }*/
    new name[MAX_PLAYER_NAME];


    PlayerInfo[playerid][Bankrob]=0;
    gPlayerSpawned[playerid] = 0;
    GetPlayerName(playerid, name, sizeof(name));
    PlayerInfo[playerid][pLocal] = 255;
    if(killerid != 255)
    if(reason == 38)
    {
    new kstring[128];
    new kickname[MAX_PLAYER_NAME];
    if(IsPlayerConnected(killerid))
    {
    GetPlayerName(killerid, kickname, sizeof(kickname));
    format(string, 256, "[AdminWarnung]: [%d]%s hat einen Spieler mit einer Minigun gekillt. ACHTUNG [CheatVerdacht].",killerid,kickname);
    ABroadCast(COLOR_YELLOW,string,1);
    printf("%s", kstring);
    }
    }
    if (gPlayerCheckpointStatus[playerid] > 4 && gPlayerCheckpointStatus[playerid] < 11)
    {
    DisablePlayerCheckpoint(playerid);
    gPlayerCheckpointStatus[playerid] = CHECKPOINT_NONE;
    }
    new caller = Mobile[playerid];
    if(caller != 255)
    {
    if(caller < 255)
    {
    SendClientMessage(caller, COLOR_GRAD2, " Die Verbindung wurde unterbrochen....");
    CellTime[caller] = 0;
    CellTime[playerid] = 0;
    Mobile[caller] = 255;
    }
    Mobile[playerid] = 255;
    CellTime[playerid] = 0;
    }
    ClearCrime(playerid);
    if(BlindFold[playerid] == 1)
    {
    BlindFold[playerid] = 0;
    }
    if(PlayerInfo[playerid][pMauled] == 1)
    {
    PlayerInfo[playerid][pMauled] = 0;
    }
    if(IsBlacklist[playerid]==1)
    {
    ClearBlack(playerid);
    IsBlacklist[playerid]=0;
    }
    if(GettingCK[playerid] < 999 || OnCK[playerid] < 999)
    {
    if(IsPlayerConnected(killerid))
    {
    if(GettingCK[killerid] < 999 || OnCK[playerid] < 999)
    {
    new killer[MAX_PLAYER_NAME];
    new dier[MAX_PLAYER_NAME];
    GetPlayerName(playerid, dier, sizeof(dier));
    GetPlayerName(killerid, killer, sizeof(killer));
    format(string, sizeof(string), "* %s hat deinen Charakter gesperrt, du kannst nun mit diesem Charakter nicht mehr Spielen.",killer);
    SendClientMessage(playerid, COLOR_LIGHTRED, string);
    format(string, sizeof(string), "** %s hat den Spieler %s erledigt**",killer,dier);
    CKLog(string);
    PlayerInfo[playerid][pCK] = 1;
    if(GettingCK[playerid] < 999) { GettingCK[playerid] = 999; }
    else if(OnCK[playerid] < 999) { OnCK[playerid] = 999; }
    if(GettingCK[killerid] < 999) { GettingCK[killerid] = 999; }
    else if(OnCK[killerid] < 999) { OnCK[killerid] = 999; }
    KickPlayer[playerid] = 1;
    }
    }
    }
    //Der wichtige Teil!!!
    if(PlayerInfo[playerid][pHeadValue] > 0)
    {
    if(IsPlayerConnected(killerid))
    {
    if(PlayerInfo[killerid][pMember] == 8 || PlayerInfo[killerid][pLeader] == 8)
    {
    if(GoChase[killerid] == playerid)
    {
    ConsumingMoney[killerid] = 1;
    new killer[MAX_PLAYER_NAME];
    GetPlayerName(killerid, killer, sizeof(killer));
    GivePlayerMoney(killerid, PlayerInfo[playerid][pHeadValue]);
    format(string,128,"<< Hitman %s hat den Auftrag an %s erfüllt und bekommt: $%d >>",killer,name,PlayerInfo[playerid][pHeadValue]);
    SendFamilyMessage(8, COLOR_YELLOW, string);
    PlayerInfo[playerid][pHeadValue] = 0;
    GotHit[playerid] = 0;
    GetChased[playerid] = 999;
    GoChase[killerid] = 999;
    }
    }
    }
    }
    PlayerInfo[playerid][ptankart] = 0;
    return 1;
    }

    Liebe Grüße


    Marcel

  • Du könntest das Headshot-System in den Gamemode mit einbringen und bei der Funktion
    TOETESPIELER(zielperson);
    Einfach abfragen ob der Killer ein Hitman ist.


    Also als Beispiel:
    if(IsPlayerInFrac(killerid,hitmafrakid)
    {
    if(Contract[killerid] == zielperson) //Hier abfragen ob der getötete der Contract des Spielers ist.
    {
    GivePlayerMoney(killerid,contractmoney); //Hier das Geld was er für den Contract bekommt
    }
    }


    So UNGEFÄHR könntest du dies machen.

  • Hier Empfiehlt man keine Script Mein Gott,...


    Zu deinen problem:



    SetPVarInt(playerid,"lhit",pID);//pID spieler der in Getroffen hat am Besten das zu OnPlayerTakeDamage und anpassen
    //Dan bei OnPlayerDeath ganz oben
    killerid = GetPVarInt(playerid,"lhit");
    //So einfach ist die Killerid besser festgelegt ;)


    MFG Arendium

  • killerid = GetPVarInt(playerid,"lhit");


    killerid also der Killer ist ja der Hitman selber. Was bringt dir dann diese abfrage?

  • Alter alter alter alter... da werd ich ja zum Wolf:


    Also du kannst OnPlayerDeath einfach als Funktion ausführen in Quelltext, du musst ihm dann nur die Variablen geben. OnPlayerDeath ist nicht anderes als eine normale Funktion, die zwar ein Event noch hat, aber die du wie SetPlayerHealth einfach in deinem Code ausführen kannst ;)

    nanosMalte


    Zitat

    Zitat von Goldkiller




    Obwohl MiniYoda das Wörtchen "Dynamisch" in der Deutschen SA-MP szene mit durchaus fatalen Folgen verbreitete, so hat er dennoch bewiesen, dass er das Handwerk PAWN hervorragend beherrscht. Er gehört definitiv zu den kompetentesten Scriptern die man bei SA-MP.DE finden kann.

  • Alter alter alter alter... da werd ich ja zum Wolf:


    Also du kannst OnPlayerDeath einfach als Funktion ausführen in Quelltext, du musst ihm dann nur die Variablen geben. OnPlayerDeath ist nicht anderes als eine normale Funktion, die zwar ein Event noch hat, aber die du wie SetPlayerHealth einfach in deinem Code ausführen kannst ;)


    Am besten noch per CallLocalFunction ich persönlich würde eher zu dieser include http://forum.sa-mp.com/showthread.php?t=403713
    oder seif bodypart include präferiere diese sind genauer als diese berechnung die du hier im forum gefunden hast.