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.