1 Komenda robi za 2 funkcje
XXL
10.01.2015
Witam i pytam jak zrobić aby po wpisaniu np say /komenda tworzy się coś nwm napis na hud i znowu po wpisaniu komendy w say /komenda zatrzymuje wyświetlaniu prosiłbym o jakiś prosty przykładowy plugin z ową funkcją
Znalazłem w necie takie coś ale kompletnie tego nie ogarniam
#include <amxmodx> #include <fakemeta> #define PLUGIN "Speedometer" #define VERSION "1.2" #define AUTHOR "AciD" #define FREQ 0.1 new bool:plrSpeed[33] new TaskEnt,SyncHud,showspeed,color, maxplayers, r, g, b public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_cvar("AcidoX", "Speedometer 1.1", FCVAR_SERVER) register_forward(FM_Think, "Think") TaskEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")) set_pev(TaskEnt, pev_classname, "speedometer_think") set_pev(TaskEnt, pev_nextthink, get_gametime() + 1.01) register_clcmd("say /speed", "toogleSpeed") showspeed = register_cvar("showspeed", "1") color = register_cvar("speed_colors", "255 255 255") SyncHud = CreateHudSyncObj() maxplayers = get_maxplayers() new colors[16], red[4], green[4], blue[4] get_pcvar_string(color, colors, sizeof colors - 1) parse(colors, red, 3, green, 3, blue, 3) r = str_to_num(red) g = str_to_num(green) b = str_to_num(blue) } public Think(ent) { if(ent == TaskEnt) { SpeedTask() set_pev(ent, pev_nextthink, get_gametime() + FREQ) } } public client_putinserver(id) { plrSpeed[id] = showspeed > 0 ? true : false } public toogleSpeed(id) { plrSpeed[id] = plrSpeed[id] ? false : true return PLUGIN_HANDLED } SpeedTask() { static i, target static Float:velocity[3] static Float:speed, Float:speedh for(i=1; i<=maxplayers; i++) { if(!is_user_connected(i)) continue if(!plrSpeed[i]) continue target = pev(i, pev_iuser1) == 4 ? pev(i, pev_iuser2) : i pev(target, pev_velocity, velocity) speed = vector_length(velocity) speedh = floatsqroot(floatpower(velocity[0], 2.0) + floatpower(velocity[1], 2.0)) set_hudmessage(r, g, b, -1.0, 0.7, 0, 0.0, FREQ, 0.01, 0.0) ShowSyncHudMsg(i, SyncHud, "%3.2f units/second^n%3.2f velocity", speed, speedh) } }
Użytkownik XXL edytował ten post 10.01.2015 17:53
grankee
11.01.2015
No to właśnie taki prosty kod podałeś, jedyne co w nim nie jest proste dla początkującego, to think enta zamiast tasku, lepsza droga do celu. Tylko, że to nie wymaga zmiany, raczej nauczenia się, żeby do początku robić jak należy. Daj jeszcze raz ten kod, ale na końcu każdej linijki, której nie rozumiesz, postaw
//
czyli komentarz, postaram się objaśnić.
NoLiFeR
11.01.2015
Ludzie... Po co tak komplikować sprawe ?
#include amxmodx new zmiana[33] public plugin_init() { register_plugin("LoLs","1.0","NoLiFeR") register_clcmd("say /komenda","publiczk") } public publiczk(id) { switch(zmiana[id]) { case 0: { //code zmiana[id] = 1 } case 1: { //code zmiana[id] = 0 } } }
Kod umieszczony w case 0 wykona się po pierwszym wpisaniu komendy, a w case 1 po drugim wpisaniu komendy, po kolejnym case 0 etc
Mógłbyś np zrobić synchudmessage w tasku gdzieś w innej funkcji. Oto ona
#include amxmodx new zmiana[33] new syncuchw public plugin_init() { register_plugin("LoLs","1.0","NoLiFeR"); register_clcmd("say /komenda","publiczk"); syncuchw = CreateHudSyncObj(); } public publiczk(id) { switch(zmiana[id]) { case 0: { zmiana[id] = 1 hudmsgbegin(id) } case 1: { zmiana[id] = 0 } } } public hudmsgbegin(id) { id -= 8145791 if(!zmiana[id]) return; set_hudmessage(255, 255, 255, -1.0, 0.35, 0, 6.0, 1.0, 0.1, 0.2, -1) ShowSyncHudMsg(id, syncuchw, "Wiadomosc") set_task(1.0,hudmsgbegin,id+8145791) }
//Sorry za brak tabulacji.
Użytkownik NoLiFeR edytował ten post 11.01.2015 01:32
grankee
11.01.2015
Mógłbyś np zrobić synchudmessage w tasku gdzieś w innej funkcji.
jedyne co w nim nie jest proste dla początkującego, to think enta zamiast tasku, lepsza droga do celu. Tylko, że to nie wymaga zmiany, raczej nauczenia się, żeby od początku robić jak należy.
grankee
13.01.2015
Think entu jest lepiej obsługiwany przez silnik (jest optymalniejszy?), ponadto tasku trzeba pilnować, nieumiejętne przewidywanie jego działania skutkuje errorami oraz rzadziej nieprawidłowym działaniem pluginu, skrajnie crashami serwera. To nie jedyne powody, kiedyś rozmawiałem o tym z kimś kto więcej wie na ten temat, wolałem jednak zapamiętać, żeby wystrzegać się tasków niżeli dlaczego, ponieważ powody raz mnie przekonały i nie widziałem sensu ich zapamiętywać. Kolejna sprawa to autor np. tego pluginu zdecydował się użyć entu i jego thinka zamiast tasku, to też sugeruje, że jest to lepsze wyjście.
NoLiFeR
13.01.2015
Autor powiedział, iż znalazł ten plugin na internecie, więc wyboru nie miał.
Dziękuje za wyjaśnienie.