Русское сообщество по скриптингу

Изучение модуля Hamsandwich с нуля [12.08.2013]

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Retro-kolt Lincoln » 11 авг 2013, 17:50

Название статьи: Изучение модуля Hamsandwich с нуля.
Автор: Freedo.m
Источник: amx-x.ru

Предисловие:
Здравствуйте дорогие друзья, сегодня я хочу Вам рассказать о таком замечательном модуле как hamsandwich, с помощью данного модуля можно отлавливать и вызывать большое количество различных событий в игре (forward'ов). Например: получение урона, смерть игрока, спавн игрока, соприкосновение энтити, все эти события и многие другие можно отловить и изменить с помощью модуля hamsandwich, давайте же приступим к делу.

1. Регистрация событий.
[spoiler]Чтобы поймать за хвост то или иное событие, его нужно сначала зарегистрировать.
[pawn]
  1. RegisterHam(A, B, C, D);
[/pawn]
A - Событие которое необходимо отловить.
B - Объект который мы отлавливаем.
C - Название функции в которую мы будем передавать отловленные параметры.
D - Когда событие будет отловлено, до того как оно произошло или после(Pre, Post).

Пример:
[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1);

  7. }

  8.  

  9. public Ham_PlayerSpawn_Post(pPlayer)

  10. {

  11.         // Ваш код

  12. }
[/pawn]
С помощью данного примера мы отловили событие спавна игрока.
Ham_Spawn - Событие спавна.
player - Отлавливаемый объект (тут может быть не только игрок, например какое нибудь оружие).
Ham_PlayerSpawn_Post - Название функции в которую мы передаём необходимые параметры(название может быть любое, но лучше пишите так, чтобы потом сами поняли что это).
1 - Отлавливаем событие после того как оно произошло, что же это значит? Приведу другой пример, мы отлавливаем урон нанесённый игроку, если мы будем отлавливать событие до(то есть 0) его можно будет изменить, так как игрок ещё не получил урона, а вот если мы будем отлавливать событие после(то есть 1), мы уже не сможем его изменить, так как игрок уже получил урон.[/spoiler]
2. Изменение параметров отловленных событий.
[spoiler]Научились ловить события? Хорошо, теперь приступим к их изменениям.
[pawn]
  1. SetHamParamInteger(A, B); // целое значение

  2. SetHamParamFloat(A, B); // дробное значение

  3. SetHamParamString(A, B); // строка (значение содержит символы)

  4. SetHamParamVector(A, B); // дробный массив с векторами в трёх плоскостях (x,y,z)

  5. SetHamParamEntity(A, B); // индекс энтити

  6. SetHamParamTraceResult(A, B); // результат трассировки
[/pawn]
A - Номер параметра который необходимо изменить.
B - Любое значение или строка(зависит от того какой функцией пользуетесь).

Примеры:
[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Pre", 0);

  7. }

  8.  

  9. public Ham_PlayerKilled_Pre(pVictim, pKiller, iCorpse)

  10. {

  11.         SetHamParamInteger(3, 2);

  12. }
[/pawn]
Данный пример изменит параметр iCorpse который отвечает за эффект смерти игрока, теперь все игроки при смерти будут разрываться на куски :D

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_TakeDamage, "player", "Ham_PlayerTakeDamage_Pre", 0);

  7. }

  8.  

  9. public Ham_PlayerTakeDamage_Pre(pVictim, pInflictor, pAttacker, Float:fDamage, iDamageType)

  10. {

  11.         SetHamParamFloat(4, 100.0);

  12. }
[/pawn]
Изменяем значение fDamage, оно отвечает за количество нанесённого урона, теперь какой бы урон не получил игрок, он всегда будет ровняться 100 (то есть смерть, кэп да?).

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_GiveAmmo, "player", "Ham_PlayerGiveAmmo_Pre", 0);

  7. }

  8.  

  9. public Ham_PlayerGiveAmmo_Pre(pPlayer, iAmmoAmount, const szAmmoName[], iAmmoMax)

  10. {

  11.         SetHamParamString(3, "338magnum");

  12. }
[/pawn]
Странный плагин... С помощью него ловится событие покупки патронов и какие бы Вы патроны не покупали, купятся патроны 338magnum...

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_TraceAttack, "player", "Ham_PlayerTraceAttack_Pre", 0);

  7. }

  8.  

  9. public Ham_PlayerTraceAttack_Pre(pVictim, pAttacker, Float:fDamage, Float:fDirection[3], pTr, iDamageType)

  10. {

  11.         fDirection[2] -= 20.0;

  12.         SetHamParamVector(4, fDirection);

  13. }
