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

отловить reload и unrealod

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

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

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

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

отловить reload и unrealod

Сообщение 1kla$ » 21 апр 2018, 16:31

Приветик, подскажите как можно отловить reload и unrealod
я знаю про функцию ham_reload, но вот как отловить когда игрок перезарядился ??
мне просто надо переменную при перезорядке true , а когда перезарядился false
может можно как то через event cur weapon сделать сразу одним событием ? чтобы не регать 2 функции ham
кому не трудно помогите, спасибо
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

Re: отловить reload и unrealod

Сообщение 1kla$ » 22 апр 2018, 09:44

Поможете кому не трудно?
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

Re: отловить reload и unrealod

Сообщение Subb98 » 22 апр 2018, 11:31

Возможно, вам подойдёт Reload bar в качестве примера:

Код: Выделить всё
/* AMX Mod X
*   Reload Status Bar
*
* (c) Copyright 2008 by VEN
*
* This file is provided as is (no warranties)
*
*    DESCRIPTION
*        Plugin draws dynamic status bar when player reloads his weapon.
*
*    CREDITS
*        Idea has been taken from "Reloadbar" plugin by "NL)Ramon(NL".
*
*    VERSIONS
*        0.1.1
*            - added: linux support
*            - some code improvements
*        0.1
*            - initial version
*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

// plugin's main information
#define PLUGIN_NAME "Reload Status Bar"
#define PLUGIN_VERSION "0.1.1"
#define PLUGIN_AUTHOR "VEN"

#define OFFSET_PLAYER_LINUX_DIFFERENCE 5

#define OFFSET_PLAYER_NEXT_ATTACK_WIN32 83
#define /* Float: */ GetPlayerAttackDelay(%1) /* (iPlayer) */ get_pdata_float(%1, OFFSET_PLAYER_NEXT_ATTACK_WIN32, OFFSET_PLAYER_LINUX_DIFFERENCE)

#define OFFSET_WEAPON_LINUX_DIFFERENCE 4

#define OFFSET_WEAPON_CBASE_PLAYER_WIN32 41
#define GetWeaponPlayer(%1) /* (iEnt) */ get_pdata_cbase(%1, OFFSET_WEAPON_CBASE_PLAYER_WIN32, OFFSET_WEAPON_LINUX_DIFFERENCE)

#define OFFSET_WEAPON_IN_RELOAD_WIN32 54
#define /* bool: */ IsWeaponInReload(%1) /* (iEnt) */ !!get_pdata_int(%1, OFFSET_WEAPON_IN_RELOAD_WIN32, OFFSET_WEAPON_LINUX_DIFFERENCE)

#define WEAPONS_SHOTGUNS_NONGUNS ((1<<CSW_HEGRENADE) | (1<<CSW_XM1014) | (1<<CSW_C4) | (1<<CSW_SMOKEGRENADE) | (1<<CSW_M3) | (1<<CSW_FLASHBANG) | (1<<CSW_KNIFE))

enum weapon_list {
    
WeaponList_Name 1,
    
WeaponList_AmmoId1,
    
WeaponList_MaxAmmo1,
    
WeaponList_AmmoId2,
    
WeaponList_MaxAmmo2,
    
WeaponList_Slot,
    
WeaponList_Position,
    
WeaponList_Id,
    
WeaponList_Flags
}

new 
g_iFwIdRegUserMsgPost

new const g_szMsgNameWeaponList[] = "WeaponList"
stock const g_szMsgNameBarTime[] = "BarTime"

new g_iMsgIdWeaponList
new g_iMsgIdBarTime

#define MAX_CLIENTS 32

new Float:g_fPlayerReloadEndGameTime[MAX_CLIENTS 1]

public 
plugin_precache() {
    
g_iMsgIdWeaponList get_user_msgid(g_szMsgNameWeaponList)
    if (!
g_iMsgIdWeaponList)
        
g_iFwIdRegUserMsgPost register_forward(FM_RegUserMsg"fwRegUserMsgPost"1)
    else
        
HookMsgWeaponList()
}

public 
fwRegUserMsgPost(const szMsgName[]) {
    if (!
equal(szMsgNameg_szMsgNameWeaponList))
        return 
FMRES_IGNORED

    unregister_forward
(FM_RegUserMsgg_iFwIdRegUserMsgPost1)
    
g_iMsgIdWeaponList get_orig_retval()
    
HookMsgWeaponList()

    return 
FMRES_HANDLED
}

HookMsgWeaponList() {
    
register_message(g_iMsgIdWeaponList"fwMsgWeaponList")
}

