Убивает сразу

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Решил переписать кровотечение на новый синтаксис и вроде бы все работает.
Исходники
Проблема: Если в кваре стоит снимать 10 хп когда идет кровотечение, то когда у игрока остается 10 хп его сразу же убивает или меньше 10 хп (не успеет даже пройти таймер его убьет).
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
когда у игрока остается 10 хп его сразу же убивает или меньше 10 хп (не успеет даже пройти таймер его убьет)
C-подобный:
int health = GetClientHealth(client) - GetConVarInt(g_hBleedingHealth);
if (health < 1) KillPlayer(client);
Сам же написал, что пусть убивает, когда разница меньше единицы, хотя время ещё не пришло.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, Дело в том что, если у игрока осталось 8 ХП, а по квару снимает 10 ХП то через секунду его убьет.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
то через секунду его убьет
Я тебе и сказал. Смотри внимательно указанное место:
C-подобный:
stock bool StartBleeding(int client)
{
	int health = GetClientHealth(client) - GetConVarInt(g_hBleedingHealth);
	//Допустим, у игрока сейчас 5 ХП: 5 - 5 = 0. health = 0.
	
	if (i_bleeding[client] > 0)
	{
		i_bleeding[client]--;
		PrintHintText(client, "<font color='#ff0000'>Кровотечение через %d</font>", i_bleeding[client]);

		//Первый "тик" таймера, а health уже < 1 - убивает, хотя время и остаётся.
		if (health < 1) KillPlayer(client);
	}
	
	else if (i_bleeding[client] == 0 && health <= GetConVarInt(g_hBleedingBorder))
	{
		SetEntityHealth(client, health);
		i_bleeding[client] = GetConVarInt(g_hBleedingTime);
	}
}
Оффтоп
 

FurFur

Участник
Сообщения
153
Реакции
85
C-подобный:
int health = GetClientHealth(client) - GetConVarInt(g_hBleedingHealth);

У тебя оно узнает сколько хп будет у игрока,если кровотечение нанесет урон.
Ну вот если у тебя и остается 8 хп,то health уже будет равен -2.

Вот тут и срабатывает твой KillPlayer(client) во время таймера, который сразу и убивает
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, нет писать за меня не нужно, надо учиться самому.

C-подобный:
stock bool StartBleeding(int client)
{
    int health = GetClientHealth(client) - GetConVarInt(g_hBleedingHealth);
   
    if (i_bleeding[client] > 0)
    {
        PrintHintText(client, "<font color='#ff0000'>Кровотечение через %d</font>", i_bleeding[client]--);
    }
   
    else if (i_bleeding[client] == 0 && health <= GetConVarInt(g_hBleedingBorder))
    {
        if (health < 1)
        {
            KillPlayer(client);
        }
        else
        {
            SetEntityHealth(client, health);
            i_bleeding[client] = GetConVarInt(g_hBleedingTime);
        }
    }
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
писать за меня не нужно
Приходится...
PHP:
stock bool StartBleeding(int client)
{
    int health = GetClientHealth(client);
    if(health > GetConVarInt(g_hBleedingBorder)) b_bleeding[client] = false;

    else if (i_bleeding[client] > 0)
    {
        i_bleeding[client]--;
        PrintHintText(client, "<font color='#ff0000'>Кровотечение через %d</font>", i_bleeding[client]);
    }
   
    else if (i_bleeding[client] == 0)
    {
        if ((health -= GetConVarInt(g_hBleedingHealth)) > 0)
        {
            SetEntityHealth(client, health);
            i_bleeding[client] = GetConVarInt(g_hBleedingTime);
        }
        else KillPlayer(client);
    }
}
У тебя опять расчёт не на месте и, если у игрока регенерация, то всё равно может начаться кровотечение, хоть его ХП уже и больше квара начала кровотечения.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, я об этом не думал.
--- Добавлено позже ---
Ну все, вопрос решен.
 
Последнее редактирование:
Сверху Снизу