←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Task - problem z wyświetlanie...


Najlepsza odpowiedź sebul 08.07.2013 00:00

1. Nigdy nie wczytuj cvarów w plugin_init.

2. Nigdy nie wczytuj wartości cvara w środku pętli, jeśli można to zrobić przed nią.

3. Pętla po graczach w plugin_init? A w życiu... właśnie też na początku nie miało prawa to działać, bo sprawdzałeś, czy gracz był na serwerze.

4. Zawsze staraj się pisać jak najkrótszy kod.

5.

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <ColorChat>

#define PLUGIN "Rate'y + HUDMSG"
#define VERSION "2.0"
#define AUTHOR "Filip / `NN"

new const prefix[] = "[RSF]";

new pcvar_rate;
new pcvar_cmdbackup;
new pcvar_cmdrate;
new pcvar_updaterate;
new pcvar_interp;

new pcvar_hud_show;
new pcvar_hud_showtype;
new pcvar_hud_time;

new hudhandle;

public plugin_init(){
    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHam(Ham_Spawn, "player", "raty", 1);
    
    register_dictionary("rsf.txt")
    
    pcvar_rate = register_cvar("rsf_rate", "25000")
    pcvar_cmdbackup = register_cvar("rsf_cmdbackup", "2")
    pcvar_cmdrate = register_cvar("rsf_cmdrate", "101")
    pcvar_updaterate = register_cvar("rsf_updaterate", "101")
    pcvar_interp = register_cvar("rsf_interp", "0.01")
    
    pcvar_hud_show = register_cvar("rsf_hud_show", "1")
    pcvar_hud_showtype = register_cvar("rsf_hud_showtype", "0")
    pcvar_hud_time = register_cvar("rsf_hud_time", "120.0")
    
    hudhandle = CreateHudSyncObj();
}

public plugin_cfg(){
    new cfgDir[64]
    get_configsdir(cfgDir, 63)
    server_cmd("exec %s/rsf.cfg", cfgDir)
}

public raty(id){
    if(!is_user_connected(id)) return;
    
    client_cmd(id, "rate %d", get_pcvar_num(pcvar_rate))
    client_cmd(id, "cl_cmdbackup %d", get_pcvar_num(pcvar_cmdbackup))
    client_cmd(id, "cl_cmdrate %d", get_pcvar_num(pcvar_cmdrate))
    client_cmd(id, "cl_updaterate %d",get_pcvar_num(pcvar_updaterate))
    client_cmd(id, "ex_interp ^"%.2f^"", get_pcvar_float(pcvar_interp)+0.0001)
    
    if(get_pcvar_num(pcvar_hud_show) == 1) {
        new Float:ttime = get_pcvar_float(pcvar_hud_time);
        if(ttime > 0) {
            if(!task_exists(id)) set_task(ttime, "hudmsg", id, _, _, "b")
        }
        else {
            hudmsg(id);
        }
    }
}

public hudmsg(id){
    if(!is_user_connected(id)) {
        remove_task(id);
        return;
    }
    
    new htype = get_pcvar_num(pcvar_hud_showtype);
    if(htype != 1){
        set_hudmessage(255, 100, 10, 0.1, 0.7, 0, 6.0, 9.0, 0.0, 0.0, random_num(1,4))
        ShowSyncHudMsg(id, hudhandle, "%L", LANG_PLAYER, "RSF_INFO")
    }
    if(htype)
        ColorChat(id, GREEN, "%s ^x01%L", prefix, LANG_PLAYER, "RSF_INFO")
}

Coś takiego chyba się nada.

Przejdź do postu
Zablokowany

  • +
  • -
Filip1512 - zdjęcie Filip1512 07.07.2013

Cześć,

jak to dość często bywa u mnie, po raz kolejny mam problem z taskami (już nawet nie wiem, który raz :P).

Wyświetlanie wiadomości w hudzie/czacie nie działa, jesli cvar "rsf_hud_time" jest ustawiony na inną wartość niż "0". Cały czas kombinuje w sma, więc kod się cały czas zmienia, ale na obecną chwilę mam już tak:

 

Spoiler
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 07.07.2013

Łap

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <ColorChat>

#define PLUGIN "Rate'y + HUDMSG"
#define VERSION "2.0"
#define AUTHOR "Filip / `NN"
#define TaskHud 781232

new maxplayers;

new prefix[] = "[RSF]";

