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