Skocz do zawartości
Minokon

Tworzenie systemu biznesów

Rekomendowane odpowiedzi

Witam

Chciałbym przedstawić wam polską wersję poradnika którego można znaleźć na forum sa-mp (link).

Oczywiście nie jest to samo, gdyż troszkę to zmodyfikowałem.

Na początek definujemy dwie podstawowe rzeczy:

#define MAX_BUSINESSES 50 //Tutaj podajemy maksymalną ilość biznesów, najlepiej żeby była jak najmniejsza.
#define PayoutTimer 60 //Liczba sekund, co ile gracz będzie dostawał wypłatę.
Następnie tworzymy enumerator i zmienną przechowującą dane biznesu:
enum BusInfo
{
  Float:BusX, //Pozycja X
  Float:BusY, //Pozycja Y
  Float:BusZ, //Pozycja Z
  BusCost, //Koszt kupna
  BusSell, //Zarobek ze sprzedaży
  BusEarn, //Wypłata
  BusOwner, //ID właściciela biznesu
  BusName[60], //Nazwa biznesu
  bool:Disabled //Czy biznes jest zablokowany czy nie
};

new BusinessInfo[MAX_BUSINESSES][BusInfo]; //Zmienna przechowująca dane biznesów
Potem jeszcze zmienna która będzie przechowywać ID pickupa biznesu, i zmienna zawierająca ilość stworzonych biznesów:
new BusinessPickup[MAX_BUSINESSES]; //Zmienna która będzie przechowywała ID pickupów
new BusinessCount = -1; //Liczba biznesów, będziemy jej używać do określania ID biznesów
Następnie definiujemy callback, który będzie dawał graczom pieniądze przez określony przez nas czas:
forward Payouttimer(); //definiujemy callback
Potem w callbacku OnGameModeInit dodajemy timer:
public OnGameModeInit()
{
	SetTimer("Payouttimer", PayoutTimer*1000, true); //Ustawiamy timer
	return 1;
}
Następnie (gdzieś na dole skryptu) tworzymy funkcję dodającą nowe biznesy:
CreateBusiness(BusinessName[], Float:XPos, Float:YPos, Float:ZPos, Price, Sell, Earn)
{
	if(!strlen(BusinessName)) return 0; //Jeśli brakuje nazwy biznesu, nie tworzy go
	BusinessCount ++; //Dodaje 1 do liczby biznesów (pierwszy biznes będzie miał ID 0)
 	BusinessInfo[BusinessCount][BusX] = XPos; //Ustawia pozycję X
  	BusinessInfo[BusinessCount][BusY] = YPos; //Ustawia pozycję Y
  	BusinessInfo[BusinessCount][BusZ] = ZPos; //Ustawia pozycję Z
  	BusinessInfo[BusinessCount][BusCost] = Price; //Ustawia cenę biznesu
  	BusinessInfo[BusinessCount][BusSell] = Sell; //Ustawia cenę sprzedaży biznesu
  	BusinessInfo[BusinessCount][BusEarn] = Earn; //Ustawia zarobek z biznesu
  	BusinessInfo[BusinessCount][BusOwner] = -1; //Ustawia właściciela biznesu (-1 czyli nikt)
  	BusinessPickup[BusinessCount] = CreatePickup(1272, 19, XPos, YPos, ZPos, -1); //Dodaje pickup biznesu
  	format(BusinessInfo[BusinessCount][BusName], 60, "%s", BusinessName); //Ustawia nazwę biznesu
  	return BusinessCount; //Zwraca ID biznesu
}
A także tworzymy callback które będzie dawał graczom pieniądze:
public Payouttimer()
{
	for(new i; i<GetMaxPlayers(); i++) //Pętla dla wszystkich graczy
  	{
    	if(GetPVarInt(i, "Businessearnings") != 0) //Sprawdza zarobki
    	{
      		new str[100]; //Tworzy ciąg znaków
      		format(str, sizeof str, "Zarobiłeś %d ze wszystkich swoich posiadłości!", GetPVarInt(i, "Businessearnings")); //Formatujemy ciąg znaków
      		SendClientMessage(i, 0x00FF00AA, str); //Wysyłamy ciąg znaków do gracza
      		GivePlayerMoney(i, GetPVarInt(i, "Businessearnings")); //Daje graczowi gotowkę
    	}
  	}
  	return 1;
}
Następnie tworzymy funkcję sprawdzającą czy gracz jest w okolicy któregoś z biznesów:
stock IsPlayerCloseEnoughToBis(playerid)
{
	for(new C; C < BusinessCount + 1; C++) //Pętla dla wszystkich stworzonych biznesów
  	{
    	if(IsPlayerInRangeOfPoint(playerid, 3, BusinessInfo[C][BusX], BusinessInfo[C][BusY], BusinessInfo[C][BusZ])) return C; //Sprawdza najbliższy biznes i zwraca jego ID
  	}
  	return -1;
}
Potem w callbacku OnPlayerCommendText tworzymy dwie komendy, /buy i /sell:
if(!strcmp(cmdtext, "/buy", true, 4))
	{
	    new buss = IsPlayerCloseEnoughToBis(playerid); //Zmiena buss będzie zawierała ID biznesu który jest najbliżej gracza
 		if(buss == -1) return SendClientMessage(playerid, 0xAA3333AA, "Nie jesteś przy żadnym biznesie!"); //Sprawdza czy gracz jest blisko jakiegoś biznesu
 		else if(BusinessInfo[buss][Disabled] == true) SendClientMessage(playerid, 0xAA3333AA, "Biznes jest zablokowany!"); //Sprawdza czy biznes nie jest zablokowany
  		else if(GetPlayerMoney(playerid) < BusinessInfo[buss][BusCost]) SendClientMessage(playerid, 0xAA3333AA, "Niestety nie stać Cię na ten biznes."); //Sprawdza czy gracz ma odpowiednią ilość gotówki
  		else if(BusinessInfo[buss][BusOwner] != -1) SendClientMessage(playerid, 0xAA3333AA, "Biznes jest już zakupiony."); //Sprawdza czy biznes nie jest przez kogoś kupiony
		else
		{
	  		BusinessInfo[buss][BusOwner] = playerid; //Ustawia właściciela biznesu
  			SetPVarInt(playerid, "Businessearnings" , GetPVarInt(playerid, "Businessearnings") + BusinessInfo[buss][BusEarn]); //Zwiększa graczowi zarobki
  			new str[100]; //Tworzy ciąg znaków
  			format(str, sizeof str, "Kupiłeś biznes %s za $%d. Do twoich zarobków zostanie dodane $%d", BusinessInfo[buss][BusName], BusinessInfo[buss][BusCost], BusinessInfo[buss][BusEarn]); //Formatujemy ciąg znaków
  			SendClientMessage(playerid, 0x00FF00AA, str); //Wysyła ciąg znaków
  			GivePlayerMoney(playerid, -BusinessInfo[buss][BusCost]); //Bierze pieniądze od gracza
		}
		return 1;
	}
