Lasermine add delay function

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
kerasseN
Membru, skill 0
Membru, skill 0
Posts: 53
Joined: 04 Feb 2020, 00:00
Detinator Steam: Nu
Fond eXtream: 0
Has thanked: 1 time

14 Aug 2021, 18:47

Code: Select all

#include < amxmodx >
#include < fakemeta >
#include < engine >

native zp_get_user_zombie( iPlayer );
native zp_get_user_ammo_packs( iPlayer );
native zp_set_user_ammo_packs( iPlayer, iPacks );

#define MAX_ENTITIES			600
#define MAX_PLAYERS			32
#define MINE_ON				1
#define MINE_OFF			0
#define TASK_CREATE			84765
#define TASK_REMOVE			86766
#define MINE_COST			10
#define MINE_CLASSNAME			"zp_trip_mine"
#define MINE_MODEL_EXPLODE		"sprites/zerogxplode.spr"
#define MINE_MODEL_VIEW			"models/zp_apocalypse/lasermine.mdl"
#define MINE_SOUND_ACTIVATE		"weapons/mine_activate.wav"
#define MINE_SOUND_CHARGE		"weapons/mine_charge.wav"
#define MINE_SOUND_DEPLOY		"weapons/mine_deploy.wav"
#define MINE_HEALTH			800.0
#define entity_get_owner(%0)		entity_get_int( %0, EV_INT_iuser2 )
#define entity_get_status(%0)		entity_get_int( %0, EV_INT_iuser1 )
#define entity_get_classname(%0,%1)	entity_get_string( %0, EV_SZ_classname, %1, charsmax( %1 ) )

new g_iTripMines[ 33 ];
new g_iPlantedMines[ 33 ];
new g_iPlanting[ 33 ];
new g_iRemoving[ 33 ];
new g_hExplode;

public plugin_init( )
{
	register_plugin( "[ZP] TripMines", "1.0", "Hattrick" );
	
	register_clcmd( "say /lm", "Command_Buy" );
	register_clcmd( "say lm", "Command_Buy" );
	
	register_clcmd( "+setlaser", "Command_Plant" );
	register_clcmd( "+dellaser", "Command_Take" );
	
	register_logevent( "Event_RoundStart", 2, "1=Round_Start" );
	
	register_think( MINE_CLASSNAME, "Forward_Think" );
}

public plugin_precache( )
{
	engfunc( EngFunc_PrecacheModel, MINE_MODEL_VIEW );
	
	engfunc( EngFunc_PrecacheSound, MINE_SOUND_ACTIVATE );
	engfunc( EngFunc_PrecacheSound, MINE_SOUND_CHARGE );
	engfunc( EngFunc_PrecacheSound, MINE_SOUND_DEPLOY );
	
	g_hExplode = engfunc( EngFunc_PrecacheModel, MINE_MODEL_EXPLODE );
}

public client_disconnect( iPlayer )
{
	g_iTripMines[ iPlayer ] = 0;
	g_iPlanting[ iPlayer ] = false;
	g_iRemoving[ iPlayer ] = false;
	
	if( g_iPlantedMines[ iPlayer ] )
	{
		Func_RemoveMinesByOwner( iPlayer );
		
		g_iPlantedMines[ iPlayer ] = 0;
	}
	
	remove_task( iPlayer + TASK_REMOVE );
	remove_task( iPlayer + TASK_CREATE );
}