new pcvar_rate;
new pcvar_cmdbackup;
new pcvar_cmdrate;
new pcvar_updaterate;
new pcvar_interp;

new pcvar_hud_show;
new pcvar_hud_showtype;
new pcvar_hud_time;

public plugin_init(){
    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHam(Ham_Spawn, "player", "raty", 1);
    
    register_dictionary("rsf.txt")
    
    pcvar_rate = register_cvar("rsf_rate", "25000")
    pcvar_cmdbackup = register_cvar("rsf_cmdbackup", "2")
    pcvar_cmdrate = register_cvar("rsf_cmdrate", "101")
    pcvar_updaterate = register_cvar("rsf_updaterate", "101")
    pcvar_interp = register_cvar("rsf_interp", "0.01")
    
    pcvar_hud_show = register_cvar("rsf_hud_show", "1")
    pcvar_hud_showtype = register_cvar("rsf_hud_showtype", "0")
    pcvar_hud_time = register_cvar("rsf_hud_time", "120.0")
    
    maxplayers = get_maxplayers()
    
    for(new id=0; id<=maxplayers; id++)
        if(get_pcvar_float(pcvar_hud_time) > 0 && get_pcvar_num(pcvar_hud_show) == 1)
            set_task(get_pcvar_float(pcvar_hud_time), "hudmsg", id+TaskHud, _, _, "b") // Lepiej uważaj z id w task`ach
}

/*
public plugin_cfg(){
    new cfgDir[64]
    get_configsdir(cfgDir, 63)
    server_cmd("exec %s/rsf.cfg", cfgDir)
}*/
//Po co ci to ?


public raty(id){
    client_cmd(id, "rate %d", get_pcvar_num(pcvar_rate))
    client_cmd(id, "cl_cmdbackup %d", get_pcvar_num(pcvar_cmdbackup))
    client_cmd(id, "cl_cmdrate %d", get_pcvar_num(pcvar_cmdrate))
    client_cmd(id, "cl_updaterate %d",get_pcvar_num(pcvar_updaterate))
    client_cmd(id, "ex_interp ^"%f^"", get_pcvar_float(pcvar_interp))
    if(get_pcvar_num(pcvar_hud_show) == 1 && get_pcvar_float(pcvar_hud_time) == 0)	hudmsg(id);
}


public hudmsg(idt){

	new id = idt-TaskHud 
	if(!is_user_connected(id)) return 0; // Inaczej dla graczy których niema na serwerze też się to wykona
	if(get_pcvar_num(pcvar_hud_showtype) == 0)
	{
		set_hudmessage(255, 100, 10, 0.1, 0.7, 0, 6.0, 9.0, 0.0, 0.0, random_num(1,4))
		ShowSyncHudMsg(id, CreateHudSyncObj(), "%L", LANG_PLAYER, "RSF_INFO")
	}
	else if(get_pcvar_num(pcvar_hud_showtype) == 1)	ColorChat(id, GREEN, "%s ^x01%L", prefix, LANG_PLAYER, "RSF_INFO")
	else //Dlaczego bez sprawdzania czy typ msg jest 2 bo jak by ktoś w cvar`ze wybrał inną liczbę to by się wogóle nie pokazało
	{
		set_hudmessage(255, 100, 10, 0.1, 0.7, 0, 6.0, 9.0, 0.0, 0.0, random_num(1,4))
		ShowSyncHudMsg(id, CreateHudSyncObj(), "%L", LANG_PLAYER, "RSF_INFO")
		ColorChat(id, GREEN, "%s ^x01%L", prefix, LANG_PLAYER, "RSF_INFO")
	}
	return 0;
}
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 07.07.2013

Konstrukcje z TaskHud dodawanie i odejmowanie całkowicie nie potrzebne usuń je

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 07.07.2013

Nic się nie stanie jak użyje id gracza ??

Nigdy w pluginie nie widziałem aby w tasku było id gracza tzn. bynajmniej nie sprawdzałem czy może być.

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 07.07.2013

@Black - ja już nie raz używałem id w tasku i działało.

/*
public plugin_cfg(){
new cfgDir[64]
get_configsdir(cfgDir, 63)
server_cmd("exec %s/rsf.cfg", cfgDir)
}*/
//Po co ci to ?

Bo cvary są czytane z oddzielnego pliku, nie z amxx.cfg.

 

 

 

Czyli tak?

 

Spoiler
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 07.07.2013

Nic się nie stanie jak użyje id gracza ??

 

