Sprite nad głową
Filip1512
05.11.2013
Cześć,
korzystając z innych tematów i kodu, który znalazłem, jak sprawić, aby ten sprite był widoczny zawsze, ale tylko nad konkretną osobą (z wykorzystaniem get_user_authid, bo na SteamID)?
W którym miejscu to się zmienia? Ogólnie wydaje mi się na pierwszy rzut oka, że to powinien być inny event, ale co poza tym?
#include <amxmodx> #include <amxmisc> #include <cstrike> #define TE_PLAYERATTACHMENT 124 new sprite; public plugin_init() { register_event("StatusValue", "on_ShowStatus", "be", "1=2", "2!0"); } public plugin_precache() sprite = precache_model("sprites/sprite.spr"); public on_ShowStatus(id){ new cel, body get_user_aiming(id, cel, body) if(cel != 0 && is_user_alive(id) && is_user_alive(cel) && cs_get_user_team(id) == cs_get_user_team(cel)){ if(get_user_flags(cel) & ADMIN_IMMUNITY){ message_begin(MSG_ONE, SVC_TEMPENTITY,_,id) write_byte(TE_PLAYERATTACHMENT) write_byte(cel) write_coord(35) write_short(sprite) write_short(100) message_end() } } }
GwynBleidD
05.11.2013
Za wyświetlanie samego sprite odpowiedzialny jest ten fragment:
message_begin(MSG_ONE, SVC_TEMPENTITY,_,id) write_byte(TE_PLAYERATTACHMENT) write_byte(cel) write_coord(35) write_short(sprite) write_short(100) message_end()
Ostatni parametr jest odpowiedzialny za czas wyświetlania. Nie pamiętam w jakich jest jednostkach, musisz sobie to obadać. W każdym bądź razie, wystarczy że odnośnie odpowiedniego gracza będziesz w tasku non stop to wysyłał... Gracz na którym ma być to wyświetlane to cel. id to gracz który ma widzieć znaczek.
Filip1512
05.11.2013
#include <amxmodx> #include <amxmisc> #include <cstrike> #define TE_PLAYERATTACHMENT 124 #define "SID_CEL" "tutaj steam id" new sprite; public plugin_init(){ set_task(0.1, "SpriteEffect", 0, _, _, "b") } public plugin_precache() sprite = precache_model("sprites/sprite.spr"); public SpriteEffect(id){ new cel, sid[20] get_user_authid(cel, sid, 19) if(equali(sid, "SID_CEL") && is_user_alive(id) && is_user_alive(cel)){ message_begin(MSG_ONE, SVC_TEMPENTITY,_,0) write_byte(TE_PLAYERATTACHMENT) write_byte(cel) write_coord(35) write_short(sprite) write_short(100) message_end() } }
Filip1512
05.11.2013
A czy ten event jest potrzebny, skoro wystarczy 'tylko' utworzyć sprite nad głową konkretnej osoby bez konieczności namierzania na cel?
GwynBleidD
05.11.2013
Użył taska, bo nie chce robić widocznego sprite, gdy ktoś celownikiem najedzie, ale przez cały czas każdy ma ten sprite widzieć nad tamtego głową.
Task wykonujesz zbyt często. Zwiększ odstępy między taskami, zwiększając jednocześnie czas wyświetlania tego sprite.
Filip1512
05.11.2013
Czasem się będę bawił jak kod będzie działać, póki co jest tylko tak, żeby był, ale nadal nie wiem czy kod będzie działał (Dark pisze wyżej, że nie), a nie mam żadnych możliwości sprawdzenia tego.
GwynBleidD
05.11.2013
#include <amxmodx> #include <amxmisc> #include <cstrike> #define TE_PLAYERATTACHMENT 124 const SID_CEL[]="tutaj steam id" new cel=0; new sprite; public plugin_init(){ set_task(0.1, "SpriteEffect", 0, _, _, "b") } public client_authorized(id) { new sid[20] get_user_authid(id,sid, 19) if(equal(sid, SID_CEL)) cel=id; } public client_disconnect(id) { if (id==cel) cel=0; } public plugin_precache() sprite = precache_model("sprites/sprite.spr"); public SpriteEffect(taskId){ if(!cel) return; if(!is_user_connected(cel)) { cel = 0; return; } if(!is_user_alive(cel)) return; for(new id=1; id<33; ++id) { if(id == cel) continue; if(!is_user_connected(id)||!is_user_alive(id)) continue; message_begin(MSG_ONE, SVC_TEMPENTITY,_,id) write_byte(TE_PLAYERATTACHMENT) write_byte(cel) write_coord(35) write_short(sprite) write_short(100) message_end() } }To już powinno działać... Nie jestem pewien, ale chyba można to przerobić na MSG_ALL dzięki czemu unikniesz pętli... Nie wiem jednak co się stanie, gdy użyjesz tego na graczu będącym celem (tj jemu samemu wyświetlisz nad jego głową sprite)... Może to powodować jakieś dziwne błędy, musisz to sprawdzić...
Filip1512
05.11.2013
A nie lepiej MSG_BROADCAST? Bo to jest bardziej dodatek niż konieczność.
I powtarzam, niestety nie mam możliwości sprawdzenia tego..
GwynBleidD
05.11.2013
Nie mam pojęcia jak się CS zachowa, gdy gracz dostanie informację, że nad jego własną głową ma się wyświetlić sprite, musisz to sprawdzić niestety. MSG_BROADCAST wysyła do wszystkich, więc i do gracza, któremu ma się to nad głową wyświetlać. Jeśli będzie to źle działało, oczywiście możesz użyć MSG_ONE_UNRELIABLE
Filip1512
05.11.2013
A gdyby zmienić warunek
if(id == cel) continue;
na
if(id == cel) return;
?
GwynBleidD
05.11.2013
Wtedy przerwie Ci całkowicie wyświetlanie. Załóżmy, że gracz cel ma id=3, więc cel=3. Graczy masz 6 na serwerze, mają id ustawione po kolei (1-6), wtedy dla 1 i 2 wyświetli Ci się ten sprite, ale 4, 5 i 6 już go widzieć nie będą. Ma się tylko nie wysyłać dla gracza który jest celem.
Gdy chcesz to przerobić na MSG_ALL albo MSG_BROADCAST, wtedy rezygnujesz całkowicie z pętli i warunków wewnątrz niej.