Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

R3X - zdjęcie

R3X

Rejestracja: 11.12.2008
Aktualnie: Nieaktywny
Poza forum Ostatnio: 28.01.2017 17:30
*****

#405551 Pobranie ID gracza, który jest w naszym zasięgu wzroku

Napisane przez R3X w 03.05.2012 10:21

Tu jest lib i jego .inc, zaraz dorzucę przykładowy plugin pokazujący jak to wykorzystać

Edit.
uaktualizowałem załączniki


targetController linia 114

if(B < 0 || A > 25.0) continue;
B pilnuje, żeby nie celować do tyłu, a A to zakres tolerancji (odległość celu od celownika)

A powinno być podawane w natywie, ale nie miałem nigdy tego publikować to nie budowałem porządnego API ;P


public filterPlayers(id, ent)
{
	return is_user_alive(ent);
}

Funkcja filtrująca ma zwracać wartość różną od zera jeśli byt `ent` może być celem akcji. W tym przypadku każdy żywy gracz. Można dodać warunek drużyn i będzie można celować tylko we wrogów.

Załączone pliki


  • +
  • -
  • 4


#405433 Pobranie ID gracza, który jest w naszym zasięgu wzroku

Napisane przez R3X w 02.05.2012 22:00

Używałem kąta i odległości do regulowanego viewcone`a , coś jak to

Jeśli chodzi Ci o coś podobnego to mogę podesłać tego liba.
  • +
  • -
  • 2


#405430 [ROZWIĄZANE] Tworzenie angles

Napisane przez R3X w 02.05.2012 21:56

wektor od gracza X do gracza Y to jest

vec = originY -originX;

taki wektor możesz zamienić na kąt vector_to_angle to załatwi sprawę, otrzymasz kąt pod jakim musi patrzeć gracz X żeby celować w gracza Y

wynikowe kąty możesz ustawić jako pev_v_angle, ale jak sam chcesz skipnac [0] to skopiuj w to pole aktualny
  • +
  • -
  • 1


#391297 [ROZWIĄZANE] This jako tablica

Napisane przez R3X w 04.04.2012 18:37

w javascripcie dostęp do pól obiektu jest możliwy operatorem . lub []

wyrażenia
this.pole1 
this['pole1']
są równoważne


this[ 1 ]
oznacza dostęp do pola obiektu o identyfikatorze 1, w tym przypadku this.1 nie działa ze względu na składnie, więc jedyne wyjście to []
  • +
  • -
  • 1


#390448 Model Placer

Napisane przez R3X w 03.04.2012 07:40

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>

#define PLUGIN "Guzik"
#define VERSION "1.0"
#define AUTHOR "R3X"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_Use, "func_button", "fwButtonUsed", 1);
}

public fwButtonUsed(ent, idcaller, id, usetype, Float:value)
{
	if(pev_valid(ent) && is_user_alive(id))
	{
		new Float:fHP;
		pev(ent, pev_health, fHP);
		
		if(floatabs(fHP-777.0) < 0.0001)
		{
			fwMyEntityUsed(id);
		}
	}
}

fwMyEntityUsed(id)
{
	client_print(id, print_chat, "Uzyles guzika z modelplacera");
}

I ustaw w configach health na 777.0
  • +
  • -
  • 1


#377062 Automatyczna kompilacja .sma z załącznika

Napisane przez R3X w 08.03.2012 08:11

a co jeśli plugin nie kompiluje się z powodu braku plików .inl, a nie .inc? podzielone pluginy sprawiają kłopot w tym przypadku
  • +
  • -
  • 6


#369040 Call of Duty MW Mod MySQL

Napisane przez R3X w 22.02.2012 18:18

Dość tego :)

Napisałem w pierwszym poście, że wersja do testów.

Podobno publikuje się działające wersje

Powiedz to Microsoftowi i jego pierwszym Windowsom czy IE i pomyśl, że oni zrobili na tym fortunę. Ja spróbowałem zrobić coś inaczej niż jest to dotychczas i w moich warunkach testowych działało. Straciłem przy pracy nad tym całkiem dużo czasu. Od pewnego czasu słyszę tylko jęki, że nie działa, że chcecie naprawione.

Straciłem zainteresowanie tym projektem i nigdy nie wyszła wersja finalna. See ya
  • +
  • -
  • 6


#368140 [ROZWIĄZANE] ID w MySQL

Napisane przez R3X w 20.02.2012 21:13

0 może być nawet dla intów, a do 0.1 potrzebujesz pola float i prawdopodobnie nie będziesz mógł ustawić jako auto_increment, chociaż możesz spróbować
  • +
  • -
  • 1


#353816 Tworzenie stref

Napisane przez R3X w 25.01.2012 21:30

Wszyscy tak mieli, głupi bug w kodzie (repo) :P dziwne, że dopiero teraz wyszedł. Poprawione.

Strefy trzeba niestety zresizować ręcznie.
  • +
  • -
  • 1


#352677 Server Queries

Napisane przez R3X w 22.01.2012 15:50

Aktualizowałem je. Teraz są już wszystkie polecenia :)
  • +
  • -
  • 1


#352664 Server Queries

Napisane przez R3X w 22.01.2012 15:11

To nie takie proste, ale dobrze kombinujesz. Jeszcze switch i Parse
  • +
  • -
  • 1


#352662 Server Queries

Napisane przez R3X w 22.01.2012 15:07

To jest właśnie to brakujące zapytanie, za które się zabieram dopiero.
  • +
  • -
  • 1


#352659 Server Queries

Napisane przez R3X w 22.01.2012 15:03

Tak, każdy callback ma parametr `success`, jeśli jest równy false to serwer jest offline
  • +
  • -
  • 1


#352654 Server Queries

Napisane przez R3X w 22.01.2012 14:56

Server Queries

Biblioteka do pobierania danych o serwerze: Server queries - Valve Developer Community


Dostępne zapytania:

Pingowanie. Sprawdzamy czy serwer jest online.
stock ServerPing(const szServer[], const szCallback[]);

new const SERVER_ADDRESS[] = "192.168.0.14:27015";

public ping()
{
	ServerPing(SERVER_ADDRESS, "cbPing");
	return PLUGIN_HANDLED;
}

public cbPing(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(success)
	{
		client_print(0, print_chat, "Server %s is Online latency = %d", szServer, latency);
	}
	else
	{
		client_print(0, print_chat, "Server %s is Offline", szServer);
	}
}



Info. Nazwa serwera, nazwa mapy, obecna ilość graczy, max ilość graczy, nazwa gry.
stock ServerInfo(const szServer[], const szCallback[]);

new const SERVER_ADDRESS[] = "192.168.0.14:27015";

public info()
{	
	ServerInfo(SERVER_ADDRESS, "cbInfo");
	return PLUGIN_HANDLED;
}

public cbInfo(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{		
	if(!success)
		return;
			
	new szName[64], szMap[64], szDirectory[64], szDescription[64];
	new iPlayers = 0;
	new iMaxPlayers = 0;
	
	ServerResponseParseInfo(Response, szName, 63, szMap, 63, szDirectory, 63, szDescription, 63, iPlayers, iMaxPlayers);
	
	client_print(0, print_chat, "Nazwa: %s", szName);
	client_print(0, print_chat, "Map: %s", szMap);
	client_print(0, print_chat, "Folder: %s", szDirectory);
	client_print(0, print_chat, "Opis: %s", szDescription);
	client_print(0, print_chat, "Gracze: %d / %d", iPlayers, iMaxPlayers);
}



Rules. Zestawienie wszystkich możliwych do odczytania cvarów serwera.
! Odpowiedź może przyjść w kilku częściach, tzn na jedną komendę można dostać kilka callbacków.

stock ServerRules(const szServer[], const szCallback[]);

new const SERVER_ADDRESS[] = "192.168.0.14:27015";

public rules()
{	
	if(ServerGetChallenge(SERVER_ADDRESS))
	{	
		ServerRules(SERVER_ADDRESS, "cbRules");
	}
	else
	{
		ServerChallenge(SERVER_ADDRESS, "cbChallengeRules");
	}
	return PLUGIN_HANDLED;
}

public cbChallengeRules(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(!success)
		return;
		
	//Get and cche challenge	
	new challenge_value = ServerResponseParseChallenge(Response);
	ServerSetChallenge(szServer, challenge_value);
	
	//Now can get Rules
	ServerRules(SERVER_ADDRESS, "cbRules");
}

public cbRules(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(!success)
		return;
	
	new szValue[32];
	if(ServerResponseParseRules(Response, len, "sv_alltalk", szValue, 31))
	{
		client_print(0, print_chat, "Rule: sv_alltalk ^"%s^"", szValue);
	}
}



Player. Lista graczy na serwerze.
stock ServerPlayer(const szServer[], const szCallback[]);

new const SERVER_ADDRESS[] = "192.168.0.14:27015";

public player()
{	
	if(ServerGetChallenge(SERVER_ADDRESS))
	{	
		ServerPlayer(SERVER_ADDRESS, "cbPlayer");
	}
	else
	{
		ServerChallenge(SERVER_ADDRESS, "cbChallengePlayer");
	}
	return PLUGIN_HANDLED;
}

public cbChallengePlayer(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(!success)
		return;
		
	//Get and cache challenge	
	new challenge_value = ServerResponseParseChallenge(Response);
	ServerSetChallenge(szServer, challenge_value);
	
	//Now can get Player
	ServerPlayer(SERVER_ADDRESS, "cbPlayer");
}


public cbPlayer(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(!success)
		return;
		
	new iPlayers = ServerResponseParsePlayerNum(Response);
	
	client_print(0, print_chat, "Players: %d", iPlayers);
	
	new szNick[32], id, kills, Float:uptime;
	for(new i=0;i<iPlayers; i++)
	{
		if(ServerResponseParsePlayer(Response, i, id, szNick, 31, kills, uptime))
		{
			client_print(0, print_chat, "%d %s |  kills:%d, uptime = %f", id, szNick, kills, uptime);
		}
	}
	
	ServerResponseSave("Player", Response, len);
}



Challenge. Kod bezpieczeństwa wymagany dla Player i Rules
stock ServerChallenge(const szServer[], const szCallback[]);

new const SERVER_ADDRESS[] = "192.168.0.14:27015";

public challenge()
{	
	ServerChallenge(SERVER_ADDRESS, "cbChallenge");
	return PLUGIN_HANDLED;
}

public cbChallenge(const szServer[], _A2A_TYPE, const Response[], len, success, latency)
{
	if(!success)
		return;
		
	new challenge_value = ServerResponseParseChallenge(Response);
	client_print(0, print_chat, "Challenge: %X", challenge_value);
}

Załączone pliki


  • +
  • -
  • 14


#348638 [ROZWIĄZANE] Poprawność MoreHP

Napisane przez R3X w 13.01.2012 06:44

Teraz śmiga

W buyHP potrzebujesz klamer {}, bo aktualnie to wygląda tak:
public buyhp(id)
{
	if(get_user_flags(id) & ADMIN_LEVEL_H)
	{
		if(!is_user_alive(id))
		{
			client_print(id,print_chat,"[MoreHP] Jestes martwy. Nie mozesz skorzystac z uslugi")
		}
	}
	set_user_health(id,2000)
	cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(cena_hp))
	
	return PLUGIN_HANDLED
}
a pewnie chciałbyś, żeby warunek pilnował otrzymania HP; trzeba też przerwać wywołanie funkcji return`em jak gracz jest martwy
public buyhp(id)
{
	if(get_user_flags(id) & ADMIN_LEVEL_H)
	{
		if(!is_user_alive(id))
		{
			client_print(id,print_chat,"[MoreHP] Jestes martwy. Nie mozesz skorzystac z uslugi");
			return PLUGIN_HANDLED
		}
		set_user_health(id,2000)
		cs_set_user_money(id,cs_get_user_money(id)-get_pcvar_num(cena_hp))
	}
	return PLUGIN_HANDLED
}

Dość kiepsko, że nie uwzględniłeś przypadku, że gracz nie ma wystarczająco dużo kasy. Można doładowywać HP bez przerwy,nawet z zerem na koncie.



Funkcja respawnu powinna być jedna i łączyć funkcjonalność obu aktualnych.
RegisterHam(Ham_Spawn, "player", "respawn", 1)
RegisterHam(Ham_Spawn, "player", "respawn2", 1) //<- Do śmieci
public respawn(id)
{
	if(!is_user_alive(id))
			return HAM_IGNORED;
	strip_user_weapons(id)
	give_item ( id, "weapon_m4a1" )
	
	cs_set_user_money ( id, 1, 1 )
	
	if(get_user_flags(id) & ADMIN_LEVEL_H)
	{	
		set_user_health (id, 12000)
		
		set_hudmessage ( 200, 100, 0, 0.2, 0.35, 2, 1.0, 10.0, 0.1, 0.2, 4 )
		show_hudmessage(id, "Korzystasz z konta V.I.P")
	}else
	{
		set_user_health (id, 10000)
		
	}
	ColorChat(id, GREEN, "[MoreHP] Dostałeś M4A1 i nieskończoność amunicji")
	return HAM_IGNORED;
}
W innym przypadku gracz VIP otrzyma 2 komunikaty.
  • +
  • -
  • 1