Nie nic sie nie stanie

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 07.07.2013

Dziwne,  bo dopiero z id + task hudem działa, a bez niego nie...

 

Twój kod Black działa.

 

Dark - a Ty jak byś to zrobił?

Odpowiedz

  • +
  • -
Najlepsza odpowiedź sebul - zdjęcie sebul 08.07.2013

1. Nigdy nie wczytuj cvarów w plugin_init.

2. Nigdy nie wczytuj wartości cvara w środku pętli, jeśli można to zrobić przed nią.

3. Pętla po graczach w plugin_init? A w życiu... właśnie też na początku nie miało prawa to działać, bo sprawdzałeś, czy gracz był na serwerze.

4. Zawsze staraj się pisać jak najkrótszy kod.

5.

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <ColorChat>

#define PLUGIN "Rate'y + HUDMSG"
#define VERSION "2.0"
#define AUTHOR "Filip / `NN"

new const prefix[] = "[RSF]";

new pcvar_rate;
new pcvar_cmdbackup;
new pcvar_cmdrate;
new pcvar_updaterate;
new pcvar_interp;

new pcvar_hud_show;
new pcvar_hud_showtype;
new pcvar_hud_time;

new hudhandle;

public plugin_init(){
    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHam(Ham_Spawn, "player", "raty", 1);
    
    register_dictionary("rsf.txt")
    
    pcvar_rate = register_cvar("rsf_rate", "25000")
    pcvar_cmdbackup = register_cvar("rsf_cmdbackup", "2")
    pcvar_cmdrate = register_cvar("rsf_cmdrate", "101")
    pcvar_updaterate = register_cvar("rsf_updaterate", "101")
    pcvar_interp = register_cvar("rsf_interp", "0.01")
    
    pcvar_hud_show = register_cvar("rsf_hud_show", "1")
    pcvar_hud_showtype = register_cvar("rsf_hud_showtype", "0")
    pcvar_hud_time = register_cvar("rsf_hud_time", "120.0")
    
    hudhandle = CreateHudSyncObj();
}

public plugin_cfg(){
    new cfgDir[64]
    get_configsdir(cfgDir, 63)
    server_cmd("exec %s/rsf.cfg", cfgDir)
}

public raty(id){
    if(!is_user_connected(id)) return;
    
    client_cmd(id, "rate %d", get_pcvar_num(pcvar_rate))
    client_cmd(id, "cl_cmdbackup %d", get_pcvar_num(pcvar_cmdbackup))
    client_cmd(id, "cl_cmdrate %d", get_pcvar_num(pcvar_cmdrate))
    client_cmd(id, "cl_updaterate %d",get_pcvar_num(pcvar_updaterate))
    client_cmd(id, "ex_interp ^"%.2f^"", get_pcvar_float(pcvar_interp)+0.0001)
    
    if(get_pcvar_num(pcvar_hud_show) == 1) {
        new Float:ttime = get_pcvar_float(pcvar_hud_time);
        if(ttime > 0) {
            if(!task_exists(id)) set_task(ttime, "hudmsg", id, _, _, "b")
        }
        else {
            hudmsg(id);
        }
    }
}

public hudmsg(id){
    if(!is_user_connected(id)) {
        remove_task(id);
        return;
    }
    
    new htype = get_pcvar_num(pcvar_hud_showtype);
    if(htype != 1){
        set_hudmessage(255, 100, 10, 0.1, 0.7, 0, 6.0, 9.0, 0.0, 0.0, random_num(1,4))
        ShowSyncHudMsg(id, hudhandle, "%L", LANG_PLAYER, "RSF_INFO")
    }
    if(htype)
        ColorChat(id, GREEN, "%s ^x01%L", prefix, LANG_PLAYER, "RSF_INFO")
}

Coś takiego chyba się nada.

Odpowiedz

  • +
  • -
Filip1512 - zdjęcie Filip1512 08.07.2013

Dzięki wszystko działa i przy okazji kod jest teraz bardziej optymalny :)


sebul (08.07.2013 16:04):
I jeszcze jedno, w sumie ten warunek
if(ttime > 0)

można zamienić na
if(ttime > 10)

albo dać jeszcze większą liczbę, bo wyświetlać ten sam tekst częściej niż raz na 10 sekund nie ma najmniejszego sensu. Ty może będziesz o tym wiedział, ale ktoś inny może nie.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 08.07.2013

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz
Zablokowany