/explosion (Healhack Test Bug)

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
  • Heyho Community,
    ich habe nen /explosion Befehl gescriptet, der eine Explosion auf einem Spieler machen soll um zu schauen ob er Healhack benutzt.
    Hier der Code:




    ocmd:explosion(playerid,params[])
    {
    if(!IsPlayerAnAdmin(playerid,3))return SendClientMessage(playerid,ROT,"Diesen Befehl kannst du nicht nutzen. Mindestens benötigter Rang: Admin");// Adminabfrage
    new pID,string[128];
    new Float:X,Float:Y,Float:Z;
    GetPlayerPos(pID,X,Y,Z);
    CreateExplosion(X,Y,Z,100,5);
    if(sscanf(params,"us",pID))return SendClientMessage(playerid,BLAU,"/explosion [ID]");//fehlermeldung wenn falsche eingaben
    format(string,sizeof(string),"%s wurde von %s auf Healhack kontrolliert.",SpielerName(pID),SpielerName(playerid));//string
    if(!IsPlayerAnAdmin(playerid,1))return 0;
    SendClientMessageToAll(BLAU,string);
    return 1;
    }


    Ich weiß nicht genau wie ich das in einem Pawn Queltext einfüge ohne das es nebeneinander steht.
    So, nun das Problem:
    Die Explosion macht 1. kein Dmg und sie Spawnt beim ausführer, also Playerid, auch wenn ich eine andere ID eingebe oder garkeine ID.
    Meine Frage ist, wie kann ich das beheben und wie mache ich eine "SendClientMessageToAdmins"?


    Gruß,

  • ähh wenn du abfragen willst ob er healthhack benutzt würde ich das ein klein wenig anders machen...



    ocmd:lebencheck(playerid,params[]) // ändere meinetwegen den Namen völlig wurscht
    {
    if(!IsPlayerAnAdmin(playerid,3))return SendClientMessage(playerid,ROT,"Diesen Befehl kannst du nicht nutzen. Mindestens benötigter Rang: Admin");// Adminabfrage
    new Float:Pos[3],inputID,string[128],Float:ATM_Health,Float:ATM_Armour,Float:After_Health; //ATM_Health = Momentanes Leben, ATM_Armour = Momentane Rüstung
    if(sscanf(params,"d",inputID)) return SendClientMessage(playerid,BLAU,"/explosion [ID]");//fehlermeldung wenn falsche eingaben
    if(!IsPlayerConnected(inputID)) return SendClientMessage(playerid,ROT,"Dieser Spieler ist nicht online!");
    GetPlayerHealth(inputID,ATM_Health);
    GetPlayerArmour(inputID,ATM_Armour);
    GetPlayerPos(inputID,Pos[0],Pos[1],Pos[2]);
    SetPlayerHealth(inputID,100);
    SetPlayerArmour(inputID,0);
    CreateExplosion(Pos[0],Pos[1],Pos[2],11,15); // ich würde eine kleine Explosion empfehlen ^^
    GetPlayerHealth(inputID,After_Health);
    format(string,sizeof(string),"%s wurde von %s auf Healhack kontrolliert. Leben: %0.2f",SpielerName(inputID),SpielerName(playerid),After_Health);//string
    SetPlayerHealth(inputID,ATM_Health);
    SetPlayerArmour(inputID,ATM_Armour);
    if(!IsPlayerAnAdmin(inputID,1))return 1;
    SendClientMessageToAll(BLAU,string);
    return 1;
    }


    Dies ist noch ungetestet, außerdem würde ich ihn zu einem anderen Ort porten ^^
    Dann kann auch niemandem Anderen etwas passieren ^^


    Falls ne erklärung nötig ist schreib im thread ^^

  • Funktioniert Einwandfrei, danke für die Hilfe, bloß gibt es ein Problem:
    Ich habe den Healhacktest auf mich selbst ausgeübt und habe trotzdem kein Leben verloren.
    Die Explosion zieht irgendwie kein DMG.


    Eine Erklärung wäre auch ganz cool :)


    Gruß und danke :)

  • Hey, hat leider nichts gebracht, ich glaube es liegt daran, das die HP direkt wieder auf 100 gesetzt wird.
    Ich versuch mal das Explosion über den GetPlayerHealth zu machen und schauen was passiert, trotzdem danke für deinen Hilfsversuch! :)


    Gruß,


    E:
    Ich weiß nun woran es liegt, aber ich weiß nicht wie ich es Scripten soll :P
    Es liegt daran, das die HP zu schnell wieder auf 100 gesetzt sind un die Abfrage nach dem Leben nach der Explosion einfach zu langsam ist, daher bräuchte ich einen Timer, der nach ca. 0,5-1 Sekunde erst Abfragt wie viel Leben der Spieler hat.

    Einmal editiert, zuletzt von roOlling ()

  • Abgesehen davon das es scheiße gescriptet ist, finde ich es so angenehmer:

    ocmd:lebencheck(playerid,params[]) // ändere meinetwegen den Namen völlig wurscht
    {
    if(!IsPlayerAnAdmin(playerid,3))
    return SendClientMessage(playerid,ROT,"Diesen Befehl kannst du nicht nutzen. Mindestens benötigter Rang: Admin");// Adminabfrage
    new Float:Pos[3],
    inputID,
    string[128],
    Float:ATM_Health,
    Float:ATM_Armour,
    Rechnung,
    Float:newhealth; //ATM_Health = Momentanes Leben, ATM_Armour = Momentane Rüstung
    if(sscanf(params,"u",inputID))
    return SendClientMessage(playerid,BLAU,"/explosion [ID]");//fehlermeldung wenn falsche eingaben
    if(!IsPlayerConnected(inputID))
    return SendClientMessage(playerid,ROT,"Dieser Spieler ist nicht online!");
    GetPlayerHealth(inputID,ATM_Health);
    GetPlayerArmour(inputID,ATM_Armour);
    GetPlayerPos(inputID,Pos[0],Pos[1],Pos[2]);
    SetPlayerHealth(inputID,100);
    SetPlayerArmour(inputID,0);
    CreateExplosion(Pos[0],Pos[1],Pos[2],11,15); // ich würde eine kleine Explosion empfehlen ^^
    Rechnung = 100 - GetPlayerHealth(playerid, newhealth);
    format(string,sizeof(string),"%s wurde von %s auf Healhack kontrolliert. Lebensdifferenz: %d",SpielerName(inputID),SpielerName(playerid), Rechnung);//string
    SendClientMessageToAll(BLAU,string);
    SetPlayerHealth(inputID,ATM_Health);
    SetPlayerArmour(inputID,ATM_Armour);
    //if(!IsPlayerAnAdmin(inputID,1))return 1; // hä, was soll der scheiß jetzt?
    return 1;
    }

  • 1. Das war provisorisch spontan gescriptet...
    2. Das Leben kann ruhig neu gesetzt werden, da du ne Nachricht bekommst wie viel leben du nach der Explosion hast
    3. gibt es bei deiner rechnung einen "Schönheitsfehler"
    Die rechnung ist überflüssig und noch dazu falsch...


    wenn man rechnung haben will dann muss das so sein



    new Float:Rechnung;
    new Float:newhealth;
    //nach CreateExplosion
    GetPlayerHealth(inputID,newhealth);
    Rechnung = 100 - newhealth;
    format(string,sizeof(string),"%s wurde von %s auf Healhack kontrolliert. Lebensdifferenz: %d",SpielerName(inputID),SpielerName(playerid), floatround(Rechnung));//string

    So hab ich es gelernt und meiner meinung nach ist das der richtigerererererere Weg :D