Sprites In Player HUD – Wyświetlanie sprites w hudzie gracza

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

4 komentarzy o “Sprites In Player HUD – Wyświetlanie sprites w hudzie gracza

Dodaj komentarz