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

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

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

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

перезарядка оружия при килле

, перенести на reAPI
Статус пользователя ssx
сообщение 5.4.2017, 19:28
Сообщение #1


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Всем привет!
Помогите переписать под reAPI плагин.

Смысл очень простой: если хедшот то перезаряжать первичное и вторичное оружие, если обычное убийство то только текущее оружие перезаряжать.


Cкрытый текст
Код:
// Copyright  2015 Vaqtincha

/**
Credits:

- ConnorMcLeod for plugin "Refill Weapon On Hs Kill"
*/

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

#define PLUGIN "Refill Weapon On Kill"
#define VERSION "0.0.1"
#define AUTHOR "Vaqtincha"

#define get_user_active_weapon(%1) get_pdata_cbase(%1, m_pActiveItem, XO_PLAYER)
#define get_user_last_hitgroup(%1) get_pdata_int(%1, m_LastHitGroup, XO_PLAYER)
#define fm_get_weapon_id(%1) get_pdata_int(%1, m_iId, XO_WEAPON)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, m_iClip, %2, XO_WEAPON)

#define IsPlayer(%1) ( 1 <= %1 <= g_iMaxPlayers )

// Offsets
const m_pNext = 42
const m_iId = 43
const m_iClip = 51
const XO_WEAPON = 4
const XO_PLAYER = 5
const m_pActiveItem = 373
const m_LastHitGroup = 75
new const m_rgpPlayerItems_CBasePlayer[6] = {367, 368, ...}

//const NOCLIP_WPN_BS = ((1<<CSW_HEGRENADE)|(1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_KNIFE)|(1<<CSW_C4))
const NOCLIP_WPN_BS = ((1<<CSW_SMOKEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_C4))

new const g_iMaxClip[CSW_P90+1] = { -1, 13, -1, 10, 1, 7, 1, 30, 30, 1, 30, 20, 25, 30,
35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 2, 7, 30, 30, -1, 50
}

new g_iMaxPlayers

public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR )
RegisterHam(Ham_Killed, "player", "Player_Killed_Post", 1)
g_iMaxPlayers = get_maxplayers()
}

public Player_Killed_Post(id, iKiller, iGib)
{
if(IsPlayer(iKiller) && id != iKiller && is_user_alive(iKiller))
{
if(get_user_last_hitgroup(id) == HIT_HEAD)
{
for(new slot = 1; slot<= 2; slot++)
{
new iWeapon = get_pdata_cbase(iKiller, m_rgpPlayerItems_CBasePlayer[slot])
while(iWeapon > 0)
{
new iId = fm_get_weapon_id(iWeapon)
if(!(NOCLIP_WPN_BS & (1<<iId)))
{
fm_set_weapon_ammo(iWeapon, g_iMaxClip[iId])
iWeapon = get_pdata_cbase(iWeapon, m_pNext, XO_WEAPON)
// client_cmd(iKiller, "spk ^"items/9mmclip2.wav^"")
}
}
}
}else{
new iActiveWeapon = get_user_active_weapon(iKiller)
if(iActiveWeapon > 0)
{
new iId = fm_get_weapon_id(iActiveWeapon)
if(!(NOCLIP_WPN_BS & (1<<iId)))
{
fm_set_weapon_ammo(iActiveWeapon, g_iMaxClip[iId])
// client_cmd(iKiller, "spk ^"items/9mmclip1.wav^"")
}
}
}
}
}


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя SISA
сообщение 5.4.2017, 20:08
Сообщение #2
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

ssx,

Такой бредокод в 2015 году написать ? crazy.gif

Тебе нужны оффсеты:

#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_fInReload 54
#define m_flNextAttack 83
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 5.4.2017, 20:39
Сообщение #3
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

Не тестировал
Код:
#include < amxmodx >
#include < reapi >


public plugin_init( )
{
register_plugin( "Refill Weapon On Kill", "Best", "whore (fl0wer)" );
RegisterHookChain( RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true );
}

