Addon для Weapon Skin System API (Damage)

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
95
Реакции
21
Основная информация

Проблема: Addon для Weapon Skin System (Damage)

Ошибка:
Написал addon для Weapon Skin System, но осталась одна проблема, которую никак не могу побороть.
Пример бага:
  1. Покупаю оружие АК;
  2. через /skin ставлю ему модель (урон в этот момент установился);
  3. делаю дроп оружия и поднимаю другой АК, повышенный урон все равно остается.
Дополнительная информация

Amx Mod X: 1.8.3-dev

Исходник:
Код:

#define PLUGIN ""
#define VERSION ""
#define AUTHOR ""

#include <amxmodx>
#include <reapi>
#include <weapon_skin_system>

#pragma semicolon 1

#define WM_ACCESS_FLAG ADMIN_KICK

enum SkinInfo { SkinIndex, SkinWeaponid, SkinWeapon};
enum Skins { SKIN_AK };

new g_iWeaponSkins[Skins][SkinInfo];

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Pre");
}

public wss_loaded_skin(index, weaponid, name[])
{
if(equal(name, "AK-47 Arena"))
{
g_iWeaponSkins[SKIN_AK][SkinIndex] = index;
g_iWeaponSkins[SKIN_AK][SkinWeaponid] = weaponid;
}
}

public wss_weapon_deploy(id, weapon, weaponid, skin)
{
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{ g_iWeaponSkins[SKIN_AK][SkinWeapon] = weapon; }
}

public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new g_iWeapon = get_user_weapon(pevAttacker);

if(wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_AK][SkinWeapon]) == g_iWeaponSkins[SKIN_AK][SkinIndex] && g_iWeapon == CSW_AK47)
{ SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2); }
}

Комментарий:
Прошу помощи у опытных скриптеров, думаю многие хотели бы сделать подобный плагин для скин менеджера от мистрика.
wopox1337, не проходи мимо, я знаю ты можешь исправить :) Заранее благодарочка)
 
В этой теме было размещено решение! Перейти к решению.
Последнее редактирование модератором:
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Попробуйте такой вариант.
Код:
#define PLUGIN  ""
#define VERSION ""
#define AUTHOR ""

#include <amxmodx>
#include <reapi>
#include <weapon_skin_system>

#pragma semicolon 1

#define WM_ACCESS_FLAG ADMIN_KICK

enum SkinInfo { SkinIndex, SkinWeaponid, SkinWeapon};
enum Skins { SKIN_AK };

new g_iWeaponSkins[Skins][SkinInfo];
new HookChain:g_iTakeDamage;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
DisableHookChain(g_iTakeDamage = RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Pre", false));
}

public wss_loaded_skin(index, weaponid, name[])
{
if(equal(name, "AK-47 Arena"))
{
g_iWeaponSkins[SKIN_AK][SkinIndex] = index;
g_iWeaponSkins[SKIN_AK][SkinWeaponid] = weaponid;
}
}

public wss_weapon_deploy(id, weapon, weaponid, skin)
{
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex]) {
g_iWeaponSkins[SKIN_AK][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}
else DisableHookChain(g_iTakeDamage);
}

public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new g_iWeapon = get_user_weapon(pevAttacker);
if(wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_AK][SkinWeapon]) == g_iWeaponSkins[SKIN_AK][SkinIndex] && g_iWeapon == CSW_AK47) SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
 
Сообщения
95
Реакции
21
Minni, тот же самый баг и остался, как только взял калаш без скина урон не убрался
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
thegame, попробуйте добавить форвард wss_weapon_drop и в него внести отключения хука. Хотя, это не совсем правильно будет, но попробовать стоит.
 
Сообщения
95
Реакции
21
Minni, там не в дроп , а в пикап надо внести его, щас пробую.
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Код:
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new g_iWeapon = get_user_weapon(pevAttacker);
if(wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_AK][SkinWeapon]) == g_iWeaponSkins[SKIN_AK][SkinIndex] && g_iWeapon == CSW_AK47)
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}

