|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Правильное изменение кол-ва фрагов игрока
|
|
slogic | Дата: Среда, 28.03.2007, 20:13:36 | Сообщение # 1 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Минут 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
Статус: Не в сети
| Также следует подчеркнуть, что pev(id, pev_frags) возвращает корректное целое значение свойства, тип которого - дробный.
Сообщение отредактировал slogic - Среда, 28.03.2007, 20:20:01 |
|
| |
VEN | Дата: Среда, 28.03.2007, 21:11:40 | Сообщение # 3 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| 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
Статус: Не в сети
| Я в моде КС-Прятки использовал немного другую систему. 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
Статус: Не в сети
| Наиболее правильный (за исключением небольшого "трюка") и в то же время наиболее простой способ увеличения(уменьшения) количества фрагов для 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
Статус: Не в сети
| 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
Статус: Не в сети
| 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
Статус: Не в сети
| Я не доверяю 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
Статус: Не в сети
| Я уже говорил, что если 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
Статус: Не в сети
| 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 Russian Community © 2006-2024 | |
|
| |