AMX MOD X
Понедельник, 29.04.2024, 14:49:59



Приветствую Вас Гость | RSS
[ Главная ] [ Правильное изменение кол-ва фрагов игрока - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Правильное изменение кол-ва фрагов игрока (обсуждение)
Правильное изменение кол-ва фрагов игрока
slogicДата: Среда, 28.03.2007, 20:13:36 | Сообщение # 1
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Минут 30 бился над тем, почему после ручного изменения кол-ва фрагов оно обнуляется, хотя я явно записывал туда не нулевое число. Выяснилось, что свойство frags не целого типа, а дробного. После этого я загялнул в плагин MyPhysics. Там я присваиваю целый тип. Но я точно проверял плагин. И фраги корректно увеличивались. Хотя в данном случае я фраги уменьшал на единицу и записывал отрицательное значение. Это как раз и вывалилось в проблему.

Привожу код, который должен корректно устанавливать очки игроков (это не готовый вариант, а лишь набросок - для обсуждение!):
Code
#include <amxmodx>

new g_cvarFFA, g_cvarTeamPlay
//-----------------------------------------------------------------------------
public plugin_init()
{
   g_msgScoreInfo = get_user_msgid("ScoreInfo")
}
//-----------------------------------------------------------------------------
public plugin_cfg()
{
  g_cvarFFA = get_cvar_pointer("mp_freeforall")
  g_cvarTeamPlay = get_cvar_pointer("mp_teamplay")
}
//-----------------------------------------------------------------------------
stock changeFrags(attacker, victim)
{
  new id = attacker // просто лень переименовывать переменные ниже

  set_pev(id, pev_frags, float(pev(id, pev_frags)) + getFragByRules(attacker, victim))

  message_begin(MSG_ALL, g_msgScoreInfo)
  write_byte(id)
  write_short(get_user_frags(id))
  write_short(get_user_deaths(id))
  write_short(0) // 0 under CS, but what about other mods?
  write_short(get_user_team(id))
  message_end()
}
//-----------------------------------------------------------------------------
Float:getFragByRules(attacker, victim)
{
  if(attacker == victim)
   return -1.0
   
  if((g_cvarFFA && get_pcvar_num(g_cvarFFA)) || (g_cvarTeamPlay && !get_pcvar_num(g_cvarTeamPlay)))
   return 1.0

  // it's a teamplay game
  if(get_user_team(attacker) == get_user_team(victim))
   return -1.0
   
  return 1.0
}



Сообщение отредактировал slogic - Среда, 28.03.2007, 20:17:17
 
slogicДата: Среда, 28.03.2007, 20:19:14 | Сообщение # 2
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Также следует подчеркнуть, что pev(id, pev_frags) возвращает корректное целое значение свойства, тип которого - дробный.

Сообщение отредактировал slogic - Среда, 28.03.2007, 20:20:01
 
VENДата: Среда, 28.03.2007, 21:11:40 | Сообщение # 3
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Quote
set_pev(id, pev_frags, pev(id, pev_frags) + 1.0)
верно (хотя, что интересно, даже, думая, что pev_frags int, все равно прибавляешь float)

Quote
set_pev(id, pev_frags, float(pev(id, pev_frags)) + getFragByRules(attacker, victim))
верно

Хотя, даже зная особенность return rounded float pev val, все равно предпочитаю float byref.

Сообщение отредактировал VEN - Среда, 28.03.2007, 21:24:00
 
AlModДата: Четверг, 29.03.2007, 07:10:12 | Сообщение # 4
Сонный кодер
Группа: Админы
Сообщений: 600
Репутация: 27
Статус: Не в сети
Я в моде КС-Прятки использовал немного другую систему.

Code

public some_frag_change_function(id,frags)
{
  new oldfrags = get_user_frags(id)
  set_user_frags(id,oldfrags+frags)
  // Update scores or changes will not displayed
  update_scores(id)
}

public update_scores(id)
{
  // Make new scores
  message_begin(MSG_ALL,gmsgScoreInfo)
  write_byte(id)
  write_short(get_user_frags(id))
  write_short(get_user_deaths(id))
  w rite_ short(0)
  write_short(get_user_team(id))
  message_end()
}

Причем самой процедуры some_frag_change_function(id,frags) у меня нет, это только для описания алгоритма


 
VENДата: Четверг, 29.03.2007, 11:09:49 | Сообщение # 5
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Наиболее правильный (за исключением небольшого "трюка") и в то же время наиболее простой способ увеличения(уменьшения) количества фрагов для CS представлен ниже:
Code
static Float:frags
static const Float:increment /* = your_increment_value_here */
pev(id, pev_frags, frags)
set_pev(id, pev_frags, frags + increment)
cs_set_user_deaths(id, cs_get_user_deaths(id)) // update the scoreboard easily


Сообщение отредактировал VEN - Четверг, 29.03.2007, 12:40:13
 
slogicДата: Четверг, 29.03.2007, 11:20:51 | Сообщение # 6
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (AlMod)
set_user_frags(id,oldfrags+frags)

Ага, и для этого надо подключать Fun модуль. Ты видел исходники функции set_user_frags? Она делает то же самое что set_pev(id, pev_frags, float_value).
 
slogicДата: Четверг, 29.03.2007, 11:23:41 | Сообщение # 7
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (VEN)
cs_set_user_deaths(id, cs_get_user_deaths(id)) // update the scoreboard easily

А это требует подключения CStrike модуля. Свет на CS клином не сошелся же.
 
VENДата: Четверг, 29.03.2007, 12:39:20 | Сообщение # 8
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Я не доверяю get_user_deaths. Например, относительно недавно для CS она выдавала ошибку. Поэтому, даже если не CS, то NS/TFC/TS/DOD и что бы там ни было... Если для них имеется мод-специфичная get|set death функция, следует использовать именно ее. Для HLDM, вероятно, get_user_deaths будет подходить лучше всего.

Сообщение отредактировал VEN - Четверг, 29.03.2007, 12:41:49
 
slogicДата: Четверг, 29.03.2007, 13:59:52 | Сообщение # 9
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Я уже говорил, что если get_user_deaths описана в amxmodx.inc, то эти функции должны по определению корректно работать в любом модуле. Если не работают, то это ошибка AMX/X, а не плагина. На эту концепцию я и ориентируюсь. Вот если команда AMX/X не справится, и уберет эту функцию из amxmodx.inc, тогда будем делать MOD-specific версии плагина.

Сообщение отредактировал slogic - Четверг, 29.03.2007, 14:01:27
 
slogicДата: Понедельник, 02.04.2007, 13:34:20 | Сообщение # 10
Генералиссимус
Группа: Админы
Сообщений: 1941
Репутация: 47
Статус: Не в сети
Quote (VEN)
Хотя, даже зная особенность return rounded float pev val, все равно предпочитаю float byref.

Я столкнулся с глюком подсчета фрагов именно из-за этого. Так что я переписал функции изменения фрагов и теперь все выглядит вот так:
Quote

stock updateScoreInfo(id)
{
// update client score tables...
message_begin(MSG_ALL, g_msgScoreInfo)
write_byte(id)
write_short(get_user_frags(id))
write_short(get_user_deaths(id))
write_short(0) // 0 under CS, but what about other mods?
write_short(get_user_team(id))
message_end()
}

Float:getFragByRules(attacker, victim)
{
if(attacker == victim)
return -1.0

if((g_cvarFFA && get_pcvar_num(g_cvarFFA)) || (g_cvarTeamPlay && !get_pcvar_num(g_cvarTeamPlay)))
return 1.0

// it's a teamplay game
if(get_user_team(attacker) == get_user_team(victim))
return -1.0

return 1.0
}

stock updateFrags(attacker, victim) // make sure attacker is pev valid
{
static Float:fFrags

pev(attacker, pev_frags, fFrags)
// update frag count
set_pev(attacker, pev_frags, fFrags + getFragByRules(attacker, victim))
updateScoreInfo(attacker)
}



Сообщение отредактировал slogic - Понедельник, 02.04.2007, 13:35:22
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Правильное изменение кол-ва фрагов игрока (обсуждение)
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024