Skocz do zawartości
Nortal

Pracownicy i grupy

Rekomendowane odpowiedzi

Cześć, 

 

tworzę już powoli grupy dla firm, na razie wszystko dla testu więc nie przestraszcie się jak są zmienne nazwane czy cuś. :P

 

Chciałbym, aby gracz mógł dołączyć do kilku grup, a nie do jednej tak jak mi to wyszło... :c

A więc, 

 

Komendą, zatrudniam się do kilku grup i w odpowiedniej tabeli tworzą się komórki z odpowiednimi danymi:

CMD:zatrudnij(playerid, params[])
{
	new query[256];
	format(query, sizeof(query), "INSERT INTO `pracownicy` VALUES('%d', '%s', '%d', '%d', '%d', '%d')", PlayerData[playerid][pUID], PlayerData[playerid][nickname], 0, 0, 0, PlayerData[playerid][groupUID]);
	mysql_query(query);
	SendClientMessage(playerid, -1, "Zatrudniono.");
	return 1;
}
Następnie wymyśliłem, wczytanie tych danych przy wejściu czyli:

forward LoadPraco(playerid);
public LoadPraco(playerid)
{
	new query[256];
	format(query, sizeof(query), "SELECT zarobek, wydatek, score, teamid FROM `pracownicy` WHERE `puid` = '%d'", PlayerData[playerid][pUID]);
	mysql_query(query);
	
	mysql_store_result();
	while(mysql_fetch_row(query, "|"))
	{
	    sscanf(query, "p<|>dddd",
		praco[playerid][zarobek],
		praco[playerid][wydatek],
		praco[playerid][score],
		praco[playerid][teamid]);
	}
	mysql_free_result();
	return 1;
}
I takim sposobem, gdy jestem "zatrudniony" w dwóch grupach (w bazie danych też), przypisuje mi do tego "praco[playerid][temaid]" ostatni pobrany "teamid" z bazy danych. Czy da się jakoś, żeby do tego "praco[playerid][temaid]" przypisywało kilka id grup?

Jak coś niezrozumiałe, piszcie - spróbuje jakoś inaczej to rozpisać. :D

Z góry dzięki, za jakąkolwiek pomoc. ;)

Edytowane przez Nortal

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do aktualnej tablicy wielowymiarowej praco musisz dodać jeszcze jeden wymiar.

 

new slotid;
 
while(mysql_fetch_row(query, "|"))
{
    sscanf(query, "p<|>dddd", praco[playerid][slotid][zarobek], praco[playerid][slotid][wydatek], praco[playerid][slotid][score], praco[playerid][slotid][teamid]);
    slotid++;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do aktualnej tablicy wielowymiarowej praco musisz dodać jeszcze jeden wymiar.

Takim sposobem:

forward LoadPraco(playerid);
public LoadPraco(playerid)
{
	new query[256], slotid;
	format(query, sizeof(query), "SELECT zarobek, wydatek, score, teamid FROM `pracownicy` WHERE `puid` = '%d'", PlayerData[playerid][pUID]);
	mysql_query(query);
	
	mysql_store_result();
	while(mysql_fetch_row(query, "|"))
	{
	    sscanf(query, "p<|>dddd",
		praco[playerid][slotid][zarobek],
		praco[playerid][slotid][wydatek],
		praco[playerid][slotid][score],
		praco[playerid][slotid][teamid]);
		slotid++;
	}
	mysql_free_result();
	return 1;
}
Mam błędy:

C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4989 -- 4990) : warning 213: tag mismatch
C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4989 -- 4990) : error 001: expected token: ",", but found "["
C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4990) : error 029: invalid expression, assumed zero
C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4990) : warning 215: expression has no effect
C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4990) : error 001: expected token: ";", but found "]"
C:\Users\Konrad\Desktop\Truck\gamemodes\mapa.pwn(4990) : fatal error 107: too many error messages on one line

Compilation aborted.Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam dodane w enum'ie już:

enum ePracownik
{
	pUID,
	pname[24],
	zarobek,
	wydatek,
	score,
	teamid[10],
}
new praco[MAX_PRACOWNIK][ePracownik];
I te same błędy co wyżej podałem. Edytowane przez Nortal

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No dobra, dałem tak:

#define MAX_PRAC 10
new praco[MAX_PLAYERS][MAX_PRAC][ePracownik];
Jak teraz to używać w dalszym kodzie? Bo jak dam przykładowo:

format(string, sizeof(string), "%d", praco[playerid][MAX_PRAC][teamid]);
Wyskakuje error:

: error 032: array index out of bounds (variable "praco")
Więc jak później używać tego? (przy formatowaniu czy tam różnych warunkach)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No dobra, górę już ogarnąłem. Teraz dla testu jeszcze, stworzyłem komendę którą dodaje sobie score do bazy danych. Lecz to zamiast przypisać mi, przypisuje innemu graczowi z tej samej grupy.

 

Kod:

stock IsPlayerInUidGroup(playerid, groupuid)
{
	for(new groupid; groupid != MAX_PRAC; groupid++)
	{
		if(praco[playerid][groupid][teamid] == groupuid)
			return groupid;
	}
	return false;
}

CMD:g(playerid, params[])
{
 	new string1[64], string2[64];
	new grupa = IsPlayerInUidGroup(playerid, praco[playerid][grupa][teamid]);
	if(sscanf(params, "ds[64]S()[64]", grupa, string1, string2))
	    return SendClientMessage(playerid, -1, "Błąd");
	    
	if(!strcmp(string1, "score", true))
	{
	    if(!praco[playerid][grupa][teamid]) return 1;
	    
	    new query[128];
	    format(query, sizeof(query), "UPDATE `pracownicy` SET score = '%d' WHERE teamid = '%d' LIMIT 1", 10, praco[playerid][grupa][teamid]);
	    mysql_query(query);
	    return 1;
	}
        return 1;
}
I taki kod przypisuje 10 score pierwszemu graczowi z bazy danych w danej grupie (nie temu co trzeba). Więc co musiałbym dodać, gdy gracz zaloguje się do danej grupy i jak się wyloguje to wysyła dane do bazy do odpowiedniego gracza i odpowiedniego teamu?

Jakaś nowa kolumna w bazie danych? Jakaś zmienna/tablica czy cuś? Nie wiem jak to rozwiązać.

http://pastebin.com/3FjB0CHQ- kod o grupach

Z góry dzięki za odpowiedź. ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

stock IsPlayerInUidGroup(playerid, groupuid)
{
	for(new groupid; groupid != MAX_PRAC; groupid++)
	{
		if(praco[playerid][groupid][teamid] == groupuid)
			return groupid;
	}
	return false;
}

groupid i teamid to to samo????

Dobrą wartość zwraca Ci ta funkcja? I raczej ten 2 argument to jest bez potrzeby...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W drugim argumencie tej funkcji wstawiam, praco[playerid][grupa][teamid] i jest potrzebne. Funkcja "przekształca" załadowane "teamid" z bazy danych na groupid (w kolejności od 1/wyżej).

Przykładowo gracz jest w teamid 3 i 5. Więc żeby się nie logować /g 3 duty czy też /g 5 duty, funkcja "przekształca" te teamid na groupid "od nowa" czyli taki gracz będzie się logował /g 1 duty (teamid == 3) czy też /g 2 duty (teamid == 5). Jakoś tak. :D I tak, dobrą wartość mi zwraca.

groupid i teamid to to samo????

Prawie. :D

Nadal nie wiem jak rozwiązać problem podany w poście #9.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie podałeś identyfikatora gracza, któremu ma zapisać dane.

format(query, sizeof(query), "UPDATE `pracownicy` SET score = '%d' WHERE puid = '%d' LIMIT 1", 10, PlayerData[playerid][pUID]);
mysql_query(query);
Czy po "WHERE" da się podać 2 "miejsca"(?) gdzie ma to zapisać? Przykładowo UID gracza i UID grupy?

Ok, ogarnąłem. Jednak się da. Na razie brak pytań. :D

Edytowane przez Nortal

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W jaki sposób mogę naliczać czas duty? Czyli po wejściu na służbę, czas idzie od 00:00 w górę. Kolejny timer?

Oraz, gdybym chciał zapisać duty do bazy mysql, to jaki to musi być typ komórki? int? varchar? Czy może coś innego?

Z góry dzięki. ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Najprostszy sposób to pobranie czasu UNIX do tablicy gracza i odejmowanie

 

//start
pTime[playerid] = gettime();
 
//koniec
new fullTime = gettime() - pTime[playerid];

 

Liczy czas nawet mając AFK, jeśli ma omijać AFK musisz zrobić to przy użyciu timera. Czas jest liczony w cyfrach, więc jak sobie wyobrażasz do tego varchar?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok, a to mi liczy w sekundach.

Zrobiłem testowe komendy:

CMD:start(playerid, params[])
{
    new grupa = IsPlayerInUidGroup(playerid, PlayerGroup[playerid][grupa][teamid]);
	PlayerGroup[playerid][grupa][duty] = gettime();
	SendClientMessage(playerid, -1, "Start");
	return 1;
}

CMD:koniec(playerid, params[])
{
	new string[128];
    new grupa = IsPlayerInUidGroup(playerid, PlayerGroup[playerid][grupa][teamid]);
    new fulltime = gettime() - PlayerGroup[playerid][grupa][duty];
   	format(string, sizeof(string), "Czas na służbie: %d", fulltime);
   	SendClientMessage(playerid, -1, string);
    return 1;
}
I teraz muszę dawać ify? Gdy fulltime jest większe od 60 i wtedy by dzieliło przez 60 itd itd.

Czy może jakoś inaczej?

Ok, ogarnąłem.

Edytowane przez Nortal

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×