Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Как упростить условие?

, if
Статус пользователя navigator19
сообщение 12.4.2016, 7:24
Сообщение #1
Стаж: 16 лет

Сообщений: 177
Благодарностей: 22
Полезность: 12

Есть функция
Код:

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] )
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}
else if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_M4A1 && g_HasAk[attacker] )
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}
else if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_MP5NAVY && g_HasAk[attacker] )
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}

return HAM_HANDLED
}

пробовал вместо этого писать ==>>
Код:

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if (is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47, CSW_M4A1, CSW_MP5NAVY && g_HasAk[attacker])
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}

return HAM_HANDLED
}

она работает, но иногда в логах ошибки на 3 строку, что не так?
Цикл не надо!

Как загнать в одну переменную CSW_AK47, CSW_M4A1, CSW_MP5NAVY и проверить не используя цикл?

Отредактировал: navigator19, - 12.4.2016, 7:31
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя mazdan
сообщение 12.4.2016, 8:08
Сообщение #2


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

можно общие проверки вынести в начало
Цитата
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if(s_valid_player( attacker ) && )
if ( i&& get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] )
{
new weapon = get_user_weapon(attacker)
if(weapon == CSW_AK47 || weapon == CSW_M4A1 || weapon == CSW_MP5NAVY)
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}
}
return HAM_HANDLED
}

если уж очень хочется проверить за один раз оружие, то можно через case или через битсумму


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя navigator19
сообщение 12.4.2016, 8:28
Сообщение #3
Стаж: 16 лет

Сообщений: 177
Благодарностей: 22
Полезность: 12

mazdan,
Я так понял вот так?
Код:

if(is_valid_player( attacker ) && g_HasAk[attacker])
{
new weapon = get_user_weapon(attacker)
if(weapon == CSW_AK47 || weapon == CSW_M4A1 || weapon == CSW_MP5NAVY)
{
SetHamParamFloat(4, damage + get_pcvar_float( cvar_dmgmultiplier ) )
}
}

Почему вот здесь работает, и не выдает ошибок ?
Код:

new plrClip, plrAmmo
new plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (plrWeapId == CSW_AK47, CSW_M4A1, CSW_MP5NAVY && g_HasAk[id])


На сколько правильно использовать Код:
if (peremennay == CSW_AK47, CSW_M4A1, CSW_MP5NAVY)
и допускается ли это вообще?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Algalon
сообщение 12.4.2016, 10:06
Сообщение #4
Стаж: 11 лет

Сообщений: 163
Благодарностей: 60
Полезность: 291

navigator19, mazdan тебе правильно посоветовал использовать битсуммы, только вот жалко, что он не показал как реализовать это тебе

Код:

new const SHOT_BITSUM = (1<<CSW_AK47)|(1<<CSW_M4A1)|(1<<CSW_MP5NAVY)

new plrClip, plrAmmo
new plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (((1<<plrWeapId) & SHOT_BITSUM) && g_HasAk[id])


Отредактировал: Algalon, - 12.4.2016, 10:21
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя navigator19
сообщение 12.4.2016, 10:39
Сообщение #5
Стаж: 16 лет

Сообщений: 177
Благодарностей: 22
Полезность: 12

Algalon, А константу можно глобальную объявить, если проверка будет использоваться не только в одной функции?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Algalon
сообщение 12.4.2016, 10:45
Сообщение #6
Стаж: 11 лет

Сообщений: 163
Благодарностей: 60
Полезность: 291

navigator19, кончено можно, можно даже без константы, это я для наглядного примера показал
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 12.4.2016, 12:33
Сообщение #7


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

Algalon, я не уверен что битсумма тут будет быстрее чем сравнения т.к. тут дополнительно операции << и & вместо 1-3 условий. Нужно тестировать.
+ если делать с битсуммами, то тогда нужно экономить и на записи в переменные, иначе это как-то бессмысленно (у меня в примере переменная для дела)
А в варианте
Цитата
new plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (((1<<plrWeapId) & SHOT_BITSUM) && g_HasAk[id])
лишняя переменная plrWeapId + проверка массива выполняется в самом конце, хотя логичнее дешевую проверку сделать в начале.
т.е. результат будет теоретически быстрееКод:
 if(is_valid_player( attacker ) && g_HasAk[attacker] && (1<<get_user_weapon(id, plrClip , plrAmmo) ) & SHOT_BITSUM)  )


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя navigator19
сообщение 12.4.2016, 14:30
Сообщение #8
Стаж: 16 лет

