PDA

Просмотр полной версии : [Вопрос] По отнимания хп у игрока



Snoop_Dog
02.06.2015, 19:03
Есть глобальный таймер который обновляется каждую 1 секунду
Но возникло 2 способа
1.
объявляется глобальная переменная new Hptimer_Player = 0;
после чего в этом глобальном таймере происходит вот такое ветвление

Hptimer_Player ++;
if(Hptimer_Player == 45)
{
HPPlayer(i);
Hptimer_Player = 0;
}
В этом ветвление выполняется действие(stock) HPPlayer(i);

2.
объявляется PVar SetPVarInt(i, "HPPlayer", gettime() + 45); после него вот такое ветвление

if(GetPVarInt(i, "HPPlayer") <= GetTime && GetPVarInt(i, "HPPlayer") != 0)
{
GetPlayerHealth(i, PLAYER[i][HEALTH]);
if(PLAYER[i][HEALTH] <= floatround(10.0)) SendClientMessage(i, COLOR_ADM, "Вам плохо! Лучше сходить к врачу на лечение или провести обследование");
SetPlayerHealth(i, floatround(PLAYER[i][HEALTH] - 1.0));
DeletePVar(i, "HPPlayer");
}

L0ndl3m
02.06.2015, 21:42
Используйте второй вариант, можно без PVar'ов с проверкой на то делится ли unix-время на 45 без остатка:


if(0 == (gettime() % 45))
{
GetPlayerHealth(i, PLAYER[i][HEALTH]);
if(PLAYER[i][HEALTH] <= 10.0)
SendClientMessage(i, COLOR_ADM, "Вам плохо! Лучше сходить к врачу на лечение или провести обследование");

SetPlayerHealth(i, PLAYER[i][HEALTH] - 1.0);
}

Snoop_Dog
02.06.2015, 22:34
Используйте второй вариант, можно без PVar'ов с проверкой на то делится ли unix-время на 45 без остатка:


if(0 == (gettime() % 45))
{
GetPlayerHealth(i, PLAYER[i][HEALTH]);
if(PLAYER[i][HEALTH] <= 10.0)
SendClientMessage(i, COLOR_ADM, "Вам плохо! Лучше сходить к врачу на лечение или провести обследование");

SetPlayerHealth(i, PLAYER[i][HEALTH] - 1.0);
}


Хм.. стоит мне посмотреть мануал бы про unix, а так спасибо!

Snoop_Dog
03.06.2015, 09:49
Есть еще один вопрос, но он не относится к этой тему, дабы не создавать новую тему я решил сюда написать

Вопрос по форматированию и показа сообщения:
Посмотрел в учебнике Daniel_Cortez'a про этот урок (форм. и показ сообщения)
Например я хочу показать игроку имя:
Старый показ

new string[64];
format(string, sizeof(string), "Ваше имя: %s", Player[playerid][Name]);
SendClientMessage(playerid, -1, string);
Я не стал считать сам а указал в стринге макс. значение 64

Способ второй

static const fmt_string[] = "Ваше имя: %s";
new string[sizeof(fmt_string)-2+MAX_PLAYER_NAME];
format(string, sizeof(string), fmt_string, Player[playerid][Name]);
SendClientMessage(playerid, -1, string);

Как показывается в учебнике, 2 способ сам подсчитывает необходимый размер строки(то есть компилятор)

Ну и главный вопрос какой из них лучше?
Самому подсчитывать или пускай сам компилятор подсчитывает, не будет ли лагов из за 2 способа?
Просто кто то 2 способа воздерживается и говорят что это плохо.

Daniel_Cortez
03.06.2015, 11:09
не будет ли лагов из за 2 способа?
На сервере? С чего бы это? Размер строки подсчитывается при компиляции, а не при выполнении на сервере.
Для работы на сервере же одна выгода.
Во-первых, компилятор сам рассчитает размер массивов под строки и скрипт будет использовать именно столько места в стеке, сколько нужно, а не сколько захотела ваша правая пятка.
Во-вторых, скрипт будет работать быстрее: при создании локальных массивов (в т.ч. и под строки) все элементы инициализируются нулями (иначе в массиве будут мусорные значения из стека, оставшиеся после выполнения другого кода). Чем меньше элементов (см. 1), тем быстрее процесс инициализации массива.



Просто кто то 2 способа воздерживается и говорят что это плохо.
Так обычно говорят те, кто не осилил набор текста и печатает со скоростью 1-2 символа в секунду. На том же govno-info это чуть ли не каждый второй. Nuff said.

P.S.: Выдал предупреждение за нарушение пункта 9.3 ОПФ.

3. Также в темах с вопросами запрещено удаление и/или изменение постов с целью скрыть их содержимое (например, замена содержимого поста на "delete" или любой другой бесполезный текст).
Помните: на портале Вам помогают безвозмездно, не требуя ничего взамен - так помогите и Вы другим людям с таким же вопросом, дав им возможность найти ответ, посмотрев Вашу тему. Никто не любит эгоистов.
Содержимое 1 поста восстановил.

Snoop_Dog
03.06.2015, 11:31
Тему можно закрывать.