Заявка за редактиране на Drop Plugin

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
Bartian
Извън линия
Потребител
Потребител
Мнения: 280
Регистриран на: 01 Сеп 2018, 14:43
Се отблагодари: 65 пъти
Получена благодарност: 78 пъти

Заявка за редактиране на Drop Plugin

Мнение от Bartian » 27 Фев 2019, 18:43

Здравейте , искам да се направи следната редакция на плъгина за drop weapon искам , като натиска копчето "Е" за смяна на оръжието веднага да се сменя а не 1во да изхвърли този , който има а направо , ако не сте ме разбрали кажете мога и по подробно :)
Ето и плъгин:

Код за потвърждение: Избери целия код

 
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>

#define PLUGIN_NAME "Real Weapon Drop"
#define PLUGIN_VERSION "1.4"
#define PLUGIN_AUTHOR "Numb"

new maxplayers;
new get_user_msgid_AmmoPickup;

new Array:ammo_entery_datas;
new ammo_entery_num;

new alive[33];

new cs_ammo_weapons[10] =
{
	CSW_AWP,
	CSW_SCOUT,
	CSW_M249,
	CSW_M4A1,
	CSW_M3,
	CSW_USP,
	CSW_FIVESEVEN,
	CSW_DEAGLE,
	CSW_P228,
	CSW_GLOCK18
};

new cs_ammo_max[10] =
{
	30,
	90,
	200,
	90,
	32,
	100,
	100,
	35,
	52,
	120
};

new cs_ammo_id[10] =
{
	1,
	2,
	3,
	4,
	5,
	6,
	7,
	8,
	9,
	10
};

new const ammo_model[] = "models/w_357ammobox.mdl";
new const ammo_sound[] = "items/9mmclip2.wav"; // cs standart - "items/9mmclip1.wav"

public plugin_precache()
{
	precache_model(ammo_model);
	precache_sound(ammo_sound);
}

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	
	RegisterHam(Ham_Spawn,  "weaponbox",      "Ham_FOSpawn_weaponbox",      1);
	RegisterHam(Ham_Killed, "weaponbox",      "Ham_FEKilled_weaponbox",     0);
	RegisterHam(Ham_Think,  "weaponbox",      "Ham_FEThink_weaponbox",      0);
	RegisterHam(Ham_Touch,  "weaponbox",      "Ham_FETouch_weaponbox",      0);
	RegisterHam(Ham_Spawn,  "player",         "Ham_FOSpawn_player",         1);
	RegisterHam(Ham_Killed, "player",         "Ham_FEKilled_player",        0);
	RegisterHam(Ham_Touch,  "armoury_entity", "Ham_FETouch_armoury_entity", 0);
	
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_hegrenade",    "Ham_FOWeapon_PrimaryAttack_he", 1);
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_flashbang",    "Ham_FOWeapon_PrimaryAttack_fb", 1);
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_smokegrenade", "Ham_FOWeapon_PrimaryAttack_sg", 1);
	
	register_event("HLTV",      "Event_NewRound",  "a", "1=0", "2=0");
	register_event("CurWeapon", "Event_CurWeapon", "be");
	
	get_user_msgid_AmmoPickup = get_user_msgid("AmmoPickup");
	
	ammo_entery_datas = ArrayCreate(64);
	
	maxplayers = get_maxplayers();
}

public Event_NewRound()
{
	new view[32];
	if( ammo_entery_num )
	{
		new buffer[64], s_ent[5], ent;
		for( new item; item < ammo_entery_num; item++ )
		{
			ArrayGetString(ammo_entery_datas, item, buffer, 63);
			replace_all(buffer, 63, "_", " ");
			parse(buffer, s_ent, 4);
			ent = str_to_num(s_ent);
			if( pev_valid(ent) )
			{
				pev(ent, pev_classname, view, 31);
				if( equal(view, "weaponbox") )
				{
					pev(ent, pev_model, view, 31);
					if( equal(view, ammo_model) )
					{
						set_pev(ent, pev_solid, SOLID_NOT);
						dllfunc(DLLFunc_Think, ent);
						engfunc(EngFunc_RemoveEntity, ent);
					}
				}
			}
		}
		
		ArrayClear(ammo_entery_datas);
		ammo_entery_num = 0;
	}
	
	new ent = -1, owner;
	while( (ent=engfunc(EngFunc_FindEntityByString, ent, "classname", "weaponbox"))>0 )
	{
		pev(ent, pev_model, view, 31);
		if( equal(view, ammo_model) )
		{
			set_pev(ent, pev_solid, SOLID_NOT);
			dllfunc(DLLFunc_Think, ent);
			engfunc(EngFunc_RemoveEntity, ent);
		}
	}
	
	ent = -1;
	while( (ent=engfunc(EngFunc_FindEntityByString, ent, "classname", "armoury_entity"))>0 )
	{
		owner = pev(ent, pev_owner);
		if( owner > 0 && owner <= maxplayers )
		{
			dllfunc(DLLFunc_Think, ent);
			engfunc(EngFunc_RemoveEntity, ent);
		}
	}
}

public Event_CurWeapon(id)
{
	if( alive[id] )
		alive[id] = 1;
}

public Ham_FEThink_weaponbox(weaponbox_ent)
{
	if( !ammo_entery_num )
		return HAM_IGNORED;
	
	new buffer[64];
	pev(weaponbox_ent, pev_model, buffer, 31);
	if( !equal(buffer, ammo_model) )
		return HAM_IGNORED;
	
	new s_ent[5];
	for( new item; item < ammo_entery_num; item++ )
	{
		ArrayGetString(ammo_entery_datas, item, buffer, 63);
		replace_all(buffer, 63, "_", " ");
		parse(buffer, s_ent, 4);
		if( str_to_num(s_ent)==weaponbox_ent )
		{
			ArrayDeleteItem2(ammo_entery_datas, item);
			ammo_entery_num--;
			return HAM_IGNORED;
		}
	}
	return HAM_IGNORED;
}

public Ham_FEKilled_weaponbox(weaponbox_ent, idattacker, shouldgib)
{
	if( !ammo_entery_num )
		return HAM_IGNORED;
	
	new buffer[64];
	pev(weaponbox_ent, pev_model, buffer, 31);
	if( !equal(buffer, ammo_model) )
		return HAM_IGNORED;
	
	new s_ent[5];
	for( new item; item < ammo_entery_num; item++ )
	{
		ArrayGetString(ammo_entery_datas, item, buffer, 63);
		replace_all(buffer, 63, "_", " ");
		parse(buffer, s_ent, 4);
		if( str_to_num(s_ent)==weaponbox_ent )
		{
			ArrayDeleteItem2(ammo_entery_datas, item);
			ammo_entery_num--;
			return HAM_IGNORED;
		}
	}
	return HAM_IGNORED;
}

public Ham_FOSpawn_weaponbox(weaponbox_ent)
	weaponbox_spawned(weaponbox_ent, pev(weaponbox_ent, pev_owner));

public weaponbox_spawned(weaponbox_ent, owner)
{
	static classname[32];
	if( owner )
		pev(owner, pev_classname, classname, 31);
	else
		copy(classname, 31, "");
	
	if( equal(classname, "player") )
	{
		static Float:velocity[3];
		pev(owner, pev_velocity, velocity);
		
		if( alive[owner] )
		{
			static Float:aim_speed[3], Float:velocity[3];
			pev(owner, pev_velocity, velocity);
			velocity_by_aim(owner, 200, aim_speed);
			velocity[0] += aim_speed[0];
			velocity[1] += aim_speed[1];
			velocity[2] += aim_speed[2];
		}
		else if( !task_exists(weaponbox_ent) )
		{
			set_pev(weaponbox_ent, pev_velocity, Float:{0.0, 0.0, 0.0});
			set_task(0.01, "modify_death_speed", weaponbox_ent);
		
		}
	}
}

public modify_death_speed(weaponbox_ent)
{
	if( pev_valid(weaponbox_ent) )
	{
		static classname[32];
		pev(weaponbox_ent, pev_classname, classname, 31);
		if( equal(classname, "weaponbox") || equal(classname, "armoury_entity") )
		{
			static owner;
			owner = pev(weaponbox_ent, pev_owner);
			if( pev_valid(owner) )
			{
				pev(owner, pev_classname, classname, 31);
				if( equal(classname, "player") )
				{
					if( !alive[owner] && pev_valid(owner) )
					{
						static Float:velocity[3];
						pev(owner, pev_velocity, velocity);
						set_pev(weaponbox_ent, pev_velocity, velocity);
					}
				}
			}
		}
	}
}

public Ham_FOSpawn_player(id)
	alive[id] = 1;

public Ham_FEKilled_player(victim, idattacker, shouldgib)
{
	client_dies(victim);
	return HAM_IGNORED;
}

public client_disconnect(id)
	client_dies(id);

public client_dies(id)
{
	if( !alive[id] )
		return;
	
	new buffer[64], pbammo, len, total_ammo, weaponbox_ent, Float:origin[3], Float:angles[3];
	pev(id, pev_v_angle, angles);
	pev(id, pev_origin, origin);
	angles[0] = 0.0;
	if( (pbammo=clamp(cs_get_user_bpammo(id, CSW_HEGRENADE), 0, 254)-((alive[id]==CSW_HEGRENADE)?1:0))>0 )
	{
		if( (weaponbox_ent=engfunc(EngFunc_CreateNamedEntity, (len=engfunc(EngFunc_AllocString, "armoury_entity"))))>0 )
		{
			total_ammo = random_num(-22, 22);
			angles[1] += float(total_ammo);
			
			num_to_str(pbammo, buffer, 4);
			set_armoury_entity_kvd(weaponbox_ent, "15", buffer);
			
			dllfunc(DLLFunc_Spawn, weaponbox_ent);
			engfunc(EngFunc_SetOrigin, weaponbox_ent, origin);
			set_pev(weaponbox_ent, pev_angles, angles);
			set_pev(weaponbox_ent, pev_owner, id);
			set_pev(weaponbox_ent, pev_movetype, MOVETYPE_BOUNCE);
			set_pev(weaponbox_ent, pev_gravity, 1.0);
			weaponbox_spawned(weaponbox_ent, id);
			
			angles[1] -= float(total_ammo);
			
			if( alive[id] != CSW_HEGRENADE )
				cs_set_user_bpammo(id, CSW_HEGRENADE, 0);
		}
	}
	if( (pbammo=clamp(cs_get_user_bpammo(id, CSW_FLASHBANG), 0, 254)-((alive[id]==CSW_FLASHBANG)?1:0))>0 )
	{
		if( !len )
			len = engfunc(EngFunc_AllocString, "armoury_entity");
		
		if( (weaponbox_ent=engfunc(EngFunc_CreateNamedEntity, len))>0 )
		{
			total_ammo = random_num(-22, 22);
			angles[1] += float(total_ammo);
			
			num_to_str(pbammo, buffer, 4);
			set_armoury_entity_kvd(weaponbox_ent, "14", buffer);
			
			dllfunc(DLLFunc_Spawn, weaponbox_ent);
			engfunc(EngFunc_SetOrigin, weaponbox_ent, origin);
			set_pev(weaponbox_ent, pev_angles, angles);
			set_pev(weaponbox_ent, pev_owner, id);
			set_pev(weaponbox_ent, pev_movetype, MOVETYPE_BOUNCE);
			set_pev(weaponbox_ent, pev_gravity, 1.0);
			weaponbox_spawned(weaponbox_ent, id);
			
			angles[1] -= float(total_ammo);
			
			if( alive[id] != CSW_FLASHBANG )
				cs_set_user_bpammo(id, CSW_FLASHBANG, 0);
		}
	}
	if( (pbammo=clamp(cs_get_user_bpammo(id, CSW_SMOKEGRENADE), 0, 254)-((alive[id]==CSW_SMOKEGRENADE)?1:0))>0 )
	{
		if( !len )
			len = engfunc(EngFunc_AllocString, "armoury_entity");
		
		if( (weaponbox_ent=engfunc(EngFunc_CreateNamedEntity, len))>0 )
		{
			total_ammo = random_num(-22, 22);
			angles[1] += float(total_ammo);
			
			num_to_str(pbammo, buffer, 4);
			set_armoury_entity_kvd(weaponbox_ent, "18", buffer);
			
			dllfunc(DLLFunc_Spawn, weaponbox_ent);
			engfunc(EngFunc_SetOrigin, weaponbox_ent, origin);
			set_pev(weaponbox_ent, pev_angles, angles);
			set_pev(weaponbox_ent, pev_owner, id);
			set_pev(weaponbox_ent, pev_movetype, MOVETYPE_BOUNCE);
			set_pev(weaponbox_ent, pev_gravity, 1.0);
			weaponbox_spawned(weaponbox_ent, id);
			
			angles[1] -= float(total_ammo);
			
			if( alive[id] != CSW_SMOKEGRENADE )
				cs_set_user_bpammo(id, CSW_SMOKEGRENADE, 0);
		}
	}
	
	alive[id] = 0;
	
	new weapons[32], num, weapon_name[32];
	get_user_weapons(id, weapons, num);
	for( new i; i < num; i++ )
	{
		switch( weapons[i] )
		{
			case CSW_HEGRENADE, CSW_SMOKEGRENADE, CSW_FLASHBANG, CSW_KNIFE: continue;
			default:
			{
				get_weaponname(weapons[i], weapon_name, 31);
				engclient_cmd(id, "drop", weapon_name);
			}
		}
	}
	
	len = 0;
	for( new i; i < 10; i++ )
	{
		pbammo = clamp(cs_get_user_bpammo(id, cs_ammo_weapons[i]), 0, 254);
		len += format(buffer[len], 63-len, "%s%d", (i==0)?"":"_", pbammo);
		total_ammo += pbammo;
	}
	
	if( total_ammo>0 )
	{
		if( (weaponbox_ent=engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "weaponbox")))>0 )
		{
			dllfunc(DLLFunc_Spawn, weaponbox_ent);
			engfunc(EngFunc_SetModel, weaponbox_ent, ammo_model);
			engfunc(EngFunc_SetOrigin, weaponbox_ent, origin);
			set_pev(weaponbox_ent, pev_angles, angles);
			set_pev(weaponbox_ent, pev_owner, id);
			weaponbox_spawned(weaponbox_ent, id);
			format(buffer, 63, "%d_%s", weaponbox_ent, buffer);
			ArrayPushString(ammo_entery_datas, buffer);
			ammo_entery_num++;
		}
	}
	
	alive[id] = 0;
}

public Ham_FETouch_armoury_entity(ent, id)
{
	if( id < 0 || id > maxplayers )
		return FMRES_IGNORED;
	
	static owner;
	owner = pev(ent, pev_owner);
	if( owner < 1 || owner > maxplayers )
		return FMRES_IGNORED;
	
	if( !(pev(ent, pev_flags)&FL_ONGROUND) )
		return FMRES_SUPERCEDE;
	
	if( pev(ent, pev_effects)&EF_NODRAW )
	{
		set_pev(ent, pev_solid, SOLID_NOT);
		engfunc(EngFunc_RemoveEntity, ent);
		return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED;
}

public Ham_FETouch_weaponbox(weaponbox_ent, id)
{
	if( !ammo_entery_num )
		return HAM_IGNORED;
	
	static classname[32];
	pev(weaponbox_ent, pev_model, classname, 31);
	if( !equal(classname, ammo_model) )
		return HAM_IGNORED;
	
	pev(id, pev_classname, classname, 31);
	if( equal(classname, "player") )
	{
		static i, buffer[64], ent_id[5], s_ammo_values[10][4], ammo_values[10], item;
		for( item=0; item < ammo_entery_num; item++ )
		{
			ArrayGetString(ammo_entery_datas, item, buffer, 63);
			replace_all(buffer, 63, "_", " ");
			parse(buffer, ent_id, 4, s_ammo_values[0], 3, s_ammo_values[1], 3, s_ammo_values[2], 3, s_ammo_values[3], 3, s_ammo_values[4], 3,
				s_ammo_values[5], 3, s_ammo_values[6], 3, s_ammo_values[7], 3, s_ammo_values[8], 3, s_ammo_values[9], 3);
			
			if( weaponbox_ent==str_to_num(ent_id) )
				break;
			else
				copy(buffer, 63, "");
		}
		
		if( !buffer[0] )
			return HAM_IGNORED;
		
		for( i=0; i < 10; i++ )
			ammo_values[i] = str_to_num(s_ammo_values[i]);
		
		if( !(pev(weaponbox_ent, pev_flags)&FL_ONGROUND) )
			return HAM_SUPERCEDE;
		
		static user_ammo, total_new_user_ammo, new_user_ammo, total_ammo, ammo_values_changed;
		total_ammo = 0;
		ammo_values_changed = false;
		
		for( i=0; i < 10; i++ )
		{
			if( ammo_values[i] )
			{
				user_ammo = clamp(cs_get_user_bpammo(id, cs_ammo_weapons[i]), 0, 254);
				if( user_ammo<cs_ammo_max[i] )
				{
					total_new_user_ammo = user_ammo+ammo_values[i];
					new_user_ammo = clamp(total_new_user_ammo, user_ammo, cs_ammo_max[i]);
					if( total_new_user_ammo>cs_ammo_max[i] )
						ammo_values[i] = total_new_user_ammo-cs_ammo_max[i];
					else
						ammo_values[i] = 0;
					message_begin(MSG_ONE_UNRELIABLE, get_user_msgid_AmmoPickup, {0, 0, 0}, id);
					write_byte(cs_ammo_id[i]);
					write_byte((new_user_ammo-user_ammo));
					message_end();
					cs_set_user_bpammo(id, cs_ammo_weapons[i], new_user_ammo);
					emit_sound(id, CHAN_ITEM, ammo_sound, 1.0, ATTN_NORM, 0, PITCH_NORM);
					
					if( !ammo_values_changed )
						ammo_values_changed = true;
				}
				total_ammo += ammo_values[i];
			}
		}
		
		if( !ammo_values_changed )
			return HAM_SUPERCEDE;
		
		if( total_ammo )
		{
			static len;
			len = format(buffer, 63, "%d", weaponbox_ent);
			for( i=0; i < 10; i++ )
				len += format(buffer[len], 63-len, "_%d", ammo_values[i]);
			
			ArrayDeleteItem2(ammo_entery_datas, item);
			ArrayPushString(ammo_entery_datas, buffer);
		}	
		else
		{
			set_pev(weaponbox_ent, pev_solid, SOLID_NOT);
			dllfunc(DLLFunc_Think, weaponbox_ent);
			engfunc(EngFunc_RemoveEntity, weaponbox_ent);
			ArrayDeleteItem2(ammo_entery_datas, item);
			ammo_entery_num--;
		}
		return HAM_SUPERCEDE;
	}
	return HAM_IGNORED;
}

public Ham_FOWeapon_PrimaryAttack_he(ent)
	grenade_attack(ent, CSW_HEGRENADE);

public Ham_FOWeapon_PrimaryAttack_fb(ent)
	grenade_attack(ent, CSW_FLASHBANG);

public Ham_FOWeapon_PrimaryAttack_sg(ent)
	grenade_attack(ent, CSW_SMOKEGRENADE);

grenade_attack(ent, grenade_id)
{
	static owner;
	owner = pev(ent, pev_owner);
	if( is_user_alive(owner) && user_has_weapon(owner, grenade_id) )
	{
		alive[owner] = grenade_id;
		return 1;
	}
	
	return 0;
}

ArrayDeleteItem2(Array:arrayid, itemid) // Fix standart native and I will use it. Untill then - I'll use my way...
{
	if( ammo_entery_num==1 )
		ArrayClear(arrayid);
	else
	{
		static bool:temp_exists, Array:temp_array;
		if( !temp_exists )
		{
			temp_array = ArrayCreate(64);
			temp_exists = true;
		}
		else
			ArrayClear(temp_array);
		
		new data[64], item;
		for( item = 0; item < ammo_entery_num; item++ )
		{
			if( item!=itemid )
			{
				ArrayGetString(arrayid, item, data, 63);
				ArrayPushString(temp_array, data);
			}
		}
		
		ArrayClear(arrayid);
		
		for( item = 0; item < (ammo_entery_num-1); item++ )
		{
			ArrayGetString(temp_array, item, data, 63);
			ArrayPushString(arrayid, data);
		}
	}
	
	return 1;
}

set_armoury_entity_kvd(ent, const item_id[], const count[])
{
	set_kvd(0, KV_ClassName, "armoury_entity");
	set_kvd(0, KV_KeyName, "item");
	set_kvd(0, KV_Value, item_id);
	set_kvd(0, KV_fHandled, 0);
	
	if( dllfunc(DLLFunc_KeyValue, ent, 0) )
	{
		set_kvd(0, KV_ClassName, "armoury_entity");
		set_kvd(0, KV_KeyName, "count");
		set_kvd(0, KV_Value, count);
		set_kvd(0, KV_fHandled, 0);
		
		return dllfunc(DLLFunc_KeyValue, ent, 0);
	}
	
	return 0;
}
 

Код за потвърждение: Избери целия код

/**
 *
 * Real Weapon Drop
 *  by Numb
 *
 *
 * Description:
 *  This plugin introduces into the game more features related to dropped weapons. Features
 *  such as:
 *  + Ability to drop weapons up and down - where you aim, in that direction weapon will be
 *   thrown.
 *  + Ability to manually drop grenades.
 *  + Drop all weapons at death. Including grenades and a special box of ammunition.
 *  + Drop all weapons on disconnect. Including grenades and a special box of ammunition.
 *  + Barrel of dropped weapons is always facing in the same direction as player was looking.
 *
 *
 * Requires:
 *  FakeMeta
 *  HamSandWich
 *
 *
 * Cvars:
 *
 *  + "rwd_aimdrop" - Counter-Strike:Source style manual weapon drop.
 *  - "1" - enabled. [default]
 *  - "0" - disabled.
 *
 *  + "rwd_grenadedrop" - ability to manually drop grenades.
 *  - "1" - enabled. [default]
 *  - "0" - disabled.
 *
 *  + "rwd_deathdrop" - drop all weapons on death.
 *  - "1" - enabled. [default]
 *  - "0" - disabled.
 *
 *  + "rwd_disconnectdrop" - drop all weapons on disconnect.
 *  - "1" - enabled. [default]
 *  - "0" - disabled.
 *
 *  + "rwd_modelanglefix[/U]" - barrel of the weapon angle fix.
 *  - "1" - enabled. [default]
 *  - "0" - disabled.
 *
 *
 * Additional info:
 *  Tested in Counter-Strike 1.6 with amxmodx 1.8.2. Various features can be enabled and
 *  disabled via cvars. This plugin also has support VIP objectives and grenade trail
 *  plugins.
 *
 *
 * Notes:
 *  Barrel of dropped weapons may be facing in wrong direction if client is using custom
 *  weapon models.
 *
 *
 * WARNINGS:
 *  In some cases pausing this plugin may lead to glitches, therefor if when needed please
 *  use cvars instead. That is if paused in certain moments by other plugins. Manual pauses
 *  won't do much harm, except dropped flashes will fill up your flashbang slot to maximum,
 *  and ammunition box will be touchable only once.
 *
 *
 * Credits:
 *  Special thanks to Arkshine ( http://forums.alliedmods.net/member.php?u=7779 ) for
 *  Counter-Strike SDK ( https://github.com/Arkshine/CSSDK/ ) and big help what he have
 *  provided by delivering very useful information! Also big thanks goes to eDark for
 *  calculation functions!
 *
 *
 * Change-Log:
 *
 *  + 2.3
 *  - Fixed: Crash at mapchange if there's too many players and other entities.
 *  - Changed: More reliability when saving number of dropped bullets and flash grenades.
 *
 *  + 2.2
 *  - Fixed: VIPs drop all their weapons on escape.
 *  - Changed: Minor performance improvement.
 *
 *  + 2.1
 *  - Changed: Minor performance improvement.
 *
 *  + 2.0
 *  - Fixed: Grenades do not bounce insane when dropped.
 *  - Fixed: VIPs can't no longer pick-up ammunition.
 *  - Fixed: VIPs also do drop their weapons if have any.
 *  - Changed: Full plugin rewrite - plugin is now much more stable.
 *
 *  + 1.4
 *  - Fixed: "grenade bounce for ever" by adding gravitation level manually. // had issues
 *
 *  + 1.3
 *  - Fixed: Explode grenade on death if it's not armed.
 *  - Added: Grenade drop.
 *
 *  + 1.2
 *  - Fixed: Due to bug in standard ArrayDeleteItem(Array:which, item) native I created my
 *   own working one.
 *
 *  + 1.1
 *  - Changed: (code) Modified array clear (less cpu usage - I think).
 *  - Changed: (code) Entity scan (less cpu usage).
 *  - Changed: (code) Unneeded data getting from array - removed (less cpu usage).
 *
 *  + 1.0
 *  - First release.
 *
 *
 * Downloads:
 *  Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=619788#post619788
 *
**/

//#define FAST_METHOD // saves AllocString value at mapstart, but isn't as reliable

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

#define PLUGIN_NAME	"Real Weapon Drop"
#define PLUGIN_VERSION	"2.3"
#define PLUGIN_AUTHOR	"Numb"

#define AMMO_MODEL "models/w_357ammobox.mdl"
#define AMMO_SOUND "items/9mmclip2.wav"

#define SetPlayerBit(%1,%2)    ( %1 |=  ( 1 << ( %2 & 31 ) ) )
#define ClearPlayerBit(%1,%2)  ( %1 &= ~( 1 << ( %2 & 31 ) ) )
#define CheckPlayerBit(%1,%2)  ( %1 &   ( 1 << ( %2 & 31 ) ) )

// "weapon_" entity
#define m_flStartThrow 30
#define m_pPlayer 41
#define m_iId 43
#define m_flTimeWeaponIdle 48

// "player" entity
#define m_bIsVIP 209
#define m_pActiveItem 373
#define m_rgAmmo_player 376
#define FLAG_VIP (1<<8)

// "weaponbox" entity
#define m_rgpPlayerItems 34
#define m_rgiszAmmo 41
#define m_rgAmmo 73
#define AMMO_FLASHBANG 11
#define AMMO_HEGRENADE 12
#define AMMO_SMOKENADE 13

new g_iBulletsDropped[33][15];
#if defined FAST_METHOD
new m_rgiszAmmoNames[15];
#endif
new g_iMaxPlayers;
new g_iConnected;
new g_iAlive;

new g_iMsgId_AmmoPickup;
new g_iMsgId_WeapPickup;

new g_iCvar_AimDrop;
new g_iCvar_GrenadeDrop;
new g_iCvar_DeathDrop;
new g_iCvar_DisconnectDrop;
new g_iCvar_ModelAngleFix;

new g_bInAutoDrop;
new HamHook:g_iHamHook_Think;
new g_iHamHook_Active;
new g_iDeathDrops[33][29];
new g_iDeathDropsNum[33];
new Float:g_fPlayerAngle[33];
new bool:g_bVipDrop;
new bool:g_bChangingMap;

new g_iAmmoNames[15][] = {
	"",
	"338Magnum", // awp
	"762Nato", // ak47 scout g3sg1
	"556NatoBox", // m249
	"556Nato", // aug m4a1 sgg550 sgg552 galil famas
	"buckshot", // m3 xm1014
	"45ACP", // mac10 usp ump45
	"57mm", // p90 fiveseven
	"50AE", // deagle
	"357SIG", // p228
	"9mm", // glock elites mp5navy tmp
	"Flashbang",
	"HEGrenade",
	"SmokeGrenade",
	"C4"
};

new g_iAmmoEntityNames[15][] = {
	"",
	"ammo_338magnum", // awp
	"ammo_762nato", // ak47 scout g3sg1
	"ammo_556natobox", // m249
	"ammo_556nato", // aug m4a1 sgg550 sgg552 galil famas
	"ammo_buckshot", // m3 xm1014
	"ammo_45acp", // mac10 usp ump45
	"ammo_57mm", // p90 fiveseven
	"ammo_50ae", // deagle
	"ammo_357sig", // p228
	"ammo_9mm", // glock elites mp5navy tmp
	"weapon_flashbang",
	"weapon_hegrenade",
	"weapon_smokegenade",
	"weapon_c4"
};

new g_iMaxAmmo[15] = {
	0,
	30,
	90,
	200,
	90,
	32,
	100,
	100,
	35,
	52,
	120,
	2,
	1,
	1,
	1
};

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	
	register_event("30", "Event_MapChangeScoreboard", "a");
	
	register_forward(FM_ClientDisconnect, "FM_ClientDisconnect_Pre", 0);
	register_forward(FM_SetModel,         "FM_SetModel_Pre",         0);
	
	RegisterHam(Ham_Spawn,           "player",              "Ham_Spawn_Player_Post",  1);
	RegisterHam(Ham_Killed,          "player",              "Ham_Killed_player_Pre",  0);
	RegisterHam(Ham_Killed,          "player",              "Ham_Killed_player_Post", 1);
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_hegrenade",    "Ham_Item_CanDrop_Pre",   0);
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_flashbang",    "Ham_Item_CanDrop_Pre",   0);
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_smokegrenade", "Ham_Item_CanDrop_Pre",   0);
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_knife",        "Ham_Item_CanDrop_Pre",   0);
	RegisterHam(Ham_Touch,           "weaponbox",           "Ham_Touch_wpnbox_Pre",   0);
	RegisterHam(Ham_Touch,           "func_vip_safetyzone", "Ham_Touch_safezone_Pre", 0);
	
	g_iHamHook_Think = RegisterHam(Ham_Think, "player", "Ham_Think_player_Pre", 0);
	DisableHamForward(g_iHamHook_Think);
	
	g_iCvar_AimDrop        = register_cvar("rwd_aimdrop", "1");
	g_iCvar_GrenadeDrop    = register_cvar("rwd_grenadedrop", "1");
	g_iCvar_DeathDrop      = register_cvar("rwd_deathdrop", "1");
	g_iCvar_DisconnectDrop = register_cvar("rwd_disconnectdrop", "1");
	g_iCvar_ModelAngleFix  = register_cvar("rwd_modelanglefix", "1");
	
	g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
	
#if defined FAST_METHOD
	for( new iLoop=1; iLoop<15; iLoop++ )
		m_rgiszAmmoNames[iLoop] = engfunc(EngFunc_AllocString, g_iAmmoNames[iLoop]);
#endif
	
	g_iMsgId_AmmoPickup = get_user_msgid("AmmoPickup");
	g_iMsgId_WeapPickup = get_user_msgid("WeapPickup");
}

public plugin_precache()
{
	precache_model(AMMO_MODEL);
	precache_sound(AMMO_SOUND);
}

public plugin_unpause()
{
	g_iConnected = 0;
	g_iAlive = 0;
	
	for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
	{
		if( is_user_alive(iPlrId) )
		{
			SetPlayerBit(g_iConnected, iPlrId);
			SetPlayerBit(g_iAlive, iPlrId);
		}
		else if( is_user_connected(iPlrId) )
			SetPlayerBit(g_iConnected, iPlrId);
	}
}

public client_connect(iPlrId)
{
	ClearPlayerBit(g_iAlive, iPlrId);
	ClearPlayerBit(g_iConnected, iPlrId);
}

public client_putinserver(iPlrId)
	SetPlayerBit(g_iConnected, iPlrId);

public Event_MapChangeScoreboard()
	g_bChangingMap = true;

public Message_AmmoPickup(iMsgId, iMsgType, iPlrId) // modify given ammo on hud when needed
{
	static s_iAmmoNum;
	s_iAmmoNum = g_iBulletsDropped[iPlrId][get_msg_arg_int(1)];
	if( s_iAmmoNum )
		set_msg_arg_int(2, ARG_BYTE, s_iAmmoNum);
}

public Message_Block(iMsgId, iMsgType, iPlrId) // block ammo and weaponpickup hud update when needed
	return PLUGIN_HANDLED;

public FM_ClientDisconnect_Pre(iPlrId)
{
	ClearPlayerBit(g_iConnected, iPlrId);
	ClearPlayerBit(g_iAlive, iPlrId);
	ClearPlayerBit(g_iHamHook_Active, iPlrId);
	
	if( get_pcvar_num(g_iCvar_DisconnectDrop) )
	{
		static s_iVip;
		s_iVip = get_pdata_int(iPlrId, m_bIsVIP, 5);
		set_pdata_int(iPlrId, m_bIsVIP, (s_iVip&~FLAG_VIP), 5);
		force_weapon_drop(iPlrId, 0, 0);
		set_pdata_int(iPlrId, m_bIsVIP, s_iVip, 5);
	}
}

public FM_SetModel_Pre(iEnt, iModel[])
{
	if( !equal(iModel, "models/w_", 9) )
		return FMRES_IGNORED;
	
	if( equal(iModel[9], "weaponbox.mdl") ) // this weaponbox isn't yet ready to be worked with
		return FMRES_IGNORED;
	
	static s_iClassName[11];
	pev(iEnt, pev_classname, s_iClassName, 10);
	
	if( equal(s_iClassName, "weaponbox") ) // is this a weaponbox with what we can work
	{
		static s_iOwner, Float:s_fVelocity[3], s_bAlive, Float:s_fAngle[3];
		s_iOwner = pev(iEnt, pev_owner);
		if( 0<s_iOwner<=g_iMaxPlayers )
			s_bAlive = (CheckPlayerBit(g_iAlive, s_iOwner)?true:false);
		else
			s_bAlive = false;
		
		if( s_bAlive && !g_bVipDrop ) // alive user dropped weapons
		{
			if( get_pcvar_num(g_iCvar_AimDrop) ) // should we change drop direction via player by aim
			{
				static Float:s_fOrigin[3], Float:s_fResult[3];
				pev(s_iOwner, pev_origin, s_fOrigin);
				pev(s_iOwner, pev_v_angle, s_fAngle);
				SphereToCartesian(s_fResult, s_fOrigin, s_fAngle, Float:{0.0, 0.0, 200.0}); // some extraterrestrial math by eDark
				pev(s_iOwner, pev_velocity, s_fVelocity);
				s_fVelocity[0] += (s_fResult[0]-s_fOrigin[0]);
				s_fVelocity[1] += (s_fResult[1]-s_fOrigin[1]);
				s_fVelocity[2] -= (s_fResult[2]-s_fOrigin[2]);
				set_pev(iEnt, pev_velocity, s_fVelocity);
			}
		}
		else if( is_player_connected(s_iOwner) ) // weapon is dropped due to death
		{
			if( get_pcvar_num(g_iCvar_DeathDrop) )
			{
				if( CheckPlayerBit(g_iHamHook_Active, s_iOwner) && 0<=g_iDeathDropsNum[s_iOwner] && g_iDeathDropsNum[s_iOwner]<29 )
				{
					g_iDeathDrops[s_iOwner][g_iDeathDropsNum[s_iOwner]] = iEnt; // sometimes not all the weapons have speed set right,
					g_iDeathDropsNum[s_iOwner]++; // therefor we'll set their speed to again, when we'll be sure it's right
					
					s_fVelocity = Float:{0.0, 0.0, 0.0};
				}
				else
					pev(s_iOwner, pev_velocity, s_fVelocity);
					
				s_fVelocity[0] += random_float(-10.0, 10.0);
				s_fVelocity[1] += random_float(-10.0, 10.0);
				s_fVelocity[2] += random_float(-5.0, 5.0);
				set_pev(iEnt, pev_velocity, s_fVelocity);
			}
		}
		else if( get_pcvar_num(g_iCvar_DisconnectDrop) ) // weapon is dropped due to disconnect
		{
			s_fVelocity = Float:{0.0, 0.0, 0.0};
			s_fVelocity[0] = random_float(-10.0, 10.0);
			s_fVelocity[1] = random_float(-10.0, 10.0);
			s_fVelocity[2] = random_float(-5.0, 5.0);
			set_pev(iEnt, pev_velocity, s_fVelocity);
		}
		
		if( 0<s_iOwner<=g_iMaxPlayers ) // should we work a bit more with the weaponbox
		{
			if( !s_bAlive )
			{
				pev(iEnt, pev_angles, s_fAngle);
				s_fAngle[1] = g_fPlayerAngle[s_iOwner];
				set_pev(iEnt, pev_angles, s_fAngle);
			}
			
			if( equal(iModel[9], "flashbang.mdl") ) // this weaponbox includes information about flash grenade
			{
#if defined FAST_METHOD
				set_pdata_int(iEnt, (m_rgiszAmmo+AMMO_FLASHBANG), m_rgiszAmmoNames[AMMO_FLASHBANG], 4);
#else
				set_pdata_int(iEnt, (m_rgiszAmmo+AMMO_FLASHBANG), engfunc(EngFunc_AllocString, g_iAmmoNames[AMMO_FLASHBANG]), 4);
#endif
				if( s_bAlive )
				{
					set_pdata_int(iEnt, (m_rgAmmo+AMMO_FLASHBANG), 1, 4); // not working (glitch with grenades)
					if( g_iBulletsDropped[s_iOwner][AMMO_FLASHBANG]>0 )
					{
						static s_iFwdMsg_AmmoPickup, s_iFwdMsg_WeapPickup;
						s_iFwdMsg_AmmoPickup = register_message(g_iMsgId_AmmoPickup, "Message_Block");
						s_iFwdMsg_WeapPickup = register_message(g_iMsgId_WeapPickup, "Message_Block");
						
						ham_give_item(s_iOwner, "weapon_flashbang");
						set_pdata_int(s_iOwner, (m_rgAmmo_player+AMMO_FLASHBANG), g_iBulletsDropped[s_iOwner][AMMO_FLASHBANG], 5);
						engclient_cmd(s_iOwner, "weapon_flashbang");
						
						unregister_message(g_iMsgId_AmmoPickup, s_iFwdMsg_AmmoPickup);
						unregister_message(g_iMsgId_WeapPickup, s_iFwdMsg_WeapPickup);
					}
				}
				else
					set_pdata_int(iEnt, (m_rgAmmo+AMMO_FLASHBANG), g_iBulletsDropped[s_iOwner][AMMO_FLASHBANG], 4); // not working (glitch with grenades)
				
				message_begin(MSG_ALL, SVC_TEMPENTITY, _, _); // yep, lets include support for grenade trail plugin
				write_byte(TE_KILLBEAM);
				write_short(iEnt);
				message_end();
			}
			else if( equal(iModel[9], "hegrenade.mdl") ) // this weaponbox includes information about he grenade
			{
				message_begin(MSG_ALL, SVC_TEMPENTITY, _, _); // yep, lets include support for grenade trail plugin
				write_byte(TE_KILLBEAM);
				write_short(iEnt);
				message_end();
				
				pev(iEnt, pev_angles, s_fAngle);
				s_fAngle[1] += 90.0;
				set_pev(iEnt, pev_angles, s_fAngle);
			}
			else if( equal(iModel[9], "smokegrenade.mdl") ) // this weaponbox includes information about smoke grenade
			{
				message_begin(MSG_ALL, SVC_TEMPENTITY, _, _); // yep, lets include support for grenade trail plugin
				write_byte(TE_KILLBEAM);
				write_short(iEnt);
				message_end();
				
				pev(iEnt, pev_angles, s_fAngle);
				s_fAngle[1] += 45.0;
				set_pev(iEnt, pev_angles, s_fAngle);
			}
			else if( equal(iModel[9], "knife.mdl") ) // dropped knife - lets set bullets info into it
			{
				pev(iEnt, pev_angles, s_fAngle);
				s_fAngle[1] += 180.0;
				set_pev(iEnt, pev_angles, s_fAngle);
				
				static s_iLoop;
				for( s_iLoop=1; s_iLoop<11; s_iLoop++ )
				{
#if defined FAST_METHOD
					set_pdata_int(iEnt, (m_rgiszAmmo+s_iLoop), m_rgiszAmmoNames[s_iLoop], 4);
#else
					set_pdata_int(iEnt, (m_rgiszAmmo+s_iLoop), engfunc(EngFunc_AllocString, g_iAmmoNames[s_iLoop]), 4);
#endif
					set_pdata_int(iEnt, (m_rgAmmo+s_iLoop), g_iBulletsDropped[s_iOwner][s_iLoop], 4);
				}
				
				engfunc(EngFunc_SetModel, iEnt, AMMO_MODEL); // and change model to custom one of course
				return FMRES_SUPERCEDE;
			}
			else if( get_pcvar_num(g_iCvar_ModelAngleFix) ) // lets fix angle of the weaponbox model
			{
				pev(iEnt, pev_angles, s_fAngle);
				
				if( equal(iModel[9], "glock18.mdl") )
					s_fAngle[1] -= 110.0;
				else if( equal(iModel[9], "usp.mdl") )
					s_fAngle[1] -= 65.0;
				else if( equal(iModel[9], "deagle.mdl") )
					s_fAngle[1] -= 110.0;
				else if( equal(iModel[9], "p228.mdl") )
					s_fAngle[1] -= 60.0;
				else if( equal(iModel[9], "elite.mdl") )
					s_fAngle[1] -= 180.0;
				else if( equal(iModel[9], "fiveseven.mdl") )
					s_fAngle[1] -= 50.0;
				else if( equal(iModel[9], "m3.mdl") )
					s_fAngle[1] -= 125.0;
				else if( equal(iModel[9], "xm1014.mdl") )
					s_fAngle[1] -= 5.0;
				else if( equal(iModel[9], "mp5.mdl") )
					s_fAngle[1] += 10.0;
				else if( equal(iModel[9], "tmp.mdl") ) // mac10 has a perfect angle - no need to fix
					s_fAngle[1] -= 135.0;
				else if( equal(iModel[9], "p90.mdl") )
					s_fAngle[1] -= 125.0;
				else if( equal(iModel[9], "ump45.mdl") )
					s_fAngle[1] -= 70.0;
				else if( equal(iModel[9], "galil.mdl") )
					s_fAngle[1] += 15.0;
				else if( equal(iModel[9], "famas.mdl") )
					s_fAngle[1] -= 30.0;
				else if( equal(iModel[9], "ak47.mdl") )
					s_fAngle[1] -= 105.0;
				else if( equal(iModel[9], "m4a1.mdl") )
					s_fAngle[1] -= 60.0;
				else if( equal(iModel[9], "sg552.mdl") )
					s_fAngle[1] -= 130.0;
				else if( equal(iModel[9], "aug.mdl") )
					s_fAngle[1] -= 125.0;
				else if( equal(iModel[9], "scout.mdl") )
					s_fAngle[1] -= 70.0;
				else if( equal(iModel[9], "awp.mdl") )
					s_fAngle[1] -= 110.0;
				else if( equal(iModel[9], "g3sg1.mdl") )
					s_fAngle[1] -= 110.0;
				else if( equal(iModel[9], "sg550.mdl") )
					s_fAngle[1] -= 115.0;
				else if( equal(iModel[9], "m249.mdl") )
					s_fAngle[1] -= 95.0;
				
				set_pev(iEnt, pev_angles, s_fAngle);
			}
		}
	}
	
	return FMRES_IGNORED;
}

public Ham_Spawn_Player_Post(iPlrId)
{
	if( is_user_alive(iPlrId) )
		SetPlayerBit(g_iAlive, iPlrId);
	else
		ClearPlayerBit(g_iAlive, iPlrId);
}

public Ham_Killed_player_Pre(iPlrId, iAttackerId, iShouldGib)
{
	g_iDeathDropsNum[iPlrId] = 0;
	if( !g_iHamHook_Active )
		EnableHamForward(g_iHamHook_Think);
	SetPlayerBit(g_iHamHook_Active, iPlrId);
	
	if( get_pcvar_num(g_iCvar_DeathDrop) )
	{
		static s_iArmedGrenade, s_iWeaponType;
		s_iArmedGrenade = get_pdata_cbase(iPlrId, m_pActiveItem, 5);
		if( s_iArmedGrenade>0 && pev_valid(s_iArmedGrenade) )
		{
			s_iWeaponType = get_pdata_int(s_iArmedGrenade, m_iId, 4);
			if( s_iWeaponType==CSW_FLASHBANG || s_iWeaponType==CSW_HEGRENADE || s_iWeaponType==CSW_SMOKEGRENADE )
			{
				if( get_pdata_float(s_iArmedGrenade, m_flStartThrow, 3) && get_pdata_float(s_iArmedGrenade, m_flTimeWeaponIdle, 4)<=0.0 )
					s_iArmedGrenade = s_iWeaponType; // a grenade is ready to explode - save information what grenade it is
				else
					s_iArmedGrenade = 0;
			}
			else
				s_iArmedGrenade = 0;
		}
		else
		{
			s_iWeaponType = 0;
			s_iArmedGrenade = 0;
		}
		
		static s_iVip;
		s_iVip = get_pdata_int(iPlrId, m_bIsVIP, 5);
		set_pdata_int(iPlrId, m_bIsVIP, (s_iVip&~FLAG_VIP), 5);
		force_weapon_drop(iPlrId, s_iArmedGrenade, s_iWeaponType);
		set_pdata_int(iPlrId, m_bIsVIP, s_iVip, 5);
	}
}

public Ham_Killed_player_Post(iPlrId, iAttackerId, iShouldGib)
{
	if( is_user_alive(iPlrId) )
		SetPlayerBit(g_iAlive, iPlrId);
	else
		ClearPlayerBit(g_iAlive, iPlrId);
}

public Ham_Think_player_Pre(iPlrId)
{
	if( g_iDeathDropsNum[iPlrId] )
	{
		static Float:s_fVelocity[3];
		pev(iPlrId, pev_velocity, s_fVelocity);
		
		static s_iDeathDrops, s_iEnt;
		for( s_iDeathDrops=0; s_iDeathDrops<g_iDeathDropsNum[iPlrId]; s_iDeathDrops++ )
		{
			s_iEnt = g_iDeathDrops[iPlrId][s_iDeathDrops];
			if( s_iEnt>0 && pev_valid(s_iEnt) )
				set_pev(s_iEnt, pev_velocity, s_fVelocity);
		}
	}
	
	ClearPlayerBit(g_iHamHook_Active, iPlrId);
	if( !g_iHamHook_Active )
		DisableHamForward(g_iHamHook_Think);
}

public Ham_Touch_safezone_Pre(iEnt, iPlrId)
{
	if( iPlrId>0 && iPlrId<=g_iMaxPlayers )
	{
		static s_iVip;
		s_iVip = get_pdata_int(iPlrId, m_bIsVIP, 5);
		if( s_iVip&FLAG_VIP )
		{
			g_bVipDrop = true;
			set_pdata_int(iPlrId, m_bIsVIP, (s_iVip&~FLAG_VIP), 5);
			force_weapon_drop(iPlrId, 0, 0);
			set_pdata_int(iPlrId, m_bIsVIP, s_iVip, 5);
			g_bVipDrop = false;
		}
	}
}

public Ham_Item_CanDrop_Pre(iEnt) // allow drop of various items when needed
{
	if( g_bInAutoDrop )
		SetHamReturnInteger(1);
	else if( get_pcvar_num(g_iCvar_GrenadeDrop) )
	{
		static s_iOwner;
		s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
		
		if( 0<s_iOwner<=g_iMaxPlayers )
		{
			if( get_pdata_int(s_iOwner, m_bIsVIP, 5)&FLAG_VIP ) // yep, if somehow VIP gets a grenade, don't allow it to be dropped
				return HAM_IGNORED;
			
			static s_iWeaponType;
			s_iWeaponType = get_pdata_int(iEnt, m_iId, 4);
			
			if( s_iWeaponType==CSW_KNIFE )
				return HAM_IGNORED; // yep, don't allow manual drop of knife
			else if( s_iWeaponType==CSW_FLASHBANG )
				g_iBulletsDropped[s_iOwner][AMMO_FLASHBANG] = (clamp(get_pdata_int(s_iOwner, (m_rgAmmo_player+AMMO_FLASHBANG), 5), 1, 2)-1);
			SetHamReturnInteger(1);
		}
		else
			return HAM_IGNORED;
	}
	else
		return HAM_IGNORED;
	
	return HAM_OVERRIDE;
}

public Ham_Touch_wpnbox_Pre(iEnt, iPlrId) // when weaponbox is touched
{
	if( 0<iPlrId<=g_iMaxPlayers )
	{
		if( get_pdata_int(iPlrId, m_bIsVIP, 5)&FLAG_VIP || ~pev(iEnt, pev_flags)&FL_ONGROUND ) // weaponbox can have an effect on the player
			return HAM_SUPERCEDE;
		
		static s_iBoxAmmo, s_iUserAmmo;
		if( (s_iBoxAmmo=get_pdata_int(iEnt, (m_rgAmmo+AMMO_FLASHBANG), 4))>0 ) // weaponbox has flashbang information inside
		{
			if( (s_iUserAmmo=get_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_FLASHBANG), 5))>=2 )
				return HAM_SUPERCEDE;
			else if( (s_iUserAmmo<=0 && s_iBoxAmmo>=2) )
			{
				ham_give_item(iPlrId, "weapon_flashbang");
				ham_give_item(iPlrId, "weapon_flashbang");
				
				emit_sound(iPlrId, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				emit_sound(iPlrId, CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			
				set_pev(iEnt, pev_solid, SOLID_NOT);
				set_pev(iEnt, pev_effects, EF_NODRAW);
				dllfunc(DLLFunc_Think, iEnt);
				
				return HAM_SUPERCEDE;
			}
			else if( (s_iUserAmmo==1 && s_iBoxAmmo==1) )
			{
				ham_give_item(iPlrId, "weapon_flashbang");
				
				emit_sound(iPlrId, CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			
				set_pev(iEnt, pev_solid, SOLID_NOT);
				set_pev(iEnt, pev_effects, EF_NODRAW);
				dllfunc(DLLFunc_Think, iEnt);
				
				return HAM_SUPERCEDE;
			}
			else if( s_iUserAmmo==1 && s_iBoxAmmo>=2 )
			{
				set_pdata_int(iEnt, (m_rgAmmo+AMMO_FLASHBANG), (s_iBoxAmmo-1), 4);
				ham_give_item(iPlrId, "weapon_flashbang");
				
				emit_sound(iPlrId, CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				
				return HAM_SUPERCEDE;
			}
			else if( s_iUserAmmo<=0 && ham_give_item(iPlrId, "weapon_flashbang")>0 )
			{
				emit_sound(iPlrId, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				
				set_pev(iEnt, pev_solid, SOLID_NOT);
				set_pev(iEnt, pev_effects, EF_NODRAW);
				dllfunc(DLLFunc_Think, iEnt);
				
				return HAM_SUPERCEDE;
			}
			
			return HAM_IGNORED;
		}
		else // now check for actual bullets
		{
			static s_iTemp;
			s_iTemp = get_pdata_cbase(iEnt, (m_rgpPlayerItems+3), 4);
			
			if( s_iTemp>0 && pev_valid(s_iTemp) )
			{
				if( get_pdata_int(s_iTemp, m_iId, 4)==CSW_KNIFE ) // check passed - this weaponbox should include information about the bullets
				{
					static s_iFwdMsg_AmmoPickup;
					s_iFwdMsg_AmmoPickup = register_message(g_iMsgId_AmmoPickup, "Message_AmmoPickup"); // yes, we'll have to edit hud value
					
					g_iBulletsDropped[0][0] = g_iBulletsDropped[iPlrId][0] = 0;
					for( s_iTemp=1; s_iTemp<11; s_iTemp++ )
					{
						if( (s_iBoxAmmo=get_pdata_int(iEnt, (m_rgAmmo+s_iTemp), 4))>0 )
						{
							if( (s_iUserAmmo=clamp(get_pdata_int(iPlrId, (m_rgAmmo_player+s_iTemp), 5), 0, g_iMaxAmmo[s_iTemp]))>=g_iMaxAmmo[s_iTemp] )
								g_iBulletsDropped[0][0] = 1; // weaponbox still has ammo - don't remove the entity
							else
							{
								if( (s_iUserAmmo+s_iBoxAmmo)<=g_iMaxAmmo[s_iTemp] )
								{
									g_iBulletsDropped[iPlrId][s_iTemp] = s_iBoxAmmo;
									s_iUserAmmo += s_iBoxAmmo;
									set_pdata_int(iEnt, (m_rgAmmo+s_iTemp), 0, 4);
								}
								else
								{
									g_iBulletsDropped[0][0] = 1; // weaponbox still has ammo - don't remove the entity
									
									g_iBulletsDropped[iPlrId][s_iTemp] = (g_iMaxAmmo[s_iTemp]-s_iUserAmmo);
									s_iUserAmmo = g_iMaxAmmo[s_iTemp];
									set_pdata_int(iEnt, (m_rgAmmo+s_iTemp), (s_iBoxAmmo-g_iBulletsDropped[iPlrId][s_iTemp]), 4);
								}
								g_iBulletsDropped[iPlrId][0] += g_iBulletsDropped[iPlrId][s_iTemp]; // we need to save that some bullets were given
								
								fm_give_item(iPlrId, g_iAmmoEntityNames[s_iTemp]); // we must give ammo this way, else weapon
								set_pdata_int(iPlrId, (m_rgAmmo_player+s_iTemp), s_iUserAmmo, 5); // wont be able to reload
							}
						}
					}
					unregister_message(g_iMsgId_AmmoPickup, s_iFwdMsg_AmmoPickup);
					
					if( g_iBulletsDropped[iPlrId][0] ) // bullets were given - emit bullet pick-up sound
						emit_sound(iPlrId, CHAN_ITEM, AMMO_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
					
					if( !g_iBulletsDropped[0][0] ) // weaponbox has no more ammo - remove it
					{
						set_pev(iEnt, pev_solid, SOLID_NOT);
						set_pev(iEnt, pev_effects, EF_NODRAW);
						dllfunc(DLLFunc_Think, iEnt);
					}
					
					return HAM_SUPERCEDE;
				}
			}
		}
	}
	
	return HAM_IGNORED;
}

force_weapon_drop(iPlrId, iArmedGrenade, iWeaponType)
{
	if( g_bChangingMap )
		return;
	
	g_bInAutoDrop = true; // allow death drop of grenades and knife
	
	static s_iUserWeapons, Float:s_fAngle[3];
	s_iUserWeapons = pev(iPlrId, pev_weapons);
	pev(iPlrId, pev_v_angle, s_fAngle);
	g_fPlayerAngle[iPlrId] = s_fAngle[1];
	
	if( iArmedGrenade!=CSW_HEGRENADE && get_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_HEGRENADE), 5)>0 )
		engclient_cmd(iPlrId, "drop", "weapon_hegrenade");
	
	if( (g_iBulletsDropped[iPlrId][AMMO_FLASHBANG]=(clamp(get_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_FLASHBANG), 5), 0, 2)-((iArmedGrenade==CSW_FLASHBANG)?1:0)))>0 )
	{
		engclient_cmd(iPlrId, "drop", "weapon_flashbang");
		
		if( iArmedGrenade==CSW_FLASHBANG ) // oh, ya, by dropping one flash, we disarm the other one, so we have to bypass it
		{
			set_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_FLASHBANG), 1, 5); // just to be on the safe side, in case user had more than 2 flashes
			iArmedGrenade = ham_give_item(iPlrId, "weapon_flashbang");
			set_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_FLASHBANG), 1, 5); // if magically user doesn't die, let him have one flash (not two)
			
			if( iArmedGrenade>0 && pev_valid(iArmedGrenade) )
			{
				set_pdata_cbase(iPlrId, m_pActiveItem, iArmedGrenade, 5); // yep, lets set it to be the active item
				set_pdata_float(iArmedGrenade, m_flStartThrow, 1.0, 3); // now arm the grenade, so at death it'll be dropped
				set_pdata_float(iArmedGrenade, m_flTimeWeaponIdle, -0.001, 4);
			}
			iArmedGrenade = 0;
		}
	}
	
	if( iArmedGrenade!=CSW_SMOKEGRENADE && get_pdata_int(iPlrId, (m_rgAmmo_player+AMMO_SMOKENADE), 5)>0 )
		engclient_cmd(iPlrId, "drop", "weapon_smokegrenade");
	
	static s_iLoop;
	g_iBulletsDropped[iPlrId][0] = 0; // this will be higher, if player has any bullets at all
	for( s_iLoop=1; s_iLoop<11; s_iLoop++ ) // yep, here we get information of specific bullet types
	{
		g_iBulletsDropped[iPlrId][s_iLoop] = clamp(get_pdata_int(iPlrId, (m_rgAmmo_player+s_iLoop), 5), 0, g_iMaxAmmo[s_iLoop]);
		set_pdata_int(iPlrId, (m_rgAmmo_player+s_iLoop), 0, 5);
		g_iBulletsDropped[iPlrId][0] += g_iBulletsDropped[iPlrId][s_iLoop];
	
	}
	
	if( g_iBulletsDropped[iPlrId][0] ) // if player has any bullets at all
	{
		if( ~s_iUserWeapons&(1<<CSW_KNIFE) ) // if user has no knife - give one
			ham_give_item(iPlrId, "weapon_knife");
		engclient_cmd(iPlrId, "drop", "weapon_knife");
		ham_give_item(iPlrId, "weapon_knife"); // after dropping the knife, to be safe, lets give 1 knife back
	}
	
	g_bInAutoDrop = false; // disallow death drop of grenades and knife
	
	if( s_iUserWeapons&(1<<CSW_P228) && iWeaponType!=CSW_P228 ) // just drop all the weapons
		engclient_cmd(iPlrId, "drop", "weapon_p228");
	if( s_iUserWeapons&(1<<CSW_SCOUT) && iWeaponType!=CSW_SCOUT )
		engclient_cmd(iPlrId, "drop", "weapon_scout");
	if( s_iUserWeapons&(1<<CSW_XM1014) && iWeaponType!=CSW_XM1014 )
		engclient_cmd(iPlrId, "drop", "weapon_xm1014");
	if( s_iUserWeapons&(1<<CSW_MAC10) && iWeaponType!=CSW_MAC10 )
		engclient_cmd(iPlrId, "drop", "weapon_mac10");
	if( s_iUserWeapons&(1<<CSW_AUG) && iWeaponType!=CSW_AUG )
		engclient_cmd(iPlrId, "drop", "weapon_aug");
	if( s_iUserWeapons&(1<<CSW_ELITE) && iWeaponType!=CSW_ELITE )
		engclient_cmd(iPlrId, "drop", "weapon_elite");
	if( s_iUserWeapons&(1<<CSW_FIVESEVEN) && iWeaponType!=CSW_FIVESEVEN )
		engclient_cmd(iPlrId, "drop", "weapon_fiveseven");
	if( s_iUserWeapons&(1<<CSW_UMP45) && iWeaponType!=CSW_UMP45 )
		engclient_cmd(iPlrId, "drop", "weapon_ump45");
	if( s_iUserWeapons&(1<<CSW_SG550) && iWeaponType!=CSW_SG550 )
		engclient_cmd(iPlrId, "drop", "weapon_sg550");
	if( s_iUserWeapons&(1<<CSW_GALIL) && iWeaponType!=CSW_GALIL )
		engclient_cmd(iPlrId, "drop", "weapon_galil");
	if( s_iUserWeapons&(1<<CSW_FAMAS) && iWeaponType!=CSW_FAMAS )
		engclient_cmd(iPlrId, "drop", "weapon_famas");
	if( s_iUserWeapons&(1<<CSW_USP) && iWeaponType!=CSW_USP )
		engclient_cmd(iPlrId, "drop", "weapon_usp");
	if( s_iUserWeapons&(1<<CSW_GLOCK18) && iWeaponType!=CSW_GLOCK18 )
		engclient_cmd(iPlrId, "drop", "weapon_glock18");
	if( s_iUserWeapons&(1<<CSW_AWP) && iWeaponType!=CSW_AWP )
		engclient_cmd(iPlrId, "drop", "weapon_awp");
	if( s_iUserWeapons&(1<<CSW_MP5NAVY) && iWeaponType!=CSW_MP5NAVY )
		engclient_cmd(iPlrId, "drop", "weapon_mp5navy");
	if( s_iUserWeapons&(1<<CSW_M249) && iWeaponType!=CSW_M249 )
		engclient_cmd(iPlrId, "drop", "weapon_m249");
	if( s_iUserWeapons&(1<<CSW_M3) && iWeaponType!=CSW_M3 )
		engclient_cmd(iPlrId, "drop", "weapon_m3");
	if( s_iUserWeapons&(1<<CSW_M4A1) && iWeaponType!=CSW_M4A1 )
		engclient_cmd(iPlrId, "drop", "weapon_m4a1");
	if( s_iUserWeapons&(1<<CSW_TMP) && iWeaponType!=CSW_TMP )
		engclient_cmd(iPlrId, "drop", "weapon_tmp");
	if( s_iUserWeapons&(1<<CSW_G3SG1) && iWeaponType!=CSW_G3SG1 )
		engclient_cmd(iPlrId, "drop", "weapon_g3sg1");
	if( s_iUserWeapons&(1<<CSW_DEAGLE) && iWeaponType!=CSW_DEAGLE )
		engclient_cmd(iPlrId, "drop", "weapon_deagle");
	if( s_iUserWeapons&(1<<CSW_SG552) && iWeaponType!=CSW_SG552 )
		engclient_cmd(iPlrId, "drop", "weapon_sg552");
	if( s_iUserWeapons&(1<<CSW_AK47) && iWeaponType!=CSW_AK47 )
		engclient_cmd(iPlrId, "drop", "weapon_ak47");
	if( s_iUserWeapons&(1<<CSW_P90) && iWeaponType!=CSW_P90 )
		engclient_cmd(iPlrId, "drop", "weapon_p90");
	if( s_iUserWeapons&(1<<CSW_C4) && iWeaponType!=CSW_C4 )
		engclient_cmd(iPlrId, "drop", "weapon_c4");
}

ham_give_item(iPlrId, iClassName[]) // ham fowrad is useful, cause it doesn't emit no item sound
{
	new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, iClassName));
	if( iEnt<=0 || !pev_valid(iEnt) )
		return 0;
	
	set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
	dllfunc(DLLFunc_Spawn, iEnt);
	
	if( ExecuteHamB(Ham_AddPlayerItem, iPlrId, iEnt) )
	{
		ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlrId);
		return iEnt;
	}
	
	if( pev_valid(iEnt) )
		set_pev(iEnt, pev_flags, (pev(iEnt, pev_flags)|FL_KILLME));
	
	return -1;
}

fm_give_item(iPlrId, iClassName[]) // fakemeta forward is useful, cause it can be used with ammo_ items
{
	new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, iClassName));
	if( !pev_valid(iEnt) )
		return 0;
	
	set_pev(iEnt, pev_spawnflags, (pev(iEnt, pev_spawnflags)|SF_NORESPAWN));
	dllfunc(DLLFunc_Spawn, iEnt);
	
	new iSolidType = pev(iEnt, pev_solid);
	dllfunc(DLLFunc_Touch, iEnt, iPlrId);
	if( pev(iEnt, pev_solid)!=iSolidType )
		return iEnt;
	
	set_pev(iEnt, pev_flags, (pev(iEnt, pev_flags)|FL_KILLME));
	
	return -1;
}

bool:is_player_connected(iPlrId)
{
	if( 0<iPlrId<=g_iMaxPlayers )
	{
		if( CheckPlayerBit(g_iConnected, iPlrId) )
			return true;
	}
	
	return false;
}

bool:SphereToCartesian(Float:fDest[3], Float:fOrigin[3], Float:fView[3], Float:fAngle[3])
{
	fView[1] *= (M_PI/180.0); // and now angle[0] and angle[1] has no effect?
	fView[0] *= (M_PI/180.0); // yes, this code is eDarks, so I don't remember why I added that comment above
	
	fAngle[0] *= (M_PI/-180.0);
	fAngle[1] *= (M_PI/180.0);
	
	static Float:s_fSin0, Float:s_fCos0, Float:s_fSin1, Float:s_fCos1;
	s_fSin0 = floatsin((fAngle[0]+(M_PI*0.5)), radian);
	
	fDest[0] = fAngle[2]*s_fSin0*floatcos(fAngle[1], radian);
	fDest[1] = fAngle[2]*s_fSin0*floatsin(fAngle[1], radian);
	fDest[2] = fAngle[2]*floatcos((fAngle[0]+(M_PI*0.5)), radian);
	
	
	s_fSin0 = floatsin(fView[0], radian);
	s_fCos0 = floatcos(fView[0], radian);
	s_fSin1 = floatsin(fView[1], radian);
	s_fCos1 = floatcos(fView[1], radian);
	
	static Float:s_fTemp[3];
	s_fTemp[0] = (fDest[0]*s_fCos0*s_fCos1)-(fDest[1]*s_fSin1)+(fDest[2]*s_fSin0*s_fCos1);
	s_fTemp[1] = (fDest[0]*s_fCos0*s_fSin1)+(fDest[1]*s_fCos1)+(fDest[2]*s_fSin1*s_fSin0);
	s_fTemp[2] = (fDest[2]*s_fCos0)-(fDest[0]*s_fSin0);
	
	fDest[0] = (fOrigin[0]+s_fTemp[0]);
	fDest[1] = (fOrigin[1]+s_fTemp[1]);
	fDest[2] = (fOrigin[2]-s_fTemp[2]);
	
	return true;
}
Думата "хакер" е неправилно използвана в смисъл на "компютърен хакер" от някои журналисти. Ние, хакерите, отказваме да приемем това тълкуване и продължаваме да означаваме с него смисъла на "някой, който обича да го програмира и да го ползва". Изображение

Аватар
mBFF-TheFucKBG
Извън линия
Потребител
Потребител
Мнения: 311
Регистриран на: 09 Ное 2018, 16:40
Местоположение: Сливен
Се отблагодари: 13 пъти
Получена благодарност: 11 пъти

Заявка за редактиране на Drop Plugin

Мнение от mBFF-TheFucKBG » 28 Фев 2019, 07:24

МНЕНИЕТО Е СКРИТО ОТ СТРАНА НА МОДЕРАТОР! ЦЪКНИ ВЪРХУ ЛЕНТАТА ЗА ДА ГО ПРЕГЛЕДАШ.
Последно промяна от stambeto2006 на 28 Фев 2019, 07:42, променено общо 1 път.
Причина: Излишен коментар!
Фенче на СкандаУ <3

Аватар
Leonardo Da Vinci
Извън линия
Потребител
Потребител
Мнения: 67
Регистриран на: 30 Мар 2018, 20:55
Местоположение: #include <amxmodx>

Заявка за редактиране на Drop Plugin

Мнение от Leonardo Da Vinci » 28 Фев 2019, 16:13

Има предвид когато натиснеш +use, директно да ти го сменя на оръжието, което е на земята, а твоето да пада. Точно като в CS:GO.
Betrayal stings like salt on a wound.

Аватар
Huehue
Извън линия
Модератор
Модератор
Мнения: 352
Регистриран на: 16 Яну 2017, 23:42
Местоположение: София
Се отблагодари: 7 пъти
Получена благодарност: 171 пъти
Обратна връзка:

Заявка за редактиране на Drop Plugin

Мнение от Huehue » 28 Фев 2019, 22:46

Ако може и по подробно обяснение..

Ако го искаш както потребителя над мен е споменал с ефекта на CSGO, пробвай това
csgo_weapon_pickup_amxxbg_request.sma
(5.75 KiB) Свалено 138 пъти
csgo_weapon_pickup_amxxbg_request.sma
(5.75 KiB) Свалено 138 пъти
LOYAL TO THE OATH OF OMERTА̀

Зад монитора мъжкари, това не го разбирам..
На живо сте мишкари, това го гарантирам!
Седиш на 30 метра от мен като препариран!
Ако има нещо брат, номерът ми е блокиран..

My GitHub Profile
GitHub

My AMXX Includes Collection
AMXX Include Libraries

My Steam Profile (from SteamDB)
  • Value: 4179€
  • Games owned: 1855
  • Games played: 754 (40%)
  • Hours on record: 4,994.9h

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Заявки за плъгини”

Кой е на линия

Потребители разглеждащи този форум: Bing [Bot] и 19 госта