Сообщений: 177
Благодарностей: 22
Полезность: 12

mazdan, Algalon, Так а все таки, такая запись
Код:
if (peremennay == CSW_AK47, CSW_M4A1, CSW_MP5NAVY)

в корне не правильная?
Ведь она иногда работает

Отредактировал: navigator19, - 12.4.2016, 14:31
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя user.gameover.user
сообщение 12.4.2016, 14:44
Сообщение #9
Стаж: 15 лет

Сообщений: 1470
Благодарностей: 426
Полезность: 700

У меня аналогичный вопрос
Код:

get_ucp_from_team(from, alive) // gets alive user with ucp
{
new UcpUsers[33], c;

for( new id = 1; id < 33; id ++ )
{
if( is_user_alive(id) == alive && get_user_team(id) == from && gbUCP[id])
{
UcpUsers[c++] = id;
}
}

if©
{
return UcpUsers[ random© ];
}

return 0;
}


Как добавить в рандом стим игроков,

Код:
if( is_user_alive(id) == alive && get_user_team(id) == from && gbUCP[id] || is_user_steam(id))

такой код вроде баганый, довольно часто срабатывает выдача плента двум игрокам
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя AndrewZ
сообщение 12.4.2016, 15:14
Сообщение #10


Иконка группы

Стаж: 18 лет
Город: Санкт-Петербург


Сообщений: 4700
Благодарностей: 2452
Полезность: 1018

Цитата
такой код вроде баганый, довольно часто срабатывает выдача плента двум игрокам

Так тут видимо сама выдача больше 1 раза происходит, либо хз что. Так-то выходит, что больше одного id эта функция не вернет в любом случае.

А вообще так лучше сделать:
Код:
if( ( is_user_alive(id) == alive ) && ( get_user_team(id) == from ) && ( gbUCP[id] || is_user_steam(id) ) )


Просто на всякий случай)


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя user.gameover.user
сообщение 12.4.2016, 15:17
Сообщение #11
Стаж: 15 лет

Сообщений: 1470
Благодарностей: 426
Полезность: 700

AndrewZ,
Выдача такого вида
Код:
public logevent_SpawnedBomb()
{
new bombCarrier = get_loguser_index();

if( !gbUCP[bombCarrier] || !is_user_steam(bombCarrier) )
{
new UcpPlayer = get_ucp_from_team(1, 1); // maybe players here are not alive
//new SteamPlayer = get_steam_from_team(1, 1);

if(UcpPlayer)
{
fm_transfer_user_gun(bombCarrier, UcpPlayer, CSW_C4, "weapon_c4")
}
}
}


ну и напоследок, может что добавить?
Код:
stock get_loguser_index()
{
new loguser[80], name[32]
read_logargv(0, loguser, 79)
parse_loguser(loguser, name, 31)

return get_user_index(name)
}


Отредактировал: user.gameover.user, - 12.4.2016, 15:21
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя AndrewZ
сообщение 12.4.2016, 15:52
Сообщение #12


Иконка группы

Стаж: 18 лет
Город: Санкт-Петербург


Сообщений: 4700
Благодарностей: 2452
Полезность: 1018

Ну выходит, что logevent_SpawnedBomb() срабатывает несколько раз.. Не иначе. Либо как-то криво работает fm_transfer_user_gun и не удаляет бомбу у старого игрока.
Если первый вариант - то можно попробовать костыль, что-то вроде глобальной булевой переменной, которая будет true после первого срабатывания, и false по ивенту HLTV, например.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя user.gameover.user
сообщение 12.4.2016, 16:02
Сообщение #13
Стаж: 15 лет

Сообщений: 1470
Благодарностей: 426
Полезность: 700

Цитата(AndrewZ @ 12.4.2016, 16:52) *
Ну выходит, что logevent_SpawnedBomb() срабатывает несколько раз.. Не иначе. Либо как-то криво работает fm_transfer_user_gun и не удаляет бомбу у старого игрока.
Если первый вариант - то можно попробовать костыль, что-то вроде глобальной булевой переменной, которая будет true после первого срабатывания, и false по ивенту HLTV, например.

Код
register_logevent("logevent_SpawnedBomb", 3, "2=Spawned_With_The_Bomb");


До моего кривого добавления проверки на стим, иногда плент оказывался не у того игрока,толи не забирало,толи передавало не тому,довольно редко
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 2 гостей читают эту тему: