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

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

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

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

Двойной отсчет при респавне игрока

, Ham_Spawn
Статус пользователя filip
сообщение 30.6.2015, 10:45
Сообщение #1


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Ловлю событие спавна (Ham_Spawn), далее игрокам с флагом t выдаю граву и скорость. Обычным игрокам грава и скорость выдаются только тогда, когда количество смертей превышает количество фрагов на величину VIP_DIFFERENCE. При этом идет отсчет этой выдачи, т.е. за карту выдаем не более COUNT раз. Код ниже.
Код:
RegisterHam(Ham_Spawn, "player", "SetSpeedGravity", 1)

Код:
public SetSpeedGravity (id)
{
new Death[33], Frags[33]
Death[id] = get_user_deaths(id)
Frags[id] = get_user_frags(id)
new Float:speed = get_user_maxspeed(id) + VIP_SPEED

if (!is_user_alive(id))
return
if (get_user_flags(id) & ADMIN_LEVEL_H)
{
set_user_maxspeed(id , speed)
//увеличиваем гравитацию
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
}
if (((Death[id] - Frags[id]) > VIP_DIFFERENCE) && (g_count[id] < COUNT))
{
set_user_maxspeed(id , speed)
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
set_task(0.1, "Shake", id)
client_cmd( id, "spk %s", szSound )
g_count[id]++
PrintChatColor(id, _, "!gОсталось !t%d !yвозрождений(я) с !tVIP возможностями", (COUNT - g_count[id]))
if(((COUNT - g_count[id]) < (COUNT - 1)))
PrintChatColor(id, _, "!tskype для покупки VIP !gpl-evgen")
return HAM_SUPERCEDE
}
}

Все работает, но есть бага. Отсчет выдачи происходит дважды за каждый спавн игрока. Т.е. 1 спавн = 2 отсчетам. Причем происходит это только тогда, когда игроков на сервере 5 и более (если меньше, то отсчет работает корректно), мод gungame, если это важно (исходник мода в аттаче).

В чем прикол? Я уже голову всю сломал crazy.gif Прикрепленный файл  gungame.sma ( 283,32 килобайт ) Кол-во скачиваний: 4


А еще момент, вчера один хороший человек подсказал идейку с воспроизведением звука. Я прикрутил туда же. Звук воспроизводится один раз при любых условиях.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Legenda
сообщение 30.6.2015, 14:01
Сообщение #2


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

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

скорее всего SetSpeedGravity два раза вызывается
ищи ошибку выше

либо проблема с PrintChatColor
Цитата
А еще момент, вчера один хороший человек подсказал идейку с воспроизведением звука.

плохая идея,
ЕМНИП если уже проигрывается звук - нельзя запускать проигрывание другого звука, пока проигрывание 1-ого файла не закончится

return HAM_SUPERCEDE лучше убрать

ps лучше кидай весь код
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 30.6.2015, 14:13
Сообщение #3
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

filip, никакие HAM_SUPERCEDE в Post'е не имеют смысла: функция уже вызвалась, её невозможно заблокировать diablo.gif
После халявы ребятам с ADMIN_LEVEL_H поставь return HAM_IGNORED.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 1.7.2015, 14:13
Сообщение #4


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Цитата(Legenda @ 30.6.2015, 15:01) *
скорее всего SetSpeedGravity два раза вызывается
ищи ошибку выше

Увы, нет там больше обращений к SetSpeedGravity
Цитата(Legenda @ 30.6.2015, 15:01) *
либо проблема с PrintChatColor

нет, client_print тоже 2 раза выводит сообщение
Цитата(Legenda @ 30.6.2015, 15:01) *
плохая идея,
ЕМНИП если уже проигрывается звук - нельзя запускать проигрывание другого звука, пока проигрывание 1-ого файла не закончится

не понял, можно поподробнее?
Цитата(Safety1st @ 30.6.2015, 15:13) *
filip, никакие HAM_SUPERCEDE в Post'е не имеют смысла: функция уже вызвалась, её невозможно заблокировать

