Jump to content

players in vehicles - tutorial


AlexxAdv

Recommended Posts

Salutare, tot primeam mesaj de genu "salut, alex, cum pot face viteza la vehicul sa fie rapida, sa arate viteza instant intr-un mod optimizat".

Eh, o sa va arat cred ca cea mai buna metoda a face asta, in care puteti face viteza sa se updateze repede la 200-300 milisecunde in textdraw, in cel mai bun mod( dupa parere mea).

 

1. Avem nevoie de o librarie a lui Y_LESS, printre care y_iterate.

2. Creem iteratorul si variabila for player.

new Iterator:playerInVehicles[MAX_VEHICLES]<MAX_PLAYERS>,
    playerInVehicle[MAX_PLAYERS] = {INVALID_VEHICLE_ID, ...}; 

3. O sa mergem in OnPlayerStateChange si vom adauga asta

if (newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) 
	{
		playerInVehicle[ playerid ] = GetPlayerVehicleID( playerid );
		Iter_Add(playerInVehicles[ playerInVehicle[ playerid ] ] , playerid);
	} 
	else if (oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) 
	{
		if( playerInVehicle[ playerid ] != INVALID_VEHICLE_ID )
		{	
			Iter_Remove( playerInVehicles[ playerInVehicle[ playerid ] ], playerid);
			playerInVehicle[ playerid ] = INVALID_VEHICLE_ID;
		}
	} 

4. Resetam la conectarea player-ului pentru a fi siguri ca nu se vor intampla probleme

public OnPlayerConnect( playerid )
{
	playerInVehicle[ playerid ] = INVALID_VEHICLE_ID;
}

5. De asemenea, vom reseta si la deconectarea player-ului, sa fim siguri ca nu vor aparea probleme pe parcurs

public OnPlayerDisconnect( playerid, reason )
{
	if (playerInVehicle[ playerid ] != INVALID_VEHICLE_ID) 
    {
		Iter_Remove( playerInVehicles[ playerInVehicle [ playerid ] ], playerid );
		playerInVehicle[ playerid ] = INVALID_VEHICLE_ID;
	}

6. Creem un stock prin care putem lua driver-ul care conduce masina X si stock-ul va fi cam asa

stock GetVehicleDriver( vehicleid )
{
    foreach(new i : playerInVehicles[ vehicleid ])
    {
    	if( GetPlayerState( i ) != PLAYER_STATE_DRIVER )
    		continue;

        return i;
    }
    return INVALID_PLAYER_ID;
}

7. De asemenea vom face si un stock, prin care putem verifica daca vehiculul este liber sau are pasageri/conducatori

stock IsVehicleOccupied( vehicleid )
{
    return Iter_Count( playerInVehicles[ vehicleid ] );
}    

Acum, cum am putea folosi sa facem de exemplu, avem comanda /cw( /carwhisper ), cum facem sa trimitem mesaje la toti playerii din vehiculul X? Comanda noastra ar trebui sa fie in stilul acesta 

CMD:cw( playerid, params[] )
{
    if(!IsPlayerInAnyVehicle(playerid))
    	return SendClientMessage(playerid, -1, "{FFF8C6}You need to be in vehicle.");

    new Text[ 128 ];
	if( sscanf( params, "s[128]", Text ) )
		return SendClientMessage( playerid, -1, "/cw [ message ]" );

	new v_id = GetPlayerVehicleID( playerid );

	new string[128];
	format( string, sizeof string, "(Car Whisper) %s: %s", GetName( playerid ), Text );

    foreach(new i : playerInVehicles[ v_id ] )
    {
        SendClientMessage( i, -1, string );
    }

	return true;
}

Daca nu avem " GetName " creat, il vom face in urmatorul mod

stock GetName(playerid)
{
	new name[MAX_PLAYER_NAME];
	GetPlayerName(playerid, name, sizeof name);
	return name;
}

Cu modelul de la comanda ( /cw, /carwhisper ) puteti face un timer la cate milisecunde/seecunde vreti voi, doar in vehiculul X, aveti N metode de a face asta, una ar fi sa porniti un timer in OnGameModeInit, prin toate vehiculele( MAX_VEHICLES ) si verificati cu Iter_Count( playerInVehicles[ vehicleid ] ) daca nu sunt playeri in masina, sa nu fie executat degeaba loop-ul.

 

Cam asta a fost micul, scurt tutorial, daca am omis ceva, rog cunoscatorii sa completeze(sau sa corecteze) in caz ca am gresit ceva din neatentie, sper ca n am omis nimic.

 

Daca exista un astfel de tutorial, atunci imi voi retrage postarea, dar am primit destule mesaje cum se poate face asta si totusi am zis sa va arat cea mai buna metoda( din perspectiva mea )

Succes tuturor :)

Edited by AlexxAdv
small mistake
Link to comment
Share on other sites

2 minutes ago, Sancky said:

daca se teleporteaza cineva din masina in masina si nu se apeleaza OPSC, ce se intampla?

cum s ar putea teleporta din masina in masina? daca te referi la comanda /goto cand se teleporteazaa la un jucaator aflat deja in vehicul, n are fi greu sa faci o verificare daca e in veehicul si tu esti intr-un vehicul sa te teleportezee fara sa te bagate in vehiculul jucatorului la care te-ai teleportat

Link to comment
Share on other sites

Just now, Sancky said:

un hacker, nuj

in cazu asta poti seta intr-un timer for player daca se afla intr-un vehicul si nu este in aceel iterator pentru vehiculul in care see afla, sa l adauge, deci s-ar executa doar o singura data

Link to comment
Share on other sites

42 minutes ago, nobilzeus said:

aveti un exemplu mai bun aici no hate

 

Nu știu la ce te referi prin "mai bun", dar cu siguranță nu este intr un mod mai optim fata de ce am prezentat eu și dacă e autobuz și are peste 10 jucători, ce se întâmplă?

image-17.png

Link to comment
Share on other sites

1 minute ago, nobilzeus said:

se trimit toate mesajele, tu ce crezi ca se intampla? nu inteleg? ai folosit vreodata profiler?

Folosesc profiler de mult, nu cred e cazu sa vorbim despre optimizarea asta, eu zic sa ți verifici totuși codul, mai exact acel loop :) eu zic ca nu se trimit la playerii din autobuz dacă > 4

Link to comment
Share on other sites

25 minutes ago, AlexxAdv said:

Folosesc profiler de mult, nu cred e cazu sa vorbim despre optimizarea asta, eu zic sa ți verifici totuși codul, mai exact acel loop :) eu zic ca nu se trimit la playerii din autobuz dacă > 4

my bad 

 new result[200], seats = vdata[GetVehicleModel(GetPlayerVehicleId[playerid])-400][CarSeats];
    
    for(new i = 0; i < seats; i ++) if(InVehicle[car][i] != -1) SCMF(InVehicle[car][i],COLOR_YELLOW, "(Car Whisper) %s: %s","(Car Whisper) %s: %s",GetName(playerid),result);

ty for reporting

Edited by nobilzeus
Link to comment
Share on other sites

7 hours ago, nobilzeus said:

folosesti includuri sau?

M ai întrebat de profiler și nu eram la pc sa ți pot arata, știam doar ca am o poza cu inc urile și dacă vezi acolo #include profiler...automat ca am și pluginu ca nu pleacă gm unu fără altu.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.