A teraz /sell:
if(!strcmp(cmdtext, "/sell", true, 5))
	{
	    new buss = IsPlayerCloseEnoughToBis(playerid); //Zmiena buss będzie zawierała ID biznesu który jest najbliżej gracza
  		if(buss == -1) return SendClientMessage(playerid, 0xAA3333AA, "Nie jesteś blisko żadnego biznesu!"); //Sprawdza czy gracz jest blisko jakiegoś biznesu
  		else if(BusinessInfo[buss][BusOwner] != playerid) return SendClientMessage(playerid, 0xAA3333AA, "Nie jesteś właścicielem tego biznesu!"); //Sprawdza czy gracz jest właścicielem biznesu
		else
		{
  			BusinessInfo[buss][BusOwner] = -1; //Usuwa właściciela
  			SetPVarInt(playerid, "Businessearnings", GetPVarInt(playerid, "Businessearnings") - BusinessInfo[buss][BusEarn]); //Zmniejsza zarobki gracza
  			new str[100];//Tworzy ciąg znaków
  			format(str, sizeof str, "Sprzedałeś biznes %s za $%d", BusinessInfo[buss][BusName], BusinessInfo[buss][BusCost]); //Formatujemy ciąg znaków
  			SendClientMessage(playerid, 0x00FF00AA, str); //Wysyła ciąg znaków
  			GivePlayerMoney(playerid, BusinessInfo[buss][BusSell]); //Daje graczowi gotówkę za sprzedaż biznesu
		}
  		return 1;
	}