public CBasePlayer_Killed_Post( iVictim, iAttacker, iGib )
{
if( !is_user_alive( iAttacker ) )
return;

if( get_member( iVictim, m_bHeadshotKilled ) )
{
new iItem = get_member( iAttacker, m_rgpPlayerItems, PRIMARY_WEAPON_SLOT );

if( iItem != NULLENT )
rg_instant_reload_weapons( iAttacker, iItem );

iItem = get_member( iAttacker, m_rgpPlayerItems, PISTOL_SLOT );

if( iItem != NULLENT )
rg_instant_reload_weapons( iAttacker, iItem );
}
else
{
new iActiveItem = get_member( iAttacker, m_pActiveItem );

if( iActiveItem != NULLENT )
rg_instant_reload_weapons( iAttacker, iActiveItem );
}
}


Отредактировал: fl0werD, - 5.4.2017, 20:44
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя adva
сообщение 5.4.2017, 21:42
Сообщение #4


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

Стаж: 12 лет

Сообщений: 2543
Благодарностей: 1676
Полезность: 819

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

Код:
// Copyright 2017 Vaqtincha
// SUPPORT http://dev-cs.ru/

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

#define ONLY_ACTIVE_WEAPON
// #define ONLY_HEADSHOT_KILL

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

#define PL_VERSION "0.0.1"

#include <amxmodx>
#include <reapi>

public plugin_init()
{
register_plugin("Refill Weapon On Kill", PL_VERSION, "Vaqtincha")
RegisterHookChain(RG_CSGameRules_DeathNotice, "CSGameRules_DeathNotice", .post = true)
}


