Страница 1 от 1

Back Stab Counter v1.0

Публикувано на: 15 Фев 2017, 19:16
от JustInCase
Име на плъгина : Back Stab Counter
Версия : 1.0
Автор : Just In Case ( аз )

Описание:
Плъгина отброява на всеки играч убийствата/умиранията в гръб.

CVARs
amx_bsc_savetype"1" --- С този квар определяте начина на запазване на данните
| 1 за НИК |2 за IP | 3 за Steam ID (не препоръчвам 3-тия вариант
amx_bsc_stats "1" --- Това е кварът който изключва/включва /statsback командата
amx_bsc_menuinfo "2" --- Кварът с който настройвате как да показва информацията на даден играч (ако горния квар е 1)
| 1 за ЧАТ | 2 отваря друго меню с информацията
Чат команди

/checkback - Показва вашите убийства/умирания в гръб.

/statsback - Отваря менюто с играчите в сървъра

Благодарности на @TheRedShoko.

Re: Back Stab Counter v1.0 [ UNTESTED ]

Публикувано на: 15 Фев 2017, 19:55
от hackera457
Така при преглеждането на плъгина ми изглежда точно, но ето какво бих те посъветвал:
  • * static вместо new - само на няколко места си го ползвал, а има още къде да се замени
    * ShowCounts( id ) трябва да има return PLUGIN_HANDLED /отговора на въпроса оставам ти да се сетиш/
Функцията за запазване ти е неправилна

Код за потвърждение: Избери целия код

UseVault(id, iType) {        
    new szKey[32], szData[16]
    switch ( get_pcvar_num( g_iSaveType ) )
    {
        case 0: return
        case 1: get_user_name(id, szKey, charsmax(szKey))
        case 2: get_user_ip(id, szKey, charsmax(szKey), 1)
        case 3: get_user_authid(id, szKey, charsmax(szKey))
    }

    
    switch(iType)
    {
        case 0:
        {
            formatex(szData, charsmax(szData), "%i | %i", g_iBackStabKills[ id ], g_iBackStabDeaths[ id ])
            replace_all(szData, charsmax(szData), "|", " ")
            nvault_set(g_iVault, szKey, szData)
        }
        case 1:
        {
            nvault_get(g_iVault, szKey, szData, charsmax(szData))
            new szArg[2][8]
            parse(szData, szArg[0], charsmax(szArg[]), szArg[1], charsmax(szArg[]))
            g_iBackStabKills[ id ] = str_to_num(szArg[0])
            g_iBackStabDeaths[ id ] = str_to_num(szArg[1])
        }
    }
}
Трябва да стане

Код за потвърждение: Избери целия код

UseVault(id,iType)
{
    static szVaultKey[64], szVaultData[128], szBackStabKills[10], szBackStabDeaths[10]
    
    switch(get_pcvar_num( g_iSaveType ))
    {
        case 0: return
        case 1: get_user_name(id,szVaultKey, sizeof szVaultKey -1)
        case 2: get_user_ip(id,szVaultKey, sizeof szVaultKey -1);
        case 3: get_user_authid(id,szVaultKey, sizeof szVaultKey -1)
    }
    
    switch(iType)
    {
        case 0:
        {
            formatex(szVaultData, sizeof szVaultData -1,"%i | %i",g_iBackStabKills[ id ], g_iBackStabDeaths[ id ])
            nvault_set(g_iVault, szVaultKey, szVaultData)
        }
        
        case 1:
        {
            nvault_get(g_iVault, szVaultKey, szVaultData, sizeof szVaultData -1)
            replace_all(szVaultData, sizeof szVaultData,"|", " ")
            parse(szVaultData, szBackStabKills[10], sizeof szBackStabKills -1, szBackStabDeaths, sizeof szBackStabDeaths -1)
            
            g_iBackStabKills[id] = str_to_num(szBackStabKills)
            g_iBackStabDeaths[id] = str_to_num(szBackStabDeaths)
        }
    }
}
Сравни твоя код и моя код и виж къде си допуснал грешката. Грешката е, че там където запазваш си сложил

Код за потвърждение: Избери целия код

replace_all(szData, charsmax(szData), "|", " ")
А трябва да е над parse(), защото така както си го дал като реплейсваш с празни във файла ще стане мазало, а функцията няма да ти парсва правилно и ще се чудиш защо не ти зарежда Kills и Deads

Иначе Браво, други забележки нямам

Re: Back Stab Counter v1.0 [ UNTESTED ]

Публикувано на: 15 Фев 2017, 20:47
от JustInCase
Благодаря ще го ъпдейтна по-късно :)