Цитата(Legenda @ 30.6.2015, 15:01) *
return HAM_SUPERCEDE лучше убрать

Да да, его и не было в рабочей версии плагина, это я от безысходности экспериментировал)
Цитата(Safety1st @ 30.6.2015, 15:13) *
После халявы ребятам с ADMIN_LEVEL_H поставь return HAM_IGNORED.

Увы, это не решило проблему
Цитата(Legenda @ 30.6.2015, 15:01) *
ps лучше кидай весь код

Каюсь, вот он
Код:
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
#include <WPMGPrintChatColor>
#include <fun>

#define VIP_DAMAGE 1.5 //урон наносимый вип игроком 1 - стандартный урон, 1.5 - увеличен на 50%
#define VIP_SPEED 480.0 //Стандартная скорость игрока 450 юнитов/мин, это ДОБАВКА к стандартной скорости, тип данных float (дробное число)
#define VIP_GRAVITY 0.7 //Гравитация 1 - стандартная, 1.5 - увеличена на 50%
#define VIP_DIFFERENCE 1 //разница между фрагами и смертями, при достижении которой будет выдаваться вип обычному игроку (в рекламных целях)
#define COUNT 7 //сколько раз за карту обычому игроку будут выдаваться вип возможности при достижении разницы между смертями и фрагами (выдается при каждомвозрождении)

#define FFADE_IN 0x0000 //это не трогать, это для тряски экрана

new g_ability[33]
new g_count[33]
new g_msgFade, g_msgShake

const VIP_FLAG = ADMIN_LEVEL_H // флаг вип игрока(для отображения вип в табе)

static szSound[] = "buttons/button7.wav"

public plugin_init()
{
register_plugin("VIP_Gungame_by_pl", "1.0", "rukojop :-)")

register_event("CurWeapon", "WeaponChange", "be", "1=1" )//регистрируем событие смены оружия (фикс бага с пропаданием скорости и гравы)

register_message( get_user_msgid ("ScoreAttrib"), "msg_ScoreAttrib" )

RegisterHam (Ham_TakeDamage, "player", "UserTakeDamage") // регистрируем событие получения урона
RegisterHam(Ham_Spawn, "player", "SetSpeedGravity", 1) // регистрируем момент возрождения игрока, в этот момент будем выдавать скорость и гравитацию
RegisterHam(Ham_Killed,"player","ham_player_kill")//тут регистрируем момент смерти, где будем обнулять идентификатор наличия вип возможностей

g_msgShake = get_user_msgid("ScreenShake")
g_msgFade = get_user_msgid("ScreenFade")
}

public plugin_precache()
{
precache_sound(szSound)
}

public msg_ScoreAttrib( msg_id, msg_dest, receiver ) //эта функция отображает тэг ВИП в таблице счета
{
/* original code by xpaw & Radius */
#define ARG_PlayerID 1
#define ARG_Flags 2
#define SCOREBOARD_VIP (1 << 2)

if( get_user_flags( get_msg_arg_int(ARG_PlayerID) ) & VIP_FLAG )
set_msg_arg_int( ARG_Flags, ARG_BYTE, get_msg_arg_int(ARG_Flags) | SCOREBOARD_VIP )
}

public client_disconnect(id) // при дисконнекте игрока обнуляем идентификаторы
{
g_ability[id] = false
g_count[id] = 0
}

public ham_player_kill(victim, attacker, corpse)
{
g_ability[victim] = false
}

public WeaponChange(id) //
{
if(g_ability[id])
{
set_user_maxspeed(id, VIP_SPEED)
set_user_gravity(id,VIP_GRAVITY)
}
}

