[Cerere Plugin] Probleme molotov [Rezolvat]

Categoria cu cereri de pluginuri si nu numai.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Forum rules
Accesează link-ul pentru a putea vedea regulile forumului

Daca doriti sa vi se modifice un plugin, va rugam postati aici .
Post Reply
User avatar
limbaa
Membru, skill 0
Membru, skill 0
Posts: 33
Joined: 26 Oct 2015, 11:25
Detinator Steam: Da
Detinator server CS: GOX.BLACKGAMES.RO
SteamID: tenlimba96
Fond eXtream: 0
Discord: GaBy#1976
Has thanked: 4 times
Contact:

28 Nov 2022, 06:16

Plugin Cerut: Plugin molotov
Descriere (adica ce face el mai exact): e un plugin ce modifica grenada smoke in molotov. Și acest plugin îmi face niste probleme adică poți cumpăra cate molotov vrei dar eu vreau sa poți cumpăra doar 1 pe runda.
Ai cautat pluginul?(daca da, precizeaza cum): dap, îl las mai jos
Serverul impune conditii strict HLDS/REHLDS?: Rehlds
Necesita mod special?: nu
Versiune AMXX Server: 1.9


Code: Select all

/*

				Molotov Cocktail
				  Version 3.1c
                         by: SAMURAI & [ --<-@ ] Black Rose

* Commands:
- say molotov - buy a molotov.
- say /molotov - buya  molotov.
- molotov_give [optional:player] - give player a molotov, if no player id will be given a molotov.
- molotov_cocktail - See the plugin status


* Cvars
- New  - Enable/disable the plugin [1= enabled ; 0 = disabled]
- molotov_price - Set the molotov price [default = 1200]
- molotov_damage - set the damage done by molotov [default = 40.0]
- molotov_radius - set the radius of molotov damage [default = 200.0]
- molotov_firetime - duration of fire effects, sounds etc [default = 6]
- molotov_firedamage - ammount of damage done by fire effects. [default = 1] ( every 0.2 secs )
- molotov_tk - disable/enable the ability to damage/kill someone on your team with molotov. [default = 1]
- molotov_tempoverride - override the original hegrenade autmoaticly with molotov. [default = 0]
- molotov_max - max num of molotovs able to carry. [default = 1] ( Does not work with override )
- molotov_inmenu - Puts molotov in the end of the equipment buymenu. [default = 0] ( if the override cvar is enabled the hegrenade will be replaced instead. )
- molotov_buyzone - do you have to be in buyzone? [default = 1] ( if inmenu this is ignored )

* Required Modules:
- Fakemeta
- Fun
- Cstrike
- CSX

* Have a nice day now
*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <csx>
#include <fun>
#include <fakemeta_util>

#define AUTHORS "SAMURAI & Black Rose"

#define ADMIN_ACCESS ADMIN_KICK

#define ICON_R 255
#define ICON_G 170
#define ICON_B 0

#define ANTI_LAGG 7.0	// Defines max calculations before a flame is spawned without check if onground
// This is  to prevent lagg at really narrow ents where you could end up with 400 calculations per flame
// Suggested: <= 10

new pnumplugin, pprice, pMlDamage, pMlRadius, pFireTime, pOverride;
new pTeamKill, pFireDmg, pMaxMolotovs, pBuyMenu, pBuyZone;

new gmsgScoreInfo, gmsgDeathMsg;

new g_pAllocModel, g_vAllocModel;

new g_frags[33];
new g_hasMolotov[33];
new g_restarted;
new g_MaxPlayers;
new g_bomb_map;

new firespr, smokespr[2];


public plugin_init() {
	
	register_plugin("Molotov Cocktail", "3.1c", AUTHORS);
	
	register_clcmd("say /molotov","buy_molotov");
	register_clcmd("say molotov","buy_molotov");
	register_concmd("molotov_give", "cmd_MolotovGive", ADMIN_ACCESS);
	register_concmd("molotov_override", "cmd_Override", ADMIN_ACCESS);
	register_concmd("molotov_cocktail", "cmd_PluginStatus", ADMIN_ACCESS);
	
	pnumplugin = register_cvar("molotov_tempcocktail","1", FCVAR_SPONLY);
	pOverride = register_cvar("molotov_tempoverride", "1", FCVAR_SPONLY); 
	
	pprice = register_cvar("molotov_price","1200");
	pMlDamage = register_cvar("molotov_damage","40.0");
	pMlRadius = register_cvar("molotov_radius","200.0");
	pFireTime = register_cvar("molotov_firetime", "6");
	pFireDmg = register_cvar("molotov_firedamage", "1");
	pTeamKill = register_cvar("molotov_tk", "0");
	pMaxMolotovs = register_cvar("molotov_max", "1");
	pBuyMenu = register_cvar("molotov_inmenu", "1");
	pBuyZone = register_cvar("molotov_buyzone", "1");
	
	register_event("CurWeapon", "Event_CurWeapon","be", "1=1");
	register_event("HLTV","event_new_round", "a","1=0", "2=0");
	register_event("TextMsg","Event_GameRestart","a","2=#Game_Commencing","2=#Game_will_restart_in");
	register_event("DeathMsg", "event_DeathMsg", "a");
	
	register_event("ShowMenu", "event_BuyMenuT", "b", "4=#T_BuyItem", "1=575");
	register_event("ShowMenu", "event_BuyMenuCT", "b", "4=#CT_BuyItem", "1=703");
	register_event("ShowMenu", "event_BuyMenuT", "b", "4=#DT_BuyItem", "1=575");
	register_event("ShowMenu", "event_BuyMenuCT", "b", "4=#DCT_BuyItem", "1=767");
	
	register_menucmd(register_menuid("#CT_BuyItem"), 1023, "handle_BuyMenuCT");
	register_menucmd(register_menuid("#T_BuyItem"), 1023, "handle_BuyMenuT");
	
	register_forward(FM_EmitSound, "fw_EmitSound");
	
	g_MaxPlayers = get_maxplayers();
	
	gmsgScoreInfo = get_user_msgid("ScoreInfo");
	gmsgDeathMsg = get_user_msgid("DeathMsg");
	
	g_pAllocModel = engfunc(EngFunc_AllocString, "models/p_molotov.mdl");
	g_vAllocModel = engfunc(EngFunc_AllocString, "models/v_molotov.mdl");
	
	g_bomb_map = engfunc(EngFunc_FindEntityByString, g_MaxPlayers, "classname", "info_bomb_target") ? 1 : 0;
}

public cmd_Override(id,level,cid) {	
	
	if ( ! cmd_access(id, level,cid,1) ) 
		return PLUGIN_HANDLED;
	
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	new arg[2];
	read_argv(1, arg, 1);
	
	new num = str_to_num(arg);
	
	if ( 1 < num < 0 ) {
		if ( id )
			client_print(id, print_console, "Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		else
			server_print("Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		return PLUGIN_HANDLED;
	}
	
	if ( num == get_pcvar_num(pOverride) ) {
		if ( id )
			client_print(id, print_console, "Override is already %s.", num ? "enabled" : "disabled");
		else
			server_print("Override is already %s.", num ? "enabled" : "disabled");
		return PLUGIN_HANDLED;
	}
	
	set_pcvar_num(pOverride, num);
	
	if ( id )
		client_print(id, print_console, "Override was %s.", num ? "enabled" : "disabled");
	else
		server_print("Override was %s.", num ? "enabled" : "disabled");
	
	if ( num )
		set_molotovs();
	else
		reset_molotovs();
	
	return PLUGIN_HANDLED;
}

public cmd_PluginStatus(id,level,cid) {
	
	if ( ! cmd_access(id,level,cid,2))  	
		return PLUGIN_HANDLED;
	
	
	new arg[2];
	read_argv(1, arg, 1);
	
	new num = str_to_num(arg);
	
	if ( 1 < num < 0 ) {
		if ( id )
			client_print(id, print_console, "Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		else
			server_print("Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		return PLUGIN_HANDLED;
	}
	
	if ( num == get_pcvar_num(pnumplugin) ) {
		if ( id )
			client_print(id, print_console, "Plugin is already %s.", num ? "enabled" : "disabled");
		else
			server_print("Plugin is already %s.", num ? "enabled" : "disabled");
		return PLUGIN_HANDLED;
	}
	
	set_pcvar_num(pnumplugin, num);
	
	if ( id )
		client_print(id, print_console, "Plugin was %s.", num ? "enabled" : "disabled");
	else
		server_print("Plugin was %s.", num ? "enabled" : "disabled");
	
	if ( num && get_pcvar_num(pOverride) )
		set_molotovs();
	else
		reset_molotovs();
	
	return PLUGIN_HANDLED;
}

public cmd_MolotovGive(id,level,cid) {
	
	if( !cmd_access(id,level,cid,2) ) 
		return PLUGIN_HANDLED;
	
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	new arg[32];
	read_argv(1, arg, 31);
	
	new target;
	
	if ( ! arg[0] ) {
		if ( id )
			target = id;
		else
			server_print("You have to enter a name of a client to give the molotov to");
	}
	else
		target = cmd_target(id, arg, 6);
	
	if ( ! target ) 
	{
		id ? client_print(id, print_console, "None or multiple clients found with that name.") : server_print("None or multiple clients found with that name.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[target] == get_pcvar_num(pMaxMolotovs) ) {
		if ( g_hasMolotov[target] == 1 ) {
			if ( id )
				client_print(id, print_center, "Client already have a Molotov Cocktail.");
			else
				server_print("Client already have a Molotov Cocktail.");
		}
		else {
			if ( id )
				client_print(id, print_center, "Client already have %d Molotov Cocktails.", g_hasMolotov[target]);
			else
				server_print("Client already have %d Molotov Cocktails.", g_hasMolotov[target]);
		}
		
		return PLUGIN_CONTINUE;
	}
	
	if ( ! g_hasMolotov[target] && user_has_weapon(target, CSW_SMOKEGRENADE) ) {
		if ( id )
			client_print(id, print_console, "Client already has a Smoke Grenade");
		else
			server_print("Client already has a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[target]++;
	
	give_item(target, "weapon_smokegrenade");
	cs_set_user_bpammo(target, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(target, print_chat, "You got a Molotov Cocktail!");
	
	return PLUGIN_HANDLED;
}

public buy_molotov(id) {
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	if ( get_pcvar_num(pOverride) ) {
		if ( get_pcvar_num(pBuyMenu) )
			client_print(id, print_center, "Buy them in the buy equipment menu.");
		else
			client_print(id, print_center, "Just buy a smoke grenade and get molotov automaticly!");
		return PLUGIN_HANDLED;
	}
	
	if ( ! is_user_alive(id) ) {
		client_print(id, print_center, "You can't buy Molotov Cocktails because you are dead.");
		return PLUGIN_HANDLED;
	}
	
	if ( ! cs_get_user_buyzone(id) && get_pcvar_num(pBuyZone) ) {
		client_print(id, print_center, "You are not in a buyzone.");
		return PLUGIN_HANDLED;
	}
	
	new money = cs_get_user_money(id);
	
	if ( money < get_pcvar_num(pprice) ) {
		client_print(id, print_center, "You don't have enough $ to buy a Molotov Cocktail.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[id] == get_pcvar_num(pMaxMolotovs) ) {
		if ( g_hasMolotov[id] == 1 )
			client_print(id, print_center, "You already have a Molotov Cocktail.");
		else
			client_print(id, print_center, "You already have %d Molotov Cocktails.", g_hasMolotov[id]);
		return PLUGIN_HANDLED;
	}
	
	if ( ! g_hasMolotov[id] && user_has_weapon(id, CSW_SMOKEGRENADE) ) {
		client_print(id, print_center, "You already have a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[id]++;
	
	cs_set_user_money(id, money - get_pcvar_num(pprice) );
	give_item(id, "weapon_smokegrenade");
	cs_set_user_bpammo(id, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(id, print_chat, "You got a Molotov Cocktail!");
	
	return PLUGIN_HANDLED;
}

public plugin_precache() {
	
	precache_model("models/p_molotov.mdl");
	precache_model("models/b_molotov.mdl");
	precache_model("models/w_molotov.mdl");
	
	firespr = precache_model("sprites/gox_flame.spr");
	
	smokespr[0] = precache_model("sprites/black_smoke3.spr");
	smokespr[1] = precache_model("sprites/steam1.spr");
	
	precache_sound("misc/molotov_fire.wav");
	precache_sound("misc/molotov_explosion.wav");
}

public fw_EmitSound(ent, channel, sample[]) {
	
	if ( equal(sample[8], "sg_explode", 10) ) {
		
		new model[32];
		pev(ent, pev_model, model, 31);
		
		if ( equal(model[9], "molotov.mdl") )
			grenade_explode(ent);
	}
}

public Event_CurWeapon(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! is_user_alive(id) )
		return PLUGIN_CONTINUE;
	
	if ( ! g_hasMolotov[id] && ! get_pcvar_num(pOverride) )
		return PLUGIN_CONTINUE;
	
	new WeaponID = get_user_weapon(id, WeaponID, WeaponID);
	
	if ( WeaponID != CSW_SMOKEGRENADE )
		return PLUGIN_CONTINUE;
	
	set_pev(id, pev_viewmodel, g_vAllocModel);
	set_pev(id, pev_weaponmodel, g_pAllocModel);
	set_pev(id, pev_weaponanim, 9);
	
	return PLUGIN_CONTINUE;
}

public Event_GameRestart() g_restarted = 1;

public event_DeathMsg() g_hasMolotov[read_data(2)] = 0;

public event_new_round() {
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_CONTINUE;
	
	for ( new i ; i < g_MaxPlayers ; i++ ) {
		if ( g_frags && is_user_connected(i) )
			set_user_frags(i, get_user_frags(i) + g_frags);
		g_frags = 0;
	}
	
	if ( g_restarted ) {
		for ( new i ; i < g_MaxPlayers ; i++ )
			g_hasMolotov = 0;
		g_restarted = 0;
	}
	
	if ( get_pcvar_num(pOverride) )
		set_molotovs();
	else
		reset_molotovs();
	
	return PLUGIN_CONTINUE;
}

public event_BuyMenuCT(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! get_pcvar_num(pBuyMenu) )
		return PLUGIN_CONTINUE;
	
	new Override = get_pcvar_num(pOverride);
	
	new menu[1024];
	new len = formatex(menu, 1023, "\yBuy Equipment\R$ Cost");
	len += formatex(menu[len], 1023-len, "^n^n\w1. Kevlar Vest\R\y650");
	len += formatex(menu[len], 1023-len, "^n\w2. Kevlar Vest & Helmet\R\y1000");
	len += formatex(menu[len], 1023-len, "^n\w3. Flashbang\R\y200");
	len += formatex(menu[len], 1023-len, "^n\w4. HE Grenade\R\y300");
	
	if ( Override )
		len += formatex(menu[len], 1023-len, "^n\w5. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	else
		len += formatex(menu[len], 1023-len, "^n\w5. Smoke Grenade\R\y300");
		
	len += formatex(menu[len], 1023-len, "^n\w6. NightVision Goggles\R\y1250");
	len += formatex(menu[len], 1023-len, "^n\%c7. Defuse Kit\R\y200 ", g_bomb_map ? 'w' : 'd');
	len += formatex(menu[len], 1023-len, "^n\w8. Tactical Shield\R\y2200");
	
	if ( ! Override )
		len += formatex(menu[len], 1023-len, "^n\w9. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	
	len += formatex(menu[len], 1023-len, "^n^n\w0. Exit");
	
	show_menu(id, read_data(1)|MENU_KEY_9, menu, -1, "#CT_BuyItem");
	
	return PLUGIN_HANDLED;
}

public event_BuyMenuT(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! get_pcvar_num(pBuyMenu) )
		return PLUGIN_CONTINUE;
	
	new Override = get_pcvar_num(pOverride);
	
	new menu[1024];
	new len = formatex(menu, 1023, "\yBuy Equipment\R$ Cost");
	len += formatex(menu[len], 1023-len, "^n^n\w1. Kevlar Vest\R\y650");
	len += formatex(menu[len], 1023-len, "^n\w2. Kevlar Vest & Helmet\R\y1000");
	len += formatex(menu[len], 1023-len, "^n\w3. Flashbang\R\y200");
	len += formatex(menu[len], 1023-len, "^n\w4. HE Grenade\R\y300");
		
	if ( Override )
		len += formatex(menu[len], 1023-len, "^n\w5. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	else
		len += formatex(menu[len], 1023-len, "^n\w5. Smoke Grenade\R\y300");
		
	len += formatex(menu[len], 1023-len, "^n\w6. NightVision Goggles\R\y1250");
	
	if ( !Override )
		len += formatex(menu[len], 1023-len, "^n\w7. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	
	len += formatex(menu[len], 1023-len, "^n^n\w0. Exit");
	
	show_menu(id, read_data(1)|MENU_KEY_7, menu, -1, "#T_BuyItem");
	
	return PLUGIN_HANDLED;
}

public handle_BuyMenuCT(id, key) 
{
	 
	if ( get_pcvar_num(pOverride) ) 
	{
		if ( key != 4 )
		return PLUGIN_CONTINUE;
	}
    
	else 
	{
		if ( key != 8 )
		return PLUGIN_CONTINUE;
	}
    
	handle_BuyMenu(id);
    
	return PLUGIN_HANDLED;
}

public handle_BuyMenuT(id, key) 
{
    
	if ( get_pcvar_num(pOverride) ) 
	{
		if ( key != 4 )
		return PLUGIN_CONTINUE;
	}
    
	else 
	{
		if ( key != 6 )
		return PLUGIN_CONTINUE;
	}
    
	handle_BuyMenu(id);
    
	return PLUGIN_HANDLED;
}

stock handle_BuyMenu(id) {
	
	new money = cs_get_user_money(id);
	
	if ( money < get_pcvar_num(pprice) ) {
		client_print(id, print_center, "You don't have enough $ to buy a Molotov Cocktail.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[id] == get_pcvar_num(pMaxMolotovs) ) {
		if ( g_hasMolotov[id] == 1 )
			client_print(id, print_center, "You already have a Molotov Cocktail.");
		else
			client_print(id, print_center, "You already have %d Molotov Cocktails.", g_hasMolotov[id]);
		return PLUGIN_HANDLED;
	}
	
	else if ( ! g_hasMolotov[id] && user_has_weapon(id, CSW_SMOKEGRENADE) ) {
		client_print(id, print_center, "You already have a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[id]++;
	
	cs_set_user_money(id, money - get_pcvar_num(pprice) );
	give_item(id, "weapon_smokegrenade");
	cs_set_user_bpammo(id, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(id, print_chat, "You got a Molotov Cocktail!");
	
	return PLUGIN_HANDLED;
}

public grenade_throw(id, ent, wid) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! is_user_connected(id) || wid != CSW_SMOKEGRENADE )
		return PLUGIN_CONTINUE;
	
	if ( ! g_hasMolotov[id] && ! get_pcvar_num(pOverride) )
		return PLUGIN_CONTINUE;
	
	g_hasMolotov[id]--;
	engfunc(EngFunc_SetModel, ent, "models/w_molotov.mdl");
	set_pev(ent, pev_nextthink, 99999.0);
	
	return PLUGIN_CONTINUE;
}

public grenade_explode(ent) {
	
	new Float:fOrigin[3];
	pev(ent, pev_origin, fOrigin);
	
	new owner = pev(ent, pev_owner);
	new ent2 = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
	
	new param[5], iOrigin[3];
	param[0] = owner;
	param[1] = iOrigin[0] = floatround(fOrigin[0]);
	param[2] = iOrigin[1] = floatround(fOrigin[1]);
	param[3] = iOrigin[2] = floatround(fOrigin[2]);
	param[4] = ent2;
	
	radius_damage(owner, fOrigin, get_pcvar_float(pMlDamage), get_pcvar_float(pMlRadius), DMG_BLAST);
	emit_sound(ent, CHAN_AUTO, "misc/molotov_explosion.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	
	engfunc(EngFunc_RemoveEntity, ent);
	
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
	
	new param2[2];
	param2[0] = ent;
	param2[1] = ent2;
	
	random_fire(iOrigin, ent2);
	
	new Float:FireTime = get_pcvar_float(pFireTime);
	
	set_task(0.2, "fire_damage", 56235 + random_num(-100, 100), param, 5, "a", floatround(FireTime / 0.2, floatround_floor));
	set_task(1.0, "fire_sound", 37235 + random_num(-100, 100), param2, 2, "a", floatround(FireTime) - 1);
	set_task(FireTime, "fire_stop", 27367 + random_num(-100, 100), param2, 2);
	
	return PLUGIN_CONTINUE;
}

public fire_sound(param[])
	emit_sound(param[0], CHAN_AUTO, "misc/molotov_fire.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

new Float:g_i;
new Float:g_g;

public fire_stop(param[]) {
	g_g = 0.0;
	g_i = 0.0;
	engfunc(EngFunc_RemoveEntity, param[0]);
}

public fire_damage(param[]) {
	
	new iOrigin[3], Float:fOrigin[3];
	iOrigin[0] = param[1];
	iOrigin[1] = param[2];
	iOrigin[2] = param[3];
	
	random_fire(iOrigin, param[4]);
	
	IVecFVec(iOrigin, fOrigin);
	radius_damage(param[0], fOrigin, get_pcvar_float(pFireDmg), get_pcvar_float(pMlRadius), DMG_BURN, 0);
}

stock radius_damage(attacker, Float:origin[3], Float:damage, Float:range, dmgtype, calc = 1) {
	
	new Float:pOrigin[3], Float:dist, Float:tmpdmg/*, iOrigin[3] */;
	new i, ateam = get_user_team(attacker), TK = get_pcvar_num(pTeamKill);
	
	while ( i++ < g_MaxPlayers ) {
		
		if ( ! is_user_alive(i) )
			continue;
		
		if ( ! TK && ateam == get_user_team(i) )
			continue;
		
		pev(i, pev_origin, pOrigin);
		dist = get_distance_f(origin, pOrigin);
		
		if ( dist > range )
			continue;
		
		if ( calc )
			tmpdmg = damage - ( damage / range ) * dist;
		else
			tmpdmg = damage;
		
		if ( pev(i, pev_health) < tmpdmg )
			kill(attacker, i);
		else
			fm_fakedamage(i, "molotov", tmpdmg, dmgtype);
		
		// FVecIVec(pOrigin, iOrigin);
		// Flame(iOrigin, 1);
	}
	
	while ( ( i = engfunc(EngFunc_FindEntityInSphere, i, origin, range) ) ) {
		if ( pev(i, pev_takedamage) ) {
			if ( calc ) {
				pev(i, pev_origin, pOrigin);
				tmpdmg = damage - ( damage / range ) * get_distance_f(origin, pOrigin);
			}
			else
				tmpdmg = damage;
			
			// FVecIVec(pOrigin, iOrigin);
			// Flame(iOrigin, 1);
			
			fm_fakedamage(i, "molotov", tmpdmg, dmgtype);
		}
	}
}

stock random_fire(Origin[3], ent) {
	
	new range = get_pcvar_num(pMlRadius);
	new iOrigin[3];
	
	for ( new i = 1 ; i <= 5 ; i++ ) {
		
		g_i++;
		g_g++;
		
		iOrigin[0] = Origin[0] + random_num(-range, range);
		iOrigin[1] = Origin[1] + random_num(-range, range);
		iOrigin[2] = Origin[2];
		iOrigin[2] = ground_z(iOrigin, ent);
		
		while ( get_distance(iOrigin, Origin) > range ) {
			g_g++;
			iOrigin[0] = Origin[0] + random_num(-range, range);
			iOrigin[1] = Origin[1] + random_num(-range, range);
			iOrigin[2] = Origin[2];
			if ( g_g / g_i >= ANTI_LAGG )
				iOrigin[2] = ground_z(iOrigin, ent, 1);
			else
				iOrigin[2] = ground_z(iOrigin, ent);
		}
		
		if ( ! ( i % 4 ) )
			Flame(iOrigin, (!(i%4)));
		else
			Flame(iOrigin, 0);
	}
}

stock Flame(iOrigin[3], smoke) {
	
	new rand = random_num(5, 15);
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
	write_byte(TE_SPRITE);
	write_coord(iOrigin[0]);
	write_coord(iOrigin[1]);
	write_coord(iOrigin[2] + rand * 10);
	write_short(firespr);
	write_byte(rand);
	write_byte(100);
	message_end();
	
	if ( smoke ) {
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
		write_byte(TE_SMOKE);
		write_coord(iOrigin[0]);
		write_coord(iOrigin[1]);
		write_coord(iOrigin[2] + 120);
		write_short(smokespr[random_num(0, 1)]);
		write_byte(random_num(10, 30));
		write_byte(random_num(10, 20));
		message_end();
	}
	
}

stock kill(k, v) {
	
	user_silentkill(v);
	
	new kteam = get_user_team(k);
	new vteam = get_user_team(v);
	
	new kfrags = get_user_frags(k) + 1;
	new kdeaths = get_user_deaths(k);
	if ( kteam == vteam )
		kfrags = get_user_frags(k) - 2;
	
	new vfrags = get_user_frags(v);
	new vdeaths = get_user_deaths(v);
	
	message_begin(MSG_ALL, gmsgScoreInfo);
	write_byte(k);
	write_short(kfrags);
	write_short(kdeaths);
	write_short(0);
	write_short(kteam);
	message_end();
	
	message_begin(MSG_ALL, gmsgScoreInfo);
	write_byte(v);
	write_short(vfrags + 1);
	write_short(vdeaths);
	write_short(0);
	write_short(vteam);
	message_end();
	
	message_begin(MSG_ALL, gmsgDeathMsg, {0,0,0}, 0);
	write_byte(k);
	write_byte(v);
	write_byte(0);
	write_string("molotov");
	message_end();
	
	g_frags[k]++;
	
	if ( kteam != vteam )
		cs_set_user_money(k, cs_get_user_money(k) + 300);
	else
		cs_set_user_money(k, cs_get_user_money(k) - 300);
}

stock ground_z(iOrigin[3], ent, skip = 0) {
	
	iOrigin[2] += random_num(5, 80);
	
	new Float:fOrigin[3];
	
	IVecFVec(iOrigin, fOrigin);
	
	set_pev(ent, pev_origin, fOrigin);
	
	engfunc(EngFunc_DropToFloor, ent);
	
	if ( ! skip && ! engfunc(EngFunc_EntIsOnFloor, ent) )
		return ground_z(iOrigin, ent);
	
	pev(ent, pev_origin, fOrigin);
	
	return floatround(fOrigin[2]);
}

stock reset_molotovs() {
	new ent = g_MaxPlayers;
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "model", "models/w_molotov.mdl")))
		engfunc(EngFunc_SetModel, ent, "models/w_smokegrenade.mdl");
}

stock set_molotovs() {
	new ent = g_MaxPlayers;
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "model", "models/w_smokegrenade.mdl")))
		engfunc(EngFunc_SetModel, ent, "models/w_molotov.mdl");
}
Last edited by limbaa on 02 Dec 2022, 11:54, edited 1 time in total.
RoyalServer
lexz
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 918
Joined: 02 Nov 2020, 01:57
Detinator Steam: Da
Fond eXtream: 0
Discord: lexzor#0630
Has thanked: 71 times
Been thanked: 136 times

28 Nov 2022, 08:21

edit: nvm
User avatar
levin
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 3844
Joined: 24 Aug 2011, 12:24
Detinator Steam: Da
CS Status:
Detinator server CS: ☯∴
SteamID: riseofevo
Reputatie: Scripter eXtreamCS
Nume anterior: Adryyy
Location: ҳ̸Ҳ̸ҳ
Discord: devilclass
Has thanked: 36 times
Been thanked: 594 times
Contact:

28 Nov 2022, 16:08

Code: Select all

/*

				Molotov Cocktail
				  Version 3.1c
                         by: SAMURAI & [ --<-@ ] Black Rose

* Commands:
- say molotov - buy a molotov.
- say /molotov - buya  molotov.
- molotov_give [optional:player] - give player a molotov, if no player id will be given a molotov.
- molotov_cocktail - See the plugin status


* Cvars
- New  - Enable/disable the plugin [1= enabled ; 0 = disabled]
- molotov_price - Set the molotov price [default = 1200]
- molotov_damage - set the damage done by molotov [default = 40.0]
- molotov_radius - set the radius of molotov damage [default = 200.0]
- molotov_firetime - duration of fire effects, sounds etc [default = 6]
- molotov_firedamage - ammount of damage done by fire effects. [default = 1] ( every 0.2 secs )
- molotov_tk - disable/enable the ability to damage/kill someone on your team with molotov. [default = 1]
- molotov_tempoverride - override the original hegrenade autmoaticly with molotov. [default = 0]
- molotov_max - max num of molotovs able to carry. [default = 1] ( Does not work with override )
- molotov_inmenu - Puts molotov in the end of the equipment buymenu. [default = 0] ( if the override cvar is enabled the hegrenade will be replaced instead. )
- molotov_buyzone - do you have to be in buyzone? [default = 1] ( if inmenu this is ignored )

* Required Modules:
- Fakemeta
- Fun
- Cstrike
- CSX

* Have a nice day now
*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <csx>
#include <fun>
#include <fakemeta_util>

#define AUTHORS "SAMURAI & Black Rose"

#define ADMIN_ACCESS ADMIN_KICK

#define ICON_R 255
#define ICON_G 170
#define ICON_B 0

#define ANTI_LAGG 7.0	// Defines max calculations before a flame is spawned without check if onground
// This is  to prevent lagg at really narrow ents where you could end up with 400 calculations per flame
// Suggested: <= 10

new pnumplugin, pprice, pMlDamage, pMlRadius, pFireTime, pOverride;
new pTeamKill, pFireDmg, pMaxMolotovs, pBuyMenu, pBuyZone;

new gmsgScoreInfo, gmsgDeathMsg;

new g_pAllocModel, g_vAllocModel;

new g_frags[33];
new g_hasMolotov[33];
new g_restarted;
new g_MaxPlayers;
new g_bomb_map;

new firespr, smokespr[2];

new bool:have_molotov[33]

public plugin_init() {
	
	register_plugin("Molotov Cocktail", "3.1c", AUTHORS);
	
	register_clcmd("say /molotov","buy_molotov");
	register_clcmd("say molotov","buy_molotov");
	register_concmd("molotov_give", "cmd_MolotovGive", ADMIN_ACCESS);
	register_concmd("molotov_override", "cmd_Override", ADMIN_ACCESS);
	register_concmd("molotov_cocktail", "cmd_PluginStatus", ADMIN_ACCESS);
	
	pnumplugin = register_cvar("molotov_tempcocktail","1", FCVAR_SPONLY);
	pOverride = register_cvar("molotov_tempoverride", "1", FCVAR_SPONLY); 
	
	pprice = register_cvar("molotov_price","1200");
	pMlDamage = register_cvar("molotov_damage","40.0");
	pMlRadius = register_cvar("molotov_radius","200.0");
	pFireTime = register_cvar("molotov_firetime", "6");
	pFireDmg = register_cvar("molotov_firedamage", "1");
	pTeamKill = register_cvar("molotov_tk", "0");
	pMaxMolotovs = register_cvar("molotov_max", "1");
	pBuyMenu = register_cvar("molotov_inmenu", "1");
	pBuyZone = register_cvar("molotov_buyzone", "1");
	
	register_event("CurWeapon", "Event_CurWeapon","be", "1=1");
	register_event("HLTV","event_new_round", "a","1=0", "2=0");
	register_event("TextMsg","Event_GameRestart","a","2=#Game_Commencing","2=#Game_will_restart_in");
	register_event("DeathMsg", "event_DeathMsg", "a");
	
	register_event("ShowMenu", "event_BuyMenuT", "b", "4=#T_BuyItem", "1=575");
	register_event("ShowMenu", "event_BuyMenuCT", "b", "4=#CT_BuyItem", "1=703");
	register_event("ShowMenu", "event_BuyMenuT", "b", "4=#DT_BuyItem", "1=575");
	register_event("ShowMenu", "event_BuyMenuCT", "b", "4=#DCT_BuyItem", "1=767");
	
	register_menucmd(register_menuid("#CT_BuyItem"), 1023, "handle_BuyMenuCT");
	register_menucmd(register_menuid("#T_BuyItem"), 1023, "handle_BuyMenuT");
	
	register_forward(FM_EmitSound, "fw_EmitSound");
	
	g_MaxPlayers = get_maxplayers();
	
	gmsgScoreInfo = get_user_msgid("ScoreInfo");
	gmsgDeathMsg = get_user_msgid("DeathMsg");
	
	g_pAllocModel = engfunc(EngFunc_AllocString, "models/p_molotov.mdl");
	g_vAllocModel = engfunc(EngFunc_AllocString, "models/v_molotov.mdl");
	
	g_bomb_map = engfunc(EngFunc_FindEntityByString, g_MaxPlayers, "classname", "info_bomb_target") ? 1 : 0;
}

public cmd_Override(id,level,cid) {	
	
	if ( ! cmd_access(id, level,cid,1) ) 
		return PLUGIN_HANDLED;
	
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	new arg[2];
	read_argv(1, arg, 1);
	
	new num = str_to_num(arg);
	
	if ( 1 < num < 0 ) {
		if ( id )
			client_print(id, print_console, "Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		else
			server_print("Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		return PLUGIN_HANDLED;
	}
	
	if ( num == get_pcvar_num(pOverride) ) {
		if ( id )
			client_print(id, print_console, "Override is already %s.", num ? "enabled" : "disabled");
		else
			server_print("Override is already %s.", num ? "enabled" : "disabled");
		return PLUGIN_HANDLED;
	}
	
	set_pcvar_num(pOverride, num);
	
	if ( id )
		client_print(id, print_console, "Override was %s.", num ? "enabled" : "disabled");
	else
		server_print("Override was %s.", num ? "enabled" : "disabled");
	
	if ( num )
		set_molotovs();
	else
		reset_molotovs();
	
	return PLUGIN_HANDLED;
}

public cmd_PluginStatus(id,level,cid) {
	
	if ( ! cmd_access(id,level,cid,2))  	
		return PLUGIN_HANDLED;
	
	
	new arg[2];
	read_argv(1, arg, 1);
	
	new num = str_to_num(arg);
	
	if ( 1 < num < 0 ) {
		if ( id )
			client_print(id, print_console, "Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		else
			server_print("Invalid argument(%d). Valid arguments are ^"0^" and ^"1^".", num);
		return PLUGIN_HANDLED;
	}
	
	if ( num == get_pcvar_num(pnumplugin) ) {
		if ( id )
			client_print(id, print_console, "Plugin is already %s.", num ? "enabled" : "disabled");
		else
			server_print("Plugin is already %s.", num ? "enabled" : "disabled");
		return PLUGIN_HANDLED;
	}
	
	set_pcvar_num(pnumplugin, num);
	
	if ( id )
		client_print(id, print_console, "Plugin was %s.", num ? "enabled" : "disabled");
	else
		server_print("Plugin was %s.", num ? "enabled" : "disabled");
	
	if ( num && get_pcvar_num(pOverride) )
		set_molotovs();
	else
		reset_molotovs();
	
	return PLUGIN_HANDLED;
}

public cmd_MolotovGive(id,level,cid) {
	
	if( !cmd_access(id,level,cid,2) ) 
		return PLUGIN_HANDLED;
	
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	new arg[32];
	read_argv(1, arg, 31);
	
	new target;
	
	if ( ! arg[0] ) {
		if ( id )
			target = id;
		else
			server_print("You have to enter a name of a client to give the molotov to");
	}
	else
		target = cmd_target(id, arg, 6);
	
	if ( ! target ) 
	{
		id ? client_print(id, print_console, "None or multiple clients found with that name.") : server_print("None or multiple clients found with that name.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[target] == get_pcvar_num(pMaxMolotovs) || have_molotov[target] ) {
		if ( g_hasMolotov[target] == 1 ) {
			if ( id )
				client_print(id, print_center, "Client already have a Molotov Cocktail.");
			else
				server_print("Client already have a Molotov Cocktail.");
		}
		else {
			if ( id )
				client_print(id, print_center, "Client already have %d Molotov Cocktails.", g_hasMolotov[target]);
			else
				server_print("Client already have %d Molotov Cocktails.", g_hasMolotov[target]);
		}
		
		return PLUGIN_CONTINUE;
	}
	
	if ( ! g_hasMolotov[target] && user_has_weapon(target, CSW_SMOKEGRENADE) ) {
		if ( id )
			client_print(id, print_console, "Client already has a Smoke Grenade");
		else
			server_print("Client already has a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[target]++;
	
	give_item(target, "weapon_smokegrenade");
	cs_set_user_bpammo(target, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(target, print_chat, "You got a Molotov Cocktail!");

	have_molotov[target]=true
	
	return PLUGIN_HANDLED;
}

public buy_molotov(id) {
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_HANDLED;
	
	if ( get_pcvar_num(pOverride) ) {
		if ( get_pcvar_num(pBuyMenu) )
			client_print(id, print_center, "Buy them in the buy equipment menu.");
		else
			client_print(id, print_center, "Just buy a smoke grenade and get molotov automaticly!");
		return PLUGIN_HANDLED;
	}
	
	if ( ! is_user_alive(id) ) {
		client_print(id, print_center, "You can't buy Molotov Cocktails because you are dead.");
		return PLUGIN_HANDLED;
	}
	
	if ( ! cs_get_user_buyzone(id) && get_pcvar_num(pBuyZone) ) {
		client_print(id, print_center, "You are not in a buyzone.");
		return PLUGIN_HANDLED;
	}
	
	new money = cs_get_user_money(id);
	
	if ( money < get_pcvar_num(pprice) ) {
		client_print(id, print_center, "You don't have enough $ to buy a Molotov Cocktail.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[id] == get_pcvar_num(pMaxMolotovs) || have_molotov[id] ) {
		if ( g_hasMolotov[id] == 1 )
			client_print(id, print_center, "You already have a Molotov Cocktail.");
		else
			client_print(id, print_center, "You already have %d Molotov Cocktails.", g_hasMolotov[id]);
		return PLUGIN_HANDLED;
	}
	
	if ( ! g_hasMolotov[id] && user_has_weapon(id, CSW_SMOKEGRENADE) ) {
		client_print(id, print_center, "You already have a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[id]++;
	
	cs_set_user_money(id, money - get_pcvar_num(pprice) );
	give_item(id, "weapon_smokegrenade");
	cs_set_user_bpammo(id, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(id, print_chat, "You got a Molotov Cocktail!");

	have_molotov[id]=true
	
	return PLUGIN_HANDLED;
}

public plugin_precache() {
	
	precache_model("models/p_molotov.mdl");
	precache_model("models/b_molotov.mdl");
	precache_model("models/w_molotov.mdl");
	
	firespr = precache_model("sprites/gox_flame.spr");
	
	smokespr[0] = precache_model("sprites/black_smoke3.spr");
	smokespr[1] = precache_model("sprites/steam1.spr");
	
	precache_sound("misc/molotov_fire.wav");
	precache_sound("misc/molotov_explosion.wav");
}

public fw_EmitSound(ent, channel, sample[]) {
	
	if ( equal(sample[8], "sg_explode", 10) ) {
		
		new model[32];
		pev(ent, pev_model, model, 31);
		
		if ( equal(model[9], "molotov.mdl") )
			grenade_explode(ent);
	}
}

public Event_CurWeapon(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! is_user_alive(id) )
		return PLUGIN_CONTINUE;
	
	if ( ! g_hasMolotov[id] && ! get_pcvar_num(pOverride) )
		return PLUGIN_CONTINUE;
	
	new WeaponID = get_user_weapon(id, WeaponID, WeaponID);
	
	if ( WeaponID != CSW_SMOKEGRENADE )
		return PLUGIN_CONTINUE;
	
	set_pev(id, pev_viewmodel, g_vAllocModel);
	set_pev(id, pev_weaponmodel, g_pAllocModel);
	set_pev(id, pev_weaponanim, 9);
	
	return PLUGIN_CONTINUE;
}

public Event_GameRestart() g_restarted = 1;

public event_DeathMsg() g_hasMolotov[read_data(2)] = 0;

public event_new_round() {
	
	if ( ! get_pcvar_num(pnumplugin) )
		return PLUGIN_CONTINUE;
	
	for ( new i ; i < g_MaxPlayers ; i++ ) {
		if ( g_frags && is_user_connected(i) )
			set_user_frags(i, get_user_frags(i) + g_frags);
		g_frags = 0;
	}
	
	if ( g_restarted ) {
		for ( new i ; i < g_MaxPlayers ; i++ )
			g_hasMolotov = 0;
		g_restarted = 0;
	}
	
	if ( get_pcvar_num(pOverride) )
		set_molotovs();
	else
		reset_molotovs();

	arrayset(have_molotov, false, charsmax(have_molotov))
	
	return PLUGIN_CONTINUE;
}

public event_BuyMenuCT(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! get_pcvar_num(pBuyMenu) )
		return PLUGIN_CONTINUE;
	
	new Override = get_pcvar_num(pOverride);
	
	new menu[1024];
	new len = formatex(menu, 1023, "\yBuy Equipment\R$ Cost");
	len += formatex(menu[len], 1023-len, "^n^n\w1. Kevlar Vest\R\y650");
	len += formatex(menu[len], 1023-len, "^n\w2. Kevlar Vest & Helmet\R\y1000");
	len += formatex(menu[len], 1023-len, "^n\w3. Flashbang\R\y200");
	len += formatex(menu[len], 1023-len, "^n\w4. HE Grenade\R\y300");
	
	if ( Override )
		len += formatex(menu[len], 1023-len, "^n\w5. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	else
		len += formatex(menu[len], 1023-len, "^n\w5. Smoke Grenade\R\y300");
		
	len += formatex(menu[len], 1023-len, "^n\w6. NightVision Goggles\R\y1250");
	len += formatex(menu[len], 1023-len, "^n\%c7. Defuse Kit\R\y200 ", g_bomb_map ? 'w' : 'd');
	len += formatex(menu[len], 1023-len, "^n\w8. Tactical Shield\R\y2200");
	
	if ( ! Override )
		len += formatex(menu[len], 1023-len, "^n\w9. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	
	len += formatex(menu[len], 1023-len, "^n^n\w0. Exit");
	
	show_menu(id, read_data(1)|MENU_KEY_9, menu, -1, "#CT_BuyItem");
	
	return PLUGIN_HANDLED;
}

public event_BuyMenuT(id) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! get_pcvar_num(pBuyMenu) )
		return PLUGIN_CONTINUE;
	
	new Override = get_pcvar_num(pOverride);
	
	new menu[1024];
	new len = formatex(menu, 1023, "\yBuy Equipment\R$ Cost");
	len += formatex(menu[len], 1023-len, "^n^n\w1. Kevlar Vest\R\y650");
	len += formatex(menu[len], 1023-len, "^n\w2. Kevlar Vest & Helmet\R\y1000");
	len += formatex(menu[len], 1023-len, "^n\w3. Flashbang\R\y200");
	len += formatex(menu[len], 1023-len, "^n\w4. HE Grenade\R\y300");
		
	if ( Override )
		len += formatex(menu[len], 1023-len, "^n\w5. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	else
		len += formatex(menu[len], 1023-len, "^n\w5. Smoke Grenade\R\y300");
		
	len += formatex(menu[len], 1023-len, "^n\w6. NightVision Goggles\R\y1250");
	
	if ( !Override )
		len += formatex(menu[len], 1023-len, "^n\w7. Molotov Cocktail\R\y%d", get_pcvar_num(pprice));
	
	len += formatex(menu[len], 1023-len, "^n^n\w0. Exit");
	
	show_menu(id, read_data(1)|MENU_KEY_7, menu, -1, "#T_BuyItem");
	
	return PLUGIN_HANDLED;
}

public handle_BuyMenuCT(id, key) 
{
	 
	if ( get_pcvar_num(pOverride) ) 
	{
		if ( key != 4 )
		return PLUGIN_CONTINUE;
	}
    
	else 
	{
		if ( key != 8 )
		return PLUGIN_CONTINUE;
	}
    
	handle_BuyMenu(id);
    
	return PLUGIN_HANDLED;
}

public handle_BuyMenuT(id, key) 
{
    
	if ( get_pcvar_num(pOverride) ) 
	{
		if ( key != 4 )
		return PLUGIN_CONTINUE;
	}
    
	else 
	{
		if ( key != 6 )
		return PLUGIN_CONTINUE;
	}
    
	handle_BuyMenu(id);
    
	return PLUGIN_HANDLED;
}

stock handle_BuyMenu(id) {
	
	new money = cs_get_user_money(id);
	
	if ( money < get_pcvar_num(pprice) ) {
		client_print(id, print_center, "You don't have enough $ to buy a Molotov Cocktail.");
		return PLUGIN_HANDLED;
	}
	
	if ( g_hasMolotov[id] == get_pcvar_num(pMaxMolotovs) || have_molotov[id] ) {
		if ( g_hasMolotov[id] == 1 )
			client_print(id, print_center, "You already have a Molotov Cocktail.");
		else
			client_print(id, print_center, "You already have %d Molotov Cocktails.", g_hasMolotov[id]);
		return PLUGIN_HANDLED;
	}
	
	else if ( ! g_hasMolotov[id] && user_has_weapon(id, CSW_SMOKEGRENADE) ) {
		client_print(id, print_center, "You already have a Smoke Grenade");
		return PLUGIN_HANDLED;
	}
	
	g_hasMolotov[id]++;
	
	cs_set_user_money(id, money - get_pcvar_num(pprice) );
	give_item(id, "weapon_smokegrenade");
	cs_set_user_bpammo(id, CSW_SMOKEGRENADE, g_hasMolotov[id]);
	client_print(id, print_chat, "You got a Molotov Cocktail!");

	have_molotov[id]=true
	
	return PLUGIN_HANDLED;
}

public grenade_throw(id, ent, wid) {
	
	if ( ! get_pcvar_num(pnumplugin) || ! is_user_connected(id) || wid != CSW_SMOKEGRENADE )
		return PLUGIN_CONTINUE;
	
	if ( ! g_hasMolotov[id] && ! get_pcvar_num(pOverride) )
		return PLUGIN_CONTINUE;
	
	g_hasMolotov[id]--;
	engfunc(EngFunc_SetModel, ent, "models/w_molotov.mdl");
	set_pev(ent, pev_nextthink, 99999.0);
	
	return PLUGIN_CONTINUE;
}

public grenade_explode(ent) {
	
	new Float:fOrigin[3];
	pev(ent, pev_origin, fOrigin);
	
	new owner = pev(ent, pev_owner);
	new ent2 = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
	
	new param[5], iOrigin[3];
	param[0] = owner;
	param[1] = iOrigin[0] = floatround(fOrigin[0]);
	param[2] = iOrigin[1] = floatround(fOrigin[1]);
	param[3] = iOrigin[2] = floatround(fOrigin[2]);
	param[4] = ent2;
	
	radius_damage(owner, fOrigin, get_pcvar_float(pMlDamage), get_pcvar_float(pMlRadius), DMG_BLAST);
	emit_sound(ent, CHAN_AUTO, "misc/molotov_explosion.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	
	engfunc(EngFunc_RemoveEntity, ent);
	
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
	
	new param2[2];
	param2[0] = ent;
	param2[1] = ent2;
	
	random_fire(iOrigin, ent2);
	
	new Float:FireTime = get_pcvar_float(pFireTime);
	
	set_task(0.2, "fire_damage", 56235 + random_num(-100, 100), param, 5, "a", floatround(FireTime / 0.2, floatround_floor));
	set_task(1.0, "fire_sound", 37235 + random_num(-100, 100), param2, 2, "a", floatround(FireTime) - 1);
	set_task(FireTime, "fire_stop", 27367 + random_num(-100, 100), param2, 2);
	
	return PLUGIN_CONTINUE;
}

public fire_sound(param[])
	emit_sound(param[0], CHAN_AUTO, "misc/molotov_fire.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

new Float:g_i;
new Float:g_g;

public fire_stop(param[]) {
	g_g = 0.0;
	g_i = 0.0;
	engfunc(EngFunc_RemoveEntity, param[0]);
}

public fire_damage(param[]) {
	
	new iOrigin[3], Float:fOrigin[3];
	iOrigin[0] = param[1];
	iOrigin[1] = param[2];
	iOrigin[2] = param[3];
	
	random_fire(iOrigin, param[4]);
	
	IVecFVec(iOrigin, fOrigin);
	radius_damage(param[0], fOrigin, get_pcvar_float(pFireDmg), get_pcvar_float(pMlRadius), DMG_BURN, 0);
}

stock radius_damage(attacker, Float:origin[3], Float:damage, Float:range, dmgtype, calc = 1) {
	
	new Float:pOrigin[3], Float:dist, Float:tmpdmg/*, iOrigin[3] */;
	new i, ateam = get_user_team(attacker), TK = get_pcvar_num(pTeamKill);
	
	while ( i++ < g_MaxPlayers ) {
		
		if ( ! is_user_alive(i) )
			continue;
		
		if ( ! TK && ateam == get_user_team(i) )
			continue;
		
		pev(i, pev_origin, pOrigin);
		dist = get_distance_f(origin, pOrigin);
		
		if ( dist > range )
			continue;
		
		if ( calc )
			tmpdmg = damage - ( damage / range ) * dist;
		else
			tmpdmg = damage;
		
		if ( pev(i, pev_health) < tmpdmg )
			kill(attacker, i);
		else
			fm_fakedamage(i, "molotov", tmpdmg, dmgtype);
		
		// FVecIVec(pOrigin, iOrigin);
		// Flame(iOrigin, 1);
	}
	
	while ( ( i = engfunc(EngFunc_FindEntityInSphere, i, origin, range) ) ) {
		if ( pev(i, pev_takedamage) ) {
			if ( calc ) {
				pev(i, pev_origin, pOrigin);
				tmpdmg = damage - ( damage / range ) * get_distance_f(origin, pOrigin);
			}
			else
				tmpdmg = damage;
			
			// FVecIVec(pOrigin, iOrigin);
			// Flame(iOrigin, 1);
			
			fm_fakedamage(i, "molotov", tmpdmg, dmgtype);
		}
	}
}

stock random_fire(Origin[3], ent) {
	
	new range = get_pcvar_num(pMlRadius);
	new iOrigin[3];
	
	for ( new i = 1 ; i <= 5 ; i++ ) {
		
		g_i++;
		g_g++;
		
		iOrigin[0] = Origin[0] + random_num(-range, range);
		iOrigin[1] = Origin[1] + random_num(-range, range);
		iOrigin[2] = Origin[2];
		iOrigin[2] = ground_z(iOrigin, ent);
		
		while ( get_distance(iOrigin, Origin) > range ) {
			g_g++;
			iOrigin[0] = Origin[0] + random_num(-range, range);
			iOrigin[1] = Origin[1] + random_num(-range, range);
			iOrigin[2] = Origin[2];
			if ( g_g / g_i >= ANTI_LAGG )
				iOrigin[2] = ground_z(iOrigin, ent, 1);
			else
				iOrigin[2] = ground_z(iOrigin, ent);
		}
		
		if ( ! ( i % 4 ) )
			Flame(iOrigin, (!(i%4)));
		else
			Flame(iOrigin, 0);
	}
}

stock Flame(iOrigin[3], smoke) {
	
	new rand = random_num(5, 15);
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
	write_byte(TE_SPRITE);
	write_coord(iOrigin[0]);
	write_coord(iOrigin[1]);
	write_coord(iOrigin[2] + rand * 10);
	write_short(firespr);
	write_byte(rand);
	write_byte(100);
	message_end();
	
	if ( smoke ) {
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
		write_byte(TE_SMOKE);
		write_coord(iOrigin[0]);
		write_coord(iOrigin[1]);
		write_coord(iOrigin[2] + 120);
		write_short(smokespr[random_num(0, 1)]);
		write_byte(random_num(10, 30));
		write_byte(random_num(10, 20));
		message_end();
	}
	
}

stock kill(k, v) {
	
	user_silentkill(v);
	
	new kteam = get_user_team(k);
	new vteam = get_user_team(v);
	
	new kfrags = get_user_frags(k) + 1;
	new kdeaths = get_user_deaths(k);
	if ( kteam == vteam )
		kfrags = get_user_frags(k) - 2;
	
	new vfrags = get_user_frags(v);
	new vdeaths = get_user_deaths(v);
	
	message_begin(MSG_ALL, gmsgScoreInfo);
	write_byte(k);
	write_short(kfrags);
	write_short(kdeaths);
	write_short(0);
	write_short(kteam);
	message_end();
	
	message_begin(MSG_ALL, gmsgScoreInfo);
	write_byte(v);
	write_short(vfrags + 1);
	write_short(vdeaths);
	write_short(0);
	write_short(vteam);
	message_end();
	
	message_begin(MSG_ALL, gmsgDeathMsg, {0,0,0}, 0);
	write_byte(k);
	write_byte(v);
	write_byte(0);
	write_string("molotov");
	message_end();
	
	g_frags[k]++;
	
	if ( kteam != vteam )
		cs_set_user_money(k, cs_get_user_money(k) + 300);
	else
		cs_set_user_money(k, cs_get_user_money(k) - 300);
}

stock ground_z(iOrigin[3], ent, skip = 0) {
	
	iOrigin[2] += random_num(5, 80);
	
	new Float:fOrigin[3];
	
	IVecFVec(iOrigin, fOrigin);
	
	set_pev(ent, pev_origin, fOrigin);
	
	engfunc(EngFunc_DropToFloor, ent);
	
	if ( ! skip && ! engfunc(EngFunc_EntIsOnFloor, ent) )
		return ground_z(iOrigin, ent);
	
	pev(ent, pev_origin, fOrigin);
	
	return floatround(fOrigin[2]);
}

stock reset_molotovs() {
	new ent = g_MaxPlayers;
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "model", "models/w_molotov.mdl")))
		engfunc(EngFunc_SetModel, ent, "models/w_smokegrenade.mdl");
}

stock set_molotovs() {
	new ent = g_MaxPlayers;
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, "model", "models/w_smokegrenade.mdl")))
		engfunc(EngFunc_SetModel, ent, "models/w_molotov.mdl");
}
Pentru ajutor, faceți cerere bine detaliată, completând și respectând modelul corespunzător.
Nu-mi mai dați cereri doar pentru a mă avea în lista de prieteni.
Dacă te ajut, și mă ignori/etc > te adaug în „foe”.
Aveți grijă la cei ce încearcă să mă copieze sau să dea drept mine..Puteți lua legătura cu mine prin STEAM dacă aveți o problemă/nelămurire în acest caz! Cont de forum am doar aici.
În cazul în care utilizați ceva din ce am postat(ex: aici), e bine să fiți la curent cu modificările aduse și de aici, iar dacă sunt ceva probleme nu ezitați să luați legătura cu mine. Actualizarea unor coduri nu se vor afișa public, doar dacă se găsește ceva critic/urgent de remediat, unele fiind coduri vechi iar unele refăcute chiar recent dar private.
* Nume pe cs1.6: eVoLuTiOn \ Nume vechi: eVo
* Atelierul meu - post2819572.html#p2819572 (închis, click link ca să vedeți de ce)
User avatar
limbaa
Membru, skill 0
Membru, skill 0
Posts: 33
Joined: 26 Oct 2015, 11:25
Detinator Steam: Da
Detinator server CS: GOX.BLACKGAMES.RO
SteamID: tenlimba96
Fond eXtream: 0
Discord: GaBy#1976
Has thanked: 4 times
Contact:

01 Dec 2022, 11:41

Pluginul ala vad ca e plin de probleme acuma nu mai merge molotovul deloc dar am gasit altul cu aceasi problema poti cumpara cate molotov vrei poti sa il faci pe asta sa cumperi doar unul ca vad ca merge ok:

Code: Select all

#include < amxmodx >
#include < fakemeta_util >
#include < hamsandwich >

//#define ZP_SUPPORT // Поддержка Zombie Plague 4.3

#if defined ZP_SUPPORT
	#include < zombieplague >
#endif

#define linux_diff_weapon		4
#define linux_diff_player		5

// CBasePlayerItem
#define m_pPlayer				41

#define MAX_CLIENTS				32
#define NADE_TYPE				1337

#define FLAME_CLASSNAME			"ent_flame" // Класснейм огня
#define FLAME_DURATION			5.0 // Сколько будет идти горение
#define FLAME_TIMERESET			0.2 // Через сколько будет наносится урон

// Урон от огня
#if defined ZP_SUPPORT
	#define FLAME_DAMAGE		random_float(30.0, 50.0)
#else
	#define FLAME_DAMAGE		random_float(3.0, 5.0)
#endif

#define GRENADE_VIEW_MODEL		"models/gox/v_molotov.mdl"
#define GRENADE_PLAYER_MODEL	"models/gox/p_molotov.mdl"
#define GRENADE_WORLD_MODEL		"models/gox/w_molotov.mdl"
#define GRENADE_MODEL_BODY		0

#define GRENADE_EXPLODE_SOUND	"gox/molotov_exp.wav"

#define WEAPON_OLD				"weapon_smokegrenade"
#define WEAPON_NEW				"gox/weapon_molotov"
#define WEAPON_HUD 				"sprites/gox/640hudx1.spr"

new const iWeaponList[] = {  
	13, 1,  -1, -1, 3, 3, 9,  24 // weapon_smokegrenade
}


#if defined ZP_SUPPORT
	new g_iItemID;
#endif

new g_iThinkTimes[512];
new g_iszModelIndexSprite;
new g_iUserHasMolotov[MAX_CLIENTS + 1];

public plugin_init()
{
	register_plugin("[AMXX] Grenade: Molotov", "1.1", "xUnicorn (t3rkecorejz)");

	RegisterHam(Ham_Killed, "player", "CPlayer__Killed_Post", .Post = 1);
	RegisterHam(Ham_Touch, "grenade", "CGrenade__Touch_Pre", .Post = 0);
	RegisterHam(Ham_Think, "grenade", "CGrenade__Think_Pre", .Post = 0);
	RegisterHam(Ham_Think, "info_target", "CEntity__Think_Pre", .Post = 0);
	RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "CGrenade__Item_Deploy_Post", .Post = 1);
	RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "CGrenade__Item_AddToPlayer_Post", .Post = 1);

	register_forward(FM_SetModel, "FM_Hook_SetModel_Pre", ._post = 0);

	register_clcmd(WEAPON_NEW, "HookSelect");

	#if defined ZP_SUPPORT
		g_iItemID = zp_register_extra_item("Molotov", 10, ZP_TEAM_HUMAN);
	#else
		register_clcmd("say molotov", "Command_GiveMolotov");
	#endif
}

public plugin_precache()
{
	new szBuffer[64]; formatex(szBuffer, charsmax(szBuffer), "sprites/%s.txt", WEAPON_NEW);

	engfunc(EngFunc_PrecacheGeneric, szBuffer);
	engfunc(EngFunc_PrecacheGeneric, WEAPON_HUD);
	
	g_iszModelIndexSprite = engfunc(EngFunc_PrecacheModel, "sprites/gox/flame.spr");

	engfunc(EngFunc_PrecacheModel, GRENADE_VIEW_MODEL);
	engfunc(EngFunc_PrecacheModel, GRENADE_PLAYER_MODEL);
	engfunc(EngFunc_PrecacheModel, GRENADE_WORLD_MODEL);

	engfunc(EngFunc_PrecacheSound, GRENADE_EXPLODE_SOUND);
}

public client_disconnected(iPlayer) g_iUserHasMolotov[iPlayer] = 0;

#if defined ZP_SUPPORT
	public zp_extra_item_selected(iPlayer, iItemID)
	{
		if(iItemID == g_iItemID)
			Command_GiveMolotov(iPlayer);
	}
#endif

public HookSelect(iPlayer) 
{
	engclient_cmd(iPlayer, WEAPON_OLD);
	return PLUGIN_HANDLED;
}

public Command_GiveMolotov(iPlayer)
{
	if(!is_user_alive(iPlayer))
		return PLUGIN_HANDLED;

	if(user_has_weapon(iPlayer, CSW_SMOKEGRENADE))
	{
		g_iUserHasMolotov[iPlayer]++;
		ExecuteHamB(Ham_GiveAmmo, iPlayer, 1, "SmokeGrenade", 32);
		emit_sound(iPlayer, CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}

	if(CPlayer__MakeWeapon(iPlayer)) 
	{
		g_iUserHasMolotov[iPlayer]++;
		emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	#if defined ZP_SUPPORT
		else return ZP_PLUGIN_HANDLED;
	#else
		else return PLUGIN_HANDLED;
	#endif

	return PLUGIN_HANDLED;
}

public CPlayer__Killed_Post(iVictim) g_iUserHasMolotov[iVictim] = 0;
public CGrenade__Touch_Pre(iEntity)
{
	if(!pev_valid(iEntity))
		return HAM_IGNORED;

	if(pev(iEntity, pev_flTimeStepSound) == NADE_TYPE)
	{
		static Float: vecOrigin[3];
		pev(iEntity, pev_origin, vecOrigin);

		if(engfunc(EngFunc_PointContents, vecOrigin) == CONTENTS_WATER) {
			set_pev(iEntity, pev_flags, FL_KILLME);
			return HAM_IGNORED;
		}

		set_pev(iEntity, pev_dmgtime, get_gametime());
	}

	return HAM_IGNORED;
}

public CGrenade__Think_Pre(iEntity)
{
	if(!pev_valid(iEntity)) 
		return HAM_IGNORED;

	static Float: flDamageTime; pev(iEntity, pev_dmgtime, flDamageTime);
	
	if(flDamageTime > get_gametime())
		return HAM_IGNORED;

	if(pev(iEntity, pev_flTimeStepSound) == NADE_TYPE)
	{
		static Float: vecOrigin[3];
		pev(iEntity, pev_origin, vecOrigin);

		if(engfunc(EngFunc_PointContents, vecOrigin) == CONTENTS_WATER) {
			set_pev(iEntity, pev_flags, FL_KILLME);
			return HAM_IGNORED;
		}

		MolotovExplode(iEntity);
		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

MolotovExplode(iEntity)
{
	if(iEntity < 0)
		return;
	
	static Float: vecOrigin[3];
	pev(iEntity, pev_origin, vecOrigin);

	emit_sound(iEntity, CHAN_WEAPON, GRENADE_EXPLODE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

	static iReference;

	new iOwner; iOwner = pev(iEntity, pev_owner);

	if(iReference || (iReference = engfunc(EngFunc_AllocString, "info_target")))
	{
		new iFlameEntity = engfunc(EngFunc_CreateNamedEntity, iReference);

		g_iThinkTimes[iFlameEntity] = 0;

		set_pev(iFlameEntity, pev_classname, FLAME_CLASSNAME);
		set_pev(iFlameEntity, pev_solid, SOLID_TRIGGER);
		set_pev(iFlameEntity, pev_movetype, MOVETYPE_TOSS);
		set_pev(iFlameEntity, pev_effects, EF_NODRAW);
		set_pev(iFlameEntity, pev_owner, iOwner);
		set_pev(iFlameEntity, pev_nextthink, get_gametime() + FLAME_TIMERESET);

		engfunc(EngFunc_SetModel, iFlameEntity, "models/w_ak47.mdl");
		engfunc(EngFunc_SetOrigin, iFlameEntity, vecOrigin);
	}

	message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
	write_byte(TE_SPRITETRAIL);
	engfunc(EngFunc_WriteCoord, vecOrigin[0]);
	engfunc(EngFunc_WriteCoord, vecOrigin[1]);
	engfunc(EngFunc_WriteCoord, vecOrigin[2] + 100.0);
	engfunc(EngFunc_WriteCoord, vecOrigin[0]);
	engfunc(EngFunc_WriteCoord, vecOrigin[1]);
	engfunc(EngFunc_WriteCoord, vecOrigin[2] + 30.0);
	write_short(g_iszModelIndexSprite);
	write_byte(50);
	write_byte(random_num(17, 20));
	write_byte(random_num(4, 6));
	write_byte(15);
	write_byte(10);
	message_end();

	set_pev(iEntity, pev_flags, FL_KILLME);
}

public CEntity__Think_Pre(iEntity)
{
	if(!pev_valid(iEntity))
		return HAM_IGNORED;

	static iVictim = -1;

	new szClassName[32], vecOrigin[3], iOwner;
	pev(iEntity, pev_classname, szClassName, charsmax(szClassName));

	if(equal(szClassName, FLAME_CLASSNAME))
	{
		pev(iEntity, pev_origin, vecOrigin);
		iOwner = pev(iEntity, pev_owner);

		if(g_iThinkTimes[iEntity] == floatround(FLAME_DURATION / FLAME_TIMERESET))
		{
			set_pev(iEntity, pev_flags, FL_KILLME);

			return HAM_IGNORED;
		}

		while((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, vecOrigin, 100.0)))
		{
			if(iOwner == iVictim || !is_user_alive(iVictim))
				continue;

			#if defined ZP_SUPPORT
				if(zp_get_user_zombie(iOwner) || !zp_get_user_zombie(iVictim))
					continue;
			#endif

			ExecuteHamB(Ham_TakeDamage, iVictim, iEntity, iOwner, FLAME_DAMAGE, DMG_BURN | DMG_NEVERGIB);
		}

		g_iThinkTimes[iEntity] += 1;
		set_pev(iEntity, pev_nextthink, get_gametime() + FLAME_TIMERESET);
	}

	return HAM_IGNORED;
}

public CGrenade__Item_Deploy_Post(iEntity)
{
	static iPlayer; iPlayer = get_pdata_cbase(iEntity, m_pPlayer, linux_diff_weapon);

	#if defined ZP_SUPPORT
		if(zp_get_user_zombie(iPlayer))
			return;
	#endif

	if(!g_iUserHasMolotov[iPlayer]) 
		return;

	set_pev(iPlayer, pev_viewmodel2, GRENADE_VIEW_MODEL);
	set_pev(iPlayer, pev_weaponmodel2, GRENADE_PLAYER_MODEL);
}

public CGrenade__Item_AddToPlayer_Post(iItem, iPlayer) p_set_user_weaponlist(iPlayer, g_iUserHasMolotov[iPlayer]);
public FM_Hook_SetModel_Pre(iEntity, const szModel[])
{
	if(!pev_valid(iEntity)) 
		return FMRES_IGNORED;

	static Float: flDamageTime; pev(iEntity, pev_dmgtime, flDamageTime);
	
	if(flDamageTime == 0.0)
		return FMRES_IGNORED;

	static iOwner; iOwner = pev(iEntity, pev_owner);

	if(equal(szModel, "models/w_smokegrenade.mdl"))
	{
		if(g_iUserHasMolotov[iOwner])
		{
			engfunc(EngFunc_SetModel, iEntity, GRENADE_WORLD_MODEL);
			
			set_pev(iEntity, pev_body, GRENADE_MODEL_BODY);
			set_pev(iEntity, pev_flTimeStepSound, NADE_TYPE);

			g_iUserHasMolotov[iOwner] -= 1;

			return FMRES_SUPERCEDE;
		}
	}

	return FMRES_IGNORED;
}

public CPlayer__MakeWeapon(iPlayer)
{
	static iEntity, g_AllocString_E;

	if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD)))
		iEntity = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);

	if(iEntity <= 0) 
		return 0;

	g_iUserHasMolotov[iPlayer]++;
	set_pev(iEntity, pev_spawnflags, SF_NORESPAWN);
	ExecuteHam(Ham_Spawn, iEntity);

	if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEntity)) 
	{
		set_pev(iEntity, pev_flags, FL_KILLME);
		return 0;
	}

	ExecuteHamB(Ham_Item_AttachToPlayer, iEntity, iPlayer);
	return iEntity;
}

stock p_set_user_weaponlist(iPlayer, iList) {
	message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, iPlayer);
	write_string(iList ? WEAPON_NEW : WEAPON_OLD);
	write_byte(iWeaponList[0]);
	write_byte(iWeaponList[1]);
	write_byte(iWeaponList[2]);
	write_byte(iWeaponList[3]);
	write_byte(iWeaponList[4]);
	write_byte(iWeaponList[5]);
	write_byte(iWeaponList[6]);
	write_byte(iWeaponList[7]);
	message_end();
}
User avatar
levin
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 3844
Joined: 24 Aug 2011, 12:24
Detinator Steam: Da
CS Status:
Detinator server CS: ☯∴
SteamID: riseofevo
Reputatie: Scripter eXtreamCS
Nume anterior: Adryyy
Location: ҳ̸Ҳ̸ҳ
Discord: devilclass
Has thanked: 36 times
Been thanked: 594 times
Contact:

01 Dec 2022, 21:38

Code: Select all

#include < amxmodx >
#include < fakemeta_util >
#include < hamsandwich >

//#define ZP_SUPPORT // Поддержка Zombie Plague 4.3

#if defined ZP_SUPPORT
	#include < zombieplague >
#endif

#define linux_diff_weapon		4
#define linux_diff_player		5

// CBasePlayerItem
#define m_pPlayer				41

#define MAX_CLIENTS				32
#define NADE_TYPE				1337

#define FLAME_CLASSNAME			"ent_flame" // Класснейм огня
#define FLAME_DURATION			5.0 // Сколько будет идти горение
#define FLAME_TIMERESET			0.2 // Через сколько будет наносится урон

// Урон от огня
#if defined ZP_SUPPORT
	#define FLAME_DAMAGE		random_float(30.0, 50.0)
#else
	#define FLAME_DAMAGE		random_float(3.0, 5.0)
#endif

#define GRENADE_VIEW_MODEL		"models/gox/v_molotov.mdl"
#define GRENADE_PLAYER_MODEL	"models/gox/p_molotov.mdl"
#define GRENADE_WORLD_MODEL		"models/gox/w_molotov.mdl"
#define GRENADE_MODEL_BODY		0

#define GRENADE_EXPLODE_SOUND	"gox/molotov_exp.wav"

#define WEAPON_OLD				"weapon_smokegrenade"
#define WEAPON_NEW				"gox/weapon_molotov"
#define WEAPON_HUD 				"sprites/gox/640hudx1.spr"

new const iWeaponList[] = {  
	13, 1,  -1, -1, 3, 3, 9,  24 // weapon_smokegrenade
}


#if defined ZP_SUPPORT
	new g_iItemID;
#endif

new g_iThinkTimes[512];
new g_iszModelIndexSprite;
new g_iUserHasMolotov[MAX_CLIENTS + 1];
new used[MAX_CLIENTS+1]

public plugin_init()
{
	register_plugin("[AMXX] Grenade: Molotov", "1.1", "xUnicorn (t3rkecorejz)");

	register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

	RegisterHam(Ham_Killed, "player", "CPlayer__Killed_Post", .Post = 1);
	RegisterHam(Ham_Touch, "grenade", "CGrenade__Touch_Pre", .Post = 0);
	RegisterHam(Ham_Think, "grenade", "CGrenade__Think_Pre", .Post = 0);
	RegisterHam(Ham_Think, "info_target", "CEntity__Think_Pre", .Post = 0);
	RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "CGrenade__Item_Deploy_Post", .Post = 1);
	RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "CGrenade__Item_AddToPlayer_Post", .Post = 1);

	register_forward(FM_SetModel, "FM_Hook_SetModel_Pre", ._post = 0);

	register_clcmd(WEAPON_NEW, "HookSelect");

#if defined ZP_SUPPORT
	g_iItemID = zp_register_extra_item("Molotov", 10, ZP_TEAM_HUMAN);
#else
	register_clcmd("say molotov", "Command_GiveMolotov");
#endif
}
public plugin_precache()
{
	new szBuffer[64]; formatex(szBuffer, charsmax(szBuffer), "sprites/%s.txt", WEAPON_NEW);

	engfunc(EngFunc_PrecacheGeneric, szBuffer);
	engfunc(EngFunc_PrecacheGeneric, WEAPON_HUD);
	
	g_iszModelIndexSprite = engfunc(EngFunc_PrecacheModel, "sprites/gox/flame.spr");

	engfunc(EngFunc_PrecacheModel, GRENADE_VIEW_MODEL);
	engfunc(EngFunc_PrecacheModel, GRENADE_PLAYER_MODEL);
	engfunc(EngFunc_PrecacheModel, GRENADE_WORLD_MODEL);

	engfunc(EngFunc_PrecacheSound, GRENADE_EXPLODE_SOUND);
}

public event_new_round()
{
	arrayset(used, 0, charsmax(used))
}
public client_disconnected(iPlayer) g_iUserHasMolotov[iPlayer] = 0;

#if defined ZP_SUPPORT
	public zp_extra_item_selected(iPlayer, iItemID)
	{
		if(iItemID == g_iItemID)
			Command_GiveMolotov(iPlayer);
	}
#endif

public HookSelect(iPlayer) 
{
	engclient_cmd(iPlayer, WEAPON_OLD);
	return PLUGIN_HANDLED;
}

public Command_GiveMolotov(iPlayer)
{
	if(!is_user_alive(iPlayer))
		return PLUGIN_HANDLED;

	if(used[iPlayer])
	{
		return 0
	}

	used[iPlayer]=1

	if(user_has_weapon(iPlayer, CSW_SMOKEGRENADE))
	{
		g_iUserHasMolotov[iPlayer]++;
		ExecuteHamB(Ham_GiveAmmo, iPlayer, 1, "SmokeGrenade", 32);
		emit_sound(iPlayer, CHAN_ITEM, "items/9mmclip1.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}

	if(CPlayer__MakeWeapon(iPlayer)) 
	{
		g_iUserHasMolotov[iPlayer]++;
		emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
#if defined ZP_SUPPORT
	else return ZP_PLUGIN_HANDLED;
#else
	else return PLUGIN_HANDLED;
#endif

	return PLUGIN_HANDLED;
}

public CPlayer__Killed_Post(iVictim) g_iUserHasMolotov[iVictim] = 0;
public CGrenade__Touch_Pre(iEntity)
{
	if(!pev_valid(iEntity))
		return HAM_IGNORED;

	if(pev(iEntity, pev_flTimeStepSound) == NADE_TYPE)
	{
		static Float: vecOrigin[3];
		pev(iEntity, pev_origin, vecOrigin);

		if(engfunc(EngFunc_PointContents, vecOrigin) == CONTENTS_WATER) {
			set_pev(iEntity, pev_flags, FL_KILLME);
			return HAM_IGNORED;
		}

		set_pev(iEntity, pev_dmgtime, get_gametime());
	}

	return HAM_IGNORED;
}

public CGrenade__Think_Pre(iEntity)
{
	if(!pev_valid(iEntity)) 
		return HAM_IGNORED;

	static Float: flDamageTime; pev(iEntity, pev_dmgtime, flDamageTime);
	
	if(flDamageTime > get_gametime())
		return HAM_IGNORED;

	if(pev(iEntity, pev_flTimeStepSound) == NADE_TYPE)
	{
		static Float: vecOrigin[3];
		pev(iEntity, pev_origin, vecOrigin);

		if(engfunc(EngFunc_PointContents, vecOrigin) == CONTENTS_WATER) {
			set_pev(iEntity, pev_flags, FL_KILLME);
			return HAM_IGNORED;
		}

		MolotovExplode(iEntity);
		return HAM_SUPERCEDE;
	}

	return HAM_IGNORED;
}

MolotovExplode(iEntity)
{
	if(iEntity < 0)
		return;
	
	static Float: vecOrigin[3];
	pev(iEntity, pev_origin, vecOrigin);

	emit_sound(iEntity, CHAN_WEAPON, GRENADE_EXPLODE_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

	static iReference;

	new iOwner; iOwner = pev(iEntity, pev_owner);

	if(iReference || (iReference = engfunc(EngFunc_AllocString, "info_target")))
	{
		new iFlameEntity = engfunc(EngFunc_CreateNamedEntity, iReference);

		g_iThinkTimes[iFlameEntity] = 0;

		set_pev(iFlameEntity, pev_classname, FLAME_CLASSNAME);
		set_pev(iFlameEntity, pev_solid, SOLID_TRIGGER);
		set_pev(iFlameEntity, pev_movetype, MOVETYPE_TOSS);
		set_pev(iFlameEntity, pev_effects, EF_NODRAW);
		set_pev(iFlameEntity, pev_owner, iOwner);
		set_pev(iFlameEntity, pev_nextthink, get_gametime() + FLAME_TIMERESET);

		engfunc(EngFunc_SetModel, iFlameEntity, "models/w_ak47.mdl");
		engfunc(EngFunc_SetOrigin, iFlameEntity, vecOrigin);
	}

	message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
	write_byte(TE_SPRITETRAIL);
	engfunc(EngFunc_WriteCoord, vecOrigin[0]);
	engfunc(EngFunc_WriteCoord, vecOrigin[1]);
	engfunc(EngFunc_WriteCoord, vecOrigin[2] + 100.0);
	engfunc(EngFunc_WriteCoord, vecOrigin[0]);
	engfunc(EngFunc_WriteCoord, vecOrigin[1]);
	engfunc(EngFunc_WriteCoord, vecOrigin[2] + 30.0);
	write_short(g_iszModelIndexSprite);
	write_byte(50);
	write_byte(random_num(17, 20));
	write_byte(random_num(4, 6));
	write_byte(15);
	write_byte(10);
	message_end();

	set_pev(iEntity, pev_flags, FL_KILLME);
}

public CEntity__Think_Pre(iEntity)
{
	if(!pev_valid(iEntity))
		return HAM_IGNORED;

	static iVictim = -1;

	new szClassName[32], vecOrigin[3], iOwner;
	pev(iEntity, pev_classname, szClassName, charsmax(szClassName));

	if(equal(szClassName, FLAME_CLASSNAME))
	{
		pev(iEntity, pev_origin, vecOrigin);
		iOwner = pev(iEntity, pev_owner);

		if(g_iThinkTimes[iEntity] == floatround(FLAME_DURATION / FLAME_TIMERESET))
		{
			set_pev(iEntity, pev_flags, FL_KILLME);

			return HAM_IGNORED;
		}

		while((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, vecOrigin, 100.0)))
		{
			if(iOwner == iVictim || !is_user_alive(iVictim))
				continue;

			#if defined ZP_SUPPORT
				if(zp_get_user_zombie(iOwner) || !zp_get_user_zombie(iVictim))
					continue;
			#endif

			ExecuteHamB(Ham_TakeDamage, iVictim, iEntity, iOwner, FLAME_DAMAGE, DMG_BURN | DMG_NEVERGIB);
		}

		g_iThinkTimes[iEntity] += 1;
		set_pev(iEntity, pev_nextthink, get_gametime() + FLAME_TIMERESET);
	}

	return HAM_IGNORED;
}

public CGrenade__Item_Deploy_Post(iEntity)
{
	static iPlayer; iPlayer = get_pdata_cbase(iEntity, m_pPlayer, linux_diff_weapon);

	#if defined ZP_SUPPORT
		if(zp_get_user_zombie(iPlayer))
			return;
	#endif

	if(!g_iUserHasMolotov[iPlayer]) 
		return;

	set_pev(iPlayer, pev_viewmodel2, GRENADE_VIEW_MODEL);
	set_pev(iPlayer, pev_weaponmodel2, GRENADE_PLAYER_MODEL);
}

public CGrenade__Item_AddToPlayer_Post(iItem, iPlayer) p_set_user_weaponlist(iPlayer, g_iUserHasMolotov[iPlayer]);
public FM_Hook_SetModel_Pre(iEntity, const szModel[])
{
	if(!pev_valid(iEntity)) 
		return FMRES_IGNORED;

	static Float: flDamageTime; pev(iEntity, pev_dmgtime, flDamageTime);
	
	if(flDamageTime == 0.0)
		return FMRES_IGNORED;

	static iOwner; iOwner = pev(iEntity, pev_owner);

	if(equal(szModel, "models/w_smokegrenade.mdl"))
	{
		if(g_iUserHasMolotov[iOwner])
		{
			engfunc(EngFunc_SetModel, iEntity, GRENADE_WORLD_MODEL);
			
			set_pev(iEntity, pev_body, GRENADE_MODEL_BODY);
			set_pev(iEntity, pev_flTimeStepSound, NADE_TYPE);

			g_iUserHasMolotov[iOwner] -= 1;

			return FMRES_SUPERCEDE;
		}
	}

	return FMRES_IGNORED;
}

public CPlayer__MakeWeapon(iPlayer)
{
	static iEntity, g_AllocString_E;

	if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD)))
		iEntity = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);

	if(iEntity <= 0) 
		return 0;

	g_iUserHasMolotov[iPlayer]++;
	set_pev(iEntity, pev_spawnflags, SF_NORESPAWN);
	ExecuteHam(Ham_Spawn, iEntity);

	if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEntity)) 
	{
		set_pev(iEntity, pev_flags, FL_KILLME);
		return 0;
	}

	ExecuteHamB(Ham_Item_AttachToPlayer, iEntity, iPlayer);
	return iEntity;
}

stock p_set_user_weaponlist(iPlayer, iList) {
	message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, iPlayer);
	write_string(iList ? WEAPON_NEW : WEAPON_OLD);
	write_byte(iWeaponList[0]);
	write_byte(iWeaponList[1]);
	write_byte(iWeaponList[2]);
	write_byte(iWeaponList[3]);
	write_byte(iWeaponList[4]);
	write_byte(iWeaponList[5]);
	write_byte(iWeaponList[6]);
	write_byte(iWeaponList[7]);
	message_end();
}
Pentru ajutor, faceți cerere bine detaliată, completând și respectând modelul corespunzător.
Nu-mi mai dați cereri doar pentru a mă avea în lista de prieteni.
Dacă te ajut, și mă ignori/etc > te adaug în „foe”.
Aveți grijă la cei ce încearcă să mă copieze sau să dea drept mine..Puteți lua legătura cu mine prin STEAM dacă aveți o problemă/nelămurire în acest caz! Cont de forum am doar aici.
În cazul în care utilizați ceva din ce am postat(ex: aici), e bine să fiți la curent cu modificările aduse și de aici, iar dacă sunt ceva probleme nu ezitați să luați legătura cu mine. Actualizarea unor coduri nu se vor afișa public, doar dacă se găsește ceva critic/urgent de remediat, unele fiind coduri vechi iar unele refăcute chiar recent dar private.
* Nume pe cs1.6: eVoLuTiOn \ Nume vechi: eVo
* Atelierul meu - post2819572.html#p2819572 (închis, click link ca să vedeți de ce)
User avatar
limbaa
Membru, skill 0
Membru, skill 0
Posts: 33
Joined: 26 Oct 2015, 11:25
Detinator Steam: Da
Detinator server CS: GOX.BLACKGAMES.RO
SteamID: tenlimba96
Fond eXtream: 0
Discord: GaBy#1976
Has thanked: 4 times
Contact:

02 Dec 2022, 11:53

Multumesc acuma merge perfect
Post Reply

Return to “Cereri”

  • Information