public 
fwMsgWeaponList() {
    static 
iHookedWeaponsiWeaponIdszWeaponName[32]
    
iWeaponId get_msg_arg_int(WeaponList_Id)
    if (
iHookedWeapons & (1<<iWeaponId))
        return 
PLUGIN_CONTINUE

    get_msg_arg_string
(WeaponList_NameszWeaponNamesizeof szWeaponName 1)

    static const 
szfwHamWeaponReloadPost[] = "fwHamWeaponReloadPost"
    
if (!(WEAPONS_SHOTGUNS_NONGUNS & (1<<iWeaponId)))
        
RegisterHam(Ham_Weapon_ReloadszWeaponNameszfwHamWeaponReloadPost1)

    static const 
szFwHamItemDeployPost[] = "fwHamItemDeployPost"
    
RegisterHam(Ham_Item_DeployszWeaponNameszFwHamItemDeployPost1)

    
iHookedWeapons |= (1<<iWeaponId)

    return 
PLUGIN_CONTINUE
}

public 
plugin_init() {
    
register_plugin(PLUGIN_NAMEPLUGIN_VERSIONPLUGIN_AUTHOR)

    
g_iMsgIdBarTime get_user_msgid(g_szMsgNameBarTime)
}

public 
fwHamWeaponReloadPost(iEnt) {
    if (!
IsWeaponInReload(iEnt))
        return 
HAM_IGNORED

    
static iWeaponPlayerFloat:fAttackDelay
    iWeaponPlayer 
GetWeaponPlayer(iEnt)
    
fAttackDelay GetPlayerAttackDelay(iWeaponPlayer)

    
MsgBarTime(iWeaponPlayerfloatround(fAttackDelay))
    
g_fPlayerReloadEndGameTime[iWeaponPlayer] = get_gametime() + fAttackDelay

    
return HAM_HANDLED
}

public 
fwHamItemDeployPost(iEnt) {
    static 
iWeaponPlayer
    iWeaponPlayer 
GetWeaponPlayer(iEnt)

    if (
g_fPlayerReloadEndGameTime[iWeaponPlayer] < get_gametime())
        return 
HAM_IGNORED

    MsgBarTime
(iWeaponPlayer0)
    
g_fPlayerReloadEndGameTime[iWeaponPlayer] = 0.0

    
return HAM_HANDLED
}

