←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Sprite nad głową

  • +
  • -
Filip1512 - zdjęcie 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()
        }
    }
}
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 05.11.2013

Hmm a coś takiego? Mało optymalny coś ten kod mi się wydaje i pewnie błędny, ale nie mam bladego pojęcia, co zrobić, żeby bez najeżdżania na kogoś myszką ten sprite widniał.
 
 
#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()
    }
}
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 05.11.2013

Kod wyżej nie zadziała.

 

Dlaczego zmieniłeś event handler na task ?

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie 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?

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie 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.

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 05.11.2013

Owszem, nie będzie...

#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ć...
Odpowiedz

  • +
  • -
Filip1512 - zdjęcie 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..

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 05.11.2013

A gdyby zmienić warunek

if(id == cel)
continue;

na

 

if(id == cel)
return;

 

?

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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.

Odpowiedz