Następnie w callbacku OnPlayerPickUpPickup dodajemy info dla gracza na temat biznesu:
public OnPlayerPickUpPickup(playerid,pickupid)
{
	for(new C = 0; C <= BusinessCount; C++) //Pętla dla wszystkich stworzonych biznesów
  	{
    	if(pickupid == BusinessPickup[C]) //Sprawdza czy pickup jest od któregoś z biznesów
    	{
      		new str[150]; //Tworzy ciąg znaków
      		if(BusinessInfo[C][BusOwner] == -1) format(str, sizeof(str), "%s ~n~~r~Cena kupna: $%d ~n~~b~Cena sprzedazy: $%d ~n~ ~g~Zarobki: $%d", BusinessInfo[C][BusName], BusinessInfo[C][BusCost], BusinessInfo[C][BusSell], BusinessInfo[C][BusEarn]); //Ustawia informacje o biznesie
      	    else
      		{
        		new PlayerName[MAX_PLAYER_NAME]; //Tworzy ciąg znaków który będzie zawierał nick właściciela biznesu
        		GetPlayerName(BusinessInfo[C][BusOwner], PlayerName, MAX_PLAYER_NAME); //Pobiera nick właściciela i zapisuje do zmiennej
        		format(str, sizeof str, "%s ~n~~r~Cena kupna: $%d ~n~~b~Cena sprzedazy: $%d ~n~ ~g~Zarobki: $%d~n~~w~Wlasciciel: %s(%d)", BusinessInfo[C][BusName], BusinessInfo[C][BusCost], BusinessInfo[C][BusSell], BusinessInfo[C][BusEarn], PlayerName, BusinessInfo[C][BusOwner]);
      		}
      		GameTextForPlayer(playerid, str, 3000, 3);
		return 1;
   		}
	}
  	return 1;
}
Potem w callbacku OnPlayerDisconnect musimy ustawić wszystkie biznesy gracza opuszczającego grę na brak właściciela:
public OnPlayerDisconnect(playerid, reason)
{
	for(new C; C < BusinessCount + 1; C++) //Pętla dla wszystkich stworzonych biznesów
  	{
    	if(BusinessInfo[C][BusOwner] == playerid) BusinessInfo[C][BusOwner] = -1; //Usuwa właściciela
  	}
	return 1;
}
Na koniec parę przydatnych funkcji:
stock ChangeBusinessName(BusinessID, BusNamme[])
{
  BusinessInfo[BusinessID][BusName] = BusNamme;
  return 1;
}

stock DisableBusiness(BusinessID)
{
  BusinessInfo[BusinessID][Disabled] = true;
  return 1;
}

stock EnableBusiness(BusinessID)
{
  BusinessInfo[BusinessID][Disabled] = false;
  return 1;
}

stock DeleteBusinessOwner(BusinessID)
{
  BusinessInfo[BusinessID][BusOwner] = -1;
  return 1;
}

stock ChangeBusinessCost(BusinessID, BussCost)
{
  BusinessInfo[BusinessID][BusCost] = BussCost;
  return 1;
}

stock ChangeBusinessSell(BusinessID, BussSell)
{
  BusinessInfo[BusinessID][BusSell] = BussSell;
  return 1;
}

stock ChangeBusinessEarn(BusinessID, Earrn)
{
  BusinessInfo[BusinessID][BusEarn] = Earrn;
  return 1;
}

Cały system w skrypcie (trzeba tylko dodać parę biznesów):

mx58.tk

Mam nadzieję że polska wersja poradnika pomoże wielu osobom.

Pozdrawiam, Minokon

@EDIT

błędy w oryginalnej wersji:

1. AddStaticPickup i CreatePickup zwracają co innego

2. GameText był wyświetlany tylko jeśli biznes ma właściciela

3. źle sformułowana pętla (a właściwie dziwnie)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Używając funkcji

CreateBusiness(BusinessName[], Float:XPos, Float:YPos, Float:ZPos, Price, Sell, Earn)

w callbacku OnGameModeInit (lub OnFilterScriptInit)

BusinessName - nazwa biznesu

XPos - pozycja X pickupa biznesu

YPos - pozycja Y pickupa biznesu

ZPos - pozycja Z pickupa biznesu

Price - cena kupna

Sell - cena sprzedaży

Earn - ile zarabia

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach


public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
	return 1;
}

Po co to tu?

PS. Jak dla nie to skrypt a nie poradnik.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

umiesz czytać?

Cały system w skrypcie (trzeba tylko dodać parę biznesów):

A co do tego OnPlayerRequestClass to pewnie zapomniałem usunąć, bo wszystkie callbacki dodawane są automatycznie przy tworzeniu nowego skryptu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hm, coś takiego?

CreateBusiness(Parking LV[], Float:2142.1897, Float:1038.4249, Float:10.8203, 150000, 100000, 3000)
Wyskakują mi błedy:
E:\GTA SA\Server\pawno\system_biznesow.pwn(30) : error 017: undefined symbol "Parking"
E:\GTA SA\Server\pawno\system_biznesow.pwn(30) : error 017: undefined symbol "LV"
E:\GTA SA\Server\pawno\system_biznesow.pwn(30) : error 029: invalid expression, assumed zero
E:\GTA SA\Server\pawno\system_biznesow.pwn(30) : fatal error 107: too many error messages on one line

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie.

Coś takiego:

CreateBusiness("Parking LV", 2142.1897, 1038.4249, 10.8203, 150000, 100000, 3000);

To jest skrypt..

Według mnie - Skrypt z dokładnym opisem.

@DOWN and 2DOWN: Przecież już napisałem jak ma zrobić..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