stock MsgBarTime(iPlayeriBarScale) {
    
message_begin(MSG_ONEg_iMsgIdBarTime_iPlayer)
    
write_short(iBarScale)
    
message_end()

Вы должны зарегистрироваться, чтобы видеть ссылки.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: отловить reload и unrealod

Сообщение Stimul » 23 апр 2018, 01:58

как отловить когда игрок перезарядился ??

На примере дигла:
Код: Выделить всё
#define m_pPlayer    41
#define m_flNextAttack    83
#define m_pActiveItem    373
#define OFFSET_CLIPAMMO    51

#define XO_WEAPON    4
#define OFFSET_LINUX    5

#define TASKID    23042018

#define AMMO_COUNT    10

public plugin_init()
    
RegisterHam(Ham_Weapon_Reload"weapon_deagle""fw_Weapon_Reload_Pre");

public 
fw_Weapon_Reload_Pre(ent)
{
    static 
idid get_pdata_cbase(entm_pPlayerXO_WEAPON);
    
    
set_task(get_pdata_float(idm_flNextAttackOFFSET_LINUX), "EndReload"id TASKID);
}

public 
EndReload(id)
    if(
is_user_alive(id) && get_user_weapon(id) == CSW_DEAGLE)
        
// Перезарядка завершена 

Должно работать.
Аватара пользователя
Stimul
 
Сообщения: 3582
Зарегистрирован: 04 янв 2012, 19:51
Благодарил (а): 192 раз.
Поблагодарили: 1163 раз.
Опыт программирования: Больше трех лет

Re: отловить reload и unrealod

Сообщение Vaqtincha » 23 апр 2018, 10:32

тебе кроме итемпостфрейма ничего не подойдет!
админгандонсоси
Аватара пользователя
Vaqtincha
 
Сообщения: 277
Зарегистрирован: 28 мар 2018, 15:05
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 53 раз.

Re: отловить reload и unrealod

Сообщение 1kla$ » 23 апр 2018, 11:43

Stimul, спасибо большое, проверю, а то код от Subb98, огромный, я аж передумал

Добавлено спустя 36 секунд:
Vaqtincha, код stimul не пройдет ? нормальная же тема, таском офф когда перезарядился
только вот надо проверить, если перебил перезарядку к примеру переменная off или нет, а то пока не перезарядится нормально она не off
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

Re: отловить reload и unrealod

Сообщение 1kla$ » 25 апр 2018, 11:07

Stimul, EndReload не срабатывает, и если просто нажать R(перезарядку) но обойма полная и он не перезаряжается , но функция срабатывает, получается переменная true а перезарядки нет, и наверное еще будет баг если во время перезарядки переключиться или сбросить ее и потом вернуться на оружие, то тоже будет true переменная, хотя перезарядка прервалась или сброшена была, можно как то это решить все будет ??

Vaqtincha, сейчас попробую почитать про itempostframe

спасибо огромное за помощь

Добавлено спустя 6 минут 6 секунд:
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define m_flTimeWeaponIdle      48
#define m_iClip                 51
#define m_fInReload             54
#define m_flNextAttack          83

new g_Tmp_Clip[33], iClipExtra = 10
new const Float
:reload_time[33] = {0.0, 2.7, 0.0, 2.0, 0.0, 0.3, 0.0, 3.15, 3.3, 0.0, 4.5, 2.7, 3.5, 3.35, 2.45, 3.3, 2.7, 2.2, 2.5, 2.63, 4.7, 0.45, 3.05, 2.12, 3.5, 0.0, 2.2, 3.0, 2.45, 0.0, 3.4}
new const reload_animations[33] = {0, 5, 0, 3, 4, }
new const weapons_name[][] = {
    "weapon_p228", "weapon_scout", "weapon_xm1014", "weapon_mac10", "weapon_aug", "weapon_elite", "weapon_fiveseven", "weapon_ump45",
    "weapon_sg550", "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
    "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_p90"
}

public plugin_init() {
    for(new w = 0; w < sizeof(weapons_name); w++) {
        RegisterHam(Ham_Weapon_Reload, weapons_name[w], "weapon_reload")
        RegisterHam(Ham_Weapon_Reload, weapons_name[w], "weapon_reload_post", 1)
        RegisterHam(Ham_Item_PostFrame, weapons_name[w], "item_post_frame")
    }
}

public weapon_reload(wpn) {
    new id = pev(wpn, pev_owner)
    if(!is_user_connected(id)) return HAM_IGNORED
    g_Tmp_Clip
[id] = -1
    new iBpAmmo 
= fm_get_user_bpammo(id, get_pdata_int(wpn, 43, 4))
    new iClip = get_pdata_int(wpn, m_iClip, 4)
    if(!iBpAmmo) return HAM_SUPERCEDE
    if
(iClip >= iClipExtra) return HAM_SUPERCEDE
    g_Tmp_Clip
[id] = iClip
    return HAM_IGNORED
}

public weapon_reload_post(wpn) {
    static id; id = get_pdata_cbase(wpn, 41, 4)
    if(!is_user_connected(id)) return HAM_IGNORED
    static weapon
; weapon = get_pdata_int(wpn, 43, 4)
    if(g_Tmp_Clip[id] == -1) return HAM_IGNORED
    set_pdata_int
(wpn, m_iClip, g_Tmp_Clip[id], 4)
    set_pdata_float(wpn, m_flTimeWeaponIdle, reload_time[weapon], 4)
    set_pdata_float(id, m_flNextAttack, reload_time[weapon], 5)
    set_pdata_int(wpn, m_fInReload, 1, 4)
    UTIL_PlayWeaponAnimation(id, reload_animations[weapon])
    return HAM_IGNORED
}

public item_post_frame(wpn) {
    static id; id = get_pdata_cbase(wpn, 41, 4)
    if(!is_user_connected(id)) return HAM_IGNORED
    static weapon
; weapon = get_pdata_int(wpn, 43, 4)
    new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, 5)
    new iBpAmmo = fm_get_user_bpammo(id, weapon)
    new iClip = get_pdata_int(wpn, m_iClip, 4)
    new fInReload = get_pdata_int(wpn, m_fInReload, 4)
    if(fInReload && flNextAttack <= 0.0) {
        new j = min(iClipExtra - iClip, iBpAmmo)
        set_pdata_int(wpn, m_iClip, iClip + j, 4)
        fm_set_user_bpammo(id, weapon, iBpAmmo-j)
        set_pdata_int(wpn, m_fInReload, 0, 4)
        fInReload = 0
    
}
    return HAM_IGNORED
}


вот нашел кодок, поможете переделать слегка ? удалить что не нужно тут и сделать чтоб при перезарядке greload[id] = true, а когда перезарядился greload[id] = false

спасибо
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

Re: отловить reload и unrealod

Сообщение ALIK » 25 апр 2018, 11:19

1kla$, тебе вообще что нужно? Тебя интересует, если игрок перезаряжает оружие или нет?
Аватара пользователя
ALIK
 
Сообщения: 227
Зарегистрирован: 01 июн 2010, 23:05
Благодарил (а): 116 раз.
Поблагодарили: 55 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn

Re: отловить reload и unrealod

Сообщение 1kla$ » 25 апр 2018, 14:29

ALIK, да, мне бы при перезарядке игрока переменную true
Как перезарядился false, только если игрок отменил перезарядку то переменная false или если игрок жмёт перезарядку а у него макс патрон то чтоб не срабатывало
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

Re: отловить reload и unrealod

Сообщение 1kla$ » 27 апр 2018, 09:32

поможете если не трудно?
Аватара пользователя
1kla$
 
Сообщения: 122
Зарегистрирован: 19 фев 2018, 13:16
Благодарил (а): 43 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца

След.

Вернуться в Скриптинг

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

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