И кто такое писал? У вас условие, которое никак не зависит от того, из чего стреляют.
Что-то менять в деплое не нужно. g_iWeaponSkins[SKIN_AK][SkinWeapon] = weapon; - вроде такой чуши.

Код:

const XO_CBASEPLAYER = 5;
const m_pActiveItem = 373;

public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new weapon = get_pdata_cbase(pevAttacker, m_pActiveItem, XO_CBASEPLAYER);
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}
 
Сообщения
95
Реакции
21
Mistrick, а чем такой вариант хуже?
Код:
#define PLUGIN  ""
#define VERSION ""
#define AUTHOR ""

#include <amxmodx>
#include <reapi>
#include <weapon_skin_system>

#pragma semicolon 1

#define WM_ACCESS_FLAG ADMIN_KICK

enum SkinInfo { SkinIndex, SkinWeaponid, SkinWeapon };
enum Skins { SKIN_M4A1, SKIN_AK, SKIN_AWP, SKIN_DEGL, SKIN_KNIFE };

new g_iWeaponSkins[Skins][SkinInfo];
new HookChain:g_iTakeDamage;

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
DisableHookChain(g_iTakeDamage = RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Pre", false));
}

public wss_loaded_skin(index, weaponid, name[])
{
if(equal(name, "M4A1 Arena"))
{
g_iWeaponSkins[SKIN_M4A1][SkinIndex] = index;
g_iWeaponSkins[SKIN_M4A1][SkinWeaponid] = weaponid;
}

if(equal(name, "AK-47 Arena"))
{
g_iWeaponSkins[SKIN_AK][SkinIndex] = index;
g_iWeaponSkins[SKIN_AK][SkinWeaponid] = weaponid;
}

if(equal(name, "AWP Arena"))
{
g_iWeaponSkins[SKIN_AWP][SkinIndex] = index;
g_iWeaponSkins[SKIN_AWP][SkinWeaponid] = weaponid;
}

if(equal(name, "Deagle Arena"))
{
g_iWeaponSkins[SKIN_DEGL][SkinIndex] = index;
g_iWeaponSkins[SKIN_DEGL][SkinWeaponid] = weaponid;
}

if(equal(name, "Knife Arena"))
{
g_iWeaponSkins[SKIN_KNIFE][SkinIndex] = index;
g_iWeaponSkins[SKIN_KNIFE][SkinWeaponid] = weaponid;
}
}

public wss_weapon_deploy(id, weapon, weaponid, skin)
{
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_M4A1][SkinIndex])
{
g_iWeaponSkins[SKIN_M4A1][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
g_iWeaponSkins[SKIN_AK][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AWP][SkinIndex])
{
g_iWeaponSkins[SKIN_AWP][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_DEGL][SkinIndex])
{
g_iWeaponSkins[SKIN_DEGL][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_KNIFE][SkinIndex])
{
g_iWeaponSkins[SKIN_KNIFE][SkinWeapon] = weapon;
EnableHookChain(g_iTakeDamage);
}
}

public wss_weapon_can_pickup(id, weaponbox, weapon, weaponid, skin)
{
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_M4A1][SkinIndex])
{
DisableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
DisableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AWP][SkinIndex])
{
DisableHookChain(g_iTakeDamage);
}

if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_DEGL][SkinIndex])
{
DisableHookChain(g_iTakeDamage);
}
}
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new g_iWeapon = get_user_weapon(pevAttacker);

new g_iM4A1 = wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_M4A1][SkinWeapon]);
new g_iAK47 = wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_AK][SkinWeapon]);
new g_iAWP = wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_AWP][SkinWeapon]);
new g_iDeagle = wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_DEGL][SkinWeapon]);
new g_iKnife = wss_get_weapon_skin_index(g_iWeaponSkins[SKIN_KNIFE][SkinWeapon]);


if( g_iM4A1 || g_iAK47 || g_iAWP || g_iDeagle )
{ SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2); }