public CSGameRules_DeathNotice(const pPlayer, const pKiller, pevInflictor)
{
if(pPlayer == pKiller || !is_user_alive(pKiller) || pKiller != pevInflictor)
return HC_CONTINUE

#if defined ONLY_HEADSHOT_KILL
if(!get_member(pPlayer, m_bHeadshotKilled))
return HC_CONTINUE
#endif

#if defined ONLY_ACTIVE_WEAPON
if(!is_nullent((pevInflictor = get_member(pKiller, m_pActiveItem))))
rg_instant_reload_weapons(pKiller, pevInflictor)
#else
rg_instant_reload_weapons(pKiller)
#endif

return HC_CONTINUE
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 5.4.2017, 22:01
Сообщение #5
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Каких халявных натив в реапи сделали. А как же хардкор на оффсетах ? crazy.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 6.4.2017, 1:59
Сообщение #6
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

Цитата(SISA @ 5.4.2017, 22:01) *
Каких халявных натив в реапи сделали. А как же хардкор на оффсетах ? crazy.gif

Какой хардкор при выставлении патронов?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 6.4.2017, 12:19
Сообщение #7
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

fl0werD,

Выставление патронов != перезарядка. В перезарядки там сброс серии выстрелов, всевозможных m_flAccuracy и зумов.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.4.2017, 12:44
Сообщение #8


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

adva, спс. ща буду тестить .

Цитата(SISA @ 6.4.2017, 12:19) *
fl0werD,

Выставление патронов != перезарядка. В перезарядки там сброс серии выстрелов, всевозможных m_flAccuracy и зумов.

На КСДМ сервере сброс серии выстрелов, разброса и т д не нужен. Нужно только по сути добавление патронов.


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.4.2017, 12:53
Сообщение #9


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Работает код из поста перезарядка оружия при килле (Пост #989507)

Но есть один нюанс! При убийстве с гранаты не пополняет патроны.


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 6.4.2017, 13:41
Сообщение #10
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Цитата(ssx @ 6.4.2017, 14:53) *
Работает код из поста перезарядка оружия при килле (Пост #989507)

Но есть один нюанс! При убийстве с гранаты не пополняет патроны.


Тогда тебе нужна не перезарядка, а восстановление патронов. Это совершенно другой код и сам факт перезарядки даже не нужен, скорее он создаст только проблемы.

У каждого оружия есть оффсет m_iDefaultAmmo и в него записано дефолтное количество патрон в обойме. Берем значения с этого офсета, суем их в m_iClip и не нужна никакая "перезарядка".
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 6.4.2017, 13:53
Сообщение #11
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

А да, мой косяк, забыл совсем, что m_iDefaultAmmo сбрасывается. Тогда да, ток через релоад. А что касается грены, то с неё нельзя убить в хед.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.4.2017, 14:24
Сообщение #12


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Цитата(SISA @ 6.4.2017, 13:53) *
А да, мой косяк, забыл совсем, что m_iDefaultAmmo сбрасывается. Тогда да, ток через релоад. А что касается грены, то с неё нельзя убить в хед.

Пока что тестирую с
// #define ONLY_ACTIVE_WEAPON
// #define ONLY_HEADSHOT_KILL

То есть чтобы через rg_instant_reload_weapons(pKiller) всё оружие перезяражало.
Просто пополняет патроны без сбрасывания зажима .

Если с ножа то пополняет. Если с гранаты - не пополняет. А должно пополнять.



Отредактировал: ssx, - 6.4.2017, 14:26


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.4.2017, 14:36
Сообщение #13


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

В общем.
Сменил
RegisterHookChain(RG_CSGameRules_DeathNotice, "CSGameRules_DeathNotice", .post = true)
на
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", .post = 0)

И все заработало как нужно!с ножа и с гранаты если убить то пополнит патроны.

Код:
#include <amxmodx>
#include <reapi>

#define PL_VERSION "0.0.1"

public plugin_init()
{
register_plugin("Refill Weapon On Kill reAPI", PL_VERSION, "Vaqtincha +edit")
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", .post = 0)
}

public CBasePlayer_Killed(const victim, const killer, iGib)
{
if(victim == killer || !is_user_alive(killer) )
return HC_CONTINUE

rg_instant_reload_weapons(killer)

return HC_CONTINUE
}


П.С. Теперь переделаю под себя - если в голову или вип то пополнять оба оружия, если не вип то только текущее.



[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 6.4.2017, 20:27
Сообщение #14
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

А зачем пре хук, ты же ничего не меняешь?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 6.4.2017, 20:32
Сообщение #15
Стаж: 15 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

А rg_instant_reload_weapons разве не вызывает весь цикл перезарядки ? Там же по идее оффсеты должны сбросить и зумы и измениться стрельба, особенно при стрельбе очередью.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.4.2017, 20:44
Сообщение #16


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

Цитата(fl0werD @ 6.4.2017, 20:27) *
А зачем пре хук, ты же ничего не меняешь?

А какая разница в pre или post ?
Если ничего не менять то и разницы нет . или я ошибаюсь ?

Вот так по простому сделал
Код:
	if(get_member(victim, m_LastHitGroup) == HITGROUP_HEAD)
{
value = value * 2
rg_instant_reload_weapons(killer)

if (fade[killer] == 1)
{
fade_msg(killer, 50, 0, 0, 50)
}
}
else if(priv[killer] >= 2 ) // vip or more access
{
rg_instant_reload_weapons(killer)

if (fade[killer] == 1)
{
fade_msg(killer, 0, 50, 0, 50)
}
}
else
{
rg_instant_reload_weapons(killer, get_member(killer, m_pActiveItem))

if (fade[killer] == 1)
{
fade_msg(killer, 0, 50, 0, 50)
}
}

Всё работает как задумывал.

Цитата(SISA @ 6.4.2017, 20:32) *
А rg_instant_reload_weapons разве не вызывает весь цикл перезарядки ? Там же по идее оффсеты должны сбросить и зумы и измениться стрельба, особенно при стрельбе очередью.

Ничего не меняется. Просто пополняет патроны.
78.152.169.100:27017 дм аим сервер . Можешь сам глянуть как работает.


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя fl0werD
сообщение 7.4.2017, 1:48
Сообщение #17
Стаж: 9 лет 2 месяца

Сообщений: 155
Благодарностей: 114
Полезность: 692

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