GTAMulti - GTA Türkiye

San Andreas Multiplayer => Yardım Talepleri => PAWN Kodlama => Kilitli Konular => Konuyu başlatan: Inappropriate - 08 Mart 2020, 02:58:22

Başlık: Hasar Listesi
Gönderen: Inappropriate - 08 Mart 2020, 02:58:22
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.
Başlık: Ynt: Hasar Listesi
Gönderen: Radless - 08 Mart 2020, 04:24:37
PAWN Kodu: Seç
#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;
}
Başlık: Ynt: Hasar Listesi
Gönderen: flareoNNN - 08 Mart 2020, 11:46:21
Alıntı yapılan: Radless - 08 Mart 2020, 04:24:37
PAWN Kodu: Seç
#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.
Başlık: Ynt: Hasar Listesi
Gönderen: squarepants - 08 Mart 2020, 15:18:36
PAWN Kodu: Seç
#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.
Başlık: Ynt: Hasar Listesi
Gönderen: Radless - 08 Mart 2020, 16:18:11
Alıntı yapılan: flareoNNN - 08 Mart 2020, 11:46:21
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.
Düzgün okumamışım  :melek:
Başlık: Ynt: Hasar Listesi
Gönderen: Radless - 08 Mart 2020, 16:47:21
PAWN Kodu: Seç
#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?
Başlık: Ynt: Hasar Listesi
Gönderen: Inappropriate - 09 Mart 2020, 06:20:48
Sabah bakıp yorum bırakacağım, teşekkür ederim yardımcı olup yorum atan herkese.
Başlık: Ynt: Hasar Listesi
Gönderen: Inappropriate - 09 Mart 2020, 07:30:25
PAWN Kodu: Seç
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)
Başlık: Ynt: Hasar Listesi
Gönderen: Radless - 09 Mart 2020, 16:51:02
@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.
Başlık: Ynt: Hasar Listesi
Gönderen: Cruza - 09 Mart 2020, 20:05:53
Sorun çözüme kavuşmuş, kilit & arşiv.