Винаги ли трябва да се ползва static вместо new ? Където е възможно разбира се.

Re: Back Stab Counter v1.0 [ UNTESTED ]

Публикувано на: 15 Фев 2017, 22:09
от hackera457
Препоръчително е,обяснявал съм защо, но пак ще го повтора докато го научите

Когато ползваш new знаеш, че се заделя някакво блокче в паметта с ключ и стойност. Името на ключа на това блокче е името на променливата. При всяко извикване на функцията ще се създава все ново и ново блокче в паметта и така при по-голям код със множество цикли и т.н ще дойде момент, когато паметта ще се напълни и при викане няма да има място където да се създаде това блокче. Това явление се нарича "Препълване на буфера" (Buffer Overflow).
Когато дефинираш дадена променлива като static то тя се създвава веднъж и се ползва локално /само във самата функция, ако опита да се достъпи от другаде няма да стане/ и колкото пъти се извика функцията, тя променя само стойността си, а не се създава наново. С други думи - променлива дефинирана като статична се създава веднъж при първото извикване на функцията и после си променя стойността при всяко повторно извикване

Re: Back Stab Counter v1.0 [ UNTESTED ]

Публикувано на: 24 Фев 2017, 15:00
от JustInCase
Благодаря за обяснението всичко е оправено !

Re: Back Stab Counter v1.0

Публикувано на: 24 Фев 2017, 19:23
от TheRedShoko
Имам една забележка - допускаш грешки при именуването на функции (както си започнал, изкарай го до края, а не едното да е PascalCase, другото с долни_черти, а третото - Смесено_ПоТози_Начин), това дразни до известна степен. Същото е положението и при скобите, когато го правиш

Код за потвърждение: Избери целия код

SomeMethod() {

}
изкарай го по този начин до края. Същото важи и за

Код за потвърждение: Избери целия код

SomeMethod()
{

}
Ако за един ред не слагаш { }, то спазвай го на всякъде, а не:

Код за потвърждение: Избери целия код

case 1:
			{
				SubMenu( id, iPlayer )
			}
			case 2:
				ColorChat(id, RED, "^4[BSC] ^3%s ^1have ^4%i ^1BS Kills and ^4%i ^1BS Deaths", szName, g_iBackStabKills[ iPlayer], g_iBackStabDeaths[ iPlayer ])
				
Тествал ли си плъгина? Струва ми се, че може да направи проблем при зареждането от базата, заради разстоянието между placeholders

Код за потвърждение: Избери целия код

%i | %i

Re: Back Stab Counter v1.0

Публикувано на: 24 Фев 2017, 19:42
от JustInCase
Плъгина не е тестван.



Това с скобите при Const, Bool, или функции, които нямат public отпред се пише точно на реда в който е дефинирана самата функция защото при натискане на ctrl + I (Indenting Code) в AMXX Studio подрежда кода както трябва иначе се получават разминавания(примера по долу). Това е причината поради, която съм го направил така.

Код за потвърждение: Избери целия код

Loose identation on line 23123(пример)
За това с разстоянието си прав оправих го !

Re: Back Stab Counter v1.0

Публикувано на: 24 Фев 2017, 20:05
от TheRedShoko
Това е въпрос на стил на писане на код, а не на правила. Правилно е да го пишеш по 1 начин, а не по няколко различни. Колкото до подреждането на кода в AMXX Studio - не бих му вярвал, не мога да кажа, че съм особено доволен от начина, по който подрежда кода, още повече, че ако сложиш някой напълно прецакан код, ще го направи още по-зле. Loose identation се получава, при различни ситуации. Предполагам, че при теб е било от това, че при начало на ред си смесил разстояния (многобройни space) и табулации. Не се вижда това, но хвърля warning.