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

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

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

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

Модуль Hamsanwich ( ЧАСТЬ 1) :)

, отслеживание игровых событий
Empower
сообщение 18.2.2009, 15:47
Сообщение #1
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Модуль Hamsandwich - очень легкий в использовании и часто без него просто не обойтись. Вот например: вы хотите чтоб при убийстве писалось в чат кто кого убил... ну и как же это сделать??? будете проверять каждую секунду все ли живы, не изменились ли фраги????
НЕТ НЕТ!! все намного проще... просто используете hamsandwich, он может отслеживать игровые события. Такие так: игрок понес урон, игрок бросил оружие, перезарядил оружие, игрок прикоснулся к предмету, игрок умер... можно писать десятки таких примеров.
А теперь рассмотрим как это же записать в коде. Сделаем небольшой плагин, чтобы когда игрок одерживал урон, то в чат выводилось его здоровье...

Каждое событие которое вы хотите использовать в своем плагине надо регистрировать в plugin_init процедурой
RegisterHam(СОБЫТИЕ, с кем происходит , какую функцию вызвать).
Для начала зарегистрируем событие урона..
Код
#include <amxmodx>
#include <hamsandwich>

public plugin_init()
{
    register_plugin("Hamsandwich Test","1.0","Empower");
    
    RegisterHam(Ham_TakeDamage, "player", "vivesti_HP");
}

Мы зарегистрировали событие - урон это Ham_TakeDamage(перевод как: принимать урон) какой объект принимает урон пишем player то есть игрок( когда дойдут руки напишу о других объектах )..и какая функция будет вызываться, если игрок понесет урон (можно любое название) в нашем случае назвал vivesti_HP...


Теперь сделаем функцию vivesti_HP, которая будет вызываться когда игрок будет терять хп..
Код
#include <amxmodx>
#include <hamsandwich>

public plugin_init()
{
    register_plugin("Hamsandwich Test","1.0","Empower");
    
    RegisterHam(Ham_TakeDamage, "player", "vivesti_HP");
}

public vivesti_hp(jertva, orujie, killer, uron)
{
    new hp
    hp = get_user_health(jertva) // записуем в переменную hp количество здоровья у урока

    new name[32]
    get_user_name(jertva,name,31) // записуем в переменную имя жертвы
//чтоб потом эго вывести в чат

    client_print(0,print_chat,"У игрока %s осталось %d ХП ",name,hp) // выводим в чат сообщение...
}

В переменные которые после public vivesti_hp поместятся кто понесет урон(jertva), с какого оружия наносят(orujie),
кто наносит эго (killer) и сколько урона сделал за этот удар(uron)...

Вот и готово....

Вот самые полезные события с модуля <hamsandwich>, которые надо писать в
RegisterHam(ЗДЕСЬ, "player", "ФУНКЦИЯ любая");
Код
Ham_TakeDamage // ИГРОК РАНИТСА (одерживает урон)

Ham_Spawn     // РЕСПАВНИТСА (появляется в мире после смерти)

Ham_Killed      // УМЕРАЕТ

Ham_Item_Drop // БРОСАЕТ ОРУЖИЕ на землю

Ham_Player_Jump // ПРЫГНУЛ

Ham_Player_Duck // ПРИСЕЛ



События ниже нужны для работы с оружием, потому вместо player будем писать оружие: weapon_deagle, weapon_awp итд..(список названий оружий в самом низу поста)..
RegisterHam(СОБИТИЕ, "weapon_ak47", "ФУНКЦИЯ любая");
Код
Ham_Weapon_Reload // перезарядил оружие

Ham_Weapon_PrimaryAttack // игрок стреляет

Ham_Weapon_SecondaryAttack // использует второй огонь


Для тех кто не знает наведу пример второго огня: в AWP это например будет включить прицел, в m4a1 это надеть глушитель, а в ak47 нету второго огня