[/pawn]
Плагин изменяет направление летящей пули, сдвигает её на 20 юнитов вниз.

[pawn]
  1. #include <amxmodx>

  2. #include <hamsandwich>

  3.  

  4. public plugin_init()

  5. {

  6.         RegisterHam(Ham_TraceAttack, "player", "Ham_PlayerTraceAttack_Pre", 0);

  7. }

  8.  

  9. public Ham_PlayerTraceAttack_Pre(pVictim, pAttacker, Float:fDamage, Float:fDirection[3], pTr, iDamageType)

  10. {

  11.         SetHamParamEntity(1, pAttacker);

  12.         SetHamParamEntity(2, pVictim);

  13. }
[/pawn]
Шуточный плагин, с помощью SetHamParamEntity мы изменяем индексы игроков таким образом, что нападающий становится жертвой :-D

[pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. public plugin_init()

  6. {

  7.         RegisterHam(Ham_TraceAttack, "player", "Ham_PlayerTraceAttack_Pre", 0);

  8. }

  9.  

  10. public Ham_PlayerTraceAttack_Pre(pVictim, pAttacker, Float:fDamage, Float:fDirection[3], pTr, iDamageType)

  11. {

  12.         set_tr2(pTr, TR_iHitgroup, HIT_HEAD);

  13.         SetHamParamTraceResult(5, pTr);

  14. }
[/pawn]
Тут пришлось подключить модуль fakemeta для того чтобы изменить трассировку атаки, а затем её выставить. Теперь в какую бы часть тела не стреляли, пули всё равно будут попадать в голову.[/spoiler]
Продолжение следует... Пишу прямо на сайте, по этому статья будет обновляться примерно каждый день. Дополнения, уточнения и нормальная критика, приветствуется.

Начну:
Ham_Item_Holster - функция вызывается, когда мы прячем оружие в кобуру(пример со сменой ножа):
[spoiler][pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. #define is_valid_player(%0)     (1 <= %0 <= g_maxpls)

  6.  

  7. new g_maxpls;

  8.  

  9. public plugin_init(){

  10.  

  11.         RegisterHam(Ham_Item_Holster, "weapon_knife", "fw_knife_holstered", 1);

  12.        

  13.         g_maxpls = get_maxplayers();

  14.        

  15. }

  16.  

  17. public fw_knife_holstered(weapon_ent){

  18.  

  19.         if(!pev_valid(weapon_ent))

  20.                 return HAM_IGNORED;

  21.                

  22.         static id; id = get_pdata_cbase(weapon_ent, 41, 4);

  23.        

  24.         if(!is_valid_player(id))

  25.                 return HAM_IGNORED;

  26.        

  27.         //CODE

  28.        

  29.         return HAM_IGNORED;

  30. }
[/pawn]
Код для отлова момента смены оружия в кобуру(т.е. сменой на другое).Мне лично эта функция помогала "сбросить" гравитацию и скорость с игрока при смене оружия(я считаю это лучшим путем).[/spoiler]

Ham_Item_Deploy - функция вызывается при смене на нужное нам оружие(в данном случае нож):
[spoiler][pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. #define is_valid_player(%0)     (1 <= %0 <= g_maxpls)

  6.  

  7. new g_maxpls;

  8.  

  9. new v_model[]   = "models/knifes/v_knife.mdl";

  10. new w_model[]   = "models/knifes/p_knife.mdl";

  11.  

  12. public plugin_precache(){

  13.  

  14.         precache_model(v_model);

  15.         precache_model(w_model);

  16. }

  17.  

  18. public plugin_init(){

  19.  

  20.         RegisterHam(Ham_Item_Deploy, "weapon_knife", "fw_check_knife", 1);

  21.        

  22.         g_maxpls = get_maxplayers();

  23. }

  24.  

  25. public fw_check_knife(weapon_ent){

  26.  

  27.         if(!pev_valid(weapon_ent))

  28.                 return HAM_IGNORED;

  29.                

  30.         static id; id = get_pdata_cbase(weapon_ent, 41, 4);

  31.        

  32.         if(!is_valid_player(id))

  33.                 return HAM_IGNORED;

  34.                

  35.         set_pev(id, pev_viewmodel2, v_model);

  36.         set_pev(id, pev_weaponmodel2, w_model);

  37.        

  38.         return HAM_IGNORED;

  39. }
[/pawn]
В данном примере мы выставили модели ножу, который держит в руках игрок "models/knifes/v_knife.mdl" и "models/knifes/p_knife.mdl" для заменяя стандартные модели ножа.[/spoiler]

Ham_Player_Jump - вызывается каждый кадр прыжка.Их примерно у меня вызвалось ~60 кадров за секунду.
[spoiler][pawn]
  1. #include <amxmodx>

  2. #include <engine>

  3. #include <hamsandwich>

  4.  

  5. public plugin_init()    RegisterHam(Ham_Player_Jump,"player","fwrd_jump_post", 1);

  6.  

  7.  

  8. public fwrd_jump_post(id){

  9.        

  10.         if(~entity_get_int(id, EV_INT_flags) & FL_ONGROUND)

  11.                 return;

  12.                

  13.         new Float:Vel[3]

  14.         entity_get_vector(id, EV_VEC_velocity, Vel)

  15.         Vel[0] *= 1.20

  16.         Vel[1] *= 1.20

  17.         Vel[2] = 250.0

  18.        

  19.         entity_set_vector(id, EV_VEC_velocity, Vel)

  20.         entity_set_int(id, EV_INT_gaitsequence, 6)

  21. }
[/pawn]
В данном случае мы сделали autobhop, без остановок и с небольшим ускорением.[/spoiler]

Ham_CS_Player_ResetMaxSpeed - довольно-таки новая функция в hamsandwich модуле, вызывается в момент обнуления скорости, нужна версия amxmodx выше 1.8.2.

[spoiler][pawn]
  1. #include <amxmodx>

  2. #include <fakemeta>

  3. #include <hamsandwich>

  4.  

  5. #define MAX_PLAYERS     32

  6.  

  7. new bool:g_speed[MAX_PLAYERS+1] = false;

  8.  

  9. public plugin_init(){

  10.  

  11.         RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "Check_speed", 0);

  12.        

  13.         register_concmd("say /speed", "speedhack");

  14. }

  15.  

  16. public speedhack(id){

  17.  

  18.         g_speed[id] = !g_speed[id];

  19.        

  20.         set_pev(id, pev_maxspeed, 2000.0);

  21. }

  22.  

  23. public Check_speed(id){

  24.        

  25.         if(g_speed[id])

  26.                 return HAM_SUPERCEDE;

  27.                

  28.         return HAM_IGNORED;

  29. }
[/pawn]
В данном примере мы создали булевую, при вводе в чат команды /test происходит выставление значении булевой нашей true/false и максимальная скорость с нашим новым значением 2000.0(по дефолту 250.0, но оружия такие как ак-47 - 240.0(вроде бы), а вот со scout - 260.0).И в Ham_CS_Player_ResetMaxSpeed проверяем нашу булевую и если наше условие подходит - суперсидим(возвращаем наше условие), чтобы не сбросилась скорость к стандартным значениям.[/spoiler]

Обновления: закончил список с изменениями параметров и добавил два недостающих примера.
Последний раз редактировалось Retro-kolt Lincoln 23 июл 2014, 22:13, всего редактировалось 1 раз.
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Safety1st » 24 июл 2014, 16:58

Воу-воу, полегче) Можешь не спорить, но я не признАю.

Leonidddd писал(а):Не будут они рисоваться так.

У меня всё рисуется: и брызги, и декальки.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Leonidddd » 24 июл 2014, 16:59

Safety1st, хм, удивил.На оленях писали, что невозможнo, что даже и пытаться не стоит, если только не создавать энтити крови..
[spoiler]Похоже на то, что человек съел что-то не то[/spoiler]
Спасибо Visual studio за кнопку "найти все ссылки", я вижу теперь что когда использовать.
Короче говоря:

ResetMaxSpeed - для глобального отлова(т.е. когда нам нужно отловить обнуление скорости, вне зависимости от того, какое оружие держит игрок).

GetMaxSpeed - для отлова обнуления скорости в момент держания определенного оружия.

Кстати, соглашусь, что форвард Ham_BloodColor практически бессмысленный.Ну может, кому и пригодится.

[spoiler]Safety1st, кстати, зачем скрывать свой сетевой статус на форуме?[/spoiler]
P.S.Надо спорить почаще, из этого может получиться отличный вывод для всех. :-D
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Safety1st » 24 июл 2014, 17:47

Leonidddd писал(а):Safety1st, хм, удивил.На оленях писали, что невозможно.. даже и пытаться не стоит.Если только не создавать энтити крови..

Ну да, удивил: ведь я обычно пишу непроверенные вещи. А тут вдруг угадал :-D
Перманентное назначение цвета крови подглядел в плагине KORD_12.7.


К вопросу о Ham_CS_Item_GetMaxSpeed: тут меня неприятно удивил ты. Какие-то усмешки ('ах да'), позиция свысока (а-ля 'я всё знаю'). Ещё неделю назад ты так себя не вёл. В сторону PRoSToTeM@ катишься? Рано ещё, знаний маловато, чтобы всё с рук сходило. На протяжении обсуждения ты ошибся 3 раза подряд: сначала что форвард вызывается каждый кадр, потом - что каждый выстрел, потом - что оффсетом цвет крови не назначить. И не пахнет глубоким знанием вопроса, что могло хоть как-то 'оправдать' такое отношение к собеседнику.

Я не увидел ни одного достойного аргумента в ответ на вопрос, в связи с которым ты споришь, а:
Leonidddd писал(а):Ham_CS_Item_GetMaxSpeed вызывается в форварде Ham_CS_Player_ResetMaxSpeed

означает, что число вызовов Ham_CS_Item_GetMaxSpeed меньше либо равно числу вызовов Ham_CS_Player_ResetMaxSpeed. На самом деле Ham_CS_Player_ResetMaxSpeed вызывается чаще и это как раз его минус, из-за чего приходится постоянно учитывать freezetime и игроков в 'свободном полёте'.

Пока я писал это пост, ты наконец-то спустился с небес на землю и соизволил-таки привести аргументы. Уже лучше. Мои дополнения:

Leonidddd писал(а):ResetMaxSpeed - для глобального отлова(т.е. когда нам нужно отловить обнуление скорости, в любой момент вне зависимости от того, какое оружие держит и т.п.).

При наличии на сервере AMXX 1.8.3-dev и выше. Ограничивать скорость наблюдателей в реальных условиях не требуется, поэтому в функции на форвард имеет смысл сделать проверку is_user_alive() .

Leonidddd писал(а):GetMaxSpeed - для отлова обнуления скорости в момент держания определенного оружия.

И на AMXX 1.8.2 и ниже доступен только он. Насчёт затрат: с одной стороны 'ещё нужно получать индекс игрока', с другой - сам форвард вызывается немного реже. Но в целом - да, чуток затратнее.

Проверка на фризтайм должна быть в обоих случаях, иначе оно не будет иметь силы для игроков с изменённой скоростью. В случае Ham_CS_Item_GetMaxSpeed такая проверка нужна только однократно, при первом назначении скорости с помощью pev_maxspeed.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Leonidddd » 24 июл 2014, 17:56

Safety1st,
Какие-то усмешки ('ах да'), позиция свысока (а-ля 'я всё знаю'). Ещё неделю назад ты так себя не вёл. В сторону PRoSToTeM@ катишься? Рано ещё, знаний маловато, чтобы всё с рук сходило. На протяжении обсуждения ты ошибся 3 раза подряд: сначала что форвард вызывается каждый кадр, потом - что каждый выстрел, потом - что оффсетом цвет крови не назначить. И не пахнет глубоким знанием вопроса, что могло хоть как-то 'оправдать' такое отношение к собеседнику.

Обычно, я так пишу, когда до меня доходит, что собеседник имел ввиду или, когда мне смогли доказать мою неправоту, мании величия у меня нету.Почему я был так уверен, что не нарисует декали ?Вот Вы должны зарегистрироваться, чтобы видеть ссылки., из-за которого я так считал, но уже буду проверять каждое слово.Чем вам Тёма не нравится?

означает, что число вызовов Ham_CS_Item_GetMaxSpeed меньше либо равно числу вызовов Ham_CS_Player_ResetMaxSpeed. На самом деле Ham_CS_Player_ResetMaxSpeed вызывается чаще и это как раз его минус, из-за чего приходится постоянно учитывать freezetime и игроков в 'свободном полёте'.

Оно равно.На игроков "в свободном полёте" это не действует(у меня surf сервер без ограничения скорости(обычными серверными настройками выставил), уже все протестировал, конфликта с Ham_CS_Player_ResetMaxSpeed - нету).На freezetime тоже никак данный форвард не влияет, не знаю, что там такого.

ты ошибся 3 раза подряд: сначала что форвард вызывается каждый кадр, потом - что каждый выстрел, потом - что оффсетом цвет крови не назначить.

Ну с кадром я погорячился(не тот сурс глянул) и с выстрелом понял, что не совсем то, но форвард использование прицела(правая кнопка AWP/Scout/CG3SG1/CSG550), левое нажатие кнопки при держании в руках C4, удар правой кнопкой ножом, выбрасывание гранат(если в руках щит), нажатие второй кнопки имея в руках щит(прикрытие) тоже вызывается в нем ResetMaxSpeed.
Код: Выделить всё
void CBasePlayer::ResetMaxSpeed(void)
{
   float speed = 240;

   if (IsObserver())
      speed = 900;
   else if (g_pGameRules->IsMultiplayer() && g_pGameRules->IsFreezePeriod())
      speed = 1;
   else if (m_bIsVIP == true)
      speed = 227;
   else if (m_pActiveItem)
      speed = m_pActiveItem->GetMaxSpeed();

   g_engfuncs.pfnSetClientMaxspeed(ENT(pev), speed);
}

Что вы здесь видите?
Все зависит от поставленной задачи.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Asmodai » 24 июл 2014, 18:28

Как все сложно. Почему просто не зарегать FM_SetClientMaxspeed? Вся проверка на фризтайм и спектатора сводится к сравнению скорости с 1 и 900.
Аватара пользователя
Asmodai
Адмирал
 
Сообщения: 466
Зарегистрирован: 24 фев 2011, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 393 раз.
Языки программирования: Counter-Strike 1.6

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Leonidddd » 24 июл 2014, 18:33

Asmodai, потому, что здесь обсуждаются hamsandwich форварды, не?
Ещё неделю назад ты так себя не вёл.

Это как?Нагло я себя вроде не веду, никого не оскорбляю, никого не унижаю(вроде бы), что не так?Из-за стараний углубления своих знаний может я себя не так веду, просто хочу уже все изучить и поделиться знаниями с другими, что здесь плохого?
Рано ещё, знаний маловато

На личности не стоит переходить.Вам не дано знать всего того, что знаю я и мне не дано знать все то, что знаете вы.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Safety1st » 24 июл 2014, 19:05

Leonidddd писал(а):Это как?Нагло я себя вроде не веду, никого не оскорбляю, никого не унижаю(вроде бы), что не так?

Выше указал конкретно:
Safety1st писал(а):Какие-то усмешки ('ах да'), позиция свысока (а-ля 'я всё знаю')


Leonidddd писал(а):На личности не стоит переходить.Вам не дано знать всего того, что знаю я и мне не дано знать все то, что знаете вы.

Как тут не перейти, если личность такие посты пишет. Не дано, конечно, но на данный случай я привёл достаточные аргументы, что знаний мало: 3 ошибки подряд.

Leonidddd писал(а):мании величия у меня нету

Что у тебя в голове - мне без разницы. Имеет значение только то, что снаружи: что ты пишешь и делаешь. С тобой всегда было приятно подискутировать. А Вы должны зарегистрироваться, чтобы видеть ссылки. прекрасный пример неприятной дискуссии: Тёма решил, что я оспариваю его экспертное мнение и понеслась :-D


Давай на этом и закончим? В 'смертных грехах' я тебя не обвинял, я всего лишь указал, что половина дискуссии с тобой была мне неприятна и почему. Мне показалось, что есть шанс, что ты прислушаешься. Нет - так нет; делиться своей информацией я могу, не вступая в споры с тобой.
--

Leonidddd писал(а):Почему я был так уверен, что не нарисует декали ?Вот Вы должны зарегистрироваться, чтобы видеть ссылки., из-за которого я так считал, но уже буду проверять каждое слово.

Arkshine шарит же. Он так и написал, что декали могут быть 2-х видов: красные и жёлтые. Мне в моде только жёлтые были нужны, дальше не исследовал. У себя в Вы должны зарегистрироваться, чтобы видеть ссылки. оговорку сделал.

Leonidddd писал(а):Оно равно.На игроков "в свободном полёте" это не действует(у меня surf сервер без ограничения скорости, уже все протестировал).На freezetime тоже никак данный форвард не влияет, не знаю, что там такого.

Оно меньше:
Ham_CS_Player_ResetMaxSpeed вызывается после окончания анимации смерти, когда игрок становится наблюдателем, а Ham_CS_Item_GetMaxSpeed - нет. Это легко пронаблюдать, если умирает не последний игрок из тимы.
• При спавне Ham_CS_Player_ResetMaxSpeed вызывается +1-2 раза даже если mp_freezetime = 0:
Код: Выделить всё

347.9940 ResetMaxSpeed Pre fired! pev_maxspeed = 1000
347.9940 ResetMaxSpeed Post fired! pev_maxspeed = 1
347.9940 ResetMaxSpeed Pre fired! pev_maxspeed = 1
347.9940 ResetMaxSpeed Post fired! pev_maxspeed = 1
348.0065 ResetMaxSpeed Pre fired! pev_maxspeed = 1
348.0065 ResetMaxSpeed Post fired! pev_maxspeed = 250

Свободный полёт - я имел ввиду наблюдателей. Surf'ы - другая песня, там скольжение. На freezetime 'данный форвард' не влияет, но функция, которую он вызывает, назначает скорость - и фризтайм становится не указом.

Asmodai писал(а):Как все сложно. Почему просто не зарегать FM_SetClientMaxspeed? Вся проверка на фризтайм и спектатора сводится к сравнению скорости с 1 и 900.

У меня ещё скорость 1000 периодически светится. А вообще идея интересная :thumbs_up Жаль, что FM куда хуже документирована(
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Leonidddd » 24 июл 2014, 19:13

Safety1st, ошибки я свои признал.

Оно меньше:
Ham_CS_Player_ResetMaxSpeed вызывается после окончания анимации смерти, когда игрок становится наблюдателем, а Ham_CS_Item_GetMaxSpeed - нет. Это легко пронаблюдать, если умирает не последний игрок из тимы

Вы не правы.Изучите код, который я дал выше.И поймете, что когда вызывается Ham_CS_Player_ResetMaxSpeed вызывается ещё и Ham_CS_Item_GetMaxSpeed.

[spoiler]Забавная переписка с Тёмой :-D[/spoiler]

Давай на этом и закончим?

Нее... спор - отличный стимул добиться результата, давай ещё продолжим, только уже на другие темы.
[spoiler]Теперь я буду проверять каждое утверждение на оленях и смотреть подтверждение в сурсах и тестированием личным(хотя, я весь код, что писал раньше - тестировал).[/spoiler]

[spoiler]У меня все-таки получилось оживить тему вроде бы. :-)[/spoiler]
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Safety1st » 24 июл 2014, 19:28

Leonidddd писал(а):Вы не правы.Изучите код, который я дал выше.И поймете, что когда вызывается Ham_CS_Player_ResetMaxSpeed вызывается ещё и Ham_CS_Item_GetMaxSpeed.

Ну как же не прав? GetMaxSpeed вызывается при выполнении ResetMaxSpeed только в одном случае из 4-х.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Изучение модуля Hamsandwich с нуля [12.08.2013]

Сообщение Leonidddd » 24 июл 2014, 19:39

в форвардах использование прицела(правая кнопка AWP/Scout/CG3SG1/CSG550), левое нажатие кнопки при держании в руках C4, удар правой кнопкой ножом(если в руках щит), выбрасывание гранат(если в руках щит), нажатие второй кнопки имея в руках щит(прикрытие) вызывается ResetMaxSpeed .

Т.е. и GetMaxSpeed.У них одинаковое кол-во вызовов.Не нужно с этим спорить.Изучив GetMaxSpeed пришёл к ещё 1ому выводу, он чуть-чуть вызывается чаще, но не на столько и это не так страшно.
Нужно правильно использовать форвард, чтобы конфликта с freezetime-ом не было.Вы выставляете в ResetMaxSpeed значение maxspeed что ли?

GetMaxSpeed вызывается при выполнении ResetMaxSpeed только в одном случае из 4-х.

False.
Ну правда, после смерти, когда становишься спектром, то GetMaxSpeed не вызовется, т.к. у нас нету активного элемента в руках игрока(оружия).
Последний раз редактировалось Leonidddd 24 июл 2014, 19:45, всего редактировалось 1 раз.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Пред.След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11