public Command_Buy( iPlayer )
{
	if( !is_user_alive( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be alive" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( zp_get_user_zombie( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be human" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( zp_get_user_ammo_packs( iPlayer ) < MINE_COST )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You need %i coins", MINE_COST );
		
		return PLUGIN_CONTINUE;
	}
	
	zp_set_user_ammo_packs( iPlayer, zp_get_user_ammo_packs( iPlayer ) - MINE_COST );
	
	g_iTripMines[ iPlayer ]++;
	
	ColorChat( iPlayer, "^4[ZP]^1 You bought a trip mine. bind to plant =>^4 [ Bind v +setlaser ]^1 /^4 [ bind c +dellaser ]^1 to take it" );
	
	return PLUGIN_CONTINUE;
}

public Command_Plant( iPlayer )
{
	if( !is_user_alive( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be alive" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( zp_get_user_zombie( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be human" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( !g_iTripMines[ iPlayer ] )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You don't have a trip mine to plant" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( g_iPlantedMines[ iPlayer ] > 0 )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You can plant only 1 mines" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( g_iPlanting[ iPlayer ] || g_iRemoving[ iPlayer ] )
		return PLUGIN_CONTINUE;
	
	if( CanPlant( iPlayer ) ) {
		g_iPlanting[ iPlayer ] = true;
		
		message_begin( MSG_ONE_UNRELIABLE, 108, _, iPlayer );
		write_byte( 1 );
		write_byte( 0 );
		message_end( );
		
		set_task( 1.2, "Func_Plant", iPlayer + TASK_CREATE );
	}
	
	return PLUGIN_CONTINUE;
}

public Command_Take( iPlayer )
{
	if( !is_user_alive( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be alive" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( zp_get_user_zombie( iPlayer ) )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You should be human" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( !g_iPlantedMines[ iPlayer ] )
	{
		ColorChat( iPlayer, "^4[ZP]^1 You don't have a planted mine" );
		
		return PLUGIN_CONTINUE;
	}
	
	if( g_iPlanting[ iPlayer ] || g_iRemoving[ iPlayer ] )
		return PLUGIN_CONTINUE;
	
	if( CanTake( iPlayer ) ) {
		g_iRemoving[ iPlayer ] = true;
		
		message_begin( MSG_ONE_UNRELIABLE, 108, _, iPlayer );
		write_byte( 1 );
		write_byte( 0 );
		message_end( );
		
		set_task( 1.2, "Func_Take", iPlayer + TASK_REMOVE );
	}
	
	return PLUGIN_CONTINUE;
}

public Event_RoundStart( ) {
	static iEntity, szClassName[ 32 ], iPlayer;
	for( iEntity = 0; iEntity < MAX_ENTITIES + 1; iEntity++ ) {
		if( !is_valid_ent( iEntity ) )
			continue;
		
		szClassName[ 0 ] = '^0';
		entity_get_classname( iEntity, szClassName );
		
		if( equal( szClassName, MINE_CLASSNAME ) )
			remove_entity( iEntity );
	}
	
	for( iPlayer = 1; iPlayer < 33; iPlayer++ ) {
		g_iTripMines[ iPlayer ] = 0;
		g_iPlantedMines[ iPlayer ] = 0;
	}
}

public Func_Take( iPlayer ) {
	iPlayer -= TASK_REMOVE;
	
	g_iRemoving[ iPlayer ] = false;
	
	static iEntity, szClassName[ 32 ], Float: flOwnerOrigin[ 3 ], Float: flEntityOrigin[ 3 ];
	for( iEntity = 0; iEntity < MAX_ENTITIES + 1; iEntity++ ) {
		if( !is_valid_ent( iEntity ) )
			continue;
		
		szClassName[ 0 ] = '^0';
		entity_get_classname( iEntity, szClassName );
		
		if( equal( szClassName, MINE_CLASSNAME ) ) {
			if( entity_get_owner( iEntity ) == iPlayer ) {
				entity_get_vector( iPlayer, EV_VEC_origin, flOwnerOrigin );
				entity_get_vector( iEntity, EV_VEC_origin, flEntityOrigin );
				
				if( get_distance_f( flOwnerOrigin, flEntityOrigin ) < 55.0 ) {
					g_iPlantedMines[ iPlayer ]--;
					g_iTripMines[ iPlayer ]++;
					
					remove_entity( iEntity );
					
					break;
				}
			}
		}
	}
}

public bool: CanTake( iPlayer ) {
	static iEntity, szClassName[ 32 ], Float: flOwnerOrigin[ 3 ], Float: flEntityOrigin[ 3 ];
	for( iEntity = 0; iEntity < MAX_ENTITIES + 1; iEntity++ ) {
		if( !is_valid_ent( iEntity ) )
			continue;
		
		szClassName[ 0 ] = '^0';
		entity_get_classname( iEntity, szClassName );
		
		if( equal( szClassName, MINE_CLASSNAME ) ) {
			if( entity_get_owner( iEntity ) == iPlayer ) {
				entity_get_vector( iPlayer, EV_VEC_origin, flOwnerOrigin );
				entity_get_vector( iEntity, EV_VEC_origin, flEntityOrigin );
				
				if( get_distance_f( flOwnerOrigin, flEntityOrigin ) < 55.0 )
					return true;
			}
		}
	}
	
	return false;
}

public bool: CanPlant( iPlayer ) {
	static Float: flOrigin[ 3 ];
	entity_get_vector( iPlayer, EV_VEC_origin, flOrigin );
	
	static Float: flTraceDirection[ 3 ], Float: flTraceEnd[ 3 ], Float: flTraceResult[ 3 ], Float: flNormal[ 3 ];
	velocity_by_aim( iPlayer, 64, flTraceDirection );
	flTraceEnd[ 0 ] = flTraceDirection[ 0 ] + flOrigin[ 0 ];
	flTraceEnd[ 1 ] = flTraceDirection[ 1 ] + flOrigin[ 1 ];
	flTraceEnd[ 2 ] = flTraceDirection[ 2 ] + flOrigin[ 2 ];
	
	static Float: flFraction, iTr;
	iTr = 0;
	engfunc( EngFunc_TraceLine, flOrigin, flTraceEnd, 0, iPlayer, iTr );
	get_tr2( iTr, TR_vecEndPos, flTraceResult );
	get_tr2( iTr, TR_vecPlaneNormal, flNormal );
	get_tr2( iTr, TR_flFraction, flFraction );
	
	if( flFraction >= 1.0 ) {
		ColorChat( iPlayer, "[ZP] You must plant the tripmine on a wall" );
		
		return false;
	}
	
	return true;
}

stock ColorChat(id, String[], any:...)
{
	static szMesage[192];
	vformat(szMesage, charsmax(szMesage), String, 3);
	
	replace_all(szMesage, charsmax(szMesage), "!1", "^1");
	replace_all(szMesage, charsmax(szMesage), "!3", "^3");
	replace_all(szMesage, charsmax(szMesage), "!4", "^4");
	
	static g_msg_SayText = 0;
	if(!g_msg_SayText)
		g_msg_SayText = get_user_msgid("SayText");
	
	new Players[32], iNum = 1, i;

 	if(id) Players[0] = id;
	else get_players(Players, iNum, "ch");
	
	for(--iNum; iNum >= 0; iNum--)
	{
		i = Players[iNum];
	
		message_begin(MSG_ONE_UNRELIABLE, g_msg_SayText, _, i);
		write_byte(i);
		write_string(szMesage);
		message_end();
	}
}

public Func_Plant( iPlayer ) {
	iPlayer -= TASK_CREATE;
	
	g_iPlanting[ iPlayer ] = false;
	
	static Float: flOrigin[ 3 ];
	entity_get_vector( iPlayer, EV_VEC_origin, flOrigin );
	
	static Float: flTraceDirection[ 3 ], Float: flTraceEnd[ 3 ], Float: flTraceResult[ 3 ], Float: flNormal[ 3 ];
	velocity_by_aim( iPlayer, 128, flTraceDirection );
	flTraceEnd[ 0 ] = flTraceDirection[ 0 ] + flOrigin[ 0 ];
	flTraceEnd[ 1 ] = flTraceDirection[ 1 ] + flOrigin[ 1 ];
	flTraceEnd[ 2 ] = flTraceDirection[ 2 ] + flOrigin[ 2 ];
	
	static Float: flFraction, iTr;
	iTr = 0;
	engfunc( EngFunc_TraceLine, flOrigin, flTraceEnd, 0, iPlayer, iTr );
	get_tr2( iTr, TR_vecEndPos, flTraceResult );
	get_tr2( iTr, TR_vecPlaneNormal, flNormal );
	get_tr2( iTr, TR_flFraction, flFraction );
	
	static iEntity;
	iEntity = create_entity( "info_target" );
	
	if( !iEntity )
		return;
	
	entity_set_string( iEntity, EV_SZ_classname, MINE_CLASSNAME );
	entity_set_model( iEntity, MINE_MODEL_VIEW );
	entity_set_size( iEntity, Float: { -4.0, -4.0, -4.0 }, Float: { 4.0, 4.0, 4.0 } );
	
	entity_set_int( iEntity, EV_INT_iuser2, iPlayer );
	
	g_iPlantedMines[ iPlayer ]++;
	
	entity_set_float( iEntity, EV_FL_frame, 0.0 );
	entity_set_float( iEntity, EV_FL_framerate, 0.0 );
	entity_set_int( iEntity, EV_INT_movetype, MOVETYPE_FLY );
	entity_set_int( iEntity, EV_INT_solid, SOLID_NOT );
	entity_set_int( iEntity, EV_INT_body, 3 );
	entity_set_int( iEntity, EV_INT_sequence, 7 );
	entity_set_float( iEntity, EV_FL_takedamage, DAMAGE_NO );
	entity_set_int( iEntity, EV_INT_iuser1, MINE_OFF );

        // Set Glow
	set_rendering( iEntity, kRenderFxGlowShell, 51, 204 ,255, kRenderNormal,25);

	static Float: flNewOrigin[ 3 ], Float: flEntAngles[ 3 ];
	flNewOrigin[ 0 ] = flTraceResult[ 0 ] + ( flNormal[ 0 ] * 8.0 );
	flNewOrigin[ 1 ] = flTraceResult[ 1 ] + ( flNormal[ 1 ] * 8.0 );
	flNewOrigin[ 2 ] = flTraceResult[ 2 ] + ( flNormal[ 2 ] * 8.0 );
	
	entity_set_origin( iEntity, flNewOrigin );
	
	vector_to_angle( flNormal, flEntAngles );
	entity_set_vector( iEntity, EV_VEC_angles, flEntAngles );
	flEntAngles[ 0 ] *= -1.0;
	flEntAngles[ 1 ] *= -1.0;
	flEntAngles[ 2 ] *= -1.0;
	entity_set_vector( iEntity, EV_VEC_v_angle, flEntAngles );
	
	g_iTripMines[ iPlayer ]--;
	
	emit_sound( iEntity, CHAN_WEAPON, MINE_SOUND_DEPLOY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
	emit_sound( iEntity, CHAN_VOICE, MINE_SOUND_CHARGE, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
	
	entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 0.6 );
}

public Func_RemoveMinesByOwner( iPlayer ) {
	static iEntity, szClassName[ 32 ];
	for( iEntity = 0; iEntity < MAX_ENTITIES + 1; iEntity++ ) {
		if( !is_valid_ent( iEntity ) )
			continue;
		
		szClassName[ 0 ] = '^0';
		entity_get_classname( iEntity, szClassName );
		
		if( equal( szClassName, MINE_CLASSNAME ) )
			if( entity_get_int( iEntity, EV_INT_iuser2 ) == iPlayer )
				remove_entity( iEntity );
	}
}

Func_Explode( iEntity ) {
	g_iPlantedMines[ entity_get_owner( iEntity ) ]--;
	
	static Float: flOrigin[ 3 ], Float: flZombieOrigin[ 3 ], Float: flHealth, Float: flVelocity[ 3 ];
	entity_get_vector( iEntity, EV_VEC_origin, flOrigin );
	
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_EXPLOSION );
	engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
	write_short( g_hExplode );
	write_byte( 55 );
	write_byte( 15 );
	write_byte( 0 );
	message_end( );
	
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_EXPLOSION );
	engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
	write_short( g_hExplode );
	write_byte( 65 );
	write_byte( 15 );
	write_byte( 0 );
	message_end( );
	
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
	write_byte( TE_EXPLOSION );
	engfunc( EngFunc_WriteCoord, flOrigin[ 0 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 1 ] );
	engfunc( EngFunc_WriteCoord, flOrigin[ 2 ] );
	write_short( g_hExplode );
	write_byte( 85 );
	write_byte( 15 );
	write_byte( 0 );
	message_end( );
	
	static iZombie;
	for( iZombie = 1; iZombie < MAX_PLAYERS + 1; iZombie++ ) 
	{
		if( is_user_connected( iZombie ) ) {
			if( is_user_alive( iZombie ) ) 
			{
				entity_get_vector( iZombie, EV_VEC_origin, flZombieOrigin );
				
				if( get_distance_f( flOrigin, flZombieOrigin ) < 360.0 ) 
				{
					flHealth = entity_get_float( iZombie, EV_FL_health );
					entity_get_vector( iZombie, EV_VEC_velocity, flVelocity );
					
					flVelocity[ 2 ] += 100.0;
					flVelocity[ 1 ] += 120.0;
					flVelocity[ 0 ] += 130.0;
					
					entity_set_vector( iZombie, EV_VEC_velocity, flVelocity );
					
					if( zp_get_user_zombie( iZombie ) )
					fm_set_user_health( iZombie, floatmax( flHealth - random_float( 200.0, 300.0 ), 0.0 ) );
				}
			}
		}
	}
	
	remove_entity( iEntity );
}

public Forward_Think( iEntity ) 
{

	static Float: flGameTime, iStatus;
	flGameTime = get_gametime( );
	iStatus = entity_get_status( iEntity );


	switch( iStatus ) 
	{

		case MINE_OFF: {

			entity_set_int( iEntity, EV_INT_iuser1, MINE_ON );
			entity_set_float( iEntity, EV_FL_takedamage, DAMAGE_YES );
			entity_set_int( iEntity, EV_INT_solid, SOLID_BBOX );
			entity_set_float( iEntity, EV_FL_health, MINE_HEALTH + 1000.0 );

			emit_sound( iEntity, CHAN_VOICE, MINE_SOUND_ACTIVATE, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
		}
		
		case MINE_ON: 
		{

			static Float: flHealth;

			flHealth = entity_get_float( iEntity, EV_FL_health );



			if( is_user_alive( entity_get_owner( iEntity ) ) )

			{
				if( pev( iEntity, pev_iuser3 ) == 0 )

					set_hudmessage(0, 200, 100, 0.05, 0.3, 0, 6.0, 1.1, 0.0, 0.0, -1),
					show_hudmessage( entity_get_owner( iEntity ), "LM:1 = %0.0f HP", flHealth - 1000.0 );

			}



			if( flHealth <= 1000.0 ) 
			{
				Func_Explode( iEntity );
				return FMRES_IGNORED;

			}
		}
	}
	
	if( is_valid_ent( iEntity ) )
		entity_set_float( iEntity, EV_FL_nextthink, flGameTime + 0.1 );

	return FMRES_IGNORED;

}

public fm_set_user_health( iPlayer, Float: flHealth )
	flHealth ? set_pev( iPlayer, pev_health, flHealth ) : dllfunc( DLLFunc_ClientKill, iPlayer );
cum pot adauga o functie de delay sa nu poti planta laser-ul decat dupa 10 secunde.

si am vazut ca poti sa iti cumperi tripmine la greu, daca se poate sa isi cumpere maxim 2, iar dupa sa ii dea un mesaj cu "ti-ai cumparat deja cele 2 tripmine-uri"
RoyalServer 2
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

15 Aug 2021, 03:38

serios ? nu poti sa faci ceea ce ai zis dar totusi vinzi "moduri configurate de la 0 de tine" pe grupurile de facebook ? :)))
User avatar
kerasseN
Membru, skill 0
Membru, skill 0
Posts: 53
Joined: 04 Feb 2020, 00:00
Detinator Steam: Nu
Fond eXtream: 0
Has thanked: 1 time

15 Aug 2021, 04:03

baiatu meu cred ca ti-e rau, eu nu vand nimic pe facebook, am incercat si imi cam da batai de cap pluginu.. nu stiu ce *** visezi tu .
Post Reply

Return to “Cereri”

  • Information
  • Who is online

    Users browsing this forum: Yandex [Bot] and 37 guests