ВОТ список названий оружий:
Код
        "weapon_mp5"
        "weapon_tmp"
        "weapon_p90"
        "weapon_mac10"
        "weapon_ak47"
        "weapon_sg552"
        "weapon_m4a1"
        "weapon_aug"
        "weapon_scout"
        "weapon_g3sg1"
        "weapon_awp"
        "weapon_m3"
        "weapon_xm1014"
        "weapon_m249"
        "weapon_flashbang"
        "weapon_hegrenade"
        "item_kevlar"
        "item_assaultsuit"
        "weapon_smokegrenade"


Если надо больше событий тода тебе Список событий Hamsandwich
Если я вам помог - кликните на спасибо!!
Приятного использования!!!!!! good.gif

P.S если желаешь прочти еще это: Блокирование игровых событий


Отредактировал: Empower, - 17.3.2009, 21:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 18 раз
   Цитировать сообщение
Fedcomp
сообщение 18.2.2009, 17:50
Сообщение #2
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

А как же тогда раньше писали плагин который показывал урон при попадании?
ведь в 1.76 такого модуля не присутствовало а плагин был ...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GODZILLA
сообщение 18.2.2009, 17:56
Сообщение #3


Стаж: 18 лет

Сообщений: 1471
Благодарностей: 440
Полезность: 716

Да,можно и по-другому,но с хамсэндвич это намного легче..

Вот у меня вопрос насчёт public vivesti_hp(jertva, orujie, killer, uron)

я вообще понимаю если в скобочках паписано id,то функция будет выполняться относительно ид. как например - public_client_putindserver(id). А вот тут не понимаю. нигде же не написано ничего про (jertva, orujie, killer, uron).
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Empower
сообщение 18.2.2009, 19:29
Сообщение #4
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Цитата
я вообще понимаю если в скобочках паписано id,то функция будет выполняться относительно ид. как например - public_client_putindserver(id). А вот тут не понимаю. нигде же не написано ничего про (jertva, orujie, killer, uron).


id ето просто переменная ты туда может что угодно написать client_putindserver(igrok) потом вместо сменной id работать с igrok... id ето всеголишь сменная, в которую люди привыкли записуетсувать ид игрока, но не имеет значения, ее мона назвать как ты захочеш... с таким же успехом можеш написать вместо (jertva, orujie, killer, uron)
(id, weapon, killer, damage)... если не понял то не стесняйса еще раз спросить, че не ясн...

Цитата
А как же тогда раньше писали плагин который показывал урон при попадании?
ведь в 1.76 такого модуля не присутствовало а плагин был ...


с помощю fakemeta или engine(ево учить не советую, он точный аналог фейкмета, ток по другому функции пишутса, некоторые функции отсутсвуют, некоторые добалены, но он по некоторым причинам хуже) ... Ето работа с ентити ( игровыми обэктами) както напишу темку. Очень полезная вещь... правда потяжелее hamsandwich-а намного :)

Отредактировал: Empower, - 18.2.2009, 21:11
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя vl25
сообщение 22.2.2009, 14:50
Сообщение #5
Стаж: 17 лет

Сообщений: 4
Благодарностей: 1
Полезность: 0

У автора явно проблемы с русским языком
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Empower
сообщение 22.2.2009, 17:07
Сообщение #6
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Цитата
У автора явно проблемы с русским языком

ага, я бывает забываю как некоторый руские слова пишутса... я не с росии сам sad.gif

Отредактировал: Empower, - 22.2.2009, 17:07
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 22.2.2009, 17:23
Сообщение #7
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

Цитата(vl25 @ 22.2.2009, 15:50) *
У автора явно проблемы с русским языком

Ненравится?
пиши сам
Человек между прочим делится полезными сведениями
На РУССКОМ (неважно что корявом) языке, и НЕНАДО искать на АНГЛИЙСКОМ языке всю эту инфу
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Empower
сообщение 22.2.2009, 18:47
Сообщение #8
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

