Plugin znany z tego filmu
Pozwala na wyświetlanie wcześniej przygotowanego sprites w dowolnej pozycji na ekranie gracza. Dodatkowo można ustawiać skalę sprites tzn powiększać / pomniejszać.
Sam plugin działa na zasadzie obliczania pozycji względem ekranu gracza wykorzystując współrzędne biegunowe ( http://pl.wikipedia.org/wiki/Uk%C5%82ad_wsp%C3%B3%C5%82rz%C4%99dnych_biegunowych )
Główny plugin posiada odpowiednie API udostępnione przez natywy tzn.
- addPlayerSprite
- setSpriteFX
- setSpriteRender
- setSpriteColor
- setSpriteSequence
- setSpriteScale
- setSpriteFrameRate
- setSpriteAmount
- setSpriteAngle
Pierwszy z nich służy do dodawania sprite
Definicja:
native addPlayerSprite(id,Float:scale,Float:frameRate,szModel[],Float:fAngle, Float:fLen, Float:fTime,Float:fDistance , bool: bTransparent );
Kolejne natywy jako że obiekt w hudzie to pełnoprawny entity ( env_sprite ) , służą do zmiany ustawień entity.
Przykładowy plugin którego efekt widać na filmie.
#include <amxmodx> #include <amxmisc> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "DarkGL" native setSpriteRender( id , indexSprite , render ); native addPlayerSprite(id,Float:scale,Float:frameRate,szModel[],Float:fAngle, Float:fLen, Float:fTime,Float:fDistance , bool: bTransparent ); new gszModel[] = "sprites/slowdown3.spr"; new iIndex; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /test", "test"); register_clcmd("say /test2", "test2"); register_clcmd("say /test3", "test3"); } public plugin_precache(){ precache_model(gszModel); } public test(id){ iIndex = addPlayerSprite(id,0.02,10.0,gszModel,20.0,10.0,9999.0, 13.0 , true ) } public test2(id){ setSpriteRender( id , iIndex , kRenderTransAdd ); } public test3(id){ setSpriteRender( id , iIndex , kRenderTransAlpha ); }
Download
spriteFixer.zip Download
W paczce znajduje się plik sprite_test.amxx czyli skompilowany kod podany wyżej oraz główny kod czyli spriteFixer.amxx.
Sam sposób obliczania pozycji
public fwAddToFullPack(es_handle, e, ENT, HOST, hostflags, player, set){ if(player || !pev_valid( ENT ) ) return FMRES_IGNORED; new szClassName[ 64 ]; pev( ENT , pev_classname , szClassName , charsmax( szClassName ) ); if( !equal( szClassName , spriteClass ) ){ return FMRES_IGNORED; } for(new i=0;i<SPRITES_PER_PLAYER;i++){ if(giEntsIds[HOST][i] == ENT){ getPosition( HOST ); new Float:fAngles[3]; new Float:fVector[3]; pev(HOST, pev_v_angle, fAngles); angle_vector(fAngles, ANGLEVECTOR_FORWARD, fVector); xs_vec_mul_scalar(fVector, gfOffsetLen[HOST][i], fVector); fAngles[2] = gfOffset[HOST][i][0]; angle_vector(fAngles, ANGLEVECTOR_RIGHT, fAngles); xs_vec_mul_scalar(fAngles, gfOffset[HOST][i][1], fAngles); xs_vec_add(gfPosition[HOST], fVector, fVector); xs_vec_add(fVector, fAngles, fVector); set_pev(giEntsIds[HOST][i], pev_origin, fVector); set_es( es_handle , ES_Origin , fVector ); return FMRES_HANDLED; } } set_es( es_handle , ES_Scale , 0.001 ); set_es( es_handle , ES_Origin , { 9999.0 , 9999.0 , 9999.0 } ); return FMRES_HANDLED; }
Funkcja addToFullPack wykonuje się dość często i może obciążać serwer jednak jeśli nie będzie wyświetlać naprawdę dużej ilości wszystko powinno być ok.
Domyślne limit sprites w hudzie dla gracza to 3.
Jeśli chcemy zwiekszyć ten limit to zmieniamy go tutaj
#define SPRITES_PER_PLAYER 3
A optymalizować plugin pod serwer możemy tutaj
#define MAX_PLAYERS 33
Plugin dodatkowo bierze pod uwagę ustawienia gracza tzn. komendy cl_bob i cl_bobup.
Owocnego użytkowania 😉 ! Na koniec jeszcze raz download.
Mam jeszcze kilka pomysłów jak poprawić działanie pluginu.
Między innymi MOVETYPE_FOLLOW , zaokrąglanie wyników obliczeń pozycji ( aby wyglądało to płynniej ).
Download
spriteFixer.zip Download
A można tak zrobić aby było można dodać obrazek w png czy coś np żeby dodać sobie logo.
Przerób png na sprite
Da się wyświetlić określoną klatkę ?
tzn ?