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

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

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

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

Урон от гранат в GOLDEN оружии

, Помогите найти ошибку
Статус пользователя Lena1978
сообщение 25.9.2021, 19:42
Сообщение #1
Стаж: 17 лет

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

Есть плагин золотого АК. Проблема в чем. Когда купишь золотой АК то увеличивается урон от НЕ гранат. Бросаеш гранату и тут-же переключаешься на голд АК, плагин думает что урон не от гранаты, а от голд-АК... и увеличивает урон в 1,5 - 2 раза.

В плагине есть строки DMG_GRENADE, чтото связано с уроном гранаты, но реально это не работает и урон повышается.
Как сделать чтобы золотой АК не влиял на урон гранат?

Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fun>
#include <cstrike>
#include <hamsandwich>

#define is_valid_player(%1) (1 <= %1 <= 32)

#define m_bitsDamageType 76

#define DMG_GRENADE (1<<24)

new AK_V_MODEL[] = "models/v_golden_ak47.mdl"
new AK_P_MODEL[] = "models/p_golden_ak47.mdl"
new AK_W_MODEL[] = "models/w_golden_ak47.mdl"

#define XO_WEAPON 4
#define XO_PLAYER 5
#define m_rgpPlayerItems_CWeaponBox 34
#define m_pNext 42
#define m_iId 43
#define m_rgpPlayerItems_CBasePlayer 367

new cvar_dmgmultiplier

new bool:g_HasAk[33], bool:g_bHasGA[33]

new g_hasZoom[33]

new cvar_cost

#define WK 3333

public plugin_precache()
{
precache_model(AK_V_MODEL);
precache_model(AK_P_MODEL);
precache_model(AK_W_MODEL);
precache_sound("weapons/zoom.wav");
}

public plugin_init()
{
cvar_dmgmultiplier = register_cvar("goldenak_dmg_multiplier", "1.5");
cvar_cost = register_cvar("goldenak_cost", "8000");

register_plugin("Golden AK-47 mod", "1.5", "AlejandroSk Mod")
register_event("DeathMsg", "Death", "a")
register_event("WeapPickup","checkModel","b","1=19")
register_event("CurWeapon","checkWeapon","be","1=1")

RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
register_forward(FM_SetModel, "fw_SetModel")
RegisterHam ( Ham_Item_AttachToPlayer, "weapon_ak47", "fw_Item_AttachToPlayer" )
register_event ( "HLTV", "ev_RoundStart", "a", "1=0", "2=0" )

register_clcmd("say /goldak", "CmdBuyAk")

register_forward(FM_CmdStart, "fw_CmdStart")
}

public ev_RoundStart ()
{
new iPlayers[32], iNum
get_players ( iPlayers, iNum )

for ( --iNum; iNum >= 0; --iNum )
g_bHasGA[iPlayers[iNum]] = false
}

public client_connect(id)
{
g_HasAk[id] = false
g_bHasGA[id] = false
}

public client_disconnect(id)
{
g_HasAk[id] = false
g_bHasGA[id] = false
}

public Death()
{
g_HasAk[read_data(2)] = false
g_bHasGA[read_data(2)] = false
}


public fw_SetModel ( ent, model[] )
{
if ( pev_valid ( ent ) != 2 )
return FMRES_IGNORED

if ( strlen ( model ) < 8 )
return FMRES_IGNORED

if ( model[7] != 'w' || model[8] != '_' )
return FMRES_IGNORED

static sClassName[32]
pev ( ent, pev_classname, sClassName, charsmax ( sClassName ) )

if ( !equal ( sClassName, "weaponbox" ) )
return FMRES_IGNORED

new id = pev ( ent, pev_owner )

if ( pev_valid ( id ) != 2 )
return FMRES_IGNORED

#define MAX_ITEM_TYPES 6

for (new i, iItem; i < MAX_ITEM_TYPES; i++)
{
iItem = get_pdata_cbase ( ent, m_rgpPlayerItems_CWeaponBox + i, XO_WEAPON )

if ( pev_valid ( iItem ) == 2 && pev(iItem, pev_impulse) == WK )
{
g_HasAk[id] = false
engfunc ( EngFunc_SetModel, ent, AK_W_MODEL )
return FMRES_SUPERCEDE
}
}

return FMRES_IGNORED
}


