Merhaba. Zevkine roleplay modu kodluyorum. Aslında "zor" dediğim çoğu alanı kodladım ve o kadar da zor gözükmeyen bir yerde takılı kaldım. İnternette baktığımda pek sonuç bulamadım ben de buraya sormak istedim.
Bir kişiye ateş açıldığında silah, neresinden vurulduğu, hasar gibi bilgileri kaydetmek istiyorum. Tek bir sonucu listelemek istersem onu yapması çok kolay fakat ben yediği son 10 hasarı listelemek istiyorum.
enum kullanırsam "hasar1_bolge hasar1_tarih hasar1_damage, hasar2_bolge hasar2_tarih ..." şeklinde gideceği için çok acemice bir kodlama olacak. Başka türlü de nasıl yapacağımı bulamadım.
Kaydettirmek istediğim alanlar "bodypart, issuerid, tarih, weaponid, amount"
Yardımcı olabilirseniz çok sevinirim.
#define MAX_DAMAGE_SLOT (10)
enum damageData
{
bool:
hasarli,
hasarliBolge,
Float:
alinanHasar,
hasarSilahi,
hasarVeren
}
new HasarBilgi[MAX_PLAYERS][MAX_DAMAGE_SLOT][damageData];
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
if(issuerid != INVALID_PLAYER_ID)
{
new ID = GetFreeDamageSlot(playerid);
if(ID == -1)
return false;
HasarBilgi[playerid][ID][hasarli] = true;
HasarBilgi[playerid][ID][hasarliBolge] = bodypart;
HasarBilgi[playerid][ID][alinanHasar] = amount;
HasarBilgi[playerid][ID][hasarSilahi] = weaponid;
HasarBilgi[playerid][ID][hasarVeren] = issuerid;
}
return 1;
}
CMD:hasar(playerid, params[])
{
new userID;
if(sscanf(params, "u", userID))
return SendClientMessage(playerid, 0x00FF00FF, "[!] {FFFFFF}Kullanım: /hasar [Oyuncu ID]");
new List[MAX_DAMAGE_SLOT * 62], weapName[32], playerName[MAX_PLAYER_NAME];
format(List, sizeof List, "{FFFFFF}Hasar Veren\t{FFFFFF}Hasar\t{FFFFFF}Silah\t{FFFFFF}Bölge\n");
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[userID][i][hasarli] == false)
continue;
GetWeaponName(HasarBilgi[userID][i][hasarSilahi], weapName, sizeof weapName);
GetPlayerName(HasarBilgi[userID][i][hasarVeren], playerName, sizeof playerName);
format(List, sizeof List, "%s{FFFFFF}%s\t{FFFFFF}%.02f\t{FFFFFF}%s\t{FFFFFF}%s\n", List, playerName, HasarBilgi[userID][i][alinanHasar], weapName, GetDamagedBodyPart(HasarBilgi[userID][i][hasarliBolge]));
}
ShowPlayerDialog(playerid, 9671, DIALOG_STYLE_TABLIST_HEADERS, "Hasar Bilgileri:", List, "Tamam", "Kapat");
return true;
}
GetFreeDamageSlot(playerid)
{
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[playerid][i][hasarli] == false)
return i;
}
return -1;
}
GetDamagedBodyPart(bodypart)
{
new str[8];
switch(bodypart)
{
case 3:
format(str, sizeof str, "Karın");
case 4:
format(str, sizeof str, "Çatal");
case 5:
format(str, sizeof str, "Sol Kol");
case 6:
format(str, sizeof str, "Sağ Kol");
case 7:
format(str, sizeof str, "Sol Bacak/Ayak");
case 8:
format(str, sizeof str, "Sağ Bacak/Ayak");
case 9:
format(str, sizeof str, "Kafa");
}
return str;
}
Alıntı yapılan: Radless - 08 Mart 2020, 04:24:37#define MAX_DAMAGE_SLOT (10)
enum damageData
{
bool:
hasarli,
hasarliBolge,
Float:
alinanHasar,
hasarSilahi,
hasarVeren
}
new HasarBilgi[MAX_PLAYERS][MAX_DAMAGE_SLOT][damageData];
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
if(issuerid != INVALID_PLAYER_ID)
{
new ID = GetFreeDamageSlot(playerid);
if(ID == -1)
return false;
HasarBilgi[playerid][ID][hasarli] = true;
HasarBilgi[playerid][ID][hasarliBolge] = bodypart;
HasarBilgi[playerid][ID][alinanHasar] = amount;
HasarBilgi[playerid][ID][hasarSilahi] = weaponid;
HasarBilgi[playerid][ID][hasarVeren] = issuerid;
}
return 1;
}
CMD:hasar(playerid, params[])
{
new userID;
if(sscanf(params, "u", userID))
return SendClientMessage(playerid, 0x00FF00FF, "[!] {FFFFFF}Kullanım: /hasar [Oyuncu ID]");
new List[MAX_DAMAGE_SLOT * 62], weapName[32], playerName[MAX_PLAYER_NAME];
format(List, sizeof List, "{FFFFFF}Hasar Veren\t{FFFFFF}Hasar\t{FFFFFF}Silah\t{FFFFFF}Bölge\n");
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[userID][i][hasarli] == false)
continue;
GetWeaponName(HasarBilgi[userID][i][hasarSilahi], weapName, sizeof weapName);
GetPlayerName(HasarBilgi[userID][i][hasarVeren], playerName, sizeof playerName);
format(List, sizeof List, "%s{FFFFFF}%s\t{FFFFFF}%.02f\t{FFFFFF}%s\t{FFFFFF}%s\n", List, playerName, HasarBilgi[userID][i][alinanHasar], weapName, GetDamagedBodyPart(HasarBilgi[userID][i][hasarliBolge]));
}
ShowPlayerDialog(playerid, 9671, DIALOG_STYLE_TABLIST_HEADERS, "Hasar Bilgileri:", List, "Tamam", "Kapat");
return true;
}
GetFreeDamageSlot(playerid)
{
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[playerid][i][hasarli] == false)
return i;
}
return -1;
}
GetDamagedBodyPart(bodypart)
{
new str[8];
switch(bodypart)
{
case 3:
format(str, sizeof str, "Karın");
case 4:
format(str, sizeof str, "Çatal");
case 5:
format(str, sizeof str, "Sol Kol");
case 6:
format(str, sizeof str, "Sağ Kol");
case 7:
format(str, sizeof str, "Sol Bacak/Ayak");
case 8:
format(str, sizeof str, "Sağ Bacak/Ayak");
case 9:
format(str, sizeof str, "Kafa");
}
return str;
}
Kullanıcı 10 hasar aldıktan sonra diğer aldığı hasarları kayıt etmeyecektir. Yani son 10 hasarı kayıt sistemi değil, ilk 10 hasarı kayıt sistemi olmuş. Zaman koşulu eklenerek düzenlenmeli.
#define MAX_DAMAGE_SLOT (10)
enum damageData
{
bool:
hasarli,
hasarliBolge,
Float:
alinanHasar,
hasarSilahi,
hasarVeren
}
new dmgTaken[MAX_PLAYERS];
new HasarBilgi[MAX_PLAYERS][MAX_DAMAGE_SLOT][damageData];
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
if(issuerid != INVALID_PLAYER_ID)
{
if(dmgTaken[playerid] == 10)
{
for(new j = 0; j < MAX_DAMAGE_SLOT; j++)
{
HasarBilgi[playerid][j][damageData:0] = false;
}
dmgTaken[playerid] = 0;
}
new ID = GetFreeDamageSlot(playerid);
if(ID == -1)
return false;
HasarBilgi[playerid][ID][hasarli] = true;
dmgTaken[playerid]++;
HasarBilgi[playerid][ID][hasarliBolge] = bodypart;
HasarBilgi[playerid][ID][alinanHasar] = amount;
HasarBilgi[playerid][ID][hasarSilahi] = weaponid;
HasarBilgi[playerid][ID][hasarVeren] = issuerid;
}
return 1;
}
CMD:hasar(playerid, params[])
{
new userID;
if(sscanf(params, "u", userID))
return SendClientMessage(playerid, 0x00FF00FF, "[!] {FFFFFF}Kullanım: /hasar [Oyuncu ID]");
new List[MAX_DAMAGE_SLOT * 62], weapName[32], playerName[MAX_PLAYER_NAME];
format(List, sizeof List, "{FFFFFF}Hasar Veren\t{FFFFFF}Hasar\t{FFFFFF}Silah\t{FFFFFF}Bölge\n");
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[userID][i][hasarli] == false)
continue;
GetWeaponName(HasarBilgi[userID][i][hasarSilahi], weapName, sizeof weapName);
GetPlayerName(HasarBilgi[userID][i][hasarVeren], playerName, sizeof playerName);
format(List, sizeof List, "%s{FFFFFF}%s\t{FFFFFF}%.02f\t{FFFFFF}%s\t{FFFFFF}%s\n", List, playerName, HasarBilgi[userID][i][alinanHasar], weapName, GetDamagedBodyPart(HasarBilgi[userID][i][hasarliBolge]));
}
ShowPlayerDialog(playerid, 9671, DIALOG_STYLE_TABLIST_HEADERS, "Hasar Bilgileri:", List, "Tamam", "Kapat");
return true;
}
GetFreeDamageSlot(playerid)
{
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[playerid][i][hasarli] == false)
return i;
}
return -1;
}
GetDamagedBodyPart(bodypart)
{
new str[8];
switch(bodypart)
{
case 3:
format(str, sizeof str, "Karın");
case 4:
format(str, sizeof str, "Çatal");
case 5:
format(str, sizeof str, "Sol Kol");
case 6:
format(str, sizeof str, "Sağ Kol");
case 7:
format(str, sizeof str, "Sol Bacak/Ayak");
case 8:
format(str, sizeof str, "Sağ Bacak/Ayak");
case 9:
format(str, sizeof str, "Kafa");
}
return str;
}Sanırım küçük bir indeks resetleme fonksiyonu ile bu işlem önceliği sağlanılabilir.
Alıntı yapılan: flareoNNN - 08 Mart 2020, 11:46:21Kullanıcı 10 hasar aldıktan sonra diğer aldığı hasarları kayıt etmeyecektir. Yani son 10 hasarı kayıt sistemi değil, ilk 10 hasarı kayıt sistemi olmuş. Zaman koşulu eklenerek düzenlenmeli.
Düzgün okumamışım :melek:
#define MAX_DAMAGE_SLOT (100)
enum damageData
{
bool:
hasarli,
hasarliBolge,
Float:
alinanHasar,
hasarSilahi,
hasarVeren
}
new HasarBilgi[MAX_PLAYERS][MAX_DAMAGE_SLOT][damageData];
public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
if(issuerid != INVALID_PLAYER_ID)
{
new ID = GetFreeDamageSlot(playerid);
if(ID == -1)
return false;
HasarBilgi[playerid][ID][hasarli] = true;
HasarBilgi[playerid][ID][hasarliBolge] = bodypart;
HasarBilgi[playerid][ID][alinanHasar] = amount;
HasarBilgi[playerid][ID][hasarSilahi] = weaponid;
HasarBilgi[playerid][ID][hasarVeren] = issuerid;
}
return 1;
}
CMD:hasar(playerid, params[])
{
new userID;
if(sscanf(params, "u", userID))
return SendClientMessage(playerid, 0x00FF00FF, "[!] {FFFFFF}Kullanım: /hasar [Oyuncu ID]");
new List[4096], weapName[32], playerName[MAX_PLAYER_NAME];
format(List, sizeof List, "{FFFFFF}Hasar Veren\t{FFFFFF}Hasar\t{FFFFFF}Silah\t{FFFFFF}Bölge\n");
for(new i = GetAllDamagedSlot(userID); i > GetAllDamagedSlot(userID)-10; i--)
{
if(i >= 0)
{
if(HasarBilgi[userID][i][hasarli] == false)
continue;
GetWeaponName(HasarBilgi[userID][i][hasarSilahi], weapName, sizeof weapName);
GetPlayerName(HasarBilgi[userID][i][hasarVeren], playerName, sizeof playerName);
format(List, sizeof List, "%s{FFFFFF}%s\t{FFFFFF}%.02f\t{FFFFFF}%s\t{FFFFFF}%s\n", List, playerName, HasarBilgi[userID][i][alinanHasar], weapName, GetDamagedBodyPart(HasarBilgi[userID][i][hasarliBolge]));
}
}
ShowPlayerDialog(playerid, 9671, DIALOG_STYLE_TABLIST_HEADERS, "Hasar Bilgileri:", List, "Tamam", "Kapat");
return true;
}
GetFreeDamageSlot(playerid)
{
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[playerid][i][hasarli] == false)
return i;
}
return -1;
}
GetDamagedBodyPart(bodypart)
{
new str[8];
switch(bodypart)
{
case 3:
format(str, sizeof str, "Karın");
case 4:
format(str, sizeof str, "Çatal");
case 5:
format(str, sizeof str, "Sol Kol");
case 6:
format(str, sizeof str, "Sağ Kol");
case 7:
format(str, sizeof str, "Sol Bacak/Ayak");
case 8:
format(str, sizeof str, "Sağ Bacak/Ayak");
case 9:
format(str, sizeof str, "Kafa");
}
return str;
}
GetAllDamagedSlot(playerid)
{
new Number = 0;
for(new i = 0; i < MAX_DAMAGE_SLOT; i++)
{
if(HasarBilgi[playerid][i][hasarli] == true)
Number += 1;
}
return Number;
}Biraz değişiklik yaptım bir de bu şekil dener misin?
Sabah bakıp yorum bırakacağım, teşekkür ederim yardımcı olup yorum atan herkese.
new HasarBilgi[MAX_PLAYERS][MAX_DAMAGE_SLOT][damageData];Bu şekilde bir tanımlama yapıldığını bilmiyordum. Bunu öğrendikten sonra devamına bakmadım bile zaten. Sistemi başarıyla tamamladım, yardımınız için çok teşekkür ederim.
(https://i.hizliresim.com/LAMgPs.png)
@Denizz istediğini yapabildiysen konuyu kilitleyebilirsin ve galiba dediğin şey anladığım kadarıyla 1 veride 1 den fazla slot oluşturmayı bilmemen, öğrendiysen ne mutlu bana.
Sorun çözüme kavuşmuş, kilit & arşiv.