Помогите с Healthnade 0.0.2

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
3
Реакции
0
Ошибка
В том то и дело что плагин работает, ошибок нету, но гранату не выдает
ОС
Linux
Amx Mod X
AMX Mod X 1.9.0-dev+5210
Билд
ReHLDS version: 3.8.0.723-dev
ReGamedll
ReGameDLL version: 5.20.0.492-dev
Версия Metamod
Metamod v1.21p37 2013/05/30
Список метамодулей
[ 1] AMX Mod X RUN - amxmodx_mm_i386. v1.9.0-d ini Start ANY
[ 2] Reunion RUN - reunion_mm_i386. v0.1.92d ini Start Never
[ 3] Rechecker RUN - rechecker_mm_i38 v2.3 ini Chlvl ANY
[ 4] VoiceTranscoder RUN - VoiceTranscoder. v2017RC5 ini ANY ANY
[ 5] ReSemiclip RUN - resemiclip_mm_i3 v2.3.9 ini Chlvl ANY
[ 6] WHBlocker RUN - whblocker_mm_i38 v1.5.692 ini Chlvl ANY
[ 7] ReAPI RUN - reapi_amxx_i386. v5.20.0. pl1 ANY Never
[ 8] Fun RUN - fun_amxx_i386.so v1.9.0-d pl1 ANY ANY
[ 9] FakeMeta RUN - fakemeta_amxx_i3 v1.9.0-d pl1 ANY ANY
[10] MySQL RUN - mysql_amxx_i386. v1.9.0-d pl1 ANY ANY
[11] ReAimDetector RUN - reaimdetector_am v0.2.2 pl1 ANY Never
[12] Engine RUN - engine_amxx_i386 v1.9.0-d pl1 ANY ANY
[13] CSX RUN - csx_amxx_i386.so v1.9.0-d pl1 ANY ANY
[14] CStrike RUN - cstrike_amxx_i38 v1.9.0-d pl1 ANY ANY
[15] Ham Sandwich RUN - hamsandwich_amxx v1.9.0-d pl1 ANY ANY
Список плагинов
[ 1] FreshBan 1.0.5b kanagava fresh_bans.amxx running
[ 2] DopBan 0.8.1e mazdan dop_ban.amxx running
[ 3] ReAimDetector API 0.2.2 ReHLDS Team reaimdetector.a running
[ 4] Admin Base 1.8.2 AMXX Dev Team admin.amxx running
[ 5] [182] Ultimate Gag 17.12.22BE SKAJIbnEJIb ultimate_gag.am running
[ 6] Anti Flood 1.8.2 AMXX Dev Team antiflood.amxx running
[ 7] Admin Commands 1.8.2 AMXX Dev Team admincmd.amxx running
[ 8] Admin Help 1.8.2 AMXX Dev Team adminhelp.amxx running
[ 9] Admin Votes 1.8.2 AMXX Dev Team adminvote.amxx running
[ 10] Admin Chat 1.8.M AMXX Dev Team adminchat.amxx running
[ 11] Commands Menu 1.8.2 AMXX Dev Team cmdmenu.amxx running
[ 12] Info. Messages 1.8.2 AMXX Dev Team imessage.amxx running
[ 13] Maps Menu 1.8.2 AMXX Dev Team mapsmenu.amxx running
[ 14] Menus Front-End 1.8.2 AMXX Dev Team menufront.amxx running
[ 15] Multi-Lingual System 1.8.2 AMXX Dev Team multilingual.am running
[ 16] Pause Plugins 1.8.2 AMXX Dev Team pausecfg.amxx running
[ 17] Players Menu 1.8.M AMXX Dev Team plmenu.amxx running
[ 18] Restrict Weapons 1.8.2 AMXX Dev Team restmenu.amxx running
[ 19] Scrolling Message 1.8.2 AMXX Dev Team scrollmsg.amxx running
[ 20] CS Stats Logging 1.8.2 AMXX Dev Team stats_logging.a running
[ 21] StatsX (MastaMan Editi 1.8.2 AMXX Dev Team & statsx_shell.am running
[ 22] Stats Configuration 1.8.2 AMXX Dev Team statscfg.amxx running
[ 23] Plugin Menu 1.8.2 AMXX Dev Team pluginmenu.amxx running
[ 24] Mode 2x2 1.9 s1lent mode_2x2x.amxx running
[ 25] Amx_Killer 1.0 byle amx_killer.amxx running
[ 26] Parachute 15.07.15 KRoT@L/JTP10181 parachute_rbs.a running
[ 27] [182] Ultimate Weapons 21.03.23 SKAJIbnEJIb ultimate_weapon running
[ 28] Map Manager 2.5.61 Mistrick mapmanager_mist running
[ 29] Admin ESP 0.3 unnamed & miRror admin_esp.amxx running
[ 30] Advert Messages 1.2 neygomon adverts.amxx running
[ 31] Instant AutoTeamBalanc 1.2.0 ConnorMcLeod instant_autotea running
[ 32] SpecList 1.2a FatalisDK speclist.amxx running
[ 33] Auto recording demo 2.0 IzI | Bonaqua (R amx_autodemorec running
[ 34] [182] High Ping Kicker 17.08.11 SKAJIbnEJIb hpk_rbs.amxx running
[ 35] Anti Flash 1.3 Crush32 antiflash.amxx running
[ 36] Block All Adverts 1.3 neygomon block_all_adver running
[ 37] Bomb Timer 3.2 Twe3k c4bom.amxx running
[ 38] Reset Score 0.2 Silenttt / CepeH resetscore.amxx running
[ 39] Map Spawns Editor 1.0.16 iG_os map_spawns_edit running
[ 40] [182] Chat RBS 20.06.06 SKAJIbnEJIb chat_rbs.amxx running
[ 41] [182] VIP RBS 20.07.20 SKAJIbnEJIb vip_rbs.amxx running
[ 42] AWPoff 4.0 PAffAEJIkA :3 awpoff2.amxx running
[ 43] Block Change Name 1.0 DJ_WEST block_ChangeNam running
[ 44] [182] Anti Kill Hostag 20.06.06 SKAJIbnEJIb & .F anti_kill_hosta остановлен
[ 45] Admin Free Look 2.0 Jim admin_freelook. running
[ 46] [182] C4 Destroyer 21.03.23 SKAJIbnEJIb c4_destroyer.am running
[ 47] [ReAPI] Healthnade 0.0.2 F@nt0M reapi_healthnad running
[ 48] Advanced Experience Sy 0.4.1 serfreeman1337 aes_main.amxx running
[ 49] AES: Exp CSTRIKE 0.3 serfreeman1337 aes_exp_cstrike running
[ 50] AES: Informer 0.2 serfreeman1337 aes_informer.am running
[ 51] AES: Experience Editor 0.1 serfreeman1337 aes_exp_editor. running
[ 52] AES: Bonus System 0.2 serfreeman1337 aes_bonus_syste running
[ 53] AES: Bonus CSTRIKE 0.4 serfreeman1337 aes_bonus_cstri running
[ 54] AES: CSTRIKE Say Tag 0.1.1 serfreeman1337 aes_say_tag.amx running
Автор плагина
https://dev-cs.ru/members/16/
Версия плагина
Healthnade 0.0.2
Исходный код
[CODE]#pragma semicolon 1



#include <amxmodx>

#include <fakemeta>

#include <hamsandwich>

#include <reapi>



const Float:HEAL_RADIUS = 300.0;

const Float:HEAL_AMOUNT = 20.0;

const ACCESS_FLAG = ADMIN_LEVEL_H;



const WeaponIdType:WEAPON_ID = WEAPON_SMOKEGRENADE;

const WeaponIdType:WEAPON_NEW_ID = WEAPON_GLOCK;

const WeaponIdType:WEAPON_FAKE_ID = WeaponIdType:75;

new const WEAPON_NAME[] = "weapon_smokegrenade";

new const AMMO_NAME[] = "HealthNade";

new const WEAPON_NEW_NAME[] = "reapi_healthnade/weapon_healthnade";

new const ITEM_CLASSNAME[] = "weapon_healthnade";

new const GRENADE_CLASSNAME[] = "healthnade";

const AMMO_ID = 16;



new SpriteCylinder, SpriteExplode, SpriteShape;

new MsgIdWeaponList, MsgIdAmmoPickup, MsgIdStatusIcon, MsgIdScreenFade;

#if WEAPON_NEW_ID != WEAPON_GLOCK

new FwdRegUserMsg, MsgHookWeaponList;

#endif



public plugin_precache() {

register_plugin("[ReAPI] Healthnade", "0.0.2", "F@nt0M");



precache_generic("sprites/reapi_healthnade/weapon_healthnade.txt");

precache_generic("sprites/reapi_healthnade/640hud128.spr");



precache_model("models/reapi_healthnade/v_healthnade.mdl");

precache_model("models/reapi_healthnade/p_healthnade.mdl");

precache_model("models/reapi_healthnade/w_healthnade.mdl");



precache_sound("weapons/reapi_healthnade/deploy.wav");

precache_sound("weapons/reapi_healthnade/pullpin.wav");



SpriteExplode = precache_model("sprites/reapi_healthnade/heal_explode.spr");

SpriteShape = precache_model("sprites/reapi_healthnade/heal_shape.spr");

SpriteCylinder = precache_model("sprites/shockwave.spr");



precache_sound("weapons/reapi_healthnade/heal.wav");



#if WEAPON_NEW_ID != WEAPON_GLOCK

MsgIdWeaponList = get_user_msgid("WeaponList");

if (MsgIdWeaponList) {

MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");

} else {

FwdRegUserMsg = register_forward(FM_RegUserMsg, "RegUserMsg_Post", true);

}

#endif

}



public plugin_init() {

register_clcmd(WEAPON_NEW_NAME, "CmdSelect");



RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Post", true);



RegisterHookChain(RG_CSGameRules_CleanUpMap, "CSGameRules_CleanUpMap_Post", true);

RegisterHookChain(RG_CBasePlayer_GiveAmmo, "CBasePlayer_GiveAmmo_Pre", false);

RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", false);



RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);

RegisterHam(Ham_Item_Holster, WEAPON_NAME, "Item_Holster_Post", true);



RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade_Pre", false);



MsgIdAmmoPickup = get_user_msgid("AmmoPickup");

MsgIdStatusIcon = get_user_msgid("StatusIcon");

MsgIdScreenFade = get_user_msgid("ScreenFade");



#if WEAPON_NEW_ID == WEAPON_GLOCK

MsgIdWeaponList = get_user_msgid("WeaponList");

UTIL_WeapoList(

MSG_INIT, 0,

WEAPON_NEW_NAME,

AMMO_ID, 1,

-1, -1, GRENADE_SLOT, 4, WEAPON_NEW_ID,

ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE

);

#else

if (FwdRegUserMsg) {

unregister_forward(FM_RegUserMsg, FwdRegUserMsg, true);

}

unregister_message(MsgIdWeaponList, MsgHookWeaponList);

#endif

}



#if WEAPON_NEW_ID != WEAPON_GLOCK

public RegUserMsg_Post(const name[]) {

if (strcmp(name, "WeaponList") == 0) {

MsgIdWeaponList = get_orig_retval();

MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");

}

}



public HookWeaponList(const msg_id, const msg_dest, const msg_entity) {

enum {

arg_name = 1,

arg_ammo1,

arg_ammo1_max,

arg_ammo2,

arg_ammo2_max,

arg_slot,

arg_position,

arg_id,

arg_flags,

};



if (msg_dest != MSG_INIT || WeaponIdType:get_msg_arg_int(arg_id) != WEAPON_NEW_ID) {

return PLUGIN_CONTINUE;

}



set_msg_arg_string(arg_name,WEAPON_NEW_NAME);

set_msg_arg_int(arg_ammo1, ARG_BYTE, AMMO_ID);

set_msg_arg_int(arg_ammo1_max, ARG_BYTE, 1);

set_msg_arg_int(arg_ammo2, ARG_BYTE, -1);

set_msg_arg_int(arg_ammo2_max, ARG_BYTE, -1);

set_msg_arg_int(arg_slot, ARG_BYTE, _:GRENADE_SLOT - 1);

set_msg_arg_int(arg_position, ARG_BYTE, 4);

set_msg_arg_int(arg_flags, ARG_BYTE, ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE);



return PLUGIN_CONTINUE;

}

#endif



public CBasePlayer_OnSpawnEquip_Post(const id) {

#if defined ACCESS_FLAG

if (~get_user_flags(id) & ACCESS_FLAG) {

return;

}

#endif

giveNade(id);

}



public CmdSelect(const id) {

if (!is_user_alive(id)) {

return PLUGIN_HANDLED;

}



new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);

if (item != 0 && get_member(id, m_pActiveItem) != item) {

rg_switch_weapon(id, item);

}

return PLUGIN_HANDLED;

}