public UserTakeDamage (victim, weapon, attacker, Float:damage, damagebits)
{
if(victim == attacker || !victim) // если жертва это атакуюший или жертвы нет, то начинаем заново
return
if (!is_user_alive(attacker))
return
if ((get_user_flags(attacker) & ADMIN_LEVEL_H)) // если игрок жив и имеет флаг t, то увеличиваем урон
{
SetHamParamFloat(4, damage * VIP_DAMAGE)
//PrintChatColor(attacker, _, "!gСТАНДАРТНЫЙ УРОН !t%.1f !gVIP УРОН !t%.1f", damage,(damage * VIP_DAMAGE))
}
if (g_ability[attacker])
{
SetHamParamFloat(4, damage * VIP_DAMAGE)
//PrintChatColor(attacker, _, "!gСТАНДАРТНЫЙ УРОН !t%.1f !gVIP УРОН !t%.1f", damage,(damage * VIP_DAMAGE))
}
}

public SetSpeedGravity (id)
{
new Death[33], Frags[33]
Death[id] = get_user_deaths(id)//получаем смерть игрока и заносим в массив
Frags[id] = get_user_frags(id) //получаем фраги игрока и заносим в массив
new Float:speed = get_user_maxspeed(id) + VIP_SPEED
/*
if (!is_user_alive(id))
return*/
if (((Death[id] - Frags[id]) > VIP_DIFFERENCE) && (g_count[id] < COUNT) && (is_user_alive(id)))
{
set_user_maxspeed(id , speed)
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
set_task(0.1, "Shake", id)
client_cmd( id, "spk %s", szSound )
g_count[id]++
PrintChatColor(id, _, "!gОсталось !t%d !yвозрождений(я) с !tVIP возможностями", (COUNT - g_count[id]))
if(((COUNT - g_count[id]) < (COUNT - 1)))
PrintChatColor(id, _, "!tskype для покупки VIP !gpl-evgen")
}
if ((get_user_flags(id) & ADMIN_LEVEL_H) && (is_user_alive(id)))
{
set_user_maxspeed(id , speed)
//увеличиваем гравитацию
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
return HAM_IGNORED
}
return HAM_HANDLED
}

public Shake (id)
{
message_begin( MSG_ONE_UNRELIABLE, g_msgFade, .player=id )
{
write_short( 1<<14 )
write_short( 1<<5 )
write_short( FFADE_IN )
write_byte( 34 )
write_byte( 34 )
write_byte( 139 )
write_byte( 75 )
}
message_end( )

message_begin( MSG_ONE_UNRELIABLE, g_msgShake, .player=id )
{
write_short( 255<<15 )
write_short( 50<<8 )
write_short( 255<<15 )
}
message_end( )
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 1.7.2015, 17:31
Сообщение #5
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(filip @ 1.7.2015, 15:13) *
не понял, можно поподробнее?

Забей, инфа в любом случае неверная.


Цитата(filip @ 1.7.2015, 15:13) *
Код
static szSound[] = "buttons/button7.wav"

Внимательнее: как раз '.wav' в именах WAV-файлов - лишние (игра пытается воспроизвести _period.wav, соответствующий точке).

Цитата(filip @ 1.7.2015, 15:13) *
Код
#include <amxmodx>

Нехорошо получилось: кодец появился в паблике, а credits нет, вообще нет, а пара кусков чужого кода - есть smile.gif

Код
new Float:speed = get_user_maxspeed(id) + VIP_SPEED

Лишнее.

Цитата(filip @ 1.7.2015, 15:13) *
Код
фикс бага с пропаданием скорости и гравы

Только скорость пропадает при переключении оружия smile.gif


В коде не вижу причин проблемы с двойным выполнением. Вангую, что несовместимость с одним из соседних плагинов. Попробуй поискать по исходникам применение нативы ExecuteHam или ExecuteHamB.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 1.7.2015, 18:22
Сообщение #6


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Цитата
В коде не вижу причин проблемы с двойным выполнением. Вангую, что несовместимость с одним из соседних плагинов. Попробуй поискать по исходникам применение нативы ExecuteHam или ExecuteHamB.

Спасибо, буду копать в эту сторону.
Цитата
Нехорошо получилось: кодец появился в паблике, а credits нет, вообще нет, а пара кусков чужого кода - есть smile.gif

Сорян) Запилил благодарности)
Код:
/*
Выражаю огромную благодарность следующим лицам,чьи наработки, подсказки и советы были мною использованы или нагло спи.....ны с просторов интеренета, что никак не отменяет их авторства.
Итак:

Safety1st
За код отображения вип в табе) брал тут: Склад маленького кода (Пост #632542)
а так же за ценные советы, и подсказки без которых все две мои прежние поделки никогда бы не работали :-), а нынешний мегаплагин
не имел прикольной свистоперделки в виде звучка при спавне), подробнее тут Двойной отсчет при респавне игрока и тут Двойной отсчет при респавне игрока

Legenda
Спасибо за то, что еще не прошел мимо ниодной моей темы с вопросами по скриптингу. Саф кстати тоже, респект, чуваки!

Stimul
С тобой не знаком, но за фикс бага с пропаданием скорости отдельное спасибо, брал его тут http://amx-x.ru/viewtopic.php?f=8&t=9398 (этот чувак вроде и на c-s.net.ua есть, так что если ты прочел это, передавай ему привет от меня))))

medusa
Чувак, спасибо тебе, что не прошел мимо и подсказал интересный вывод инфы игроку) colorchat с отправкой текста в центр экрана (Пост #812045)
Жаль там кириллицей писать неполучается(

voed
И тебе спасибо) colorchat с отправкой текста в центр экрана (Пост #811814)

Еще выражаю благодарность человеку, чье имя мне не восстановить за функцию тряски экрана, которую я выдрал из егоплагина, спасибо, бро!!!!!!!!


ПС
- все вышенаписанное не сарказм.
- "не" с зглаголами пишется раздельно, знаю, пробел глючит)
*/

