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
 

Mister Silenzo - zdjęcie

Mister Silenzo

Rejestracja: 12.09.2013
Aktualnie: Nieaktywny
Poza forum Ostatnio: 12.02.2021 05:00
*****

Moje posty

W temacie: [MySQL] Odczytywanie wartości z tabel.

06.03.2014 19:47

Zamieniłem. Sam zapis działa teraz prawidłowo, tylko nadal nie wiem jak mam odczytywać to co już, np. stworzyłem za pomocą edytora graficznego bazy danych.

W temacie: [MySQL] Odczytywanie wartości z tabel.

06.03.2014 14:36

Dobra, przeczytałem to jeszcze raz i dokładnie, teraz moje kolejne pytanie.

Odczytać wartość z tabeli i danego wiersza mogę zrobić tylko po wywołaniu komendy SQL (w przypadku mojej bazy) "SELECT 'nick', 'punkty' FROM 'konta' WHERE 'nick'='%s';" i teraz żeby odczytać ilość punktów z tablicy muszę zrobić to w publicu, który jest wywoływany przez SQL_ThreadQuery?

@EDIT

Skleciłem coś takiego:

#include <amxmodx>
#include <sqlx>

new const HOST[] = "127.0.0.1";
new const USER[] = "root";
new const PASSWORD[] = "";
new const DB[] = "cstrike_db";

new Handle:mysql;

public plugin_init() {
	register_plugin("TEST", "AUTORSKA", "MISTER SILENZO");
	
	mysql = SQL_MakeDbTuple(HOST, USER, PASSWORD, DB);
	
	new errcode, error[64];
	SQL_Connect(mysql, errcode, error, sizeof(error));
	
	if(errcode == 0) server_print("Polaczenie z baza nawiazane! Baza danych: %s!", DB);
	else {
		new string[128];
		formatex(string, sizeof(string), "Wystapil blad! Kod bledu %i o tresci %s!", errcode, error);
		server_print(string);
		set_fail_state(string);
	}
	
	register_concmd("amx_save", "save_user");
}

public save_user(id) {
	new cQuery[256], name[32], punkty;
	get_user_name(id, name, 31);
	punkty = 50;
	formatex(cQuery, sizeof(cQuery), "INSERT INTO `konta` (`nick`, `punkty`) VALUES ('%s', %i);", name, punkty);
	
	SQL_ThreadQuery(mysql, "SaveH_", cQuery);
}

public SaveH_(FailState, Handle:Query, Errorcode, Error[], Data[], DataSize)
{
	if(Errorcode) log_amx("Blad w zapytaniu: %s [SaveData] %i", Error, Errorcode);
	
	if(FailState == TQUERY_CONNECT_FAILED)
	{
		log_amx("Nie mozna podlaczyc sie do bazy danych.");
		return PLUGIN_CONTINUE;
	}
	else if(FailState == TQUERY_QUERY_FAILED)
	{
		log_amx("Zapytanie anulowane [SaveData]");
		return PLUGIN_CONTINUE
	}
	log_amx("Zapis Udany! [SaveData]");
	return PLUGIN_CONTINUE
}
Jest jednak jeden problem, w logach wyskakuje takie coś:

L 03/06/2014 - 14:56:05: [amx_ip.amxx] Blad w zapytaniu: 127.0.0.1 [SaveData] 1440
L 03/06/2014 - 14:56:05: [amx_ip.amxx] Zapis Udany! [SaveData]
I pomimo tego zapis się udaje, czy ktoś może mi wytłumaczyć czym jest spowodowany ten bug?

W temacie: [ROZWIĄZANE] Sprawdzenie poprawności pluginu, szybko :P

04.03.2014 21:59

#include <amxmodx>
#include <fun>
#include <colorchat>

public plugin_init() {
	register_plugin("2 Fragi", "Autorska", "Mister Silenzo");
	register_event("DeathMsg", "EventDeath", "a"); // Wydarzenie odpowiedzialne za wyłapywanie zabójstw
}

