доведение до ума кода "подстрелил-зарезал"

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
Добрый день ув. форумчане!
Помогите довести до ума код, проблем несколько:
1) ни как не срабатывает скринфейд
2) иной раз сразу на второе предупреждение проходит, иной раз наоборот только первое выдаёт, иной раз выдаёт предупреждение, если просто зарезать не подстрелив перед этим
3) пришлось костылить с разминкой потому, как во время разминки на гг не нужно наказывать и там в принципе ножи, но в любом случае выдаёт предупреждение

PHP:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <hamsandwich>

#define PLUGIN "Knf Weapon"
#define VERSION "1.0"
#define AUTHOR "BeasT"

#define bit_add(%0,%1) (%1 |= (1<<%0))
#define bit_sub(%0,%1) (%1 &= ~(1<<%0))
#define bit_valid(%0,%1) (%1 & (1<<%0))

#define MAX_WARNS 1

 
new g_iValidPlayersBitsum
new gg_warmup_timer_setting

new g_StatusPl[33], g_StatusKill[33], g_Status[33], g_WarmUP

new Float:fNum
 
public plugin_init()
{
    register_event("DeathMsg", "EventDeathMsg", "a", "4=knife")
    RegisterHam(Ham_TakeDamage, "player", "UserTakeDamage")
    
    gg_warmup_timer_setting = register_cvar("gg_warmup_timer_setting","")
    
    register_event("TextMsg","event_round_restart","a","2=#Game_Commencing","2=#Game_will_restart_in");
}

public enable_screenfade(Killer)
{
    message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, Killer)
    write_short(1<<10)
    write_short(1<<10)
    write_short(0x0000)
    write_byte(0)
    write_byte(155)
    write_byte(0)
    write_byte(0)
    message_end()
}

public disable_screenfade(Killer)
{
    message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, Killer)
    write_short(1<<10)
    write_short(1<<10)
    write_short(0x0000)
    write_byte(0)
    write_byte(0)
    write_byte(0)
    write_byte(0)
    message_end()
}   

public event_round_restart()
{
    new warmup_value = get_pcvar_num(gg_warmup_timer_setting)
    new Float:fNum2
    
    fNum2 = get_gametime()
    fNum = get_gametime()
    
    new num_integer = floatround((fNum2 - fNum),floatround_round)
    
    if(num_integer > warmup_value)
    {
        g_WarmUP = true
    }
}
    
public UserTakeDamage (Victim, Weapon, Attacker)
{
    if(!g_WarmUP)return PLUGIN_HANDLED
    
    if(g_Status[Attacker] < 1)
    {
        g_Status[Attacker]++
    }
    else
    
    if (get_user_weapon(Attacker) != CSW_KNIFE && g_Status[Attacker] > 0)
    {
        g_StatusPl[Attacker] = Victim
        g_StatusPl[Victim] = Victim
    }
    return PLUGIN_CONTINUE
}
 
public client_putinserver(id)
{
        bit_add(id, g_iValidPlayersBitsum);
}

 

public client_disconnect(id)
{
        bit_sub(id, g_iValidPlayersBitsum);
}
 
