lockLocked

[Tutorial] Touch

person nuttelass´
schedule May 11, 2017
forum 1
visibility 13
May 11, 2017 at 5:16 PM
Original Post
#1
Member

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 )

May 14, 2017 at 11:27 AM
#2
Member

TOPIC CLOSED

 

 

Multumim de post

Join the Discussion

You need to be logged in to post a reply.

loginLogin to Reply