←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

1 Komenda robi za 2 funkcje

  • +
  • -
XXL - zdjęcie 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ą :P

 

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
Odpowiedz

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

Odpowiedz

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

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

Odpowiedz

  • +
  • -
NoLiFeR - zdjęcie NoLiFeR 13.01.2015

Dlaczego task jest zły, wg Ciebie ?

Odpowiedz

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

Odpowiedz

  • +
  • -
NoLiFeR - zdjęcie NoLiFeR 13.01.2015

Autor powiedział, iż znalazł ten plugin na internecie, więc wyboru nie miał.



Dziękuje za wyjaśnienie.

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 13.01.2015

Autor pluginu to osoba, która go napisała, jak mógł go znaleźć?

Odpowiedz

  • +
  • -
NoLiFeR - zdjęcie NoLiFeR 14.01.2015

Ja mówie o autorze tematu : )))


 

Odpowiedz