скажите плиз где у меня ошибки? чтобы я исправил

Отредактировал: Empower, - 22.2.2009, 19:35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 22.2.2009, 19:16
Сообщение #9
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

Да вроде все правильно, только ненадо так ЭМОЦИОНАЛЬНО ПИСАТЬ не очень смотрится это
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Empower
сообщение 22.2.2009, 19:35
Сообщение #10
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Цитата
Да вроде все правильно, только ненадо так ЭМОЦИОНАЛЬНО ПИСАТЬ не очень смотрится это

непонял... то эсть, емоциально?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 22.2.2009, 21:56
Сообщение #11
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

Цитата(Empower @ 18.2.2009, 16:47) *
Модуль Hamsandwich - очень легкий в использовании и часто без него просто не обойтись. Вот например: вы хотите чтоб при убийстве писалось в чат кто кого убил... ну и как же это сделать??? будете проверять каждую секунду все ли живы, не изменились ли фраги????
НЕТ НЕТ!!
все намного проще... .

Я думаю это было излишне хотя хз
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Empower
сообщение 22.2.2009, 22:43
Сообщение #12
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Цитата(Fedcomp @ 22.2.2009, 21:56) *
Я думаю это было излишне хотя хз

ухахаахха.. лол... если 3 вопросительных знака написал, или НЕТ большими буквами знач уже злой? :)

Отредактировал: Empower, - 22.2.2009, 22:44
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 23.2.2009, 9:18
Сообщение #13
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

Совсем не злой - уж скорее сумасшедший ученый :)
ладно шутка все в струю :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ckapa6eu
сообщение 15.12.2010, 18:25
Сообщение #14
Стаж: 16 лет

Сообщений: 47
Благодарностей: 5
Полезность: 13

почему ты написал

new [32]

а (jertva,name,31) ?
я просто этого понять не могу)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя STR@TEG
сообщение 15.12.2010, 19:44
Сообщение #15
Стаж: 16 лет

Сообщений: 4186
Благодарностей: 1763
Полезность: 837

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

Сообщений: 47
Благодарностей: 5
Полезность: 13

аа.. да,да.. читал про это.

все теперь понятно, спасибо.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Habetdin
сообщение 22.3.2011, 15:42
Сообщение #17
Стаж: 16 лет

Сообщений: 13
Благодарностей: 4
Полезность: 0

Скажите, ham должен работать с ботами?
Код
public plugin_init()
{
    register_plugin("Test","1.0","Habetdin")
    RegisterHam(Ham_Spawn, "player", "PlayerPostSpawn", 1)
}

public PlayerPostSpawn(id)
{
    client_print(0, print_chat, "[debug] Player %d spawned", id)
}

Пишет только когда я респавнюсь sad.gif
P.S.: ZBot
Upd: Сам нашел yy.gif
Пример регистрации события Ham для ZBot
Код
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

new bool:g_bIsCzero
new bool:g_bCZBotRegisterHam
new g_iServerMaxPlayers
new g_iBotQuota

public plugin_init() {
    // Must use post or else is_user_alive will return false on a dead player's next spawn
    // Note: CZ bots will not hook here, must RegisterHamFromEntity for them
    RegisterHam(Ham_Spawn, "player", "fwHamPlayerSpawnPost", 1)

    g_iServerMaxPlayers = get_maxplayers()

    // See if mod is CZ
    new modName[6]
    get_modname(modName, 5)
    if ( equal(modName, "czero") ) g_bIsCzero = true

    g_iBotQuota = get_cvar_pointer("bot_quota")
}