public EventDeath() {
	new kid = read_data(1); // Numer ID osoby, która zabiła 
	new vid = read_data(2); // Numer ID osoby, która ZOSTAŁA zabita
	new hs = read_data(3); // Zwraca 1 jeżeli zabójstwo było przez headshot, lub 0 gdy było strzałem/kosą w ciało
	// read_data() służy do odczytywania parametrów wydarzenia, jeżeli użyłem złego słowa do opisania tej funkcji i jej funkcji to proszę o poprawienie mnie xd
	
	if(kid == vid || kid == 0) return; // Jeżeli OFIARĄ jest ZABÓJCA (czyt. samobójstwo) lub ZABÓJCA jest zerem (KID jest równe 0 gdy spada się z wysokości, lub admin używa SLAY ;-;)
	
	new name[2][32]; // Tablica dwuwymiarowa o dwóch polach z indeksami od 0 do 31 (Jeżeli źle wytłumaczyłem to proszę o poprawienie mnie ;/)
	if(get_user_weapon(kid) == CSW_KNIFE) { // Jeżeli bronią ZABÓJCY jest NÓŻ
		get_user_name(kid, name[0], 31); // Pobierz nick ZABÓJCY do pierwszego pola tablicy.
		get_user_name(vid, name[1], 31); // Pobierz nick OFIARY do drugiego pola tablicy.
		ColorChat(kid, RED, "^1Zdobywasz dodatkowego fraga za zabicie ^4%s^1 z ^4NOZA^1!", name[1]); // Wyświetl ZABÓJCY informację o dodaniu fraga
		for(new i = 0; i < get_maxplayers(); i++) { /* Tutaj spotykamy się ze słowem kluczowym "for", które definiuje pętlę. 
								W pętli tworzymy nową zmienną "new i" i przypisujemy jej wartość zero "new i = 0;". 
								Warunek obrotu pętli, czyli "i < get_maxplayers();", co ma się stać po obrocie pętli, czyli "i++".*/
				if(!is_user_connected(i) || is_user_bot(i) || is_user_hltv(i) || i == kid) continue; /* I jest numerem ID gracza w tej pętli, 
														więc jeżeli gracz z pętli jest zabójcą, jest niepołączony, jest botem lub hltv to go pomijamy :P
														Pomijamy zabójcę w pętli, ponieważ dla niego wiadomość została wyświetlona wcześniej, więc nie ma potrzeby pokazywać mu
														po raz kolejny tego samego, prawda? :P*/
				ColorChat(i, RED, "^4%s ^1zdobywa dodatkowego fraga za zabicie ^4%s ^1NOZEM!", name[0], name[1]);
		}
		set_user_frags(kid, get_user_frags(kid) + 1); // Dodajemy do obecnej ilości fragów ZABÓJCY jednego fraga.
		return; // Przerywa dalsze działanie kodu, gdyż gdyby zabójstwo nożem odbyło by się poprzez HS gracz dostał by dwa dodatkowe fragi zamiast jednego.
	}
	// Tutaj robimy to samo co powyżej z tą różnicą, że funkcja nie rozpoczyna się od sprawdzenia czy gracz ma nóż, lecz czy zabójstwo odbyło się poprzez HS.	
	if(hs == 1) {
		get_user_name(kid, name[0], 31);
		get_user_name(vid, name[1], 31);
		ColorChat(kid, RED, "^1Zdobywasz dodatkowego fraga za zabicie ^4%s HEADSHOTEM^1!", name[1]);
		for(new i = 0; i < get_maxplayers(); i++) {
				if(!is_user_connected(i) || is_user_bot(i) || is_user_hltv(i) || i == kid) continue;
				ColorChat(i, RED, "^4%s ^1zdobywa dodatkowego fraga za zabicie ^4%s ^1HEADSHOTEM!", name[0], name[1]);
		}
		set_user_frags(kid, get_user_frags(kid) + 1);
		return;
	}
	/*
	Mam nadzieję, że nauczyłeś się czegokolwiek XD Jeżeli czegoś nie wiesz to zapraszam na PW, bądź pisz w temacie, chętnie "pouczę" podstaw, gdyż jak na razie sam znam tylko podstawy :P
	*/
}
Proszę, oto kompletny kod z komentarzami, miłej lektury (o ile chcesz się czegoś nauczyć xD Jeżeli nie to wrzuć w kompilator i tyle :P).

W temacie: [ROZWIĄZANE] Sprawdzenie poprawności pluginu, szybko :P

04.03.2014 21:13

Nie musiałeś używać Hamsandwitcha :D Wystarczy zwykły DeathMsg, pewnie nie rozumiesz o co chodzi, więc tutaj masz "wydarzenia" w czasie rozgrywki http://amxx.pl/topic/1680-eventy/. DeathMsg jest eventem odpowiedzialnym za śmierć gracza, event przekazuje identyfikator zabijającego i zabitego oraz info o zabójstwie, a mianowicie czy odbyło się przez HS czy nie. Moje pytanie, z jakich broni ma dodawać ten jeden kill?

W temacie: temat: problem z frakcjami by cypis

04.03.2014 16:13

Zmieniałeś cokolwiek w silniku? Jeżeli nie to mogę ci poprawnie zmodyfikować czysty silnik i go podesłać.