public fw_Item_AttachToPlayer ( ent, id )
{
if ( pev_valid ( ent ) !=2 || !is_user_alive ( id ) )
return HAM_IGNORED

if ( pev ( ent, pev_impulse ) == WK )
g_HasAk[id] = true

return HAM_IGNORED
}

public checkModel(id)
{
if ( !g_HasAk[id] )
return PLUGIN_HANDLED

new szWeapID = read_data(2)

if ( szWeapID == CSW_AK47 && g_HasAk[id] == true )
{
set_pev(id, pev_viewmodel2, AK_V_MODEL)
set_pev(id, pev_weaponmodel2, AK_P_MODEL)
}
return PLUGIN_HANDLED
}

public CmdBuyAk(id)
{

new money = cs_get_user_money(id)

if (money >= get_pcvar_num(cvar_cost))
{

if(cs_get_user_shield(id))
engclient_cmd(id, "drop", "weapon_shield")

cs_set_user_money(id, money - get_pcvar_num(cvar_cost))
Player_DropWeapons ( id, 1 )
new iWeapon = give_item(id, "weapon_ak47")
set_pev(iWeapon, pev_impulse, WK)

give_item(id, "weapon_ak47")
cs_set_user_bpammo(id, CSW_AK47, 150)
g_HasAk[id] = true
}
return PLUGIN_HANDLED
}

public giveak47(id)
{
Player_DropWeapons ( id, 1 )
new iWeapon = give_item(id, "weapon_ak47")
set_pev(iWeapon, pev_impulse, WK)
give_item(id, "weapon_ak47")
cs_set_user_bpammo(id, CSW_AK47, 150)
g_HasAk[id] = true
}

public give_ak47(id)
{

giveak47(id)
return PLUGIN_CONTINUE
}

public checkWeapon(id)
{
new plrClip, plrAmmo
new plrWeapId

plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (plrWeapId == CSW_AK47 && g_HasAk[id])
checkModel(id)
else
return PLUGIN_CONTINUE

return PLUGIN_HANDLED
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !(m_bitsDamageType & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}

public fw_CmdStart( id, uc_handle, seed )
{
if( !is_user_alive( id ) )
return PLUGIN_HANDLED

if( ( get_uc( uc_handle, UC_Buttons ) & IN_ATTACK2 ) && !( pev( id, pev_oldbuttons ) & IN_ATTACK2 ) )
{
new szClip, szAmmo
new szWeapID = get_user_weapon( id, szClip, szAmmo )

if( szWeapID == CSW_AK47 && g_HasAk[id] == true && !g_hasZoom[id] == true)
{
g_hasZoom[id] = true
cs_set_user_zoom( id, CS_SET_AUGSG552_ZOOM, 0 )
emit_sound( id, CHAN_ITEM, "weapons/zoom.wav", 0.40, 2.40, 0, 100 )
}

else if ( szWeapID == CSW_AK47 && g_HasAk[id] == true && g_hasZoom[id])
{
g_hasZoom[ id ] = false
cs_set_user_zoom( id, CS_RESET_ZOOM, 0 )

}
}
return PLUGIN_HANDLED
}

Player_DropWeapons(const iPlayer, const iSlot)
{
new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, m_rgpPlayerItems_CBasePlayer + iSlot, XO_PLAYER);

while (pev_valid(iItem) == 2)
{
pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName));
engclient_cmd(iPlayer, "drop", szWeaponName);

iItem = get_pdata_cbase(iItem, m_pNext, XO_WEAPON);
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
HipHop
сообщение 25.9.2021, 20:17
Сообщение #2
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Воть.
Прикрепленный файл  gold_ak47.sma ( 6,24 килобайт ) Кол-во скачиваний: 16


Отредактировал: HipHop, - 25.9.2021, 20:17
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Lena1978
сообщение 26.9.2021, 15:25
Сообщение #3
Стаж: 17 лет

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

Спасибо.
Должно работать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Lena1978
сообщение 1.10.2021, 23:31
Сообщение #4
Стаж: 17 лет

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

