Dann beim Einzahlen so:
if((ATM[id][atmGeld] + money) > 2000000)
Dann beim Einzahlen so:
if((ATM[id][atmGeld] + money) > 2000000)
Hallo ich hab ein kleines Problem:
Sobald ich sterbe:
[debug] Run time error 4: "Array index out of bounds"
[debug] Attempted to read/write array element at index 65535 in array of size 1000
[debug] AMX backtrace:
[debug] #0 0002f768 in public OnPlayerDeath (0, 65535, 255) in selfmade.amx
Public OPD:
public OnPlayerDeath(playerid, killerid, reason)
{
if(killerid != INVALID_PLAYER_ID)
{
PlayerInfo[killerid][pKills]++;
GivePlayerMoney(killerid, 700);
PlayerInfo[killerid][pMoney] += 700;
}
PlayerInfo[playerid][pDeaths]++;
GivePlayerMoney(killerid, -200);
PlayerInfo[killerid][pMoney] -= 200;
new pmsg[228];
format(pmsg,sizeof(pmsg),"Gestorben: ~n~Du wurdest von %s getoetet ~n~ ~n~%s",PlayerInfo[killerid][pName],ServerInfo[servername]);
ChangeInfoBox(playerid,pmsg);
format(pmsg,sizeof(pmsg),"Getoetet: ~n~Du hast %s getoetet ~n~ ~n~%s",PlayerInfo[playerid][pName],ServerInfo[servername]);
ChangeInfoBox(killerid,pmsg);
new string[MAX_PLAYER_NAME+80];
format(string,sizeof(string),"DM: %s hat %s getoetet.",PlayerInfo[playerid][pName],PlayerInfo[killerid][pName]);
Log("DM",string);
return 1;
}
Alles anzeigen
Ich bin Localhost drauf und konnte es nicht Testen wenn mich jemand mit einer waffe tötet.
Aber ich vermute die Fehlermeldung kommt, weil killerid nicht gefunden werden konnte oder was meint ihr?
Und wie könnte ich abfragen ob der TOD durch eine Explosion oder Kanten Bug passiert ist?
//EDIT Hat sich erledigt, habe
Benutzt.
Wenn du dich selber tötest ist die killerid immer INVALID_PLAYER_ID (65535)
Also kannst du einfach eine Abfrage reinmachen, aber du hast ja sogar bereits eine
Guten Abend,
ich hab mal eine Frage, ich habe einen '_' in meinem Namen, diesen möchte ich gerne Splitten, um "Vorname" und "Nachnamen" getrennt anzeigen zu lassen.
new splStr[2][20], strMsg[256];
printf("Create - Name: %s", CharInfo[playerid][Name]);
sscanf(CharInfo[playerid][Name], "p<_>s[20]s[20]", splStr[0], splStr[1]);
format(strMsg, sizeof(strMsg), "{E68A00}Datenbank ID: {FFFFFF}%d {E68A00}| Vorname: {FFFFFF}%s {E68A00}| Nachname: {FFFFFF}%s {E68A00}| Geburtsdatum: {FFFFFF}%s",
CharInfo[playerid][ID], splStr[0], splStr[1], CharInfo[playerid][Birthdate]);
SendClientMessage(playerid, -1, strMsg);
Leider spuckt er mir den strMsg nicht in den Chat aus.
Oder kann sscanf ein '_' nicht Splitten?
LG, DomeTastisch.
Möglicherweise ist strMsg zu lang? Lasse es dir mal als print ausgeben, wird es dort ausgegeben? Wenn ja, dann ist es zu lang. strMsg darf höchstens 145 als Array Größe haben, da der Chat nur 144 Zeichen anzeigen kann (plus EOS).
Leider spuckt er mir den strMsg nicht in den Chat aus.
Was spuckt er denn aus?
Printe mal unter dem sscanf einfach die Variablen...was sagt er denn da so
Tatsache, die Nachricht war einfach nur zu lang, ich danke euch.
Dummer Fehler von mir.
LG, DomeTastisch.
hey, hab folgenden code:
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_PLAYER) {
new Float:tmpX;
new Float:tmpY;
new Float:tmpZ;
GetPlayerPos(hitid, tmpX, tmpY, tmpZ);
tmpX += fX;
tmpY += fY;
tmpZ += fZ;
CreatePlayer3DTextLabel(playerid,"Bullet", 0xFF0000FF, tmpX, tmpY, tmpZ, 20.0, 0, 0);
}
return 1;
}
Alles anzeigen
funktioniert alles wie gewollt, will aber dass das textlabel sagt wie viel damage man dem spieler hinzugefügt hat und nach 1ner sekunde wieder verschwindet/zerstört wird. weiß nicht wie weil der callback kein parameter für damage amount hat (wie bei OnPlayerTakeDamage). danke im voraus.
funktioniert alles wie gewollt, will aber dass das textlabel sagt wie viel damage man dem spieler hinzugefügt hat und nach 1ner sekunde wieder verschwindet/zerstört wird. weiß nicht wie weil der callback kein parameter für damage amount hat (wie bei OnPlayerTakeDamage). danke im voraus.
Nutze am Besten: https://wiki.sa-mp.com/wiki/OnPlayerTakeDamage
und dann zum Anzeigen: https://wiki.sa-mp.com/wiki/SetPlayerChatBubble
Nutze am Besten: https://wiki.sa-mp.com/wiki/OnPlayerTakeDamage
und dann zum Anzeigen: https://wiki.sa-mp.com/wiki/SetPlayerChatBubble
hatte die idee auch nur gefällt mir die variente mit dem textlabel besser. gibt es keine möglichkeit dies umzusetzen?
gibt es keine möglichkeit dies umzusetzen
Doch natürlich, nur dachte so wäre es deutlich leichter, weil diese Funktion genau dafür ist...und kp, inwiefern da ein TextLabel überhaupt den Unterschied macht...
Naja, du könntest folgendes machen:
//Oben im Skript
new Text3D:dmgLabel[MAX_PLAYERS] = {Text3D:-1, ...};
new dmgTimer[MAX_PLAYERS];
//Und dann unter OnPlayerTakeDamage
new string[32];
format(string,sizeof(string),"DMG: %.02f",amount);
if(dmgLabel[playerid] != Text3D:-1) Update3DTextLabelText(dmgLabel[playerid], 0xFF0000FF, string),KillTimer(dmgTimer[playerid]);
else dmgLabel[playerid] = Create3DTextLabel(string, 0xFF0000FF, 0,0,0, 20.0, GetPlayerVirtualWorld(playerid), 0),Attach3DTextLabelToPlayer(dmgLabel[playerid],playerid, 0,0,0.4);
dmgTimer[playerid] = SetTimerEx("@DeleteDmgDraw",1000*3,0,"i",playerid); //1000*3 = 3 Sekunden
//Und dann außerhalb:
@DeleteDmgDraw(i);@DeleteDmgDraw(i) {
Delete3DTextLabel(dmgLabel[i]);
dmgTimer[i] = -1;
dmgLabel[i] = Text3D:-1;
}
Alles anzeigen
Doch natürlich, nur dachte so wäre es deutlich leichter, weil diese Funktion genau dafür ist...und kp, inwiefern da ein TextLabel überhaupt den Unterschied macht...
Naja, du könntest folgendes machen:
CAlles anzeigen//Oben im Skript new Text3D:dmgLabel[MAX_PLAYERS] = {Text3D:-1, ...}; new dmgTimer[MAX_PLAYERS]; //Und dann unter OnPlayerTakeDamage new string[32]; format(string,sizeof(string),"DMG: %.02f",amount); if(dmgLabel[playerid] != Text3D:-1) Update3DTextLabelText(dmgLabel[playerid], 0xFF0000FF, string),KillTimer(dmgTimer[playerid]); else dmgLabel[playerid] = Create3DTextLabel(string, 0xFF0000FF, 0,0,0, 20.0, GetPlayerVirtualWorld(playerid), 0),Attach3DTextLabelToPlayer(dmgLabel[playerid],playerid, 0,0,0.4); dmgTimer[playerid] = SetTimerEx("@DeleteDmgDraw",1000*3,0,"i",playerid); //1000*3 = 3 Sekunden //Und dann außerhalb: @DeleteDmgDraw(i);@DeleteDmgDraw(i) { Delete3DTextLabel(dmgLabel[i]); dmgTimer[i] = -1; dmgLabel[i] = Text3D:-1; }
bekomme bei dieser zeile:
else dmgLabel[playerid] = CreatePlayer3DTextLabel(playerid,string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0);
folgende warnung:
bekomme bei dieser zeile:
Ich habe den Code nochmal aktualisiert, schau nochmal rein und nimm den Neusten
Ich habe den Code nochmal aktualisiert, schau nochmal rein und nimm den Neusten
Danke, das scheint zu funktionieren aber nicht wie gewollt (da hätte ich auch gleich die ChatBubble funktion nehmen können wie du schon erwähnt hast.)
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_PLAYER) {
new Float:tmpX;
new Float:tmpY;
new Float:tmpZ;
GetPlayerPos(hitid, tmpX, tmpY, tmpZ);
tmpX += fX;
tmpY += fY;
tmpZ += fZ;
CreatePlayer3DTextLabel(playerid,"Bullet", 0xFF0000FF, tmpX, tmpY, tmpZ, 20.0, 0, 0);
}
return 1;
}
Alles anzeigen
Das hier erstellt das textlabel dort, wo die kugel den spieler trifft.
Das hier erstellt das textlabel dort, wo die kugel den spieler trifft.
Achsooo, ja sag das doch, dass du das willst
Dann lösch das alles..und mach es so:
//unter OnPlayerTakeDamage
new string[32],Float:x,Float:y,Float:z,Text3D:label;
GetPlayerPos(playerid,x,y,z);
format(string,sizeof(string),"DMG: %.02f",amount);
label = Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0);
SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:label); //1000*10 = 10 Sekunden
//Und dann außerhalb:
@DeleteDmgDraw(i);@DeleteDmgDraw(i) {
Delete3DTextLabel(Text3D:i);
}
Alles anzeigen
Dann bleibt das Label 10 Sekunden da, wo der Spieler getroffen wurde.
Achsooo, ja sag das doch, dass du das willst
Dann lösch das alles..und mach es so:
CAlles anzeigen//unter OnPlayerTakeDamage new string[32],Float:x,Float:y,Float:z,Text3D:label; GetPlayerPos(playerid,x,y,z); format(string,sizeof(string),"DMG: %.02f",amount); label = Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0); SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:label); //1000*10 = 10 Sekunden //Und dann außerhalb: @DeleteDmgDraw(i);@DeleteDmgDraw(i) { Delete3DTextLabel(Text3D:i); }
Dann bleibt das Label 10 Sekunden da, wo der Spieler getroffen wurde.
bekomme folgende fehlermeldungen:
new string[32],Float:x,Float:y,Float:z,Text3D:label; //warning 219: local variable "label" shadows a variable at a preceding level und warning 203: symbol is never used: "label"
label = Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0); //error 022: must be lvalue (non-constant)
folgende fehlermeldungen
Dann hast du wohl eine globale Variable die Label heißt, das nicht so juuut, aber auch egal, dann machs einfach so:
new string[32],Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
format(string,sizeof(string),"DMG: %.02f",amount);
SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0)); //1000*10 = 10 Sekunden
//Und dann außerhalb:
@DeleteDmgDraw(i);@DeleteDmgDraw(i) {
Delete3DTextLabel(Text3D:i);
}
Dann hast du wohl eine globale Variable die Label heißt, das nicht so juuut, aber auch egal, dann machs einfach so:
Cnew string[32],Float:x,Float:y,Float:z; GetPlayerPos(playerid,x,y,z); format(string,sizeof(string),"DMG: %.02f",amount); SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0)); //1000*10 = 10 Sekunden //Und dann außerhalb: @DeleteDmgDraw(i);@DeleteDmgDraw(i) { Delete3DTextLabel(Text3D:i); }
Wir kommen der sache näher aber das textlabel wird an der gleichen stelle (genau in der mitte des spielers) erstellt. bei meinem code (wo ich onplayerweaponshot benutzt habe) hat es das textlabel genau dort erstellt wo auch die kugel den spieler getroffen hat.
Achsoooo, schreib das doch hahahaha xD
Mach es so:
if(issuerid != INVALID_PLAYER_ID)
{
new string[32],Float:x,Float:y,Float:z,Float:t;
GetPlayerLastShotVectors(issuerid,t,t,t,x,y,z);
format(string,sizeof(string),"DMG: %.02f",amount);
SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0)); //1000*10 = 10 Sekunden
}
//Und dann außerhalb:
@DeleteDmgDraw(i);@DeleteDmgDraw(i) {
Delete3DTextLabel(Text3D:i);
}
Alles anzeigen
Achsoooo, schreib das doch hahahaha xD
Mach es so:
CAlles anzeigenif(issuerid != INVALID_PLAYER_ID) { new string[32],Float:x,Float:y,Float:z,Float:t; GetPlayerLastShotVectors(issuerid,t,t,t,x,y,z); format(string,sizeof(string),"DMG: %.02f",amount); SetTimerEx("@DeleteDmgDraw",1000*10,0,"i",_:Create3DTextLabel(string, 0xFF0000FF, x,y,z, 20.0, GetPlayerVirtualWorld(playerid), 0)); //1000*10 = 10 Sekunden } //Und dann außerhalb: @DeleteDmgDraw(i);@DeleteDmgDraw(i) { Delete3DTextLabel(Text3D:i); }
vielen dank für deine hilfe jetzt funktioniert alles wie gewollt
edit: noch eine frage bezüglich dazu: wie kann ich es umändern sodass das textlabel nur dem spieler angezeigt wird, der schießt (issuerid) Kaliber