if(g_iKnife == g_iWeaponSkins[SKIN_KNIFE][SkinIndex] && g_iWeapon == CSW_KNIFE)
{SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);}
}
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
thegame, вы хоть немного понимаете, что пишите?
 
Сообщения
95
Реакции
21
Mistrick, ну да, ваш то код, который кладет сервер в офф получше то будет)
Код:
const XO_CBASEPLAYER = 5;
const m_pActiveItem = 373;

public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new weapon = get_pdata_cbase(pevAttacker, m_pActiveItem, XO_CBASEPLAYER);
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
thegame, где весь плагин?
 
Сообщения
95
Реакции
21
Mistrick, через ./skin ставлю модельку, иду стреляю в игрока и сервер офф.
Код:
#define PLUGIN  ""
#define VERSION ""
#define AUTHOR ""

#include <amxmodx>
#include <reapi>
#include <hamsandwich>
#include <weapon_skin_system>

#pragma semicolon 1

#define WM_ACCESS_FLAG ADMIN_KICK

const XO_CBASEPLAYER = 5;
const m_pActiveItem = 373;

enum SkinInfo { SkinIndex, SkinWeaponid};
enum Skins { SKIN_M4A1, SKIN_AK, SKIN_AWP, SKIN_DEGL, SKIN_KNIFE };

new g_iWeaponSkins[Skins][SkinInfo];

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage_Pre");
}

public wss_loaded_skin(index, weaponid, name[])
{
if(equal(name, "AK-47 Arena"))
{
g_iWeaponSkins[SKIN_AK][SkinIndex] = index;
g_iWeaponSkins[SKIN_AK][SkinWeaponid] = weaponid;
}
}

public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new weapon = get_pdata_cbase(pevAttacker, m_pActiveItem, XO_CBASEPLAYER);
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Код:
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
if(wss_get_weapon_skin_index(pevInflictor) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}
 
Сообщения
95
Реакции
21
Mistrick, теперь просто тупо не работает урон)
16 Сен 2017
Mistrick, то что я написал выше свой код, он работает полностью исправно, но есть в логах ошибка как ее пофиксить не знаю.
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Код:
public CBasePlayer_TakeDamage_Pre(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
new weapon = get_member(pevAttacker, m_pActiveItem);
if(wss_get_weapon_skin_index(weapon) == g_iWeaponSkins[SKIN_AK][SkinIndex])
{
SetHookChainArg(4, ATYPE_FLOAT, flDamage * 20.2);
}
}
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
просто сделай метку в самой ентити и запомни что за метка, а потом сверяй то ли это оружие. в чем проблема?
Код:

#define IsCustomItem(%0,%1) (get_entvar(%0, var_impulse) == g_iWeaponKey[%1])
#define SetCustomItem(%0,%1) set_entvar(%0, var_impulse, g_iWeaponKey[%1])
 
Сообщения
95
Реакции
21
Mistrick, только только начал проверять эту команду, да все работает. Приношу извинения и благодарность за помощь, но есть еще проблема в блокировке поднятия оружия. Если оружие дропает вип игрок, то он его может и поднимать, но этоже оружие может поднять и не вип игрок и если он его дропнет, то поднять это оружие не может никто, даже вип.
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
gyxoBka, метки уже делает система скинов.
thegame, код кто будет показывать?
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
Mistrick, ну, значит, у ТС руки.... код надо править
 
Сообщения
95
Реакции
21
Mistrick, брал ваш пример с alliedmods.
Код:
public wss_weapon_can_pickup(id, weaponbox, weapon, weaponid, skin)
{
new skin = wss_get_weapon_skin_index(weapon);
if(!skin)
{ return WEAPON_CAN_PICKUP; }

if(skin == g_iWeaponSkins[SKIN_AK][SkinIndex] && ~get_user_flags(id) & ADMIN_LEVEL_H)
{ return WEAPON_BLOCK_PICKUP; }

return WEAPON_CAN_PICKUP;
}
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
thegame, с таким кодом, не вип не может поднять оружие.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу