Skocz do zawartości
bali2k

[Rozwiązane] Problem z pluginem na aktualną prędkość

Rekomendowane odpowiedzi

Witam.
Mam problem z pluginem na aktualną prędkość gracza, która powinna się wyświetlać na ekranie. Plugin kompiluje się, aczkolwiek bez efektów. Chciałbym prosić o pomoc, ponieważ jest to mój pierwszy plugin i na pewno gdzieś popełniłem błąd.
 

Spoiler
#include <sourcemod>

public Plugin myinfo = 
{
    name = "Simple HUD",
    author = "Bali2k",
    description = "Simple HUD",
    version = "1.0"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
}

public Action spawn(Event event, char[] name, bool dontBroadcast)
{

    int client = GetClientOfUserId(event.GetInt("userid"));

    CreateTimer(1.0, ShowHud, client, TIMER_REPEAT);
}

public Action ShowHud(Handle timer, int client)
{
    if(!IsClientInGame(client) || !IsPlayerAlive(client))
    return Plugin_Continue;

    float vel = GetEntPropFloat(client, Prop_Data, "m_vecAbsVelocity");

    SetHudTextParams(-1.0, 0.6, 1.0, 0, 255, 0, 255);
    ShowHudText(client, -1, "Speed: %f", vel);
    CreateTimer(1.0, ShowHud, client, TIMER_REPEAT);

    return Plugin_Continue;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak na Twój pierwszy program to bardzo dobrze sobie poradziłeś. Sam nie jestem do końca przekonany, dlaczego nic nie wyświetla się w hud

 

Z całą pewnością dostrzegam tutaj jeden poważny błąd

W ShowHud ponownie wywołujesz CreateTimer. Zauważ, że tworzysz go z flagą TIMER_REPEAT, która sprawia, że timer jest wykonywany w kółko bez potrzeby ponownego używania CreateTimer. Masz tutaj dwa wyjścia: albo wywalasz CreateTimer z ShowHud, albo usuwasz TIMER_REPEAT z obydwu wywołań - wówczas po skończonej pracy timera będzie tworzony nowy.

 

Pomimo tego, nie jestem pewien dlaczego nic się nie wyświetla. Podejrzewałbym dwa możliwe warianty: albo to CreateTimer z flagą TIMER_REPEAT powodował problem, albo coś jest nie tak podczas wyświetlania wiadomości w ShowHudText. Po poprawce timera spróbuj sobie wyświetlić w hud jakąś testową wiadomość (np. "test"), zamiast sformatowanej wiadomości %f (raczej nie powinno to nic zmienić, ale dla świętego spokoju warto wykluczyć taką ewentualność). Możesz też pobawić się z kanałem, na którym wyświetlasz wiadomość. Aktualnie jest to -1, czyli pierwszy wolny kanał, ale może zadziała na 1, na 2......

 

https://sm.alliedmods.net/new-api/halflife/ShowHudText
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Poprawiłem błędy, lecz nadal nie pokazuje aktualnej prędkości. Sprawdziłem z przykładowym tekstem i działa poprawnie. Problem według mnie leży w zdefiniowaniu GetEntPropVector. Tutaj jak wygląda poprawiony kod:
 

Spoiler

#include <sourcemod>

public Plugin myinfo = 
{
    name = "Simple HUD",
    author = "Bali2k",
    description = "Simple HUD",
    version = "1.0"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
}

public Action spawn(Event event, char[] name, bool dontBroadcast)
{

    int client = GetClientOfUserId(event.GetInt("userid"));

    CreateTimer(1.0, ShowHud, client, TIMER_REPEAT);
}

public Action ShowHud(Handle timer, int client)
{
    if(!IsClientInGame(client) || !IsPlayerAlive(client))
    return Plugin_Continue;

    //float vel = GetEntPropFloat(client, Prop_Data, "m_vecAbsVelocity");

    SetHudTextParams(-1.0, 0.6, 1.0, 0, 255, 0, 255);
    ShowHudText(client, -1, "Speed: test");

    return Plugin_Continue;
}


Link do funkcji: https://sm.alliedmods.net/new-api/entity/GetEntPropVector
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Edytowane przez bali2k

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To zależy, czy potrzebujesz prędkości we wszystkich osiach, czy tylko takiej ogólnej.

 

Jeśli chcesz mieć rozbite na 3 osie, to tym:

float flvector[3];
GetEntPropVector(client, Prop_Data, "m_vecVelocity", flvector);

A jak potrzebujesz jednolitą:

float speed = GetVectorLength(flvector) // podajesz wektor z kodu wyżej

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

 

Działa już prawidłowo. Jeszcze został jeden problem, mianowicie tekst się "rozlewa". Jak to naprawić? Próbowałem zmieniać czas odświeżania timera, ale nic to nie dało

Edytowane przez bali2k

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wyświetlanie odbywa się na kilku kanałach. Zamiast -1 ustaw sobie jakiś konkretny, np. 3

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Jak na pierwszy plugin jestem w miarę zadowolony, aczkolwiek to nie jest coś czego oczekiwałem. Bardzo dziękuję za pomoc Magnet.
Ostateczna wersja:
 

Spoiler
#include <sourcemod>
#include <shavit>

public Plugin myinfo = 
{
    name = "Simple HUD",
    author = "Bali2k",
    description = "Simple HUD",
    version = "1.0"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
}

public Action spawn(Event event, char[] name, bool dontBroadcast)
{

	int client = GetClientOfUserId(event.GetInt("userid"));
	CreateTimer(0.1, ShowHud, client, TIMER_REPEAT);
}

public Action ShowHud(Handle timer, int client)
{
	if(!IsClientInGame(client) || !IsPlayerAlive(client))
	return Plugin_Continue;

	float flvector[3];
	GetEntPropVector(client, Prop_Data, "m_vecVelocity", flvector);

	float speed = GetVectorLength(flvector);

	SetHudTextParams(-1.0, 0.6, 1.0, 255, 255, 255, 255);
	ShowHudText(client, 1, "Speed: %.2f", speed);
	
	return Plugin_Continue;
}

 

Jeszcze jedno pytanko, ponieważ zauważyłem, że jak idę do przodu i skoczę to prędkość wzrasta, pomimo tego, że powinna być wciąż 250. Nieprawidłowo zdefiniowałem wektor? Chcę, aby była mierzona prędkość poruszania się do przodu, nie przy skoku.

Edytowane przez bali2k
problem

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jestem pewien, czy to dobre rozwiązanie, ale może wystarczy policzyć długość wektora dla składowych X i Y w flvector?

 

https://onlinemschool.com/math/library/vector/length/
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

(pierwiastek z sumy kwadratów liczysz i tyle)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Niestety nie mam pojęcia jak to przełożyć na kod. Prosiłbym o pomoc.

 

Spróbowałem coś takiego, ale zwraca mi wartość pierwiastka z 2 😛
 

float speed = SquareRoot(Pow(flvector[0],2) + Pow(flvector[1],2));

 

Edytowane przez bali2k

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Kocham to 1
Napisano (edytowane)

Jestem w szoku, że mi się udało 😛 Dzięki jeszcze raz Magnet za pomoc 😉
Tutaj wersja finalna v2:

 

#include <sourcemod>

public Plugin myinfo = 
{
    name = "Simple HUD",
    author = "Bali2k",
    description = "Simple HUD",
    version = "1.0"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
}

public Action spawn(Event event, char[] name, bool dontBroadcast)
{

	int client = GetClientOfUserId(event.GetInt("userid"));
	CreateTimer(0.1, ShowHud, client, TIMER_REPEAT);
}

public Action ShowHud(Handle timer, int client)
{
	if(!IsClientInGame(client) || !IsPlayerAlive(client))
	return Plugin_Continue;

	float flvector[3];
	GetEntPropVector(client, Prop_Data, "m_vecVelocity", flvector);

	float speed = SquareRoot((Pow((flvector[0]), 2.0)) + (Pow((flvector[1]), 2.0)));

	SetHudTextParams(-1.0, 0.6, 1.0, 255, 255, 255, 255);
	ShowHudText(client, 1, "Speed: %.2f", speed);
	
	return Plugin_Continue;
}

Jedyne co mi się aktualnie nie podoba jest to, że tekst jest postrzępiony, przez to, że odświeża się dużo razy na sekundę, lecz po zmianie na wyższy czas, prędkość odświeża się za wolno.

Edytowane przez bali2k

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
1 godzinę temu, MAGNET napisał:

Zainteresuj się tym: https://sm.alliedmods.net/new-api/halflife/CreateHudSynchronizer
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Nie wiem czy to było odniesienie do tego postrzępionego tekstu, ale jeśli tak to zapoznałem się z tą funkcją, przerobiłem program, lecz nadal jest postrzępiony.
Kod:
 

#include <sourcemod>

Handle SpeedSync;

public Plugin myinfo = 
{
    name = "Simple HUD",
    author = "Bali2k",
    description = "Simple HUD",
    version = "1.0"
};

public void OnPluginStart()
{
    HookEvent("player_spawn", spawn);
    SpeedSync = CreateHudSynchronizer();
}

public Action spawn(Event event, char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(event.GetInt("userid"));

	CreateTimer(0.1, ShowHud, client, TIMER_REPEAT);
}

public Action ShowHud(Handle timer, int client)
{
	if(!IsClientInGame(client) || !IsPlayerAlive(client))
	return Plugin_Continue;

	float flvector[3];
	GetEntPropVector(client, Prop_Data, "m_vecVelocity", flvector);

	float speed = SquareRoot((Pow((flvector[0]), 2.0)) + (Pow((flvector[1]), 2.0)));

	SetHudTextParams(-1.0, 0.6, 1.0, 255, 255, 255, 255);
	ShowSyncHudText(client, SpeedSync, "Speed: %.1f", speed);
	
	return Plugin_Continue;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
public Action ShowHud(Handle timer, int client)
{
	// zatrzymaj timer, jezeli i tak robisz nowy przy spawnie...
	if(!IsClientInGame(client) || !IsPlayerAlive(client)) return Plugin_Stop;

	float flvector[3];
	GetEntPropVector(client, Prop_Data, "m_vecVelocity", flvector);

	float speed = SquareRoot(flvector[0]*flvector[0] + flvector[1]*flvector[1]);
	// lub
	/*
	flvector[2] = 0.0;
	float speed = GetVectorLength(flvector);
	*/
	ClearSyncHud(client, SpeedSync);
	SetHudTextParams(-1.0, 0.6, 1.0, 255, 255, 255, 255);
	ShowSyncHudText(client, SpeedSync, "Speed: %.1f", speed);
	
	return Plugin_Continue;
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jest lepiej niż było, aczkolwiek nadal tekst jest postrzępiony (tak wygląda na interwale 0.05:image.png.98bcb913c5b73ea9dd198223ffe3deb5.png, a tak na 1.0: image.png.e3263d73f699e76341ed4c2a5da5fd1e.png Jest jakiś sposób na to? Potrzebuje niskiego czasu odświeżania, aby prędkość była pokazywana od razu.

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Problem został rozwiązany

Jeżeli się z tym nie zgadzasz, raportuj ten post

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...