agd555, Maku123 już mu napisał jak zrobić poprawnie, a Ty pod nim, i po co to?

Maku123 jakby to był skrypt to nie byłby opisywany, no bo który skrypter dokładnie opisuje swój skrypt? to nie ma sensu

Pozdrawiam, Minokon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mylisz pojęcie zmienna z tablica oraz podałeś pr0 funkcje :) ChangeBusinessName(BusinessID, BusNamme) - BysNamme jest liczbą typu integer ? Nice...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

RPS, czytałeś wstęp?

"Chciałbym przedstawić wam polską wersję poradnika którego można znaleźć na forum sa-mp (link).

Oczywiście nie jest to samo, gdyż troszkę to zmodyfikowałem."

Nie patrzałem za bardzo na to wszystko, tylko pozmieniałem opisy no i oczywiście przetestowałem

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

: error 047: array sizes do not match, or destination array is too small
  	BusinessInfo[BusinessCount][BusName] = BusinessName; //Ustawia nazwę biznesu

"Testowałeś" a dałeś skrypt z errorem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

sorka, mój błąd :D

testować, testowałem tyle że nie tworzyłem biznesów i miałem warning:

warning 203: symbol is never used: "CreateBusiness"

nie wyświetlało błędu bo nie użyłem tej funkcji xd

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok to teraz rozwiąż kolejny problem .

Pickup jest jednak nic się nie wyświetla po wejściu w niego.

testować, testowałem tyle że nie tworzyłem biznesów i miałem warning:

To jak to niby testowałeś bez przykładowego biznesu o.O

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

praktycznie nic nie edytowałem ;p na pewno nie od pickupów

zaraz to sprawdze i zobaczymy

@EDIT

wina leży po stronie autora, AddStaticPickup zwraca 1 jeśli pickup został utworzony lub 0 jeśli się nie udało, a CreatePickup zwraca ID pickupa

autor myślał że AddStaticPickup zwraca ID pickupa, heh :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znalazłem coś jeszcze -

for(new C; C<BusinessCount+1; C++) //Pętla dla wszystkich stworzonych biznesów
{
   	if(pickupid == BusinessPickup[C]) //Sprawdza czy pickup jest od któregoś z biznesów
   	{
   		new str2[150]; //Tworzy ciąg znaków
   		if(BusinessInfo[C][BusOwner] == -1){
   			format(str2, sizeof(str2), "%s ~n~~r~Cena kupna: $%d ~b~Cena sprzedazy: $%d ~n~", BusinessInfo[C][BusName], BusinessInfo[C][BusCost], BusinessInfo[C][BusSell], BusinessInfo[C][BusEarn]); //Ustawia informacje o biznesie
			SendClientMessage(playerid, COLOR_ORANGE, " Biznes nie ma Właściciela. Możesz kupić za pomocą /buy lub sprzedac za /sell \nZa każdy jeden biznes otrzymujesz co parę minut 1exp");
		}
		if(BusinessInfo[C][BusOwner] != -1)
    	{
      		new PlayerName2[MAX_PLAYER_NAME]; //Tworzy ciąg znaków który będzie zawierał nick właściciela biznesu
       		GetPlayerName(BusinessInfo[C][BusOwner], PlayerName2, MAX_PLAYER_NAME); //Pobiera nick właściciela i zapisuje do zmiennej
       		format(str2, sizeof(str2), "%s ~n~~r~Cena kupna: $%d ~b~Cena sprzedazy: $%d ~n~ ~g~Zarobki: $%d~n~~w~Wlasciciel: %s(%d)", BusinessInfo[C][BusName], BusinessInfo[C][BusCost], BusinessInfo[C][BusSell], BusinessInfo[C][BusEarn], PlayerName2, BusinessInfo[C][BusOwner]);
       		SendClientMessage(playerid, COLOR_ORANGE, " Biznes  ma Właściciela. Możesz potargować się z właścicielem aby odkupić biznes.");
    	}
    	GameTextForPlayer(playerid, str2, 3000, 3);
		return 1;
   	}
}

GameTextForPlayer był w miejscu gdzie jest właściciel - należy go wyjąc poza te dwa ify.

Oraz dodać return zapobiegający bugom.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

eee... chciałbym zauważyć że:

1. AddStaticPickup i CreatePickup zwracają co innego

2. GameText był wyświetlany tylko jeśli biznes ma właściciela

3. źle sformułowana pętla (a właściwie dziwnie)

już dawno to poprawiłem

a co do returna to chyba bugów nie ma (nigdy nie spotkałem) no ale dodam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
a co do returna to chyba bugów nie ma (nigdy nie spotkałem) no ale dodam

Mam w mapie z 50 pickupów.

Kiedy nie dam do każdego returna wchodząc w jeden może się wywołać funkcja z drugiego.

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ę.

×