Заявка за преработка на плъгин / Knife Abilities

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
bobywTf
Извън линия
Потребител
Потребител
Мнения: 37
Регистриран на: 21 Ное 2021, 14:28
Се отблагодари: 18 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Заявка за преработка на плъгин / Knife Abilities

Мнение от bobywTf » 09 Окт 2022, 18:47

Здравейте, искам да ползвам този плъгин за Zombi Plague мод, но се получава така че след като съм избрал нож и ме пусне зомби, остава модела на ножа а не на v_zombie_knife модела и съответно магийките продължават ефект дори като съм зомби, дали не може да се преправи плъгина когато съм зомби ножовете да нямат ефект и да не пречи на моделите на зомби ръцете. Ползвам този плъгин : viewtopic.php?f=96&t=3428

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

#include <amxmodx>
#include <amxmisc>
#include <formatin>
#include <fun>
#include <hamsandwich>
#include <fakemeta_util>


#define HOOOK
#define TELEPOORT
#define HPREGEEN
#define THUNDEER
#define JUUMPS
#define FREEZEER



#if defined JUUMPS
#include <reapi>
#endif

#if defined HOOOK
#include <engine>
#endif

#if defined FREEZEER
#define is_user_frozen(%1) g_bFrozen[%1]
#endif







#define PLUGIN_VERSION "2.2"
#define DEFAULT_V "models/v_knife.mdl"
#define DEFAULT_P "models/p_knife.mdl"

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

enum
{
	SOUND_NONE = 0,
	SOUND_DEPLOY,
	SOUND_HIT,
	SOUND_HITWALL,
	SOUND_SLASH,
	SOUND_STAB
}

enum _:Knives
{
	NAME[128],
	NAME2[128],
	INFO[128],
	INFO2[128],
	V_MODEL[128],
	P_MODEL[128],
	DEPLOY_SOUND[128],
	HIT_SOUND[128],
	HITWALL_SOUND[128],
	SLASH_SOUND[128],
	STAB_SOUND[128],
	Float: GRAVITY,
	Float: SPEED,
	Float: DAMAGE,
	NOFOOTSTEPS,
	TRANSPARENCY,
#if defined HPREGEEN
	HPREGEN,
#endif
#if defined TELEPOORT
	TELEPORT,
#endif
#if defined HOOOK	
	HOOK,
#endif
#if defined THUNDEER
	THUNDER,
#endif
#if defined JUUMPS
	JUMPS,
#endif
#if defined FREEZEER
	FREEZE,
#endif
	FLAG,
	bool:HAS_CUSTOM_SOUND
}

new Array:g_aKnives,
	bool:g_bFirstTime[33],
	g_eKnife[33][Knives],
	g_iKnife[33],
	g_pAtSpawn,
	g_pDebug,
	g_pResetSpawn,
	g_pOpenStyle,
	bool:g_bOpenStatus[33],
	g_iKnivesNum,
#if defined TELEPOORT
	g_iCanTeleport[33],
	Float:g_fLastUsedTele[33],
#endif
#if defined HOOOK
	g_iCanHook[33],
	g_iIsHooked[32] = false,
	g_iHookCounter[33],
	g_iHookOrigin[32][3],
	g_HookSprite,
#endif
#if defined THUNDEER
	g_iCanThunder[33],
	g_iThunderCounter[33],
	g_pThunderDamage,
	g_pThunderFrags,
	g_ThunderSprite,
#endif
#if defined JUUMPS
	g_iCanJumps[33],
	iJumps[33],
#endif
#if defined FREEZEER
	g_iCanFreeze[33],
	Float:g_fLastUsedFreezer[33],
	bool: g_bFrozen[33],
	Float:g_iAngles[33][3],
	g_FreezerSprite,
	g_FreezerSpriteBeam,
	g_pFDuration,
	g_iFreezerCounter[33],
#endif

	g_iSayText;

#if defined TELEPOORT
	#define TELEPORT_INTERVAL 120.0
#endif

#define FREEZER_INTERVAL 20.0
	
public plugin_init()
{
	register_plugin("Knife Abilities", PLUGIN_VERSION, "OciXCrom_Nikolow")
	register_cvar("CRXNKnifeAbilities", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	
	if(!g_iKnivesNum)
		set_fail_state("No knives found in the configuration file.")
	
	register_dictionary("KnifeAbilities.txt")
	
	//register_event("CurWeapon", "OnSelectKnife", "be", "1=1", "2=29")
	register_event("CurWeapon", "Knifeabilities", "be", "1=1")
	RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamage", 0)
#if defined JUUMPS
	RegisterHookChain(RG_CBasePlayer_Jump, "Fw_PlayerJump_Pre", 0)
#endif
	
#if defined HPREGEEN	
	register_event("Damage", "SetRegeneration", "be", "2>0");
#endif
	
	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
	register_forward(FM_EmitSound,	"OnEmitSound")
#if defined TELEPOORT
	register_clcmd("teleporter", "tele_knife")
#endif
	
#if defined HOOOK
	register_clcmd("+hook","hook_on")
	register_clcmd("-hook","hook_off")
#endif

#if defined THUNDEER
	register_clcmd( "+thor", "commandThunderOn" );
	register_clcmd( "-thor", "commandThunderOff" );
#endif

	register_event("HLTV", "OnNewRound", "a", "1=0", "2=0") 
	
	register_clcmd("say /knifes", "ShowMenu")
	register_clcmd("say_team /knifes", "ShowMenu")
	
	g_pAtSpawn 		 = register_cvar("km_open_at_1st_spawn", "0")
	g_pDebug		 = register_cvar("km_debug_damage", "0")
	g_pResetSpawn 	 = register_cvar("km_reset_at_spawn", "0")
	g_pOpenStyle	 = register_cvar("km_only_open_style", "1") // 0 - Can be opened no meter what | 1 - Once per spawn | 2 - Once per round
	
#if defined THUNDEER
	g_pThunderDamage = register_cvar("km_thunder_damage", "15")
	g_pThunderFrags  = register_cvar("km_thunder_frags", "1")
#endif
	
#if defined FREEZEER
	g_pFDuration = register_cvar("km_freezer_freeze_duration", "3.0")
	
	register_clcmd( "freezer", "freeze_knife" );
	register_event( "DeathMsg" , "eventDeathMsg" , "a" );   
#endif	
	
	
	
	g_iSayText = get_user_msgid("SayText")
}

public plugin_precache()
{
	g_aKnives = ArrayCreate(Knives)
	ReadFile()
	
#if defined HOOOK
	g_HookSprite = precache_model("sprites/laserbeam.spr")
#endif

#if defined THUNDEER
	g_ThunderSprite = precache_model("sprites/lgtning.spr")
#endif

#if defined FREEZEER
	g_FreezerSprite = precache_model("sprites/freezer_exp.spr")
	g_FreezerSpriteBeam = precache_model("sprites/lgtning.spr")
#endif
}

public plugin_end()
	ArrayDestroy(g_aKnives)

ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/KnifeAbilities.ini", szConfigsName)
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[160], szKey[32], szValue[128]
		new eKnife[Knives]
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';': continue
				case '[':
				{
					if(szData[strlen(szData) - 1] == ']')
					{
						if(g_iKnivesNum)
							PushKnife(eKnife)
							
						g_iKnivesNum++
						replace(szData, charsmax(szData), "[", "")
						replace(szData, charsmax(szData), "]", "")
						copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
					}
					else continue
				}
				default:
				{
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					
					if(equal(szKey, "FLAG"))
						eKnife[FLAG] = read_flags(szValue)
					else if(equal(szKey, "V_MODEL"))
					{
						copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "P_MODEL"))
					{
						copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "DEPLOY_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HIT_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HITWALL_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "SLASH_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "STAB_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
						precache_sound(szValue)
					}
					
					else if(equal(szKey, "GRAVITY"))
					{
						eKnife[GRAVITY] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "SPEED"))
					{
						eKnife[SPEED] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "DAMAGE"))
					{
						eKnife[DAMAGE] = _: str_to_float(szValue);
					}
					
					else if(equal(szKey, "NOFOOTSTEPS"))
					{
						eKnife[NOFOOTSTEPS] = _: str_to_num(szValue);
					}
					
					else if(equal(szKey, "TRANSPARENCY"))
					{
						eKnife[TRANSPARENCY] = _: str_to_num(szValue);
					}
					
					#if defined HPREGEEN
					else if(equal(szKey, "HPREGEN"))
					{
						eKnife[HPREGEN] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined TELEPOORT
					else if(equal(szKey, "CAN_USE_TELEPORT"))
					{
						eKnife[TELEPORT] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined HOOOK
					else if(equal(szKey, "CAN_USE_HOOK"))
					{
						eKnife[HOOK] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined THUNDEER
					else if(equal(szKey, "CAN_USE_THUNDER"))
					{
						eKnife[THUNDER] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined JUUMPS
					else if(equal(szKey, "EXTRA_JUMPS"))
					{
						eKnife[JUMPS] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined FREEZEER
					else if(equal(szKey, "CAN_USE_FREEZE"))
					{
						eKnife[FREEZE] = _: str_to_num(szValue);
					}
					#endif
					
					else if(equal(szKey, "NAME"))
					{
						copy(eKnife[NAME2], charsmax(eKnife[NAME2]), szValue)
					}
					
					else if(equal(szKey, "INFO"))
					{
						copy(eKnife[INFO], charsmax(eKnife[INFO]), szValue)
					}
					
					else if(equal(szKey, "INFO2"))
					{
						copy(eKnife[INFO2], charsmax(eKnife[INFO2]), szValue)
					}
				}
			}
		}
		
		if(g_iKnivesNum)
			PushKnife(eKnife)
		
		fclose(iFilePointer)
	}
}

public client_putinserver(id)
{
	g_bFirstTime[id] = true
	g_bOpenStatus[id] = false;
	ArrayGetArray(g_aKnives, 0, g_eKnife[id])
	
	g_iKnife[id] = 0
	
#if defined TELEPOORT
	g_iCanTeleport[id] = 0
#endif

#if defined HOOOK
	g_iCanHook[id] = 0;
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = 0;
#endif

#if defined JUUMPS
	g_iCanJumps[id] = 0;
#endif

#if defined FREEZEER
	g_iCanFreeze[id] = 0;
#endif
}

public OnEmitSound(id, iChannel, const szSample[])
{
	if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
		return FMRES_IGNORED
	
	switch(detect_knife_sound(szSample))
	{
		case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
	}
	
	return FMRES_IGNORED
}

public ShowMenu(id)
{
	if(g_bOpenStatus[id])
	{
		ColorChat(id, "%L", id, "KM_CHAT_CANT")
		return PLUGIN_HANDLED;
	}

	if (get_user_team(id) == 1)
	{
		client_print(id, print_chat, "Only humans have access to knifes")
		return PLUGIN_HANDLED
	}
	
	new szTitle[128]
	formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
	
	new iMenu = menu_create(szTitle, "MenuHandler")
	
	for(new eKnife[Knives], szItem[64], iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
	{
		ArrayGetArray(g_aKnives, i, eKnife)
		
		if(eKnife[FLAG] == ADMIN_ALL || iFlags & eKnife[FLAG])
		{
			if(g_iKnife[id] == i)
			{
				formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_SELECTED")
				menu_additem(iMenu, szItem, eKnife[NAME])
			}
			else
				menu_additem(iMenu, eKnife[NAME], eKnife[NAME])
		}
		else
		{
			formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_VIP_ONLY")
			menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG])
		}
	}
	
	if(menu_pages(iMenu) > 1)
		menu_setprop(iMenu, MPROP_TITLE, formatin("%s%L", szTitle, id, "KM_MENU_TITLE_PAGE"))
		
	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public MenuHandler(id, iMenu, iItem)
{
	if(iItem != MENU_EXIT)
	{
		if(g_iKnife[id] == iItem)
		{
			ColorChat(id, "%L", id, "KM_CHAT_ALREADY")
			if(get_pcvar_num(g_pOpenStyle) > 0) 
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
		else
		{
			new eKnife[Knives]
			ArrayGetArray(g_aKnives, iItem, eKnife)
			
			g_iKnife[id] = iItem
			ArrayGetArray(g_aKnives, iItem, g_eKnife[id])
			
			if(is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
				Knifeabilities(id) //OnSelectKnife(id)
				
			ham_strip_weapon(id, "weapon_knife"); // strip knife
			give_item(id, "weapon_knife") // give knife
			engclient_cmd(id, "weapon_knife") // switch to knife
			
			//new szName[32], iUnused
			//menu_item_getinfo(iMenu, iItem, iUnused, szName, charsmax(szName), .callback = iUnused)
			ColorChat(id, "%L", id, "KM_CHAT_SELECTED", eKnife[NAME2])
			ColorChat(id, "%L", id, "KM_CHAT_INFO", eKnife[INFO])
			ColorChat(id, "%s", eKnife[INFO2])
			
			if(get_pcvar_num(g_pOpenStyle) > 0)
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
	}
	
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}

public OnPlayerSpawn(id)
{
	if(is_user_alive(id))
	{
		if(get_pcvar_num(g_pAtSpawn) && !g_iKnife[id] && g_bFirstTime[id])
		// ако квара е 1 + няма нож + влиза за първи път
		{
			// изкарваме менюто + казваме че първия му спаун е минал
			g_bFirstTime[id] = false
			ShowMenu(id)
		}
		
		if(get_pcvar_num(g_pResetSpawn)) // ако квара е 1
		{
			if(!g_bFirstTime[id]) // не му е първия спаун
			{
				// рескаме му ножа и му изкарваме меню-то на ново
				ArrayGetArray(g_aKnives, 0, g_eKnife[id])
				g_iKnife[id] = 0
				ShowMenu(id)
			}
		}
		
		if(get_pcvar_num(g_pOpenStyle) == 1) g_bOpenStatus[id] = false;
		
		#if defined HOOOK
			g_iHookCounter[id] = 0;
		#endif
		
		#if defined THUNDEER
			g_iThunderCounter[id] = 0;
		#endif
		
		#if defined FREEZEER
			if(is_user_frozen(id)) UnFreeze( id ); // махаме фрийза ако има такъв
			g_iFreezerCounter[id] = 0;
		#endif
	}
}

public OnNewRound() 
{
	if(get_pcvar_num(g_pOpenStyle) == 2)
	{
		new players[32], num
		get_players(players, num)
	 
		new player
		for(new i = 0; i < num; i++)
		{
			player = players[i]
			g_bOpenStatus[player] = false;
		}
	}
}
/*
public OnSelectKnife(id)
{
	set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
	set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}*/

public Knifeabilities(id)
{
	if (get_user_team(id) == 1)
	return PLUGIN_HANDLED
	new weapon = read_data(2)
	
	set_user_gravity(id, weapon == CSW_KNIFE ? g_eKnife[id][GRAVITY] : 1.0)
	set_user_maxspeed(id, weapon == CSW_KNIFE? g_eKnife[id][SPEED] : 250.0)
	
	set_user_footsteps(id, weapon == CSW_KNIFE? g_eKnife[id][NOFOOTSTEPS] : 0) // 1 - no footsteps, 0 - normal footsteps
	
	set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, weapon == CSW_KNIFE? g_eKnife[id][TRANSPARENCY] : 255) // 255 - normal
	
#if defined TELEPOORT
	g_iCanTeleport[id] = g_eKnife[id][TELEPORT];
#endif
	
#if defined HOOOK
	g_iCanHook[id] = g_eKnife[id][HOOK];
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = g_eKnife[id][THUNDER];
#endif
	
#if defined JUUMPS
	g_iCanJumps[id] = g_eKnife[id][JUMPS];
#endif
	
#if defined FREEZEER
	g_iCanFreeze[id] = g_eKnife[id][FREEZE];
#endif
	
	
	if(weapon == CSW_KNIFE)
	{
		set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
		set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
	}
	return PLUGIN_CONTINUE;
}

public fwdTakeDamage(victim, inflictor, attacker, Float:damage, damage_bits)
{
	if(is_true_player(attacker) && get_user_weapon(attacker) == CSW_KNIFE && victim != attacker)	
	{
		if(get_pcvar_num(g_pDebug)) client_print(attacker, print_center, "Knife Damage: %f", damage * g_eKnife[attacker][DAMAGE]);
		SetHamParamFloat(4, damage * g_eKnife[attacker][DAMAGE])
	}
}
#if defined HPREGEEN
public SetRegeneration(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	if (get_user_health(id) < 100)
		set_task(3.0, "Regenerate", id, _, _, "b");
}

public Regenerate(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	new NeededHealth = 100 - Health;

	if (NeededHealth <= g_eKnife[id][HPREGEN])
	{
		set_user_health(id, get_user_health(id) + NeededHealth)
		remove_task(id);

		return;
	}
	
	set_user_health(id, get_user_health(id) + g_eKnife[id][HPREGEN]);
}
#endif

PushKnife(eKnife[Knives])
{
	if(!eKnife[V_MODEL][0])
		copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), DEFAULT_V)
		
	if(!eKnife[P_MODEL][0])
		copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), DEFAULT_P)
		
	ArrayPushArray(g_aKnives, eKnife)
}

bool:is_knife_sound(const szSample[])
	return bool:equal(szSample[8], "kni", 3)

detect_knife_sound(const szSample[])
{
	static iSound
	iSound = SOUND_NONE
	
	if(equal(szSample, "weapons/knife_deploy1.wav"))
		iSound = SOUND_DEPLOY
	else if(equal(szSample[14], "hit", 3))
		iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
	else if(equal(szSample[14], "sla", 3))
		iSound = SOUND_SLASH
	else if(equal(szSample[14], "sta", 3))
		iSound = SOUND_STAB
		
	return iSound
}

play_knife_sound(id, const szSound[])
	engfunc(EngFunc_EmitSound, id, CHAN_WEAPON, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
ColorChat(const id, const szInput[], any:...)
{
	new iPlayers[32], iCount = 1
	static szMessage[191]
	vformat(szMessage, charsmax(szMessage), szInput, 3)
	format(szMessage[0], charsmax(szMessage), "%L %s", id ? id : LANG_PLAYER, "KM_CHAT_PREFIX", szMessage)
	
	replace_all(szMessage, charsmax(szMessage), "!g", "^4")
	replace_all(szMessage, charsmax(szMessage), "!n", "^1")
	replace_all(szMessage, charsmax(szMessage), "!t", "^3")
	
	if(id)
		iPlayers[0] = id
	else
		get_players(iPlayers, iCount, "ch")
	
	for(new i; i < iCount; i++)
	{
		if(is_user_connected(iPlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayers[i])
			write_byte(iPlayers[i])
			write_string(szMessage)
			message_end()
		}
	}
}

stock ham_strip_weapon(id,weapon[])
{
	if(!equal(weapon,"weapon_",7)) return 0;

	new wId = get_weaponid(weapon);
	if(!wId) return 0;

	new wEnt;
	while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
	if(!wEnt) return 0;

	if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);

	if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0;
	ExecuteHamB(Ham_Item_Kill,wEnt);

	set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId));

	return 1;
}

// TELEPORT
#if defined TELEPOORT
public tele_knife(id)
{
	if(!is_user_alive(id) && !is_user_connected(id))
		return PLUGIN_HANDLED;

	if(g_iCanTeleport[id] > 0 && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedTele[id] > 0.0 && (fTime - g_fLastUsedTele[id]) < TELEPORT_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_TP_INTERVAL", TELEPORT_INTERVAL - (fTime - g_fLastUsedTele[id]))
			return PLUGIN_HANDLED;
		}   
	
		static Float:start[3], Float:dest[3] 
		pev(id, pev_origin, start) 
		pev(id, pev_view_ofs, dest) 
		xs_vec_add(start, dest, start) 
		pev(id, pev_v_angle, dest) 
	
		engfunc(EngFunc_MakeVectors, dest) 
		global_get(glb_v_forward, dest) 
		xs_vec_mul_scalar(dest, 9999.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_TraceLine, start, dest, IGNORE_MONSTERS, id, 0) 
		get_tr2(0, TR_vecEndPos, start) 
		get_tr2(0, TR_vecPlaneNormal, dest) 
	
		static const player_hull[] = {HULL_HUMAN, HULL_HEAD} 
		engfunc(EngFunc_TraceHull, start, start, DONT_IGNORE_MONSTERS, player_hull[_:!!(pev(id, pev_flags) & FL_DUCKING)], id, 0)
		
		if(!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen)) 
		{ 
			engfunc(EngFunc_SetOrigin, id, start) 
			return PLUGIN_HANDLED 
		}
	
		static Float:size[3] 
		pev(id, pev_size, size) 
		
		xs_vec_mul_scalar(dest, (size[0] + size[1]) / 2.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_SetOrigin, id, dest) 
	
		g_fLastUsedTele[id] = fTime;
	}
	else ColorChat(id, "%L", id, "KM_CHAT_CANT_TP")

	return PLUGIN_HANDLED;
}
#endif

// HOOK 
#if defined HOOOK
public hook_on(id)
{
	if(!is_user_alive(id))
		return PLUGIN_HANDLED;

	if(g_iCanHook[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
 
	if(g_iHookCounter[id] < g_iCanHook[id] && get_user_weapon( id ) == CSW_KNIFE)
	{
		get_user_origin(id, g_iHookOrigin[id],3)

		g_iIsHooked[id] = true
		++g_iHookCounter[id]
		emit_sound(id,CHAN_STATIC,"hook/hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
		set_task(0.1,"hook_task",id,"",0,"ab")
		hook_task(id)
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_HOOK_LIMIT" ,g_iCanHook[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED
}


public is_hooked(id)
	return g_iIsHooked[id] 
 
public hook_off(id)
{    
	remove_hook(id)
	return PLUGIN_HANDLED
}

public hook_task(id)
{
	if(!is_user_connected(id) || !is_user_alive(id))
		remove_hook(id)

	remove_beam(id)
	draw_hook(id)

	new origin[3], Float:velocity[3]
	get_user_origin(id,origin)
	new distance = get_distance(g_iHookOrigin[id],origin)
	if(distance > 25)
	{
		velocity[0] = (g_iHookOrigin[id][0] - origin[0]) * (2.0 * 300 / distance)
		velocity[1] = (g_iHookOrigin[id][1] - origin[1]) * (2.0 * 300 / distance)
		velocity[2] = (g_iHookOrigin[id][2] - origin[2]) * (2.0 * 300 / distance)

		entity_set_vector(id,EV_VEC_velocity,velocity)
	}
	else
	{
		entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
		remove_hook(id)
	}
}
 
 
public draw_hook(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(1) // TE_BEAMENTPOINT
	write_short(id) // entid
	write_coord(g_iHookOrigin[id][0]) // origin
	write_coord(g_iHookOrigin[id][1]) // origin
	write_coord(g_iHookOrigin[id][2]) // origin
	write_short(g_HookSprite) // sprite index
	write_byte(0) // start frame
	write_byte(0) // framerate
	write_byte(100) // life
	write_byte(10) // width
	write_byte(0) // noise
	
	// colors R G B
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))

	write_byte(250) // brightness
	write_byte(1) // speed
	message_end()
}
 
 
public remove_hook(id)
{
	if(task_exists(id))
		remove_task(id)

	remove_beam(id)
	g_iIsHooked[id] = false
}
 
 
public remove_beam(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(99)
	write_short(id)
	message_end()
}
#endif

#if defined THUNDEER
public commandThunderOn( id )
{
	if( !is_user_alive( id ) )
		return PLUGIN_HANDLED;
		
	if(g_iCanThunder[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
	
	if( g_iThunderCounter[id] < g_iCanThunder[id] && get_user_weapon( id ) == CSW_KNIFE )
	{
		new target, body;
		get_user_aiming( id, target, body );
   
		if( is_valid_ent( target ) && is_user_alive( target ) )
		{
			if( get_user_team( id ) == get_user_team( target ) )
				return PLUGIN_HANDLED;
			
			++g_iThunderCounter[id]
			
			new iPlayerOrigin[ 3 ], iEndOrigin[ 3 ];

			get_user_origin( id, iPlayerOrigin );
			get_user_origin( target, iEndOrigin );
      
			show_beam( iPlayerOrigin, iEndOrigin );
			ExecuteHam( Ham_TakeDamage, target, 0, id, float( get_pcvar_num( g_pThunderDamage ) ), DMG_ENERGYBEAM );
			entity_set_float( id, EV_FL_frags, get_user_frags( id ) + float( get_pcvar_num( g_pThunderFrags ) ) );
		}
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_THUNDER_LIMIT" ,g_iCanThunder[id])
		return PLUGIN_HANDLED
	}
   
	return PLUGIN_HANDLED;
}

public commandThunderOff( id )
{
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_KILLBEAM );
	write_short( id );
	message_end();

	return PLUGIN_HANDLED;
}

stock show_beam( StartOrigin[ 3 ], EndOrigin[ 3 ] )
{
   message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
   write_byte( TE_BEAMPOINTS );
   write_coord( StartOrigin[ 0 ] );
   write_coord( StartOrigin[ 1 ] );
   write_coord( StartOrigin[ 2 ] );
   write_coord( EndOrigin[ 0 ] );
   write_coord( EndOrigin[ 1 ] );
   write_coord( EndOrigin[ 2 ] );
   write_short( g_ThunderSprite );
   write_byte( 1 );
   write_byte( 1 );
   write_byte( 3 );
   write_byte( 33);
   write_byte( 0 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 200 );
   write_byte( 0 );
   message_end();
}
#endif

#if defined JUUMPS
public Fw_PlayerJump_Pre(id)
{
	if (!is_user_alive(id))
		return HC_SUPERCEDE

	new iFlags = get_entvar(id, var_flags)

	if (iFlags & FL_WATERJUMP || get_entvar(id, var_waterlevel) >= 2 || !(get_member(id, m_afButtonPressed) & IN_JUMP))
		return HC_CONTINUE

	if (iFlags & FL_ONGROUND)
	{
		iJumps[id] = 0
		return HC_CONTINUE
	}

	if (g_iCanJumps[id] > 0)
	{
		if (++iJumps[id] <= g_iCanJumps[id])
		{
			new Float:fVelocity[3]
			get_entvar(id, var_velocity, fVelocity)
			fVelocity[2] = 268.328157
			set_entvar(id, var_velocity, fVelocity)
			
			return HC_SUPERCEDE
		}
	}
	return HC_CONTINUE
}
#endif


#if defined FREEZEER
public freeze_knife(id)
{
	if(!is_user_alive(id))
		return PLUGIN_HANDLED;
		
	if(g_iCanFreeze[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED

	if(g_iFreezerCounter[id] < g_iCanFreeze[id] && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedFreezer[id] > 0.0 && (fTime - g_fLastUsedFreezer[id]) < FREEZER_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_FREEZE_INTERVAL", FREEZER_INTERVAL - (fTime - g_fLastUsedFreezer[id]))
			return PLUGIN_HANDLED;
		}   

		cmd_freez(id)
		++g_iFreezerCounter[id]
	
		g_fLastUsedFreezer[id] = fTime;
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_FREEZE_LIMIT" ,g_iCanFreeze[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED;
}

cmd_freez(id)
{
    new target, body
    static Float:start[3]
    static Float:aim[3]
    
    pev(id, pev_origin, start)
    fm_get_aim_origin(id, aim)
    
    start[2] += 16.0; // raise
    aim[2] += 16.0; // raise
    get_user_aiming ( id, target, body, 1000 ) // 1000 - distance
    
    if( is_user_alive( target ))
    {    
        new iOrigin[ 3 ];  
        get_user_origin( target, iOrigin, 0 );
    
        message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
        write_byte( 15 );
        write_coord( iOrigin[ 0 ] );     // start position (X)
        write_coord( iOrigin[ 1 ] );     // start position (Y)
        write_coord( iOrigin[ 2 ] + 40 ); // start position (Z)
        write_coord( iOrigin[ 0 ] );     // end position (X)
        write_coord( iOrigin[ 1 ] );    // end position (Y)
        write_coord( iOrigin[ 2 ] );    // end position (Z)
        write_short( g_FreezerSprite );    // sprite index
        write_byte( 50 );        // count
        write_byte( 20 );        // life in 0.1's
        write_byte( 2 );        // scale in 0.1's
        write_byte( 50 );        // velocity along vector in 10's
        write_byte( 10 );        // randomness of velocity in 10's
        message_end(  );

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, aim[0])
        engfunc(EngFunc_WriteCoord, aim[1])
        engfunc(EngFunc_WriteCoord, aim[2])
        write_short(g_FreezerSpriteBeam)
        write_byte(10)
        write_byte(30)
        write_byte(4)
        message_end()

        Freeze(target)        
        set_task( get_pcvar_float( g_pFDuration ), "UnFreeze", target )
    }    
    
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(0)
    engfunc(EngFunc_WriteCoord,start[0]);
    engfunc(EngFunc_WriteCoord,start[1]);
    engfunc(EngFunc_WriteCoord,start[2]);
    engfunc(EngFunc_WriteCoord,aim[0]);
    engfunc(EngFunc_WriteCoord,aim[1]);
    engfunc(EngFunc_WriteCoord,aim[2]);
    write_short(g_FreezerSpriteBeam); // sprite index
    write_byte(0); // start frame
    write_byte(10); // frame rate in 0.1's
    write_byte(10); // life in 0.1's
    write_byte(100); // line width in 0.1's
    write_byte(4); // noise amplititude in 0.01's
    write_byte(100); // red
    write_byte(149); // green
    write_byte(237); // blue
    write_byte(100); // brightness
    write_byte(50); // scroll speed in 0.1's
    message_end();    
}

stock Freeze(id)
{ 
    new iFlags = pev( id , pev_flags );
    
    if( ~iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags | FL_FROZEN );
        pev( id , pev_v_angle , g_iAngles[ id ] );
        
        set_user_rendering( id , kRenderFxGlowShell , 0 , 100 , 200 , kRenderNormal , 16 );        
    } 
    
    g_bFrozen[ id ] = true;       
}

public UnFreeze(id)
{ 
    new frozenCount = 0;
    
    g_bFrozen[ id ] = false;
    
    new iFlags = pev( id , pev_flags ) ;
    
    if( iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags & ~FL_FROZEN ) ;
        set_user_rendering( id , kRenderFxNone , 0 , 0 , 0 , kRenderNormal , 0 );
        
        new iPlayers[ 32 ] , iNum , i , tid;
        get_players( iPlayers , iNum , "a" );
        
        for( i = 0; i < iNum; i++ )
        {
            tid = iPlayers[ i ];
            
            if( is_user_frozen( tid ) )
            {
                frozenCount++;
            }
        }                
    } 
}

public eventDeathMsg() if(is_user_frozen(read_data(2))) UnFreeze(read_data(2));
#endif

Аватар
YankoNL
Извън линия
Потребител
Потребител
Мнения: 163
Регистриран на: 06 Апр 2017, 09:07
Местоположение: Варна
Се отблагодари: 22 пъти
Получена благодарност: 9 пъти

Заявка за преработка на плъгин / Knife Abilities

Мнение от YankoNL » 10 Окт 2022, 01:06

Предполагам че това може да ти свърши работа. Тествай и ми кажи дали всичко е наред

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

#include <amxmodx>
#include <amxmisc>
#include <formatin>
#include <fun>
#include <hamsandwich>
#include <fakemeta_util>
#include <zombieplague>

#define HOOOK
#define TELEPOORT
#define HPREGEEN
#define THUNDEER
#define JUUMPS
#define FREEZEER

#if defined JUUMPS
#include <reapi>
#endif

#if defined HOOOK
#include <engine>
#endif

#if defined FREEZEER
#define is_user_frozen(%1) g_bFrozen[%1]
#endif

#define PLUGIN_VERSION "2.2"
#define DEFAULT_V "models/v_knife.mdl"
#define DEFAULT_P "models/p_knife.mdl"

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

enum
{
	SOUND_NONE = 0,
	SOUND_DEPLOY,
	SOUND_HIT,
	SOUND_HITWALL,
	SOUND_SLASH,
	SOUND_STAB
}

enum _:Knives
{
	NAME[128],
	NAME2[128],
	INFO[128],
	INFO2[128],
	V_MODEL[128],
	P_MODEL[128],
	DEPLOY_SOUND[128],
	HIT_SOUND[128],
	HITWALL_SOUND[128],
	SLASH_SOUND[128],
	STAB_SOUND[128],
	Float: GRAVITY,
	Float: SPEED,
	Float: DAMAGE,
	NOFOOTSTEPS,
	TRANSPARENCY,
#if defined HPREGEEN
	HPREGEN,
#endif
#if defined TELEPOORT
	TELEPORT,
#endif
#if defined HOOOK	
	HOOK,
#endif
#if defined THUNDEER
	THUNDER,
#endif
#if defined JUUMPS
	JUMPS,
#endif
#if defined FREEZEER
	FREEZE,
#endif
	FLAG,
	bool:HAS_CUSTOM_SOUND
}

new Array:g_aKnives,
	bool:g_bFirstTime[33],
	g_eKnife[33][Knives],
	g_iKnife[33],
	g_pAtSpawn,
	g_pDebug,
	g_pResetSpawn,
	g_pOpenStyle,
	bool:g_bOpenStatus[33],
	g_iKnivesNum,
#if defined TELEPOORT
	g_iCanTeleport[33],
	Float:g_fLastUsedTele[33],
#endif
#if defined HOOOK
	g_iCanHook[33],
	g_iIsHooked[32] = false,
	g_iHookCounter[33],
	g_iHookOrigin[32][3],
	g_HookSprite,
#endif
#if defined THUNDEER
	g_iCanThunder[33],
	g_iThunderCounter[33],
	g_pThunderDamage,
	g_pThunderFrags,
	g_ThunderSprite,
#endif
#if defined JUUMPS
	g_iCanJumps[33],
	iJumps[33],
#endif
#if defined FREEZEER
	g_iCanFreeze[33],
	Float:g_fLastUsedFreezer[33],
	bool: g_bFrozen[33],
	Float:g_iAngles[33][3],
	g_FreezerSprite,
	g_FreezerSpriteBeam,
	g_pFDuration,
	g_iFreezerCounter[33],
#endif
	g_iSayText;

#if defined TELEPOORT
	#define TELEPORT_INTERVAL 120.0
#endif

#define FREEZER_INTERVAL 20.0
	
public plugin_init()
{
	register_plugin("Knife Abilities", PLUGIN_VERSION, "OciXCrom_Nikolow")
	register_cvar("CRXNKnifeAbilities", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	
	if(!g_iKnivesNum)
		set_fail_state("No knives found in the configuration file.")
	
	register_dictionary("KnifeAbilities.txt")
	
	//register_event("CurWeapon", "OnSelectKnife", "be", "1=1", "2=29")
	register_event("CurWeapon", "Knifeabilities", "be", "1=1")
	RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamage", 0)
#if defined JUUMPS
	RegisterHookChain(RG_CBasePlayer_Jump, "Fw_PlayerJump_Pre", 0)
#endif
	
#if defined HPREGEEN	
	register_event("Damage", "SetRegeneration", "be", "2>0");
#endif
	
	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
	register_forward(FM_EmitSound,	"OnEmitSound")
#if defined TELEPOORT
	register_clcmd("teleporter", "tele_knife")
#endif
	
#if defined HOOOK
	register_clcmd("+hook","hook_on")
	register_clcmd("-hook","hook_off")
#endif

#if defined THUNDEER
	register_clcmd( "+thor", "commandThunderOn" );
	register_clcmd( "-thor", "commandThunderOff" );
#endif

	register_event("HLTV", "OnNewRound", "a", "1=0", "2=0") 
	
	register_clcmd("say /knife", "ShowMenu")
	register_clcmd("say_team /knife", "ShowMenu")
	
	g_pAtSpawn 		 = register_cvar("km_open_at_1st_spawn", "1")
	g_pDebug		 = register_cvar("km_debug_damage", "0")
	g_pResetSpawn 	 = register_cvar("km_reset_at_spawn", "0")
	g_pOpenStyle	 = register_cvar("km_only_open_style", "0") // 0 - Can be opened no meter what | 1 - Once per spawn | 2 - Once per round
	
#if defined THUNDEER
	g_pThunderDamage = register_cvar("km_thunder_damage", "15")
	g_pThunderFrags  = register_cvar("km_thunder_frags", "1")
#endif
	
#if defined FREEZEER
	g_pFDuration = register_cvar("km_freezer_freeze_duration", "3.0")
	
	register_clcmd( "freezer", "freeze_knife" );
	register_event( "DeathMsg" , "eventDeathMsg" , "a" );   
#endif	
	
	
	
	g_iSayText = get_user_msgid("SayText")
}

public plugin_precache()
{
	g_aKnives = ArrayCreate(Knives)
	ReadFile()
	
#if defined HOOOK
	g_HookSprite = precache_model("sprites/laserbeam.spr")
#endif

#if defined THUNDEER
	g_ThunderSprite = precache_model("sprites/lgtning.spr")
#endif

#if defined FREEZEER
	g_FreezerSprite = precache_model("sprites/freezer_exp.spr")
	g_FreezerSpriteBeam = precache_model("sprites/lgtning.spr")
#endif
}

public plugin_end()
	ArrayDestroy(g_aKnives)

ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/KnifeAbilities.ini", szConfigsName)
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[160], szKey[32], szValue[128]
		new eKnife[Knives]
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';': continue
				case '[':
				{
					if(szData[strlen(szData) - 1] == ']')
					{
						if(g_iKnivesNum)
							PushKnife(eKnife)
							
						g_iKnivesNum++
						replace(szData, charsmax(szData), "[", "")
						replace(szData, charsmax(szData), "]", "")
						copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
					}
					else continue
				}
				default:
				{
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					
					if(equal(szKey, "FLAG"))
						eKnife[FLAG] = read_flags(szValue)
					else if(equal(szKey, "V_MODEL"))
					{
						copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "P_MODEL"))
					{
						copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "DEPLOY_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HIT_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HITWALL_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "SLASH_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "STAB_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
						precache_sound(szValue)
					}
					
					else if(equal(szKey, "GRAVITY"))
					{
						eKnife[GRAVITY] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "SPEED"))
					{
						eKnife[SPEED] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "DAMAGE"))
					{
						eKnife[DAMAGE] = _: str_to_float(szValue);
					}
					
					else if(equal(szKey, "NOFOOTSTEPS"))
					{
						eKnife[NOFOOTSTEPS] = _: str_to_num(szValue);
					}
					
					else if(equal(szKey, "TRANSPARENCY"))
					{
						eKnife[TRANSPARENCY] = _: str_to_num(szValue);
					}
					
					#if defined HPREGEEN
					else if(equal(szKey, "HPREGEN"))
					{
						eKnife[HPREGEN] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined TELEPOORT
					else if(equal(szKey, "CAN_USE_TELEPORT"))
					{
						eKnife[TELEPORT] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined HOOOK
					else if(equal(szKey, "CAN_USE_HOOK"))
					{
						eKnife[HOOK] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined THUNDEER
					else if(equal(szKey, "CAN_USE_THUNDER"))
					{
						eKnife[THUNDER] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined JUUMPS
					else if(equal(szKey, "EXTRA_JUMPS"))
					{
						eKnife[JUMPS] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined FREEZEER
					else if(equal(szKey, "CAN_USE_FREEZE"))
					{
						eKnife[FREEZE] = _: str_to_num(szValue);
					}
					#endif
					
					else if(equal(szKey, "NAME"))
					{
						copy(eKnife[NAME2], charsmax(eKnife[NAME2]), szValue)
					}
					
					else if(equal(szKey, "INFO"))
					{
						copy(eKnife[INFO], charsmax(eKnife[INFO]), szValue)
					}
					
					else if(equal(szKey, "INFO2"))
					{
						copy(eKnife[INFO2], charsmax(eKnife[INFO2]), szValue)
					}
				}
			}
		}
		
		if(g_iKnivesNum)
			PushKnife(eKnife)
		
		fclose(iFilePointer)
	}
}

public client_putinserver(id)
{
	g_bFirstTime[id] = true
	g_bOpenStatus[id] = false;
	ArrayGetArray(g_aKnives, 0, g_eKnife[id])
	
	g_iKnife[id] = 0
	
#if defined TELEPOORT
	g_iCanTeleport[id] = 0
#endif

#if defined HOOOK
	g_iCanHook[id] = 0;
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = 0;
#endif

#if defined JUUMPS
	g_iCanJumps[id] = 0;
#endif

#if defined FREEZEER
	g_iCanFreeze[id] = 0;
#endif
}

public OnEmitSound(id, iChannel, const szSample[])
{
	if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
		return FMRES_IGNORED
	
	switch(detect_knife_sound(szSample))
	{
		case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
	}
	
	return FMRES_IGNORED
}

public ShowMenu(id)
{
	if(g_bOpenStatus[id])
	{
		ColorChat(id, "%L", id, "KM_CHAT_CANT")
		return PLUGIN_HANDLED;
	}
	
	new szTitle[128]
	formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
	
	new iMenu = menu_create(szTitle, "MenuHandler")
	
	for(new eKnife[Knives], szItem[64], iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
	{
		ArrayGetArray(g_aKnives, i, eKnife)
		
		if(eKnife[FLAG] == ADMIN_ALL || iFlags & eKnife[FLAG])
		{
			if(g_iKnife[id] == i)
			{
				formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_SELECTED")
				menu_additem(iMenu, szItem, eKnife[NAME])
			}
			else
				menu_additem(iMenu, eKnife[NAME], eKnife[NAME])
		}
		else
		{
			formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_VIP_ONLY")
			menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG])
		}
	}
	
	if(menu_pages(iMenu) > 1)
		menu_setprop(iMenu, MPROP_TITLE, formatin("%s%L", szTitle, id, "KM_MENU_TITLE_PAGE"))
		
	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public MenuHandler(id, iMenu, iItem)
{
	if(iItem != MENU_EXIT)
	{
		if(g_iKnife[id] == iItem)
		{
			ColorChat(id, "%L", id, "KM_CHAT_ALREADY")
			if(get_pcvar_num(g_pOpenStyle) > 0) 
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
		else
		{
			new eKnife[Knives]
			ArrayGetArray(g_aKnives, iItem, eKnife)
			
			g_iKnife[id] = iItem
			ArrayGetArray(g_aKnives, iItem, g_eKnife[id])
			
			if(!zp_get_user_zombie(id) || is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
				Knifeabilities(id) //OnSelectKnife(id)
				
			ham_strip_weapon(id, "weapon_knife"); // strip knife
			give_item(id, "weapon_knife") // give knife
			engclient_cmd(id, "weapon_knife") // switch to knife
			
			//new szName[32], iUnused
			//menu_item_getinfo(iMenu, iItem, iUnused, szName, charsmax(szName), .callback = iUnused)
			ColorChat(id, "%L", id, "KM_CHAT_SELECTED", eKnife[NAME2])
			ColorChat(id, "%L", id, "KM_CHAT_INFO", eKnife[INFO])
			ColorChat(id, "%s", eKnife[INFO2])
			
			if(get_pcvar_num(g_pOpenStyle) > 0)
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
	}
	
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}

public OnPlayerSpawn(id)
{
	if(is_user_alive(id) || !zp_get_user_zombie(id))
	{
		if(get_pcvar_num(g_pAtSpawn) && !g_iKnife[id] && g_bFirstTime[id])
		// ако квара е 1 + няма нож + влиза за първи път
		{
			// изкарваме менюто + казваме че първия му спаун е минал
			g_bFirstTime[id] = false
			ShowMenu(id)
		}
		
		if(get_pcvar_num(g_pResetSpawn)) // ако квара е 1
		{
			if(!g_bFirstTime[id]) // не му е първия спаун
			{
				// рескаме му ножа и му изкарваме меню-то на ново
				ArrayGetArray(g_aKnives, 0, g_eKnife[id])
				g_iKnife[id] = 0
				ShowMenu(id)
			}
		}
		
		if(get_pcvar_num(g_pOpenStyle) == 1) g_bOpenStatus[id] = false;
		
		#if defined HOOOK
			g_iHookCounter[id] = 0;
		#endif
		
		#if defined THUNDEER
			g_iThunderCounter[id] = 0;
		#endif
		
		#if defined FREEZEER
			if(is_user_frozen(id)) UnFreeze( id ); // махаме фрийза ако има такъв
			g_iFreezerCounter[id] = 0;
		#endif
	}
}

public OnNewRound() 
{
	if(get_pcvar_num(g_pOpenStyle) == 2)
	{
		new players[32], num
		get_players(players, num)
	 
		new player
		for(new i = 0; i < num; i++)
		{
			player = players[i]
			g_bOpenStatus[player] = false;
		}
	}
}
/*
public OnSelectKnife(id)
{
	set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
	set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}*/

public Knifeabilities(id)
{
	new weapon = read_data(2)
	
	set_user_gravity(id, weapon == CSW_KNIFE ? g_eKnife[id][GRAVITY] : 1.0)
	set_user_maxspeed(id, weapon == CSW_KNIFE? g_eKnife[id][SPEED] : 250.0)
	
	set_user_footsteps(id, weapon == CSW_KNIFE? g_eKnife[id][NOFOOTSTEPS] : 0) // 1 - no footsteps, 0 - normal footsteps
	
	set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, weapon == CSW_KNIFE? g_eKnife[id][TRANSPARENCY] : 255) // 255 - normal
	
#if defined TELEPOORT
	g_iCanTeleport[id] = g_eKnife[id][TELEPORT];
#endif
	
#if defined HOOOK
	g_iCanHook[id] = g_eKnife[id][HOOK];
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = g_eKnife[id][THUNDER];
#endif
	
#if defined JUUMPS
	g_iCanJumps[id] = g_eKnife[id][JUMPS];
#endif
	
#if defined FREEZEER
	g_iCanFreeze[id] = g_eKnife[id][FREEZE];
#endif
	
	
	if(weapon == CSW_KNIFE && !zp_get_user_zombie(id))
	{
		set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
		set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
	}
	return PLUGIN_CONTINUE;
}

public fwdTakeDamage(victim, inflictor, attacker, Float:damage, damage_bits)
{
	if(is_true_player(attacker) && get_user_weapon(attacker) == CSW_KNIFE && victim != attacker)	
	{
		if(get_pcvar_num(g_pDebug)) client_print(attacker, print_center, "Knife Damage: %f", damage * g_eKnife[attacker][DAMAGE]);
		SetHamParamFloat(4, damage * g_eKnife[attacker][DAMAGE])
	}
}
#if defined HPREGEEN
public SetRegeneration(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	if (get_user_health(id) < 100)
		set_task(3.0, "Regenerate", id, _, _, "b");
}

public Regenerate(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	new NeededHealth = 100 - Health;

	if (NeededHealth <= g_eKnife[id][HPREGEN])
	{
		set_user_health(id, get_user_health(id) + NeededHealth)
		remove_task(id);

		return;
	}
	
	set_user_health(id, get_user_health(id) + g_eKnife[id][HPREGEN]);
}
#endif

PushKnife(eKnife[Knives])
{
	if(!eKnife[V_MODEL][0])
		copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), DEFAULT_V)
		
	if(!eKnife[P_MODEL][0])
		copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), DEFAULT_P)
		
	ArrayPushArray(g_aKnives, eKnife)
}

bool:is_knife_sound(const szSample[])
	return bool:equal(szSample[8], "kni", 3)

detect_knife_sound(const szSample[])
{
	static iSound
	iSound = SOUND_NONE
	
	if(equal(szSample, "weapons/knife_deploy1.wav"))
		iSound = SOUND_DEPLOY
	else if(equal(szSample[14], "hit", 3))
		iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
	else if(equal(szSample[14], "sla", 3))
		iSound = SOUND_SLASH
	else if(equal(szSample[14], "sta", 3))
		iSound = SOUND_STAB
		
	return iSound
}

play_knife_sound(id, const szSound[])
	engfunc(EngFunc_EmitSound, id, CHAN_WEAPON, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
ColorChat(const id, const szInput[], any:...)
{
	new iPlayers[32], iCount = 1
	static szMessage[191]
	vformat(szMessage, charsmax(szMessage), szInput, 3)
	format(szMessage[0], charsmax(szMessage), "%L %s", id ? id : LANG_PLAYER, "KM_CHAT_PREFIX", szMessage)
	
	replace_all(szMessage, charsmax(szMessage), "!g", "^4")
	replace_all(szMessage, charsmax(szMessage), "!n", "^1")
	replace_all(szMessage, charsmax(szMessage), "!t", "^3")
	
	if(id)
		iPlayers[0] = id
	else
		get_players(iPlayers, iCount, "ch")
	
	for(new i; i < iCount; i++)
	{
		if(is_user_connected(iPlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayers[i])
			write_byte(iPlayers[i])
			write_string(szMessage)
			message_end()
		}
	}
}

stock ham_strip_weapon(id,weapon[])
{
	if(!equal(weapon,"weapon_",7)) return 0;

	new wId = get_weaponid(weapon);
	if(!wId) return 0;

	new wEnt;
	while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
	if(!wEnt) return 0;

	if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);

	if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0;
	ExecuteHamB(Ham_Item_Kill,wEnt);

	set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId));

	return 1;
}

// TELEPORT
#if defined TELEPOORT
public tele_knife(id)
{
	if(!is_user_alive(id) && !is_user_connected(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;

	if(g_iCanTeleport[id] > 0 && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedTele[id] > 0.0 && (fTime - g_fLastUsedTele[id]) < TELEPORT_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_TP_INTERVAL", TELEPORT_INTERVAL - (fTime - g_fLastUsedTele[id]))
			return PLUGIN_HANDLED;
		}   
	
		static Float:start[3], Float:dest[3] 
		pev(id, pev_origin, start) 
		pev(id, pev_view_ofs, dest) 
		xs_vec_add(start, dest, start) 
		pev(id, pev_v_angle, dest) 
	
		engfunc(EngFunc_MakeVectors, dest) 
		global_get(glb_v_forward, dest) 
		xs_vec_mul_scalar(dest, 9999.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_TraceLine, start, dest, IGNORE_MONSTERS, id, 0) 
		get_tr2(0, TR_vecEndPos, start) 
		get_tr2(0, TR_vecPlaneNormal, dest) 
	
		static const player_hull[] = {HULL_HUMAN, HULL_HEAD} 
		engfunc(EngFunc_TraceHull, start, start, DONT_IGNORE_MONSTERS, player_hull[_:!!(pev(id, pev_flags) & FL_DUCKING)], id, 0)
		
		if(!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen)) 
		{ 
			engfunc(EngFunc_SetOrigin, id, start) 
			return PLUGIN_HANDLED 
		}
	
		static Float:size[3] 
		pev(id, pev_size, size) 
		
		xs_vec_mul_scalar(dest, (size[0] + size[1]) / 2.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_SetOrigin, id, dest) 
	
		g_fLastUsedTele[id] = fTime;
	}
	else ColorChat(id, "%L", id, "KM_CHAT_CANT_TP")

	return PLUGIN_HANDLED;
}
#endif