public CSGameRules_CleanUpMap_Post() {

new ent = rg_find_ent_by_class(NULLENT, GRENADE_CLASSNAME, false);

while (ent > 0) {

destroyNade(ent);

ent = rg_find_ent_by_class(ent, GRENADE_CLASSNAME, false);

}

}



public CBasePlayer_GiveAmmo_Pre(const id, const amount, const name[]) {

if (strcmp(name, AMMO_NAME) != 0) {

return HC_CONTINUE;

}



giveAmmo(id, amount, AMMO_ID, 1);

SetHookChainReturn(ATYPE_INTEGER, AMMO_ID);

return HC_SUPERCEDE;

}





public CBasePlayerWeapon_DefaultDeploy_Pre(const item, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[], const skiplocal) {

if (FClassnameIs(item, ITEM_CLASSNAME)) {

SetHookChainArg(2, ATYPE_STRING, "models/reapi_healthnade/v_healthnade.mdl");

SetHookChainArg(3, ATYPE_STRING, "models/reapi_healthnade/p_healthnade.mdl");

}



new WeaponIdType:wid = WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId);

if (wid != WEAPON_ID && wid != WEAPON_FAKE_ID) {

return HC_CONTINUE;

}



new lastItem = get_member(get_member(item, m_pPlayer), m_pLastItem);

if (is_nullent(lastItem) || item == lastItem) {

return HC_CONTINUE;

}



if (WeaponIdType:rg_get_iteminfo(lastItem, ItemInfo_iId) == WEAPON_ID) {

SetHookChainArg(6, ATYPE_INTEGER, 0);

}



return HC_CONTINUE;

}



public Item_Deploy_Post(const item) {

if (WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId) == WEAPON_FAKE_ID) {

rg_set_iteminfo(item, ItemInfo_iId, WEAPON_ID);

}



new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);

while (!is_nullent(other)) {

if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_ID) {

rg_set_iteminfo(other, ItemInfo_iId, WEAPON_FAKE_ID);

}

other = get_member(other, m_pNext);

}

}



public Item_Holster_Post(const item) {

new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);

while (!is_nullent(other)) {

if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_FAKE_ID) {

rg_set_iteminfo(other, ItemInfo_iId, WEAPON_ID);

}

other = get_member(other, m_pNext);

}

}



public CBasePlayer_ThrowGrenade_Pre(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent) {

if (!FClassnameIs(item, ITEM_CLASSNAME)) {

return HC_CONTINUE;

}



new grenade = throwNade(id, vecSrc, vecThrow, time);

SetHookChainReturn(ATYPE_INTEGER, grenade);

return HC_SUPERCEDE;

}



public GrenadeTouch(const grenade, const other) {

if (!is_nullent(grenade)) {

explodeNade(grenade);

}

}



public GrenadeThink(const grenade) {

if (!is_nullent(grenade)) {

explodeNade(grenade);

}

}



giveNade(const id) {

new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);

if (item != 0) {

giveAmmo(id, 1, AMMO_ID, 1);

return item;

}



item = rg_create_entity(WEAPON_NAME, false);

if (is_nullent(item)) {

return NULLENT;

}



new Float:origin[3];

get_entvar(id, var_origin, origin);

set_entvar(item, var_origin, origin);

set_entvar(item, var_spawnflags, get_entvar(item, var_spawnflags) | SF_NORESPAWN);



set_member(item, m_Weapon_iPrimaryAmmoType, AMMO_ID);

set_member(item, m_Weapon_iSecondaryAmmoType, -1);



set_entvar(item, var_classname, ITEM_CLASSNAME);



dllfunc(DLLFunc_Spawn, item);



set_member(item, m_iId, WEAPON_NEW_ID);



rg_set_iteminfo(item, ItemInfo_pszName, WEAPON_NEW_NAME);

rg_set_iteminfo(item, ItemInfo_pszAmmo1, AMMO_NAME);

rg_set_iteminfo(item, ItemInfo_iMaxAmmo1, 1);

rg_set_iteminfo(item, ItemInfo_iId, WEAPON_FAKE_ID);

rg_set_iteminfo(item, ItemInfo_iPosition, 4);

rg_set_iteminfo(item, ItemInfo_iWeight, 1);



dllfunc(DLLFunc_Touch, item, id);



if (get_entvar(item, var_owner) != id) {

set_entvar(item, var_flags, FL_KILLME);

return NULLENT;

}



return item;

}



giveAmmo(const id, const amount, const ammo, const max) {

if (get_entvar(id, var_flags) & FL_SPECTATOR) {

return;

}



new count = get_member(id, m_rgAmmo, ammo);

new add = min(amount, max - count);

if (add < 1) {

return;

}



set_member(id, m_rgAmmo, count + add, ammo);



emessage_begin(MSG_ONE, MsgIdAmmoPickup, .player = id);

ewrite_byte(ammo);

ewrite_byte(add);

emessage_end();

}



throwNade(const id, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time) {

new grenade = rg_create_entity("info_target", false);

if (is_nullent(grenade)) {

return 0;

}



set_entvar(grenade, var_classname, GRENADE_CLASSNAME);



set_entvar(grenade, var_movetype, MOVETYPE_BOUNCE);

set_entvar(grenade, var_solid, SOLID_BBOX);



engfunc(EngFunc_SetOrigin, grenade, vecSrc);



new Float:angles[3];

get_entvar(id, var_angles, angles);

set_entvar(grenade, var_angles, angles);



set_entvar(grenade, var_owner, id);



if (time < 0.1) {

set_entvar(grenade, var_nextthink, get_gametime());

set_entvar(grenade, var_velocity, Float:{0.0, 0.0, 0.0});

} else {

set_entvar(grenade, var_nextthink, get_gametime() + time);

set_entvar(grenade, var_velocity, vecThrow);

}



set_entvar(grenade, var_sequence, random_num(3, 6));

set_entvar(grenade, var_framerate, 1.0);

set_entvar(grenade, var_gravity, 0.5);

set_entvar(grenade, var_friction, 0.8);

engfunc(EngFunc_SetModel, grenade, "models/reapi_healthnade/w_healthnade.mdl");

set_entvar(grenade, var_dmg, 30.0);

set_entvar(grenade, var_dmgtime, get_gametime() + time);



SetTouch(grenade, "GrenadeTouch");

SetThink(grenade, "GrenadeThink");

return grenade;

}



explodeNade(const grenade) {

new Float:origin[3];

get_entvar(grenade, var_origin, origin);



UTIL_BeamCylinder(origin, SpriteCylinder, 1, 5, 30, 1, {10, 255, 40}, 255, 5, HEAL_RADIUS);

UTIL_CreateExplosion(origin, 65.0, SpriteExplode, 30, 20, (TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES));

UTIL_SpriteTrail(origin, SpriteShape);



rh_emit_sound2(grenade, 0, CHAN_WEAPON, "weapons/reapi_healthnade/heal.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);



new id = get_entvar(grenade, var_owner);

new team = get_member(id, m_iTeam);



for (new player = 1, Float:playerOrigin[3]; player <= MaxClients; player++) {

if (!is_user_alive(player) || get_member(player, m_iTeam) != team) {

continue;

}



get_entvar(player, var_origin, playerOrigin);

if (get_distance_f(origin, playerOrigin) < HEAL_RADIUS) {

ExecuteHamB(Ham_TakeHealth, player, HEAL_AMOUNT, DMG_GENERIC);

UTIL_ScreenFade(player);

}

}



destroyNade(grenade);

}



destroyNade(const grenade) {

SetTouch(grenade, "");

SetThink(grenade, "");

set_entvar(grenade, var_flags, FL_KILLME);

}



stock rg_get_player_item(const id, const classname[], const InventorySlotType:slot = NONE_SLOT) {

new item = get_member(id, m_rgpPlayerItems, slot);

while (!is_nullent(item)) {

if (FClassnameIs(item, classname)) {

return item;

}

item = get_member(item, m_pNext);

}



return 0;

}



stock bool:IsBlind(const player) {

return bool:(Float:get_member(player, m_blindUntilTime) > get_gametime());

}



stock UTIL_WeapoList(

const type,

const player,

const name[],

const ammo1,

const maxAmmo1,

const ammo2,

const maxammo2,

const InventorySlotType:slot,

const position,

const WeaponIdType:id,

const flags

) {

message_begin(type, MsgIdWeaponList, .player = player);

write_string(name);

write_byte(ammo1);

write_byte(maxAmmo1);

write_byte(ammo2);

write_byte(maxammo2);

write_byte(_:slot - 1);

write_byte(position);

write_byte(_:id);

write_byte(flags);

message_end();

}



stock UTIL_StatusIcon(const player, const type, const sprite[], const color[3]) {

message_begin(MSG_ONE, MsgIdStatusIcon, .player = player);

write_byte(type); // 0 - hide 1 - show 2 - flash

write_string(sprite);

write_byte(color[0]);

write_byte(color[1]);

write_byte(color[2]);

message_end();

}



stock UTIL_ScreenFade(const player, const Float:fxTime = 1.0, const Float:holdTime = 0.3, const color[3] = {170, 255, 0}, const alpha = 80) {

if (IsBlind(player)) {

return;

}



const FFADE_IN = 0x0000;



message_begin(MSG_ONE_UNRELIABLE, MsgIdScreenFade, .player = player);

write_short(FixedUnsigned16(fxTime));

write_short(FixedUnsigned16(holdTime));

write_short(FFADE_IN);

write_byte(color[0]);

write_byte(color[1]);

write_byte(color[2]);

write_byte(alpha);

message_end();

}



stock UTIL_BeamCylinder(const Float:origin[3], const sprite, const framerate, const life, const width, const amplitude, const color[3], const bright, const speed, const Float:size) {

message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);

write_byte(TE_BEAMCYLINDER);

write_coord_f(origin[0]);

write_coord_f(origin[1]);

write_coord_f(origin[2]);

write_coord_f(origin[0]);

write_coord_f(origin[1]);

write_coord_f(origin[2] + size);

write_short(sprite);

write_byte(0);

write_byte(framerate);

write_byte(life);

write_byte(width);

write_byte(amplitude);

write_byte(color[0]);

write_byte(color[1]);

write_byte(color[2]);

write_byte(bright);

write_byte(speed);

message_end();

}



