Salt la continut

- Advertisement -
Fotografie

[ CS16- Scripting ] Touch


  • Please log in to reply
No replies to this topic

#1
Andrei;

Andrei;

    Administrator

  • Administrator
  • 3201 Postari:
  • 398 topics
  • Joined 16-December 12
  • Country: Country Flag

Touch = atingere, interactiune. In multe cazuri avem nevoie sa stim cand 2 entitati se ating, adica intra in contact una cu cealalta. 

 

Exemplu: Entitatea A trece peste entitatea B, asta inseamna ca cele 2 entitati s-au atins. A este entitatea care atinge, B este cea care este atinsa.

 

Pentru a putea manipula putem sa alegem forwardurile puse la dispozitie de modulul engine, fakemeta si hamsandwich.

//Engine
register_touch( "touched", "toucher", "public" )
//touched = cel care atinge
//toucher = cel care este atins
//public = publicul care este chemat

//Fakemeta
register_forward( FM_Touch, "public" )
//public = publicul care este chemat

//Hamsandwich
RegisterHam( Ham_Touch, "toucher", "public" )
//toucher = cel care atinge
//public  = publicul care este chemat

Ce observam din exemplele de mai sus ?

  • Engine este cel mai flexibil, putem sa setam exact ce entitati ne intereseaza
  • Fakemeta este chemat pentru orice fel de touch, depinde de noi sa verificam ce entitati se ating.
  • Hamsandwich inregistreaza orice fel de touch cu entitatea toucher.

Headerul publicului va arata asa:

public public( touched, toucher )

Engine este cel mai rapid si cel mai flexibil. Poate sa preia modul in care hamsandwich functioneaza:

register_touch( "touched", "*", "public" ) ( adica va inregistra orice touch dintre touched si o entitate ).

In forwardul fakemeta trebuie sa verificati manual daca entitatile care se ating sunt cele care va intereseaza. Hamsandwich va permite sa inregistrati orice touch facut de o entitate, dar trebuie sa verificati manual ce a atins.

 

Toucher, touched sunt clasele entitatilor. Fiecare entitate are o clasa, de exemplu un player are clasa "player", un ostatic are clasa "func_hostage", mapa are clasa "worldspawn". Pe langa aceste clasa default, va puteti crea propriile entitati cu clase custom. 

Pentru a afla clasa unei entitati folosim:

new szClassName[ 20 ]
pev( entittate, pev_classname, szClassName, charsmax( szClassName )
// in stringul szClassName va fi stocata clasa respectiva. O puteti compara cu equal/equali sau chiar contain/containi

Acum un mic exemplu: sa spunem ca vrei sa detectati atunci cand un player atinge un alt player.

register_touch( "player", "player", "HookTouch" )

public HookTouch( touched, toucher )
{
     //toucher si touched sunt id-urile entitatilor.
    client_print( toucher, print_chat, "Ai atins un player: %i", touched )
}

Pentru hamsandwich ar trebui sa verificati daca touched are clasa "player", in fakemeta trebuie sa verificati daca ambele au clasa player.

 

Pentru a simula un touch intre 2 entitati:

//engine
fake_touch( touched, toucher )  
//fakemeta
dllfunc( DLLFunc_Touch, touched, toucher )  

Pentru a bloca touch folositi: return 1( engine ), return FMRES_SUPERCEDE( fakemeta ) sau return HAM_SUPERCEDE( hamsandwich )


Aceasta postare a fost editata de Artick: 28 September 2014 - 12:37 PM

  • Laurrica, SmoKe; x, Bogdan ; and 2 others like this




2 useri citesc topicul

0 membri, 2 vizitatori, 0 utilizatori anonimi