#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
#include <WPMGPrintChatColor>
#include <fun>

#define VIP_DAMAGE 1.5 //урон наносимый вип игроком 1 - стандартный урон, 1.5 - увеличен на 50%
#define VIP_SPEED 480.0 //Стандартная скорость игрока 450 юнитов/мин, это ДОБАВКА к стандартной скорости, тип данных float (дробное число)
#define VIP_GRAVITY 0.7 //Гравитация 1 - стандартная, 1.5 - увеличена на 50%
#define VIP_DIFFERENCE 1 //разница между фрагами и смертями, при достижении которой будет выдаваться вип обычному игроку (в рекламных целях)
#define COUNT 7 //сколько раз за карту обычому игроку будут выдаваться вип возможности при достижении разницы между смертями и фрагами (выдается при каждомвозрождении)

#define FFADE_IN 0x0000 //это не трогать, это для тряски экрана

new g_ability[33]
new g_count[33]
new g_msgFade, g_msgShake

const VIP_FLAG = ADMIN_LEVEL_H // флаг вип игрока(для отображения вип в табе)

static szSound[] = "buttons/button7"

public plugin_init()
{
register_plugin("VIP_Gungame_by_pl", "1.0", "rukojop :-)")

register_event("CurWeapon", "WeaponChange", "be", "1=1" )//регистрируем событие смены оружия

register_message( get_user_msgid ("ScoreAttrib"), "msg_ScoreAttrib" )//мессадж для отображения вип в табе

RegisterHam (Ham_TakeDamage, "player", "UserTakeDamage") // регистрируем событие получения урона
RegisterHam(Ham_Spawn, "player", "SetSpeedGravity", 1) // регистрирем момент возрождения игрока, в этот момент будем выдавать скорость и гравитацию
RegisterHam(Ham_Killed,"player","ham_player_kill")//тут регистрируем момент смерти, где будем обнулять идентификатор наличия вип возможностей

g_msgShake = get_user_msgid("ScreenShake")
g_msgFade = get_user_msgid("ScreenFade")
}

public plugin_precache()
{
precache_sound(szSound)
}

public msg_ScoreAttrib( msg_id, msg_dest, receiver ) //эта функция отображает тэг ВИП в таблице счета
{
/* original code by xpaw & Radius */
#define ARG_PlayerID 1
#define ARG_Flags 2
#define SCOREBOARD_VIP (1 << 2)

if( get_user_flags( get_msg_arg_int(ARG_PlayerID) ) & VIP_FLAG )
set_msg_arg_int( ARG_Flags, ARG_BYTE, get_msg_arg_int(ARG_Flags) | SCOREBOARD_VIP )
}