stock UTIL_CreateExplosion(const Float:origin[3], const Float:vecUp, const modelIndex, const scale, const frameRate, const flags) {

message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);

write_byte(TE_EXPLOSION);

write_coord_f(origin[0]);

write_coord_f(origin[1]);

write_coord_f(origin[2] + vecUp);

write_short(modelIndex);

write_byte(scale);

write_byte(frameRate);

write_byte(flags);

message_end();

}



stock UTIL_SpriteTrail(Float:origin[3], const sprite, const cound = 20, const life = 20, const scale = 4, const noise = 20, const speed = 10) {

message_begin(MSG_BROADCAST, SVC_TEMPENTITY); // MSG_PVS

write_byte(TE_SPRITETRAIL);

write_coord_f(origin[0]);

write_coord_f(origin[1]);

write_coord_f(origin[2] + 20.0);

write_coord_f(origin[0]);

write_coord_f(origin[1]);

write_coord_f(origin[2] + 80.0);

write_short(sprite);

write_byte(cound);

write_byte(life);

write_byte(scale);

write_byte(noise);

write_byte(speed);

message_end();

}



stock FixedUnsigned16(Float:value, scale = (1 << 12)) {

return clamp(floatround(value * scale), 0, 0xFFFF);

}

[/CODE]
Код:
#pragma semicolon 1

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

const Float:HEAL_RADIUS = 300.0;
const Float:HEAL_AMOUNT = 20.0;
const ACCESS_FLAG = ADMIN_LEVEL_H;

const WeaponIdType:WEAPON_ID = WEAPON_SMOKEGRENADE;
const WeaponIdType:WEAPON_NEW_ID = WEAPON_GLOCK;
const WeaponIdType:WEAPON_FAKE_ID = WeaponIdType:75;
new const WEAPON_NAME[] = "weapon_smokegrenade";
new const AMMO_NAME[] = "HealthNade";
new const WEAPON_NEW_NAME[] = "reapi_healthnade/weapon_healthnade";
new const ITEM_CLASSNAME[] = "weapon_healthnade";
new const GRENADE_CLASSNAME[] = "healthnade";
const AMMO_ID = 16;

new SpriteCylinder, SpriteExplode, SpriteShape;
new MsgIdWeaponList, MsgIdAmmoPickup, MsgIdStatusIcon, MsgIdScreenFade;
#if WEAPON_NEW_ID != WEAPON_GLOCK
new FwdRegUserMsg, MsgHookWeaponList;
#endif

public plugin_precache() {
    register_plugin("[ReAPI] Healthnade", "0.0.2", "F@nt0M");

    precache_generic("sprites/reapi_healthnade/weapon_healthnade.txt");
    precache_generic("sprites/reapi_healthnade/640hud128.spr");

    precache_model("models/reapi_healthnade/v_healthnade.mdl");
    precache_model("models/reapi_healthnade/p_healthnade.mdl");
    precache_model("models/reapi_healthnade/w_healthnade.mdl");

    precache_sound("weapons/reapi_healthnade/deploy.wav");
    precache_sound("weapons/reapi_healthnade/pullpin.wav");

    SpriteExplode = precache_model("sprites/reapi_healthnade/heal_explode.spr");
    SpriteShape = precache_model("sprites/reapi_healthnade/heal_shape.spr");
    SpriteCylinder = precache_model("sprites/shockwave.spr");

    precache_sound("weapons/reapi_healthnade/heal.wav");

#if WEAPON_NEW_ID != WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    if (MsgIdWeaponList) {
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    } else {
        FwdRegUserMsg = register_forward(FM_RegUserMsg, "RegUserMsg_Post", true);
    }
#endif
}

public plugin_init() {
    register_clcmd(WEAPON_NEW_NAME, "CmdSelect");

    RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Post", true);

    RegisterHookChain(RG_CSGameRules_CleanUpMap, "CSGameRules_CleanUpMap_Post", true);
    RegisterHookChain(RG_CBasePlayer_GiveAmmo, "CBasePlayer_GiveAmmo_Pre", false);
    RegisterHookChain(RG_CBasePlayerWeapon_DefaultDeploy, "CBasePlayerWeapon_DefaultDeploy_Pre", false);

    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHam(Ham_Item_Holster, WEAPON_NAME, "Item_Holster_Post", true);

    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "CBasePlayer_ThrowGrenade_Pre", false);

    MsgIdAmmoPickup = get_user_msgid("AmmoPickup");
    MsgIdStatusIcon = get_user_msgid("StatusIcon");
    MsgIdScreenFade = get_user_msgid("ScreenFade");

#if WEAPON_NEW_ID == WEAPON_GLOCK
    MsgIdWeaponList = get_user_msgid("WeaponList");
    UTIL_WeapoList(
        MSG_INIT, 0,
        WEAPON_NEW_NAME,
        AMMO_ID, 1,
        -1, -1, GRENADE_SLOT, 4, WEAPON_NEW_ID,
        ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE
    );
#else
    if (FwdRegUserMsg) {
        unregister_forward(FM_RegUserMsg, FwdRegUserMsg, true);
    }
    unregister_message(MsgIdWeaponList, MsgHookWeaponList);
#endif
}

#if WEAPON_NEW_ID != WEAPON_GLOCK
public RegUserMsg_Post(const name[]) {
    if (strcmp(name, "WeaponList") == 0) {
        MsgIdWeaponList = get_orig_retval();
        MsgHookWeaponList = register_message(MsgIdWeaponList, "HookWeaponList");
    }
}

public HookWeaponList(const msg_id, const msg_dest, const msg_entity) {
    enum {
        arg_name = 1,
        arg_ammo1,
        arg_ammo1_max,
        arg_ammo2,
        arg_ammo2_max,
        arg_slot,
        arg_position,
        arg_id,
        arg_flags,
    };

    if (msg_dest != MSG_INIT || WeaponIdType:get_msg_arg_int(arg_id) != WEAPON_NEW_ID) {
        return PLUGIN_CONTINUE;
    }

    set_msg_arg_string(arg_name,WEAPON_NEW_NAME);
    set_msg_arg_int(arg_ammo1, ARG_BYTE, AMMO_ID);
    set_msg_arg_int(arg_ammo1_max, ARG_BYTE, 1);
    set_msg_arg_int(arg_ammo2, ARG_BYTE, -1);
    set_msg_arg_int(arg_ammo2_max, ARG_BYTE, -1);
    set_msg_arg_int(arg_slot, ARG_BYTE, _:GRENADE_SLOT - 1);
    set_msg_arg_int(arg_position, ARG_BYTE, 4);
    set_msg_arg_int(arg_flags, ARG_BYTE, ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE);

    return PLUGIN_CONTINUE;
}
#endif

public CBasePlayer_OnSpawnEquip_Post(const id) {
#if defined ACCESS_FLAG
    if (~get_user_flags(id) & ACCESS_FLAG) {
        return;
    }
#endif
    giveNade(id);
}

public CmdSelect(const id) {
    if (!is_user_alive(id)) {
        return PLUGIN_HANDLED;
    }

    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0 && get_member(id, m_pActiveItem) != item) {
        rg_switch_weapon(id, item);
    }
    return PLUGIN_HANDLED;
}

public CSGameRules_CleanUpMap_Post() {
    new ent = rg_find_ent_by_class(NULLENT, GRENADE_CLASSNAME, false);
    while (ent > 0) {
        destroyNade(ent);
        ent = rg_find_ent_by_class(ent, GRENADE_CLASSNAME, false);
    }
}

public CBasePlayer_GiveAmmo_Pre(const id, const amount, const name[]) {
    if (strcmp(name, AMMO_NAME) != 0) {
        return HC_CONTINUE;
    }

    giveAmmo(id, amount, AMMO_ID, 1);
    SetHookChainReturn(ATYPE_INTEGER, AMMO_ID);
    return HC_SUPERCEDE;
}


public CBasePlayerWeapon_DefaultDeploy_Pre(const item, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[], const skiplocal) {
    if (FClassnameIs(item, ITEM_CLASSNAME)) {
        SetHookChainArg(2, ATYPE_STRING, "models/reapi_healthnade/v_healthnade.mdl");
        SetHookChainArg(3, ATYPE_STRING, "models/reapi_healthnade/p_healthnade.mdl");
    }

    new WeaponIdType:wid = WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId);
    if (wid != WEAPON_ID && wid != WEAPON_FAKE_ID) {
        return HC_CONTINUE;
    }

    new lastItem = get_member(get_member(item, m_pPlayer), m_pLastItem);
    if (is_nullent(lastItem) || item == lastItem) {
        return HC_CONTINUE;
    }

    if (WeaponIdType:rg_get_iteminfo(lastItem, ItemInfo_iId) == WEAPON_ID) {
        SetHookChainArg(6, ATYPE_INTEGER, 0);
    }

    return HC_CONTINUE;
}