public EventDeathMsg()
{
    new Killer = read_data(1), Victim = read_data(2);
    
    if(bit_valid(Killer, g_iValidPlayersBitsum) && bit_valid(Victim, g_iValidPlayersBitsum))
    {
        if(g_StatusPl[Killer] == g_StatusPl[Victim])
        {
            if(g_StatusKill[Killer] < MAX_WARNS)
            {
                ChatColor(0, "^4Подстрелив-зарезал - 1 предупреждение")
                
                g_StatusKill[Killer]++
                
                new Count, i, player, Players[32]
                
                get_players(Players, Count, "h")
                for (i=0; i<Count; i++)
                {
                    player = Players[i]
                    
                    if(g_StatusPl[player] == g_StatusPl[player])
                    {
                        g_StatusPl[player] = random_num(61275, 72175)
                    }
                }
            }
            else
            if(g_StatusKill[Killer] >= MAX_WARNS)
            {
                new szFunc[84], szName[33]
                
                get_user_name(Killer, szName, charsmax(szName))
                
                formatex(szFunc, charsmax(szFunc), "amx_gungame_level %s -1", szName)
                
                server_cmd(szFunc)
                
                enable_screenfade(Killer)
                
                set_task(1.0, "disable_screenfade", Killer)
                
                ChatColor(0, "^4Вы многократно убили подстрелив-зарезав , так нельзя")
                
                new Count, i, player, Players[32]
                
                get_players(Players, Count, "h")
                for (i=0; i<Count; i++)
                {
                    player = Players[i]
                    
                    if(g_StatusPl[player] == g_StatusPl[player])
                    {
                        g_StatusPl[player] = random_num(61275, 72175)
                    }
                }
            }
            
            new frags = get_user_frags(Killer)
            
            set_user_frags(Killer, frags - 1)
        }
    }
    return PLUGIN_CONTINUE
}

stock ChatColor(const id, const input[], any:...)
{
   new count = 1, players[32]
   static msg[191]
   vformat(msg, 190, input, 3)
  
   replace_all(msg, 190, "!g", "^4")
   replace_all(msg, 190, "!y", "^1")
   replace_all(msg, 190, "!team", "^3")
   replace_all(msg, 190, "!team2", "^0")
  
   if (id) players[0] = id; else get_players(players, count, "ch")
   {
      for (new i = 0; i < count; i++)
      {
         if (is_user_connected(players[i]))
         {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
            write_byte(players[i]);
            write_string(msg);
            message_end();
         }
      }
   }
}
 

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
BeasT, оффтоп: а в чем заключается идея плагина ? (что он должен делать?)
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
ах да
суть плагина не давать игроку в режиме GunGame сначала подстрелить, за тем зарезать игрока с одного удара, чтобы поднять уровень.
BeasT, оффтоп: а в чем заключается идея плагина ? (что он должен делать?)
 

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
BeasT, то есть, если нанес какой-либо урон с оружия, а потом добил ножом - за это предупреждение выдавать - верно ?
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
BeasT, а если другой игрок нанес урон врагу, а тиммейт добил его?
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
BeasT, а если другой игрок нанес урон врагу, а тиммейт добил его?
так можно.
действия считать только между двумя игроками, ну и соответственно сбрасывать, когда игрок(которому нанесли урон) умер.
 

georgeml

Скриптер
Постоялец
Регистрация
12 Сен 2017
Сообщения
595
Симпатии
314
действия считать только между двумя игроками
Между какими двумя?
... попал жертве на 10 хр, другой на 50, третий на 30. И теперь мне нельзя его с ножа убивать? Не совсем понятна мысль кому можно убивать и когда, а кому нельзя. В каком-то случае, возможно, потребуется двухмерный массив [victim][attcker]
 

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
georgeml, нанес игроку урон (любого кол-ва) - его нельзя убить с ножа теперь, пока он не умрет.
И таких может быть хоть 10, и всех нужно хранить до смерти :DDD.

Бред какой-то[DOUBLEPOST=1534078254][/DOUBLEPOST]georgeml, ну а после смерти удалять игрока из 'запрещенных' для определенного убийцы.
 
  • Мне нравится
Симпатии: BeasT

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
BeasT, скинул в личку)
 

BeasT

Anubis
Пользователь
Регистрация
26 Июн 2017
Сообщения
390
Симпатии
53
Пол
Мужской
если Вася подстрелил Петю, а его убила Маша, то всё нормально.
Но если Вася и Маша подстрелили Петю и кто-либо из них(Вася или Маша) зарезал Петю, то "наказание".
 

To be or not to be

Пользователь
Регистрация
9 Июн 2017
Сообщения
1.215
Симпатии
304
BeasT, ну я так и сделал. посмотри)
 
Сверху Снизу