К сожалению, проверка показала, что изменения не дают эффект... Если стоишь рядом с игроком и бросаешь ему под ноги гранату - снимается стандартный урон, наверное движок не успевает переключиться на "золотой АК" и множитель урона не считается. Но если бросаешь гранату с 5 метров и больше то урон от НЕ-гранаты всегда считается, как увеличенный на множитель золотого оружия.

Вообще нужен правильный фикс. Что предложено ранее - НЕ РАБОТАЕТ!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
HipHop
сообщение 2.10.2021, 9:04
Сообщение #5
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Скорее всего, у тебя что-то ещё стоит и мешает. Проверь работу плагина, оставив в списке только стандартные и его самого. Начни с оригинала.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Lena1978
сообщение 2.10.2021, 12:38
Сообщение #6
Стаж: 17 лет

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

Ещё установлен плагин nademodes - задает несколько режимов для гранаты - мина, лазерная и т.п. Но, поскольку урон гранаты повышается именно при использовании "голд АК" я думаю, что проблема в нем....
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
HipHop
сообщение 2.10.2021, 14:44
Сообщение #7
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Думать надо меньше, а тестировать больше smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Sonikplus
сообщение 2.10.2021, 22:15
Сообщение #8
Стаж: 11 лет

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

вместо этого
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !(m_bitsDamageType & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}
там наверняка должно было быть так
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !( get_pdata_int(victim, m_bitsDamageType) & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}
но лучше сделать так
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && g_HasAk[attacker] && inflictor == attacker && get_user_weapon(attacker) == CSW_AK47 )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя Lena1978
сообщение 2.10.2021, 23:49
Сообщение #9
Стаж: 17 лет

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

Цитата(HipHop @ 2.10.2021, 15:44) *
Думать надо меньше, а тестировать больше smile.gif


Отключение всех плагинов показало, что проблема тянется именно за "голд-ак".
Голый АМХ + плагин "голд-АК" и уже проблема есть.

Дополнительный нюанс, может поможет.
Когда убиваешь с НЕ-гранаты (с купленым голд-АК) то вверху показывается спрайт гранаты, а в конце раунда, когда
АМХ показывает стату по урону за раунд, то пишет что урон наносился с АК47.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
HipHop
сообщение 3.10.2021, 0:09
Сообщение #10
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Lena1978, замените строку в оригинальном плагине по первому совету Sonikplus (где добавляется get_pdata_int) и протестируйте.

Отредактировал: HipHop, - 3.10.2021, 0:09
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Sonikplus
сообщение 3.10.2021, 1:27
Сообщение #11
Стаж: 11 лет

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

это я просто предположил, что там могло быть, из за того что определено #define m_bitsDamageType 76
а так, то там есть четвертый параметр damagebits Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !(damagebits & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}
но в плагине не сделана до конца проверка через get_pdata_int ни через параметр dntknw.gif

Отредактировал: Sonikplus, - 3.10.2021, 1:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
HipHop
сообщение 3.10.2021, 8:31
Сообщение #12
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Во, так даже лучше: всё готовое good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Lena1978
сообщение 3.10.2021, 9:36
Сообщение #13
Стаж: 17 лет

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

Совершенно запутали в вариантах.
Какой из предложенных является оптимально-правильным?


Вариант №1
Код:

public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !( get_pdata_int(victim, m_bitsDamageType) & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}



Вариант №2
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage)
{
if ( is_valid_player( attacker ) && g_HasAk[attacker] && inflictor == attacker && get_user_weapon(attacker) == CSW_AK47 )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}



Вариант №3
Код:
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
if ( is_valid_player( attacker ) && get_user_weapon(attacker) == CSW_AK47 && g_HasAk[attacker] && !(damagebits & DMG_GRENADE) )
{
SetHamParamFloat(4, damage * get_pcvar_float( cvar_dmgmultiplier ) )
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
HipHop
сообщение 3.10.2021, 9:40
Сообщение #14
Стаж: 5 лет 7 месяцев
Город: Moscow

Сообщений: 185
Благодарностей: 139
Полезность: 828

Вариант №3. Его в любом случае делаем, даже если не будет правильно работать на сервере. И тестируем детально.

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