public Item_Deploy_Post(const item) {
    if (WeaponIdType:rg_get_iteminfo(item, ItemInfo_iId) == WEAPON_FAKE_ID) {
        rg_set_iteminfo(item, ItemInfo_iId, WEAPON_ID);
    }

    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_FAKE_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public Item_Holster_Post(const item) {
    new other = get_member(get_member(item, m_pPlayer), m_rgpPlayerItems, GRENADE_SLOT);
    while (!is_nullent(other)) {
        if (item != other && WeaponIdType:rg_get_iteminfo(other, ItemInfo_iId) == WEAPON_FAKE_ID) {
            rg_set_iteminfo(other, ItemInfo_iId, WEAPON_ID);
        }
        other = get_member(other, m_pNext);
    }
}

public CBasePlayer_ThrowGrenade_Pre(const id, const item, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time, const const usEvent) {
    if (!FClassnameIs(item, ITEM_CLASSNAME)) {
        return HC_CONTINUE;
    }

    new grenade = throwNade(id, vecSrc, vecThrow, time);
    SetHookChainReturn(ATYPE_INTEGER, grenade);
    return HC_SUPERCEDE;
}

public GrenadeTouch(const grenade, const other) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

public GrenadeThink(const grenade) {
    if (!is_nullent(grenade)) {
        explodeNade(grenade);
    }
}

giveNade(const id) {
    new item = rg_get_player_item(id, ITEM_CLASSNAME, GRENADE_SLOT);
    if (item != 0) {
        giveAmmo(id, 1, AMMO_ID, 1);
        return item;
    }

    item = rg_create_entity(WEAPON_NAME, false);
    if (is_nullent(item)) {
        return NULLENT;
    }

    new Float:origin[3];
    get_entvar(id, var_origin, origin);
    set_entvar(item, var_origin, origin);
    set_entvar(item, var_spawnflags, get_entvar(item, var_spawnflags) | SF_NORESPAWN);

    set_member(item, m_Weapon_iPrimaryAmmoType, AMMO_ID);
    set_member(item, m_Weapon_iSecondaryAmmoType, -1);

    set_entvar(item, var_classname, ITEM_CLASSNAME);
    
    dllfunc(DLLFunc_Spawn, item);
    
    set_member(item, m_iId, WEAPON_NEW_ID);

    rg_set_iteminfo(item, ItemInfo_pszName, WEAPON_NEW_NAME);
    rg_set_iteminfo(item, ItemInfo_pszAmmo1, AMMO_NAME);
    rg_set_iteminfo(item, ItemInfo_iMaxAmmo1, 1);
    rg_set_iteminfo(item, ItemInfo_iId, WEAPON_FAKE_ID);
    rg_set_iteminfo(item, ItemInfo_iPosition, 4);
    rg_set_iteminfo(item, ItemInfo_iWeight, 1);
    
    dllfunc(DLLFunc_Touch, item, id);

    if (get_entvar(item, var_owner) != id) {
        set_entvar(item, var_flags, FL_KILLME);
        return NULLENT;
    }

    return item;
}

giveAmmo(const id, const amount, const ammo, const max) {
    if (get_entvar(id, var_flags) & FL_SPECTATOR) {
        return;
    }

    new count = get_member(id, m_rgAmmo, ammo);
    new add = min(amount, max - count);
    if (add < 1) {
        return;
    }

    set_member(id, m_rgAmmo, count + add, ammo);

    emessage_begin(MSG_ONE, MsgIdAmmoPickup, .player = id);
    ewrite_byte(ammo);
    ewrite_byte(add);
    emessage_end();
}

throwNade(const id, const Float:vecSrc[3], const Float:vecThrow[3], const Float:time) {
    new grenade = rg_create_entity("info_target", false);
    if (is_nullent(grenade)) {
        return 0;
    }

    set_entvar(grenade, var_classname, GRENADE_CLASSNAME);

    set_entvar(grenade, var_movetype, MOVETYPE_BOUNCE);
    set_entvar(grenade, var_solid, SOLID_BBOX);

    engfunc(EngFunc_SetOrigin, grenade, vecSrc);

    new Float:angles[3];
    get_entvar(id, var_angles, angles);
    set_entvar(grenade, var_angles, angles);

    set_entvar(grenade, var_owner, id);
    
    if (time < 0.1) {
        set_entvar(grenade, var_nextthink, get_gametime());
        set_entvar(grenade, var_velocity, Float:{0.0, 0.0, 0.0});
    } else {
        set_entvar(grenade, var_nextthink, get_gametime() + time);
        set_entvar(grenade, var_velocity, vecThrow);
    }

    set_entvar(grenade, var_sequence, random_num(3, 6));
    set_entvar(grenade, var_framerate, 1.0);
    set_entvar(grenade, var_gravity, 0.5);
    set_entvar(grenade, var_friction, 0.8);
    engfunc(EngFunc_SetModel, grenade, "models/reapi_healthnade/w_healthnade.mdl");
    set_entvar(grenade, var_dmg, 30.0);
    set_entvar(grenade, var_dmgtime, get_gametime() + time);

    SetTouch(grenade, "GrenadeTouch");
    SetThink(grenade, "GrenadeThink");
    return grenade;
}

explodeNade(const grenade) {
    new Float:origin[3];
    get_entvar(grenade, var_origin, origin);

    UTIL_BeamCylinder(origin, SpriteCylinder, 1, 5, 30, 1, {10, 255, 40}, 255, 5, HEAL_RADIUS);
    UTIL_CreateExplosion(origin, 65.0, SpriteExplode, 30, 20, (TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES));
    UTIL_SpriteTrail(origin, SpriteShape);

    rh_emit_sound2(grenade, 0, CHAN_WEAPON, "weapons/reapi_healthnade/heal.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

    new id = get_entvar(grenade, var_owner);
    new team = get_member(id, m_iTeam);

    for (new player = 1, Float:playerOrigin[3]; player <= MaxClients; player++) {
        if (!is_user_alive(player) || get_member(player, m_iTeam) != team) {
            continue;
        }

        get_entvar(player, var_origin, playerOrigin);
        if (get_distance_f(origin, playerOrigin) < HEAL_RADIUS) {
            ExecuteHamB(Ham_TakeHealth, player, HEAL_AMOUNT, DMG_GENERIC);
            UTIL_ScreenFade(player);
        }
    }

    destroyNade(grenade);
}

destroyNade(const grenade) {
    SetTouch(grenade, "");
    SetThink(grenade, "");
    set_entvar(grenade, var_flags, FL_KILLME);
}

stock rg_get_player_item(const id, const classname[], const InventorySlotType:slot = NONE_SLOT) {
    new item = get_member(id, m_rgpPlayerItems, slot);
    while (!is_nullent(item)) {
        if (FClassnameIs(item, classname)) {
            return item;
        }
        item = get_member(item, m_pNext);
    }

    return 0;
}

stock bool:IsBlind(const player) {
    return bool:(Float:get_member(player, m_blindUntilTime) > get_gametime());
}

stock UTIL_WeapoList(
    const type,
    const player,
    const name[],
    const ammo1,
    const maxAmmo1,
    const ammo2,
    const maxammo2,
    const InventorySlotType:slot,
    const position,
    const WeaponIdType:id,
    const flags
) {
    message_begin(type, MsgIdWeaponList, .player = player);
    write_string(name);
    write_byte(ammo1);
    write_byte(maxAmmo1);
    write_byte(ammo2);
    write_byte(maxammo2);
    write_byte(_:slot - 1);
    write_byte(position);
    write_byte(_:id);
    write_byte(flags);
    message_end();
}

stock UTIL_StatusIcon(const player, const type, const sprite[], const color[3]) {
    message_begin(MSG_ONE, MsgIdStatusIcon, .player = player);
    write_byte(type); // 0 - hide 1 - show 2 - flash
    write_string(sprite);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    message_end();
}

stock UTIL_ScreenFade(const player, const Float:fxTime = 1.0, const Float:holdTime = 0.3, const color[3] = {170, 255, 0}, const alpha = 80) {
    if (IsBlind(player)) {
        return;
    }

    const FFADE_IN = 0x0000;

    message_begin(MSG_ONE_UNRELIABLE, MsgIdScreenFade, .player = player);
    write_short(FixedUnsigned16(fxTime));
    write_short(FixedUnsigned16(holdTime));
    write_short(FFADE_IN);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(alpha);
    message_end();
}

stock UTIL_BeamCylinder(const Float:origin[3], const sprite, const framerate, const life, const width, const amplitude, const color[3], const bright, const speed, const Float:size) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_BEAMCYLINDER);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2]);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + size);
    write_short(sprite);
    write_byte(0);
    write_byte(framerate);
    write_byte(life);
    write_byte(width);
    write_byte(amplitude);
    write_byte(color[0]);
    write_byte(color[1]);
    write_byte(color[2]);
    write_byte(bright);
    write_byte(speed);
    message_end();
}