public client_disconnect(id) // при дисконнекте игрока обнуляем идентификаторы
{
g_ability[id] = false
g_count[id] = 0
}

public ham_player_kill(victim, attacker, corpse)
{
g_ability[victim] = false
}

public WeaponChange(id) //
{
if(g_ability[id])
{
set_user_maxspeed(id, VIP_SPEED)
set_user_gravity(id,VIP_GRAVITY)
}
}

public UserTakeDamage (victim, weapon, attacker, Float:damage, damagebits)
{
if(victim == attacker || !victim) // если жертва это атакуюший или жертвы нет, то начинаем заново
return
if (!is_user_alive(attacker))
return
if ((get_user_flags(attacker) & ADMIN_LEVEL_H)) // если игрок жив и имеет флаг t, то увеличиваем урон на 50%
{
SetHamParamFloat(4, damage * VIP_DAMAGE)
//PrintChatColor(attacker, _, "!gСТАНДАРТНЫЙ УРОН !t%.1f !gVIP УРОН !t%.1f", damage,(damage * VIP_DAMAGE))
}
if (g_ability[attacker])
{
SetHamParamFloat(4, damage * VIP_DAMAGE)
//PrintChatColor(attacker, _, "!gСТАНДАРТНЫЙ УРОН !t%.1f !gVIP УРОН !t%.1f", damage,(damage * VIP_DAMAGE))
}
}

public SetSpeedGravity (id)
{
new Death[33], Frags[33] //объявляем массивы для хранения фрагов, смертей и имен игроков
Death[id] = get_user_deaths(id)//получаем смерть игрока и заносим в массив
Frags[id] = get_user_frags(id) //получаем фраги игрока и заносим в массив
new Float:speed = get_user_maxspeed(id) + VIP_SPEED
/*
if (!is_user_alive(id))
return*/
if (((Death[id] - Frags[id]) > VIP_DIFFERENCE) && (g_count[id] < COUNT) && (is_user_alive(id)))
{
set_user_maxspeed(id , speed)
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
set_task(0.1, "Shake", id)
client_cmd( id, "spk %s", szSound )
g_count[id]++
PrintChatColor(id, _, "!gОсталось !t%d !yвозрождений(я) с !tVIP возможностями", (COUNT - g_count[id]))
if(((COUNT - g_count[id]) < (COUNT - 1)))
PrintChatColor(id, _, "!tskype для покупки VIP !gpl-evgen")
}
if ((get_user_flags(id) & ADMIN_LEVEL_H) && (is_user_alive(id)))
{
set_user_maxspeed(id , speed)
//увеличиваем гравитацию
set_user_gravity(id,VIP_GRAVITY)
g_ability[id] = true
return HAM_IGNORED
}
return HAM_HANDLED
}

public Shake (id)
{
message_begin( MSG_ONE_UNRELIABLE, g_msgFade, .player=id )
{
write_short( 1<<14 )
write_short( 1<<5 )
write_short( FFADE_IN )
write_byte( 34 )
write_byte( 34 )
write_byte( 139 )
write_byte( 75 )
}
message_end( )

message_begin( MSG_ONE_UNRELIABLE, g_msgShake, .player=id )
{
write_short( 255<<15 )
write_short( 50<<8 )
write_short( 255<<15 )
}
message_end( )
}


Цитата
Код
new Float:speed = get_user_maxspeed(id) + VIP_SPEED

лишнее

Почему? там же потом идет
Цитата
set_user_maxspeed(id , speed)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 1.7.2015, 18:41
Сообщение #7
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(filip @ 1.7.2015, 19:22) *
Сорян) Запилил благодарности)

LOL
С избытком good.gif


Цитата(filip @ 1.7.2015, 19:22) *
Почему? там же потом идет

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