// HOOK 
#if defined HOOOK
public hook_on(id)
{
	if(!is_user_alive(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;

	if(g_iCanHook[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
 
	if(g_iHookCounter[id] < g_iCanHook[id] && get_user_weapon( id ) == CSW_KNIFE)
	{
		get_user_origin(id, g_iHookOrigin[id],3)

		g_iIsHooked[id] = true
		++g_iHookCounter[id]
		emit_sound(id,CHAN_STATIC,"hook/hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
		set_task(0.1,"hook_task",id,"",0,"ab")
		hook_task(id)
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_HOOK_LIMIT" ,g_iCanHook[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED
}


public is_hooked(id)
	return g_iIsHooked[id] 
 
public hook_off(id)
{    
	remove_hook(id)
	return PLUGIN_HANDLED
}

public hook_task(id)
{
	if(!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id))
		remove_hook(id)

	remove_beam(id)
	draw_hook(id)

	new origin[3], Float:velocity[3]
	get_user_origin(id,origin)
	new distance = get_distance(g_iHookOrigin[id],origin)
	if(distance > 25)
	{
		velocity[0] = (g_iHookOrigin[id][0] - origin[0]) * (2.0 * 300 / distance)
		velocity[1] = (g_iHookOrigin[id][1] - origin[1]) * (2.0 * 300 / distance)
		velocity[2] = (g_iHookOrigin[id][2] - origin[2]) * (2.0 * 300 / distance)

		entity_set_vector(id,EV_VEC_velocity,velocity)
	}
	else
	{
		entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
		remove_hook(id)
	}
}
 
 
public draw_hook(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(1) // TE_BEAMENTPOINT
	write_short(id) // entid
	write_coord(g_iHookOrigin[id][0]) // origin
	write_coord(g_iHookOrigin[id][1]) // origin
	write_coord(g_iHookOrigin[id][2]) // origin
	write_short(g_HookSprite) // sprite index
	write_byte(0) // start frame
	write_byte(0) // framerate
	write_byte(100) // life
	write_byte(10) // width
	write_byte(0) // noise
	
	// colors R G B
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))

	write_byte(250) // brightness
	write_byte(1) // speed
	message_end()
}
 
 
public remove_hook(id)
{
	if(task_exists(id))
		remove_task(id)

	remove_beam(id)
	g_iIsHooked[id] = false
}
 
 
public remove_beam(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(99)
	write_short(id)
	message_end()
}
#endif

#if defined THUNDEER
public commandThunderOn( id )
{
	if( !is_user_alive( id ) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;
		
	if(g_iCanThunder[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
	
	if( g_iThunderCounter[id] < g_iCanThunder[id] && get_user_weapon( id ) == CSW_KNIFE )
	{
		new target, body;
		get_user_aiming( id, target, body );
   
		if( is_valid_ent( target ) && is_user_alive( target ) && zp_get_user_zombie(target))
		{
			if( get_user_team( id ) == get_user_team( target ) )
				return PLUGIN_HANDLED;
			
			++g_iThunderCounter[id]
			
			new iPlayerOrigin[ 3 ], iEndOrigin[ 3 ];

			get_user_origin( id, iPlayerOrigin );
			get_user_origin( target, iEndOrigin );
      
			show_beam( iPlayerOrigin, iEndOrigin );
			ExecuteHam( Ham_TakeDamage, target, 0, id, float( get_pcvar_num( g_pThunderDamage ) ), DMG_ENERGYBEAM );
			entity_set_float( id, EV_FL_frags, get_user_frags( id ) + float( get_pcvar_num( g_pThunderFrags ) ) );
		}
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_THUNDER_LIMIT" ,g_iCanThunder[id])
		return PLUGIN_HANDLED
	}
   
	return PLUGIN_HANDLED;
}

public commandThunderOff( id )
{
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_KILLBEAM );
	write_short( id );
	message_end();

	return PLUGIN_HANDLED;
}

stock show_beam( StartOrigin[ 3 ], EndOrigin[ 3 ] )
{
   message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
   write_byte( TE_BEAMPOINTS );
   write_coord( StartOrigin[ 0 ] );
   write_coord( StartOrigin[ 1 ] );
   write_coord( StartOrigin[ 2 ] );
   write_coord( EndOrigin[ 0 ] );
   write_coord( EndOrigin[ 1 ] );
   write_coord( EndOrigin[ 2 ] );
   write_short( g_ThunderSprite );
   write_byte( 1 );
   write_byte( 1 );
   write_byte( 3 );
   write_byte( 33);
   write_byte( 0 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 200 );
   write_byte( 0 );
   message_end();
}
#endif

#if defined JUUMPS
public Fw_PlayerJump_Pre(id)
{
	if (!is_user_alive(id) || zp_get_user_zombie(id))
		return HC_SUPERCEDE

	new iFlags = get_entvar(id, var_flags)

	if (iFlags & FL_WATERJUMP || get_entvar(id, var_waterlevel) >= 2 || !(get_member(id, m_afButtonPressed) & IN_JUMP))
		return HC_CONTINUE

	if (iFlags & FL_ONGROUND)
	{
		iJumps[id] = 0
		return HC_CONTINUE
	}

	if (g_iCanJumps[id] > 0)
	{
		if (++iJumps[id] <= g_iCanJumps[id])
		{
			new Float:fVelocity[3]
			get_entvar(id, var_velocity, fVelocity)
			fVelocity[2] = 268.328157
			set_entvar(id, var_velocity, fVelocity)
			
			return HC_SUPERCEDE
		}
	}
	return HC_CONTINUE
}
#endif


#if defined FREEZEER
public freeze_knife(id)
{
	if(!is_user_alive(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;
		
	if(g_iCanFreeze[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED

	if(g_iFreezerCounter[id] < g_iCanFreeze[id] && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedFreezer[id] > 0.0 && (fTime - g_fLastUsedFreezer[id]) < FREEZER_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_FREEZE_INTERVAL", FREEZER_INTERVAL - (fTime - g_fLastUsedFreezer[id]))
			return PLUGIN_HANDLED;
		}   

		cmd_freez(id)
		++g_iFreezerCounter[id]
	
		g_fLastUsedFreezer[id] = fTime;
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_FREEZE_LIMIT" ,g_iCanFreeze[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED;
}

cmd_freez(id)
{
    new target, body
    static Float:start[3]
    static Float:aim[3]
    
    pev(id, pev_origin, start)
    fm_get_aim_origin(id, aim)
    
    start[2] += 16.0; // raise
    aim[2] += 16.0; // raise
    get_user_aiming ( id, target, body, 1000 ) // 1000 - distance
    
    if( is_user_alive( target ) && zp_get_user_zombie(id))
    {    
        new iOrigin[ 3 ];  
        get_user_origin( target, iOrigin, 0 );
    
        message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
        write_byte( 15 );
        write_coord( iOrigin[ 0 ] );     // start position (X)
        write_coord( iOrigin[ 1 ] );     // start position (Y)
        write_coord( iOrigin[ 2 ] + 40 ); // start position (Z)
        write_coord( iOrigin[ 0 ] );     // end position (X)
        write_coord( iOrigin[ 1 ] );    // end position (Y)
        write_coord( iOrigin[ 2 ] );    // end position (Z)
        write_short( g_FreezerSprite );    // sprite index
        write_byte( 50 );        // count
        write_byte( 20 );        // life in 0.1's
        write_byte( 2 );        // scale in 0.1's
        write_byte( 50 );        // velocity along vector in 10's
        write_byte( 10 );        // randomness of velocity in 10's
        message_end(  );

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, aim[0])
        engfunc(EngFunc_WriteCoord, aim[1])
        engfunc(EngFunc_WriteCoord, aim[2])
        write_short(g_FreezerSpriteBeam)
        write_byte(10)
        write_byte(30)
        write_byte(4)
        message_end()

        Freeze(target)        
        set_task( get_pcvar_float( g_pFDuration ), "UnFreeze", target )
    }    
    
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(0)
    engfunc(EngFunc_WriteCoord,start[0]);
    engfunc(EngFunc_WriteCoord,start[1]);
    engfunc(EngFunc_WriteCoord,start[2]);
    engfunc(EngFunc_WriteCoord,aim[0]);
    engfunc(EngFunc_WriteCoord,aim[1]);
    engfunc(EngFunc_WriteCoord,aim[2]);
    write_short(g_FreezerSpriteBeam); // sprite index
    write_byte(0); // start frame
    write_byte(10); // frame rate in 0.1's
    write_byte(10); // life in 0.1's
    write_byte(100); // line width in 0.1's
    write_byte(4); // noise amplititude in 0.01's
    write_byte(100); // red
    write_byte(149); // green
    write_byte(237); // blue
    write_byte(100); // brightness
    write_byte(50); // scroll speed in 0.1's
    message_end();    
}

stock Freeze(id)
{ 
    new iFlags = pev( id , pev_flags );
    
    if( ~iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags | FL_FROZEN );
        pev( id , pev_v_angle , g_iAngles[ id ] );
        
        set_user_rendering( id , kRenderFxGlowShell , 0 , 100 , 200 , kRenderNormal , 16 );        
    } 
    
    g_bFrozen[ id ] = true;       
}

public UnFreeze(id)
{ 
    new frozenCount = 0;
    
    g_bFrozen[ id ] = false;
    
    new iFlags = pev( id , pev_flags ) ;
    
    if( iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags & ~FL_FROZEN ) ;
        set_user_rendering( id , kRenderFxNone , 0 , 0 , 0 , kRenderNormal , 0 );
        
        new iPlayers[ 32 ] , iNum , i , tid;
        get_players( iPlayers , iNum , "a" );
        
        for( i = 0; i < iNum; i++ )
        {
            tid = iPlayers[ i ];
            
            if( is_user_frozen( tid ) )
            {
                frozenCount++;
            }
        }                
    } 
}

public eventDeathMsg() if(is_user_frozen(read_data(2))) UnFreeze(read_data(2));
#endif

Аватар
bobywTf
Извън линия
Потребител
Потребител
Мнения: 37
Регистриран на: 21 Ное 2021, 14:28
Се отблагодари: 18 пъти
Получена благодарност: 3 пъти
Обратна връзка:

Заявка за преработка на плъгин / Knife Abilities

Мнение от bobywTf » 10 Окт 2022, 04:14

YankoNL написа: 10 Окт 2022, 01:06 Предполагам че това може да ти свърши работа. Тествай и ми кажи дали всичко е наред

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

#include <amxmodx>
#include <amxmisc>
#include <formatin>
#include <fun>
#include <hamsandwich>
#include <fakemeta_util>
#include <zombieplague>

#define HOOOK
#define TELEPOORT
#define HPREGEEN
#define THUNDEER
#define JUUMPS
#define FREEZEER

#if defined JUUMPS
#include <reapi>
#endif

#if defined HOOOK
#include <engine>
#endif

#if defined FREEZEER
#define is_user_frozen(%1) g_bFrozen[%1]
#endif

#define PLUGIN_VERSION "2.2"
#define DEFAULT_V "models/v_knife.mdl"
#define DEFAULT_P "models/p_knife.mdl"

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

enum
{
	SOUND_NONE = 0,
	SOUND_DEPLOY,
	SOUND_HIT,
	SOUND_HITWALL,
	SOUND_SLASH,
	SOUND_STAB
}

enum _:Knives
{
	NAME[128],
	NAME2[128],
	INFO[128],
	INFO2[128],
	V_MODEL[128],
	P_MODEL[128],
	DEPLOY_SOUND[128],
	HIT_SOUND[128],
	HITWALL_SOUND[128],
	SLASH_SOUND[128],
	STAB_SOUND[128],
	Float: GRAVITY,
	Float: SPEED,
	Float: DAMAGE,
	NOFOOTSTEPS,
	TRANSPARENCY,
#if defined HPREGEEN
	HPREGEN,
#endif
#if defined TELEPOORT
	TELEPORT,
#endif
#if defined HOOOK	
	HOOK,
#endif
#if defined THUNDEER
	THUNDER,
#endif
#if defined JUUMPS
	JUMPS,
#endif
#if defined FREEZEER
	FREEZE,
#endif
	FLAG,
	bool:HAS_CUSTOM_SOUND
}

new Array:g_aKnives,
	bool:g_bFirstTime[33],
	g_eKnife[33][Knives],
	g_iKnife[33],
	g_pAtSpawn,
	g_pDebug,
	g_pResetSpawn,
	g_pOpenStyle,
	bool:g_bOpenStatus[33],
	g_iKnivesNum,
#if defined TELEPOORT
	g_iCanTeleport[33],
	Float:g_fLastUsedTele[33],
#endif
#if defined HOOOK
	g_iCanHook[33],
	g_iIsHooked[32] = false,
	g_iHookCounter[33],
	g_iHookOrigin[32][3],
	g_HookSprite,
#endif
#if defined THUNDEER
	g_iCanThunder[33],
	g_iThunderCounter[33],
	g_pThunderDamage,
	g_pThunderFrags,
	g_ThunderSprite,
#endif
#if defined JUUMPS
	g_iCanJumps[33],
	iJumps[33],
#endif
#if defined FREEZEER
	g_iCanFreeze[33],
	Float:g_fLastUsedFreezer[33],
	bool: g_bFrozen[33],
	Float:g_iAngles[33][3],
	g_FreezerSprite,
	g_FreezerSpriteBeam,
	g_pFDuration,
	g_iFreezerCounter[33],
#endif
	g_iSayText;

#if defined TELEPOORT
	#define TELEPORT_INTERVAL 120.0
#endif

#define FREEZER_INTERVAL 20.0
	
public plugin_init()
{
	register_plugin("Knife Abilities", PLUGIN_VERSION, "OciXCrom_Nikolow")
	register_cvar("CRXNKnifeAbilities", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
	
	if(!g_iKnivesNum)
		set_fail_state("No knives found in the configuration file.")
	
	register_dictionary("KnifeAbilities.txt")
	
	//register_event("CurWeapon", "OnSelectKnife", "be", "1=1", "2=29")
	register_event("CurWeapon", "Knifeabilities", "be", "1=1")
	RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamage", 0)
#if defined JUUMPS
	RegisterHookChain(RG_CBasePlayer_Jump, "Fw_PlayerJump_Pre", 0)
#endif
	
#if defined HPREGEEN	
	register_event("Damage", "SetRegeneration", "be", "2>0");
#endif
	
	RegisterHam(Ham_Spawn, "player", "OnPlayerSpawn", 1)
	register_forward(FM_EmitSound,	"OnEmitSound")
#if defined TELEPOORT
	register_clcmd("teleporter", "tele_knife")
#endif
	
#if defined HOOOK
	register_clcmd("+hook","hook_on")
	register_clcmd("-hook","hook_off")
#endif

#if defined THUNDEER
	register_clcmd( "+thor", "commandThunderOn" );
	register_clcmd( "-thor", "commandThunderOff" );
#endif

	register_event("HLTV", "OnNewRound", "a", "1=0", "2=0") 
	
	register_clcmd("say /knife", "ShowMenu")
	register_clcmd("say_team /knife", "ShowMenu")
	
	g_pAtSpawn 		 = register_cvar("km_open_at_1st_spawn", "1")
	g_pDebug		 = register_cvar("km_debug_damage", "0")
	g_pResetSpawn 	 = register_cvar("km_reset_at_spawn", "0")
	g_pOpenStyle	 = register_cvar("km_only_open_style", "0") // 0 - Can be opened no meter what | 1 - Once per spawn | 2 - Once per round
	
#if defined THUNDEER
	g_pThunderDamage = register_cvar("km_thunder_damage", "15")
	g_pThunderFrags  = register_cvar("km_thunder_frags", "1")
#endif
	
#if defined FREEZEER
	g_pFDuration = register_cvar("km_freezer_freeze_duration", "3.0")
	
	register_clcmd( "freezer", "freeze_knife" );
	register_event( "DeathMsg" , "eventDeathMsg" , "a" );   
#endif	
	
	
	
	g_iSayText = get_user_msgid("SayText")
}

public plugin_precache()
{
	g_aKnives = ArrayCreate(Knives)
	ReadFile()
	
#if defined HOOOK
	g_HookSprite = precache_model("sprites/laserbeam.spr")
#endif

#if defined THUNDEER
	g_ThunderSprite = precache_model("sprites/lgtning.spr")
#endif

#if defined FREEZEER
	g_FreezerSprite = precache_model("sprites/freezer_exp.spr")
	g_FreezerSpriteBeam = precache_model("sprites/lgtning.spr")
#endif
}

public plugin_end()
	ArrayDestroy(g_aKnives)

ReadFile()
{
	new szConfigsName[256], szFilename[256]
	get_configsdir(szConfigsName, charsmax(szConfigsName))
	formatex(szFilename, charsmax(szFilename), "%s/KnifeAbilities.ini", szConfigsName)
	new iFilePointer = fopen(szFilename, "rt")
	
	if(iFilePointer)
	{
		new szData[160], szKey[32], szValue[128]
		new eKnife[Knives]
		
		while(!feof(iFilePointer))
		{
			fgets(iFilePointer, szData, charsmax(szData))
			trim(szData)
			
			switch(szData[0])
			{
				case EOS, ';': continue
				case '[':
				{
					if(szData[strlen(szData) - 1] == ']')
					{
						if(g_iKnivesNum)
							PushKnife(eKnife)
							
						g_iKnivesNum++
						replace(szData, charsmax(szData), "[", "")
						replace(szData, charsmax(szData), "]", "")
						copy(eKnife[NAME], charsmax(eKnife[NAME]), szData)
					}
					else continue
				}
				default:
				{
					strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
					trim(szKey); trim(szValue)
					
					if(equal(szKey, "FLAG"))
						eKnife[FLAG] = read_flags(szValue)
					else if(equal(szKey, "V_MODEL"))
					{
						copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "P_MODEL"))
					{
						copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), szValue)
						precache_model(szValue)
					}
					else if(equal(szKey, "DEPLOY_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[DEPLOY_SOUND], charsmax(eKnife[DEPLOY_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HIT_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HIT_SOUND], charsmax(eKnife[HIT_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "HITWALL_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[HITWALL_SOUND], charsmax(eKnife[HITWALL_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "SLASH_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[SLASH_SOUND], charsmax(eKnife[SLASH_SOUND]), szValue)
						precache_sound(szValue)
					}
					else if(equal(szKey, "STAB_SOUND"))
					{
						eKnife[HAS_CUSTOM_SOUND] = true
						copy(eKnife[STAB_SOUND], charsmax(eKnife[STAB_SOUND]), szValue)
						precache_sound(szValue)
					}
					
					else if(equal(szKey, "GRAVITY"))
					{
						eKnife[GRAVITY] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "SPEED"))
					{
						eKnife[SPEED] = _: str_to_float(szValue);
					}
					else if(equal(szKey, "DAMAGE"))
					{
						eKnife[DAMAGE] = _: str_to_float(szValue);
					}
					
					else if(equal(szKey, "NOFOOTSTEPS"))
					{
						eKnife[NOFOOTSTEPS] = _: str_to_num(szValue);
					}
					
					else if(equal(szKey, "TRANSPARENCY"))
					{
						eKnife[TRANSPARENCY] = _: str_to_num(szValue);
					}
					
					#if defined HPREGEEN
					else if(equal(szKey, "HPREGEN"))
					{
						eKnife[HPREGEN] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined TELEPOORT
					else if(equal(szKey, "CAN_USE_TELEPORT"))
					{
						eKnife[TELEPORT] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined HOOOK
					else if(equal(szKey, "CAN_USE_HOOK"))
					{
						eKnife[HOOK] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined THUNDEER
					else if(equal(szKey, "CAN_USE_THUNDER"))
					{
						eKnife[THUNDER] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined JUUMPS
					else if(equal(szKey, "EXTRA_JUMPS"))
					{
						eKnife[JUMPS] = _: str_to_num(szValue);
					}
					#endif
					
					#if defined FREEZEER
					else if(equal(szKey, "CAN_USE_FREEZE"))
					{
						eKnife[FREEZE] = _: str_to_num(szValue);
					}
					#endif
					
					else if(equal(szKey, "NAME"))
					{
						copy(eKnife[NAME2], charsmax(eKnife[NAME2]), szValue)
					}
					
					else if(equal(szKey, "INFO"))
					{
						copy(eKnife[INFO], charsmax(eKnife[INFO]), szValue)
					}
					
					else if(equal(szKey, "INFO2"))
					{
						copy(eKnife[INFO2], charsmax(eKnife[INFO2]), szValue)
					}
				}
			}
		}
		
		if(g_iKnivesNum)
			PushKnife(eKnife)
		
		fclose(iFilePointer)
	}
}

public client_putinserver(id)
{
	g_bFirstTime[id] = true
	g_bOpenStatus[id] = false;
	ArrayGetArray(g_aKnives, 0, g_eKnife[id])
	
	g_iKnife[id] = 0
	
#if defined TELEPOORT
	g_iCanTeleport[id] = 0
#endif

#if defined HOOOK
	g_iCanHook[id] = 0;
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = 0;
#endif

#if defined JUUMPS
	g_iCanJumps[id] = 0;
#endif

#if defined FREEZEER
	g_iCanFreeze[id] = 0;
#endif
}

public OnEmitSound(id, iChannel, const szSample[])
{
	if(!is_user_connected(id) || !g_eKnife[id][HAS_CUSTOM_SOUND] || !is_knife_sound(szSample))
		return FMRES_IGNORED
	
	switch(detect_knife_sound(szSample))
	{
		case SOUND_DEPLOY: if(g_eKnife[id][DEPLOY_SOUND][0]) { play_knife_sound(id, g_eKnife[id][DEPLOY_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HIT: if(g_eKnife[id][HIT_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HIT_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_HITWALL: if(g_eKnife[id][HITWALL_SOUND][0]) { play_knife_sound(id, g_eKnife[id][HITWALL_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_SLASH: if(g_eKnife[id][SLASH_SOUND][0]) { play_knife_sound(id, g_eKnife[id][SLASH_SOUND][0]); return FMRES_SUPERCEDE; }
		case SOUND_STAB: if(g_eKnife[id][STAB_SOUND][0]) { play_knife_sound(id, g_eKnife[id][STAB_SOUND][0]); return FMRES_SUPERCEDE; }
	}
	
	return FMRES_IGNORED
}

public ShowMenu(id)
{
	if(g_bOpenStatus[id])
	{
		ColorChat(id, "%L", id, "KM_CHAT_CANT")
		return PLUGIN_HANDLED;
	}
	
	new szTitle[128]
	formatex(szTitle, charsmax(szTitle), "%L", id, "KM_MENU_TITLE")
	
	new iMenu = menu_create(szTitle, "MenuHandler")
	
	for(new eKnife[Knives], szItem[64], iFlags = get_user_flags(id), i; i < g_iKnivesNum; i++)
	{
		ArrayGetArray(g_aKnives, i, eKnife)
		
		if(eKnife[FLAG] == ADMIN_ALL || iFlags & eKnife[FLAG])
		{
			if(g_iKnife[id] == i)
			{
				formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_SELECTED")
				menu_additem(iMenu, szItem, eKnife[NAME])
			}
			else
				menu_additem(iMenu, eKnife[NAME], eKnife[NAME])
		}
		else
		{
			formatex(szItem, charsmax(szItem), "%s %L", eKnife[NAME], id, "KM_MENU_VIP_ONLY")
			menu_additem(iMenu, szItem, eKnife[NAME], eKnife[FLAG])
		}
	}
	
	if(menu_pages(iMenu) > 1)
		menu_setprop(iMenu, MPROP_TITLE, formatin("%s%L", szTitle, id, "KM_MENU_TITLE_PAGE"))
		
	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public MenuHandler(id, iMenu, iItem)
{
	if(iItem != MENU_EXIT)
	{
		if(g_iKnife[id] == iItem)
		{
			ColorChat(id, "%L", id, "KM_CHAT_ALREADY")
			if(get_pcvar_num(g_pOpenStyle) > 0) 
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
		else
		{
			new eKnife[Knives]
			ArrayGetArray(g_aKnives, iItem, eKnife)
			
			g_iKnife[id] = iItem
			ArrayGetArray(g_aKnives, iItem, g_eKnife[id])
			
			if(!zp_get_user_zombie(id) || is_user_alive(id) && get_user_weapon(id) == CSW_KNIFE)
				Knifeabilities(id) //OnSelectKnife(id)
				
			ham_strip_weapon(id, "weapon_knife"); // strip knife
			give_item(id, "weapon_knife") // give knife
			engclient_cmd(id, "weapon_knife") // switch to knife
			
			//new szName[32], iUnused
			//menu_item_getinfo(iMenu, iItem, iUnused, szName, charsmax(szName), .callback = iUnused)
			ColorChat(id, "%L", id, "KM_CHAT_SELECTED", eKnife[NAME2])
			ColorChat(id, "%L", id, "KM_CHAT_INFO", eKnife[INFO])
			ColorChat(id, "%s", eKnife[INFO2])
			
			if(get_pcvar_num(g_pOpenStyle) > 0)
				g_bOpenStatus[id] = true;
			else
				ShowMenu(id) // reopen the menu ?
		}
	}
	
	menu_destroy(iMenu)
	return PLUGIN_HANDLED
}

public OnPlayerSpawn(id)
{
	if(is_user_alive(id) || !zp_get_user_zombie(id))
	{
		if(get_pcvar_num(g_pAtSpawn) && !g_iKnife[id] && g_bFirstTime[id])
		// ако квара е 1 + няма нож + влиза за първи път
		{
			// изкарваме менюто + казваме че първия му спаун е минал
			g_bFirstTime[id] = false
			ShowMenu(id)
		}
		
		if(get_pcvar_num(g_pResetSpawn)) // ако квара е 1
		{
			if(!g_bFirstTime[id]) // не му е първия спаун
			{
				// рескаме му ножа и му изкарваме меню-то на ново
				ArrayGetArray(g_aKnives, 0, g_eKnife[id])
				g_iKnife[id] = 0
				ShowMenu(id)
			}
		}
		
		if(get_pcvar_num(g_pOpenStyle) == 1) g_bOpenStatus[id] = false;
		
		#if defined HOOOK
			g_iHookCounter[id] = 0;
		#endif
		
		#if defined THUNDEER
			g_iThunderCounter[id] = 0;
		#endif
		
		#if defined FREEZEER
			if(is_user_frozen(id)) UnFreeze( id ); // махаме фрийза ако има такъв
			g_iFreezerCounter[id] = 0;
		#endif
	}
}

public OnNewRound() 
{
	if(get_pcvar_num(g_pOpenStyle) == 2)
	{
		new players[32], num
		get_players(players, num)
	 
		new player
		for(new i = 0; i < num; i++)
		{
			player = players[i]
			g_bOpenStatus[player] = false;
		}
	}
}
/*
public OnSelectKnife(id)
{
	set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
	set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
}*/

public Knifeabilities(id)
{
	new weapon = read_data(2)
	
	set_user_gravity(id, weapon == CSW_KNIFE ? g_eKnife[id][GRAVITY] : 1.0)
	set_user_maxspeed(id, weapon == CSW_KNIFE? g_eKnife[id][SPEED] : 250.0)
	
	set_user_footsteps(id, weapon == CSW_KNIFE? g_eKnife[id][NOFOOTSTEPS] : 0) // 1 - no footsteps, 0 - normal footsteps
	
	set_user_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, weapon == CSW_KNIFE? g_eKnife[id][TRANSPARENCY] : 255) // 255 - normal
	
#if defined TELEPOORT
	g_iCanTeleport[id] = g_eKnife[id][TELEPORT];
#endif
	
#if defined HOOOK
	g_iCanHook[id] = g_eKnife[id][HOOK];
#endif
	
#if defined THUNDEER
	g_iCanThunder[id] = g_eKnife[id][THUNDER];
#endif
	
#if defined JUUMPS
	g_iCanJumps[id] = g_eKnife[id][JUMPS];
#endif
	
#if defined FREEZEER
	g_iCanFreeze[id] = g_eKnife[id][FREEZE];
#endif
	
	
	if(weapon == CSW_KNIFE && !zp_get_user_zombie(id))
	{
		set_pev(id, pev_viewmodel2, g_eKnife[id][V_MODEL])
		set_pev(id, pev_weaponmodel2, g_eKnife[id][P_MODEL])
	}
	return PLUGIN_CONTINUE;
}

public fwdTakeDamage(victim, inflictor, attacker, Float:damage, damage_bits)
{
	if(is_true_player(attacker) && get_user_weapon(attacker) == CSW_KNIFE && victim != attacker)	
	{
		if(get_pcvar_num(g_pDebug)) client_print(attacker, print_center, "Knife Damage: %f", damage * g_eKnife[attacker][DAMAGE]);
		SetHamParamFloat(4, damage * g_eKnife[attacker][DAMAGE])
	}
}
#if defined HPREGEEN
public SetRegeneration(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	if (get_user_health(id) < 100)
		set_task(3.0, "Regenerate", id, _, _, "b");
}

public Regenerate(id)
{
	if (!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id) || get_user_weapon(id) != CSW_KNIFE || g_eKnife[id][HPREGEN] < 1)
		return;

	new Health = get_user_health(id);

	if (Health < 1)
		return;

	new NeededHealth = 100 - Health;

	if (NeededHealth <= g_eKnife[id][HPREGEN])
	{
		set_user_health(id, get_user_health(id) + NeededHealth)
		remove_task(id);

		return;
	}
	
	set_user_health(id, get_user_health(id) + g_eKnife[id][HPREGEN]);
}
#endif

PushKnife(eKnife[Knives])
{
	if(!eKnife[V_MODEL][0])
		copy(eKnife[V_MODEL], charsmax(eKnife[V_MODEL]), DEFAULT_V)
		
	if(!eKnife[P_MODEL][0])
		copy(eKnife[P_MODEL], charsmax(eKnife[P_MODEL]), DEFAULT_P)
		
	ArrayPushArray(g_aKnives, eKnife)
}

bool:is_knife_sound(const szSample[])
	return bool:equal(szSample[8], "kni", 3)

detect_knife_sound(const szSample[])
{
	static iSound
	iSound = SOUND_NONE
	
	if(equal(szSample, "weapons/knife_deploy1.wav"))
		iSound = SOUND_DEPLOY
	else if(equal(szSample[14], "hit", 3))
		iSound = szSample[17] == 'w' ? SOUND_HITWALL : SOUND_HIT
	else if(equal(szSample[14], "sla", 3))
		iSound = SOUND_SLASH
	else if(equal(szSample[14], "sta", 3))
		iSound = SOUND_STAB
		
	return iSound
}

play_knife_sound(id, const szSound[])
	engfunc(EngFunc_EmitSound, id, CHAN_WEAPON, szSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
	
ColorChat(const id, const szInput[], any:...)
{
	new iPlayers[32], iCount = 1
	static szMessage[191]
	vformat(szMessage, charsmax(szMessage), szInput, 3)
	format(szMessage[0], charsmax(szMessage), "%L %s", id ? id : LANG_PLAYER, "KM_CHAT_PREFIX", szMessage)
	
	replace_all(szMessage, charsmax(szMessage), "!g", "^4")
	replace_all(szMessage, charsmax(szMessage), "!n", "^1")
	replace_all(szMessage, charsmax(szMessage), "!t", "^3")
	
	if(id)
		iPlayers[0] = id
	else
		get_players(iPlayers, iCount, "ch")
	
	for(new i; i < iCount; i++)
	{
		if(is_user_connected(iPlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, g_iSayText, _, iPlayers[i])
			write_byte(iPlayers[i])
			write_string(szMessage)
			message_end()
		}
	}
}

stock ham_strip_weapon(id,weapon[])
{
	if(!equal(weapon,"weapon_",7)) return 0;

	new wId = get_weaponid(weapon);
	if(!wId) return 0;

	new wEnt;
	while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
	if(!wEnt) return 0;

	if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);

	if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) return 0;
	ExecuteHamB(Ham_Item_Kill,wEnt);

	set_pev(id,pev_weapons,pev(id,pev_weapons) & ~(1<<wId));

	return 1;
}

// TELEPORT
#if defined TELEPOORT
public tele_knife(id)
{
	if(!is_user_alive(id) && !is_user_connected(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;

	if(g_iCanTeleport[id] > 0 && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedTele[id] > 0.0 && (fTime - g_fLastUsedTele[id]) < TELEPORT_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_TP_INTERVAL", TELEPORT_INTERVAL - (fTime - g_fLastUsedTele[id]))
			return PLUGIN_HANDLED;
		}   
	
		static Float:start[3], Float:dest[3] 
		pev(id, pev_origin, start) 
		pev(id, pev_view_ofs, dest) 
		xs_vec_add(start, dest, start) 
		pev(id, pev_v_angle, dest) 
	
		engfunc(EngFunc_MakeVectors, dest) 
		global_get(glb_v_forward, dest) 
		xs_vec_mul_scalar(dest, 9999.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_TraceLine, start, dest, IGNORE_MONSTERS, id, 0) 
		get_tr2(0, TR_vecEndPos, start) 
		get_tr2(0, TR_vecPlaneNormal, dest) 
	
		static const player_hull[] = {HULL_HUMAN, HULL_HEAD} 
		engfunc(EngFunc_TraceHull, start, start, DONT_IGNORE_MONSTERS, player_hull[_:!!(pev(id, pev_flags) & FL_DUCKING)], id, 0)
		
		if(!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen)) 
		{ 
			engfunc(EngFunc_SetOrigin, id, start) 
			return PLUGIN_HANDLED 
		}
	
		static Float:size[3] 
		pev(id, pev_size, size) 
		
		xs_vec_mul_scalar(dest, (size[0] + size[1]) / 2.0, dest) 
		xs_vec_add(start, dest, dest) 
		engfunc(EngFunc_SetOrigin, id, dest) 
	
		g_fLastUsedTele[id] = fTime;
	}
	else ColorChat(id, "%L", id, "KM_CHAT_CANT_TP")

	return PLUGIN_HANDLED;
}
#endif

// HOOK 
#if defined HOOOK
public hook_on(id)
{
	if(!is_user_alive(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;

	if(g_iCanHook[id] < 1 || get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
 
	if(g_iHookCounter[id] < g_iCanHook[id] && get_user_weapon( id ) == CSW_KNIFE)
	{
		get_user_origin(id, g_iHookOrigin[id],3)

		g_iIsHooked[id] = true
		++g_iHookCounter[id]
		emit_sound(id,CHAN_STATIC,"hook/hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
		set_task(0.1,"hook_task",id,"",0,"ab")
		hook_task(id)
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_HOOK_LIMIT" ,g_iCanHook[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED
}


public is_hooked(id)
	return g_iIsHooked[id] 
 
public hook_off(id)
{    
	remove_hook(id)
	return PLUGIN_HANDLED
}

public hook_task(id)
{
	if(!is_user_connected(id) || !is_user_alive(id) || zp_get_user_zombie(id))
		remove_hook(id)

	remove_beam(id)
	draw_hook(id)

	new origin[3], Float:velocity[3]
	get_user_origin(id,origin)
	new distance = get_distance(g_iHookOrigin[id],origin)
	if(distance > 25)
	{
		velocity[0] = (g_iHookOrigin[id][0] - origin[0]) * (2.0 * 300 / distance)
		velocity[1] = (g_iHookOrigin[id][1] - origin[1]) * (2.0 * 300 / distance)
		velocity[2] = (g_iHookOrigin[id][2] - origin[2]) * (2.0 * 300 / distance)

		entity_set_vector(id,EV_VEC_velocity,velocity)
	}
	else
	{
		entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
		remove_hook(id)
	}
}
 
 
public draw_hook(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(1) // TE_BEAMENTPOINT
	write_short(id) // entid
	write_coord(g_iHookOrigin[id][0]) // origin
	write_coord(g_iHookOrigin[id][1]) // origin
	write_coord(g_iHookOrigin[id][2]) // origin
	write_short(g_HookSprite) // sprite index
	write_byte(0) // start frame
	write_byte(0) // framerate
	write_byte(100) // life
	write_byte(10) // width
	write_byte(0) // noise
	
	// colors R G B
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))
	write_byte(random_num(0, 255))

	write_byte(250) // brightness
	write_byte(1) // speed
	message_end()
}
 
 
public remove_hook(id)
{
	if(task_exists(id))
		remove_task(id)

	remove_beam(id)
	g_iIsHooked[id] = false
}
 
 
public remove_beam(id)
{
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(99)
	write_short(id)
	message_end()
}
#endif

#if defined THUNDEER
public commandThunderOn( id )
{
	if( !is_user_alive( id ) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;
		
	if(g_iCanThunder[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED
	
	if( g_iThunderCounter[id] < g_iCanThunder[id] && get_user_weapon( id ) == CSW_KNIFE )
	{
		new target, body;
		get_user_aiming( id, target, body );
   
		if( is_valid_ent( target ) && is_user_alive( target ) && zp_get_user_zombie(target))
		{
			if( get_user_team( id ) == get_user_team( target ) )
				return PLUGIN_HANDLED;
			
			++g_iThunderCounter[id]
			
			new iPlayerOrigin[ 3 ], iEndOrigin[ 3 ];

			get_user_origin( id, iPlayerOrigin );
			get_user_origin( target, iEndOrigin );
      
			show_beam( iPlayerOrigin, iEndOrigin );
			ExecuteHam( Ham_TakeDamage, target, 0, id, float( get_pcvar_num( g_pThunderDamage ) ), DMG_ENERGYBEAM );
			entity_set_float( id, EV_FL_frags, get_user_frags( id ) + float( get_pcvar_num( g_pThunderFrags ) ) );
		}
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_THUNDER_LIMIT" ,g_iCanThunder[id])
		return PLUGIN_HANDLED
	}
   
	return PLUGIN_HANDLED;
}

public commandThunderOff( id )
{
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_KILLBEAM );
	write_short( id );
	message_end();

	return PLUGIN_HANDLED;
}

stock show_beam( StartOrigin[ 3 ], EndOrigin[ 3 ] )
{
   message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
   write_byte( TE_BEAMPOINTS );
   write_coord( StartOrigin[ 0 ] );
   write_coord( StartOrigin[ 1 ] );
   write_coord( StartOrigin[ 2 ] );
   write_coord( EndOrigin[ 0 ] );
   write_coord( EndOrigin[ 1 ] );
   write_coord( EndOrigin[ 2 ] );
   write_short( g_ThunderSprite );
   write_byte( 1 );
   write_byte( 1 );
   write_byte( 3 );
   write_byte( 33);
   write_byte( 0 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 255 );
   write_byte( 200 );
   write_byte( 0 );
   message_end();
}
#endif

#if defined JUUMPS
public Fw_PlayerJump_Pre(id)
{
	if (!is_user_alive(id) || zp_get_user_zombie(id))
		return HC_SUPERCEDE

	new iFlags = get_entvar(id, var_flags)

	if (iFlags & FL_WATERJUMP || get_entvar(id, var_waterlevel) >= 2 || !(get_member(id, m_afButtonPressed) & IN_JUMP))
		return HC_CONTINUE

	if (iFlags & FL_ONGROUND)
	{
		iJumps[id] = 0
		return HC_CONTINUE
	}

	if (g_iCanJumps[id] > 0)
	{
		if (++iJumps[id] <= g_iCanJumps[id])
		{
			new Float:fVelocity[3]
			get_entvar(id, var_velocity, fVelocity)
			fVelocity[2] = 268.328157
			set_entvar(id, var_velocity, fVelocity)
			
			return HC_SUPERCEDE
		}
	}
	return HC_CONTINUE
}
#endif


#if defined FREEZEER
public freeze_knife(id)
{
	if(!is_user_alive(id) || zp_get_user_zombie(id))
		return PLUGIN_HANDLED;
		
	if(g_iCanFreeze[id] < 1 ||  get_user_weapon( id ) != CSW_KNIFE)
		return PLUGIN_HANDLED

	if(g_iFreezerCounter[id] < g_iCanFreeze[id] && get_user_weapon(id) == CSW_KNIFE)
	{
		static Float:fTime;
		fTime = get_gametime();

		if(g_fLastUsedFreezer[id] > 0.0 && (fTime - g_fLastUsedFreezer[id]) < FREEZER_INTERVAL)
		{
			ColorChat(id, "%L", id, "KM_CHAT_FREEZE_INTERVAL", FREEZER_INTERVAL - (fTime - g_fLastUsedFreezer[id]))
			return PLUGIN_HANDLED;
		}   

		cmd_freez(id)
		++g_iFreezerCounter[id]
	
		g_fLastUsedFreezer[id] = fTime;
	}
	else
	{
		ColorChat(id, "%L", id, "KM_CHAT_FREEZE_LIMIT" ,g_iCanFreeze[id])
		return PLUGIN_HANDLED
	}

	return PLUGIN_HANDLED;
}

cmd_freez(id)
{
    new target, body
    static Float:start[3]
    static Float:aim[3]
    
    pev(id, pev_origin, start)
    fm_get_aim_origin(id, aim)
    
    start[2] += 16.0; // raise
    aim[2] += 16.0; // raise
    get_user_aiming ( id, target, body, 1000 ) // 1000 - distance
    
    if( is_user_alive( target ) && zp_get_user_zombie(id))
    {    
        new iOrigin[ 3 ];  
        get_user_origin( target, iOrigin, 0 );
    
        message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
        write_byte( 15 );
        write_coord( iOrigin[ 0 ] );     // start position (X)
        write_coord( iOrigin[ 1 ] );     // start position (Y)
        write_coord( iOrigin[ 2 ] + 40 ); // start position (Z)
        write_coord( iOrigin[ 0 ] );     // end position (X)
        write_coord( iOrigin[ 1 ] );    // end position (Y)
        write_coord( iOrigin[ 2 ] );    // end position (Z)
        write_short( g_FreezerSprite );    // sprite index
        write_byte( 50 );        // count
        write_byte( 20 );        // life in 0.1's
        write_byte( 2 );        // scale in 0.1's
        write_byte( 50 );        // velocity along vector in 10's
        write_byte( 10 );        // randomness of velocity in 10's
        message_end(  );

        message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
        write_byte(TE_EXPLOSION)
        engfunc(EngFunc_WriteCoord, aim[0])
        engfunc(EngFunc_WriteCoord, aim[1])
        engfunc(EngFunc_WriteCoord, aim[2])
        write_short(g_FreezerSpriteBeam)
        write_byte(10)
        write_byte(30)
        write_byte(4)
        message_end()

        Freeze(target)        
        set_task( get_pcvar_float( g_pFDuration ), "UnFreeze", target )
    }    
    
    message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte(0)
    engfunc(EngFunc_WriteCoord,start[0]);
    engfunc(EngFunc_WriteCoord,start[1]);
    engfunc(EngFunc_WriteCoord,start[2]);
    engfunc(EngFunc_WriteCoord,aim[0]);
    engfunc(EngFunc_WriteCoord,aim[1]);
    engfunc(EngFunc_WriteCoord,aim[2]);
    write_short(g_FreezerSpriteBeam); // sprite index
    write_byte(0); // start frame
    write_byte(10); // frame rate in 0.1's
    write_byte(10); // life in 0.1's
    write_byte(100); // line width in 0.1's
    write_byte(4); // noise amplititude in 0.01's
    write_byte(100); // red
    write_byte(149); // green
    write_byte(237); // blue
    write_byte(100); // brightness
    write_byte(50); // scroll speed in 0.1's
    message_end();    
}

stock Freeze(id)
{ 
    new iFlags = pev( id , pev_flags );
    
    if( ~iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags | FL_FROZEN );
        pev( id , pev_v_angle , g_iAngles[ id ] );
        
        set_user_rendering( id , kRenderFxGlowShell , 0 , 100 , 200 , kRenderNormal , 16 );        
    } 
    
    g_bFrozen[ id ] = true;       
}

public UnFreeze(id)
{ 
    new frozenCount = 0;
    
    g_bFrozen[ id ] = false;
    
    new iFlags = pev( id , pev_flags ) ;
    
    if( iFlags & FL_FROZEN ) 
    { 
        set_pev( id , pev_flags , iFlags & ~FL_FROZEN ) ;
        set_user_rendering( id , kRenderFxNone , 0 , 0 , 0 , kRenderNormal , 0 );
        
        new iPlayers[ 32 ] , iNum , i , tid;
        get_players( iPlayers , iNum , "a" );
        
        for( i = 0; i < iNum; i++ )
        {
            tid = iPlayers[ i ];
            
            if( is_user_frozen( tid ) )
            {
                frozenCount++;
            }
        }                
    } 
}

public eventDeathMsg() if(is_user_frozen(read_data(2))) UnFreeze(read_data(2));
#endif
Супер е работи, точно това ми трябваше, Благодаря :beer:
Lock :lock:

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

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

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 10 госта