stock UTIL_CreateExplosion(const Float:origin[3], const Float:vecUp, const modelIndex, const scale, const frameRate, const flags) {
    message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin, 0);
    write_byte(TE_EXPLOSION);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + vecUp);
    write_short(modelIndex);
    write_byte(scale);
    write_byte(frameRate);
    write_byte(flags);
    message_end();
}

stock UTIL_SpriteTrail(Float:origin[3], const sprite, const cound = 20, const life = 20, const scale = 4, const noise = 20, const speed = 10) {
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY); // MSG_PVS
    write_byte(TE_SPRITETRAIL);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 20.0);
    write_coord_f(origin[0]);
    write_coord_f(origin[1]);
    write_coord_f(origin[2] + 80.0);
    write_short(sprite);
    write_byte(cound);
    write_byte(life);
    write_byte(scale);
    write_byte(noise);
    write_byte(speed);
    message_end();
}

stock FixedUnsigned16(Float:value, scale = (1 << 12)) {
    return clamp(floatround(value * scale), 0, 0xFFFF);
}
 

Вложения

Сообщения
3,023
Реакции
1,731
Помог
79 раз(а)
gaser, отключаем все плагины и оставляем один плагин гранаты и проверяем
 
Сообщения
39
Реакции
7
Помог
1 раз(а)
Вопрос к вам. Модули amxx 1.9.0 а плагины 1.8.2. Получается и компилятор версии 1.8.2? Вы уверены что ошибок нет? Ошибки не толька в эрор логах могут быть
 
Сообщения
3
Реакции
0
Алексеич, буду пробовать.
15 Окт 2021
eduardglotov, нет, ошибок нету. Ведь плагины 1.8.2 же вроде работают версии выше, или не все?
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
gaser, ну вообще их желательно компилировать компилятором под актуальную версию
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Последнее редактирование:
Сообщения
775
Реакции
293
Помог
11 раз(а)
Nordic Warrior, ну это вообще не оговаривается. Я просто не смотрел что там у него за плагины на другой билд скомпилены.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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