public fwHamPlayerSpawnPost(iPlayer) {
    // Ham_Spawn will initially be called for both clients and bots when
    // they are not alive. This first call will fire for clients when they
    // are put into the server and for bots when they are created. Neither
    // are spawned alive on a team. Therefore, the first Ham_Spawn call
    // must be blocked.


    // is_user_alive will be sufficent to block first Ham_Spawn for
    // clients. However, bots will pass this check even though dead on
    // first Ham_Spawn. Also, if checking cs_get_user_team clients must be
    // alive or else the native will error.
    if ( !is_user_alive(iPlayer) ) return HAM_IGNORED

    // A team check will return 0 or unassigned for the first Ham_Spawn
    // for both clients and players. - thx to MeRcyLeZZ for this fix
    // Note: For you weirdos who don't want to use the cstikre module
    // get_user_team() seems to work just as well.
    if ( cs_get_user_team(iPlayer) == CS_TEAM_UNASSIGNED ) return HAM_IGNORED

    // player has spawned and is alive in game

    return HAM_IGNORED
}

public client_putinserver(iPlayer) {
    if ( iPlayer < 1 || iPlayer > g_iServerMaxPlayers ) return

    // Only want to run this if: mod is CZ (zbot not supported), client is a bot,
    // these are CZ bots (bot_quota), and the ham has not been registed yet.
    if ( g_bIsCzero && (pev(iPlayer, pev_flags) & FL_FAKECLIENT) && get_pcvar_num(g_iBotQuota) > 0 && !g_bCZBotRegisterHam ) {

        // Delay for private data to initialize
        set_task(0.1, "czbotHookHam", iPlayer)
    }
}

public czbotHookHam(iPlayer)
{
    // Thx to Avalanche and GunGame of which this method is based off of
    if ( g_bCZBotRegisterHam || !is_user_connected(iPlayer) ) return

    // Recheck for safety.
    if ( (pev(iPlayer, pev_flags) & FL_FAKECLIENT) && get_pcvar_num(g_iBotQuota) > 0 ) {
        // Post spawn fix for cz bots, since RegisterHam does not work for them
        RegisterHamFromEntity(Ham_Spawn, iPlayer, "fwHamPlayerSpawnPost", 1)

        // Only needs to run once after ham is registed ignore.
        g_bCZBotRegisterHam = true

        // Incase this bot has spawned alive into a game that already has
        // started we must manually call a Ham_Spawn because the ham will
        // not register early enough. - thx to MeRcyLeZZ for this fix
        if ( is_user_alive(iPlayer) ) fwHamPlayerSpawnPost(iPlayer)
    }
}

Upd: события для ботов начинаю работать только когда кто-нибудь из настоящих игроков умрет ubeysya.gif

Отредактировал: Habetdin, - 23.3.2011, 13:55
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ProxXx
сообщение 6.4.2011, 17:06
Сообщение #18


Стаж: 19 лет

Сообщений: 72
Благодарностей: 41
Полезность: 438

Цитата(Empower @ 18.2.2009, 20:29) *
id ето просто переменная ты туда может что угодно написать client_putindserver(igrok) потом вместо сменной id работать с igrok... id ето всеголишь сменная, в которую люди привыкли записуетсувать ид игрока, но не имеет значения, ее мона назвать как ты захочеш... с таким же успехом можеш написать вместо (jertva, orujie, killer, uron)
(id, weapon, killer, damage)... если не понял то не стесняйса еще раз спросить, че не ясн...

Это не переменная, а агрумент которые принимает функции, имя у них может быть любое, главное что бы тип соответствовал.
Тема не очень актуальна ибо описание, и все агрументы есть ham_const.inc.


Цитата(Empower @ 18.2.2009, 20:29) *
с помощю fakemeta или engine(ево учить не советую, он точный аналог фейкмета, ток по другому функции пишутса, некоторые функции отсутсвуют, некоторые добалены, но он по некоторым причинам хуже) ... Ето работа с ентити ( игровыми обэктами) както напишу темку. Очень полезная вещь... правда потяжелее hamsandwich-а намного :)

С помощью HL эвентов , "DeathMsg".

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