Beiträge von .Gottkomplex.

    Keine Ahnung wo, denn ich weiß ja nicht was du wann und wo vor hast, ich habe dir nur die Frage "Wie kann ich Abfragen wv Player in einem Checkpoint sind und das sie dann bei 2 Starten .." beantwortet.


    €: Ich kann dir aber sagen, dass es nicht funktionieren wird, weil du betreter schon global deklariert hast.

    Das weiss ich, aber er hatte nicht danach gefragt wie man eigene Musik Abspielt ;) Hahahaha


    Auf vielen Servern sehe ich zur Zeit, das ein Lied beim Login abgespielt wird. Es wird aber kein Stream abgespielt und es startet immer von vorne bei jedem User.
    Leider finde ich keine Antwort.
    Wie geht das?


    mfg Chax


    Nein, wollte er ja überhaupt nicht. </ironie>


    In diesem Tutorial geht es darum, die BOTs HP verlieren zu lassen, wenn man sie abschießt und dazu noch eine HP Anzeige.
    Vorausgesetzt für dieses Tutorial ist, dass ihr genügend Grundwissen über BOTS habt, oder mein anderes Tutorial gelesen habt.
    Wie im anderen Tutorial wird wieder mal RNPC benötigt.


    Also wir haben den BOT jetzt connected auf unserem Server, doch nun wollen wir, dass er HP verliert, sobald man auf ihn schießt, wie bei normalen Spielern.


    Da BOTS keine "richtige HP" wie bei Spielern haben, geben wir ihnen eine PVar dafür unter OnPlayerSpawn.



    if(IsPlayerNPC(playerid)==1)
    {
    SetPVarFloat(playerid, "Leben", 100.00);


    }


    Als nächstes machen wir uns ein Callback unter OnPlayerUpdate, das immer aufgerufen wird, wenn ein Spieler schießt.



    new curweapon = GetPlayerWeapon(playerid);
    new curammo = GetPlayerAmmo(playerid);
    if(curweapon == GetPVarInt(playerid, "CurWeapon"))
    {
    if(curammo != GetPVarInt(playerid, "curammo"))
    {
    if(curammo < GetPVarInt(playerid, "curammo"))
    {
    OnPlayerShoot(playerid, curweapon);

    }
    SetPVarInt(playerid, "curammo", curammo);
    }
    }
    else
    {
    SetPVarInt(playerid, "CurWeapon", curweapon);
    }


    Unter dem neuen Callback von uns, das wir OnPlayerShoot genannt haben, müssen wir jetzt noch abfragen, ob ein Spieler anvisiert wird, und ob der Spieler ein NPC ist.
    Zusätzlich legen wir den anvisierten Spieler in eine PVar, weil wir das später noch brauchen. Dann müssen wir noch eine PVar abfragen, die wir ihm bei seinem tot später geben.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {

    }
    }
    }
    }


    Jetzt können wir noch die Reichweite abfragen, falls man Waffen für nur bestimmte Reichweiten einstellen will.
    Dazu fügen wir dies hier erstmal ganz oben unter den Includes ins Script ein. Dieses Array enthält alle abgeschätzten Reichweiten der Waffen.



    new Float:wpReichweite[] = {
    1.0,
    1.0,
    1.2,
    1.2,
    1.1,
    1.2,
    1.2,
    1.3,
    1.2,
    1.3,
    0.5,
    0.5,
    0.5,
    0.5,
    0.5,
    1.4,
    12.0,
    12.0,
    12.0,
    0.0,
    0.0,
    0.0,
    28.0,
    29.0,
    30.0,
    26.0,
    25.0,
    27.0,
    28.0,
    31.0,
    35.0,
    35.0,
    26.0,
    38.0,
    65.0,
    40.0,
    40.0,
    23.0,
    37.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0
    };


    Jetzt können wir abfragen. Dazu brauchen wir erstmal die Koordinaten des angeschossenen BOTs und können dann abfragen, ob er in der jeweiligen Reichweite ist.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {

    }

    }
    }
    }
    }


    Jetzt brauchen wir erstmal den Waffenschaden, da ja nicht jede Waffe den gleichen Schaden machen soll, machen wir dafür auch ein Array.
    Diese sind auch einigermaßen angepasst.



    new wpSchaden[] = {
    1,
    2,
    4,
    4,
    5,
    4,
    4,
    4,
    6,
    15,
    1,
    1,
    1,
    1,
    1,
    4,
    80,
    2,
    0,
    10,
    0,
    10,
    35,
    30,
    35,
    15,
    17,
    15,
    8,
    9,
    40,
    12,
    100,
    0,
    55,
    40,
    0,
    4,
    2,
    0,
    0,
    0,
    0,
    0,
    0
    };


    Damit es gleich etwas weniger zu Schreiben gibt, legen wir den Waffenschaden und ein paar PVars erstmal in normale Vars.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    }

    }
    }
    }
    }


    Jetzt müssen wir noch den Waffenschaden von der alten HP abziehen und sie in die HP PVar des BOTs legen.


    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    }

    }
    }
    }


    Jetzt brauchen wir noch eine Abfrage dafür, wenn health weniger oder gleich 0 ist.
    Dort weisen wir im dann die vorhin abgefragte PVar zu.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    if(health <= 0.0)
    {
    SetPVarInt(player, "tot", 1);


    }
    }

    }
    }
    }
    }


    Jetzt könnt ihr machen was ihr wollt, um den BOT tot aussehen zu lassen.
    Z.b. alte Animationen entfernen, neue Animation zuteilen, laufende Timer killen.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    if(health <= 0.0)
    {
    ClearAnimations(player);
    SetPVarInt(player, "tot", 1);
    ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
    new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
    KillTimer(tid);
    }
    }

    }
    }
    }
    }



    So, jetzt kommen wir mal zur HP Anzeige.
    Dazu geben wir dem BOT nach dem Spawn einen 3DTextLabel unter OnPlayerSpawn und speichern die ID des Labels gleich als PVar, damit wir es später updaten können.



    if(IsPlayerNPC(playerid)==1)
    {
    new Text3D:label;
    SetPVarFloat(playerid, "Leben", 100.00);
    new string[128];
    format(string,128,"{00D7FF}Leben: {FF0023}100%");
    label = Create3DTextLabel(string, 0x008080FF, 0.0, 0.0, 0.0, 20.0, 0);
    SetPVarInt(playerid, "Label", _:label);
    Attach3DTextLabelToPlayer(label, playerid, 0.0, 0.0, 0.1);
    }


    Jetzt müssen wir das Label noch updaten, wenn der BOT angeschossen wird. Dies machen wir wieder unter OnPlayerShoot.
    Dazu erstellen wir einen String, der den neuen Inhalt der HP Anzeige haben wird. Also im normalen Fall wird die neue HP des BOTs angezeigt und beim Tod wird 0% angezeigt.
    Die HP wandeln wir vom Float zum Integer um, weil wir keine Kommazahl angezeigt haben wollen. Dann holen wir uns noch die ID des Labels, die wir in eine PVar gelegt haben und legen
    sie in eine Text3DVar, weil es anders nicht geht. Schon können wir das Label updaten.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new string[128]; // Der neue String
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    format(string,128,"{00D7FF}Leben: {FF0023}%d%",floatround(health,floatround_round)); // Die neue HP wird in den String gesetzt
    if(health <= 0.0)
    {
    ClearAnimations(player);
    SetPVarInt(player, "tot", 1);
    ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
    new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
    KillTimer(tid);
    format(string,128,"{00D7FF}Leben: {FF0023}0%"); // Falls der Bot stirbt, wird 0% angezeigt, anstatt die negative HP
    }
    new ee = GetPVarInt(player, "Label");
    new Text3D:label;
    label = Text3D:ee;
    Update3DTextLabelText(label, 0xFFFFFFFF, string);

    }

    }
    }
    }
    }




    Dies ist das Ende des Tutorials. Wenn ihr Syntaxfehler oder logische Fehler findet, bitte posten.


    Was schreibst du für ein Müll? Wenn er keine Nachricht bekommt wo ein Stream gepostet dann kann das auch damit gehen! Ich machs ja selber also pssst! :!: Wenn man keine ahnung hat einfach mal leise sein und nicht spamen.....


    Mit "PlayerPlaySound(); kann er z.B. die 1185 nehmen, die habe ich damals auf jeden RL oder RP Server gehabt, hat ein wenig genervt.^^


    Kann es nicht, da man so nur in GTASA schon vorhandene Sounds abspielen kann. ;)


    Wie stellst du dir das denn vor? :D
    Der Boden ist nicht überall gleich, dann braucht man 100000x IsPlayerInRangeOfPoint..


    B2T: Ich glaube es gibt doch so ein Include von MapAndreas, damit müsste es möglich sein


    Vielleicht will er ja abfragen, ob er auf einer bestimmten Stelle gelandet ist. Flughafen o.ä.

    Wir haben doch eins, dies möchte ich aber persönlich mit dem Scripter dann besprechen


    Du solltest am besten vorher schon angeben, wie du das mit der Bezahlung klären willst, denn mit deinen 9 Beiträgen kommst du einem nicht sehr vertrauenswürdig vor.
    Somit würden sich auch nicht viele melden.