Jump to content
  • 0

pomoc Kasa pro business system


Meric

Dotaz

Ahoj, tak jsem tady zas. Mám problém se špatně fungujícím dialogem kasy. Stále mi to píše, že v kase nemám dost peněz, i přestože tam jsou. Na testovacím serveru mi to napíše ale i dá ty peníze, de facto se vykoná to, co chci, ale na veřejným, který už narozdíl od testovacího není prázdný to pouze píše tu hlášku a nedá to ani floka. Kontroloval jsem i jestli se hodnota při každé výplatě, kdy chodí i do kasy tržba ukládá. To také dělá, ale špatně. Při vytvoření podniku a upravení ceny například na 1 000 000 to funguje správně, do kasy jde každou hodinu 10 000 podle vzorce (který nejspíš upravím). Ale když k tomu koupím druhý podnik, s cenou třeba 50 000, tak místo aby do jedné kasy šlo 10 000 a do druhé 500, tak v jedné je 10 000 a v druhé 10 500. Dle toho usuzuji, že je chyba v cyklu, ale jak to změnit, aby to fungovalo, nad tím se lámu už hodiny a jsem bezradný. Nejsem sice úplně začátečník, ale nějaké ty mezery ještě mám, tak to prosím berte v úvahu, děkuji. Přiložím pro jistotu úplně vše, co nějak souvisí s kasou. Na požádání můžu poslat i další části, když to pomůže k vyřešení problémů. Budu rád za každou pomoc. :-)

 

Spoiler

enum
{
...
DIALOG_KASABIZ,
...

enum sBiz
{
	ID,
	Owner[MAX_PLAYER_NAME],
	Name[32],
	Locked,
	BKasa,
	bool:LightsInt,
	Float:X,
	Float:Y,
	Float:Z,
	Float:A,
	Interior,
	Price,
	Movein[24],
	Text3D:BizLabel,
	PickupID
}

new Biz[BIZ_MAX_ID][sBiz];


...
forward LoadBiz(i, name[], value[]);
...


// Příkaz:

CMD:kasa(playerid, params[])
{
    if(!Player[playerid][Pes])
	{
		if(IsPlayerInRangeOfPoint(playerid, 2, 919.2477,-41.1382, 1493.5973))
		{
			if(Player[playerid][Faction] == fGOV)
			{
		        SPD(playerid, DIALOG_MKASA);
		        return 1;
		    }
		    else return ErrorBox(playerid, "Nejsi ve frakci GOV.");
		}
	    else
	    {
	        for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
			{
			    if(IsPlayerInRangeOfPoint(playerid, 2, Biz[i][X], Biz[i][Y], Biz[i][Z]))
             	{
	                new name[MAX_PLAYER_NAME], temp[128];
	                name = GetName(playerid);
					if(strcmp(Biz[i][Owner], name, true, MAX_PLAYER_NAME) == 0)
					{
						format(temp, sizeof(temp), "V kase máte %d$. Zadejte částku jakou si přejete vybrat.", Biz[i][BKasa]);
						ShowPlayerDialog(playerid, DIALOG_KASABIZ, DIALOG_STYLE_INPUT, "KASA PODNIKU - TRZBA", temp, "Vybrat", "Storno");
		 				return 1;
					}
					else return ErrorBox(playerid, "Nejsi vlastnikem podniku.");
				}
			}
		}
		return ErrorBox(playerid, "Tento prikaz ted nemuzes pouzivat.");
	}
	else return ErrorBox(playerid, "Jsi pes, nemuzes vybirat penize z kasy.");
}

// Dialog
                                                     
 case DIALOG_KASABIZ:
		{
		    if(response)
		    {
		        if(isnumeric(inputtext))
		        {
                    for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
                    {
						new prachy = strval(inputtext);
		            	if(Biz[i][BKasa] >= prachy)
		            	{
							new str[80];
							GivePlayerMoneyEx(playerid, prachy);
							Biz[i][BKasa] -= prachy;
							format(str, sizeof(str), "> Vybral jsi z kasy tržbu v hodnotě %d$.", prachy);
							SCM(playerid, INFOCOLOR, str);
						}
						else return ErrorBox(playerid, "Tolik penez v kase nemas");
					}
				}
				else return ErrorBox(playerid, "Hodnota musi byt ciselna");
			}
		}

// OnPlayerKeyStateChange - KEY_YES - Vstupní poplatek

for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
		{
			if(IsPlayerInRangeOfPoint(playerid, 2, Biz[i][X], Biz[i][Y], Biz[i][Z]))
			{
				if(strcmp(Biz[i][Owner], "Los_Angeles", true, MAX_PLAYER_NAME) == 0 || Spot[playerid])
				{
					TeleportToBiz(playerid, i);
					return 1;
				}
				else
				{
				    new name[MAX_PLAYER_NAME], temp[128];
				    name = GetName(playerid);
	       			if(strcmp(Biz[i][Owner], name, true, MAX_PLAYER_NAME) == 0)
	          		{
	            		TeleportToBiz(playerid, i);
	              	}
	                else
	                {
						new fee = Biz[i][Price] / 10000;
						GivePlayerMoneyEx(playerid, -fee);
						Biz[i][BKasa] += fee;
						TeleportToBiz(playerid, i);
						new moneyb = Biz[i][BKasa];
						format(temp, sizeof(temp), BIZPATH, i);
						if(fexist(temp))
						{
		    				new INI:File = INI_Open(temp);
							INI_WriteInt(File, "Kasa", moneyb);
		    				Biz[i][BKasa] = moneyb;
						    INI_Close(File);
						    return 1;
						}
					}
				}
		    }
		}
                                         
 // stock LevelUp(playerid)
 // Kontrola každé nahrané minuty kvůli výplatě
 ...
  		if(IsBizOwner(playerid))
		{
		    Player[playerid][BizOwner] = true;
		} else {
		    Player[playerid][BizOwner] = false;
		}
 ...      
 // Kontrola každé nahrané hodiny v tom stejném stocku - výplata
 
if(Player[playerid][BankAcc] == true)
		{
		    new penize;
			new danzaauta;
			new totaldanzaauta = 0;
			new danzadomy;
			new totaldanzadomy = 0;
			new totalnipenize;
			new pname[MAX_PLAYER_NAME];
			new bizpenize;
			new zaklad = 0;
			format(pname, sizeof(pname), "%s", GetName(playerid));

		        for(new i = 1; i < MAX_VEHICLES; i++)
		        {
		            if(IsValidVehicle(i))
		            {
           				if(Vehicle[i][Faction] == 0)
			            {
					    	if(strcmp(Vehicle[i][Owner], pname, true) == 0)
							{
							    if(Vehicle[i][CoinBought] == false)
							    {
								    danzaauta = VehiclePrices[Vehicle[i][Model] - 400][0] / 100 * DAN_ZA_AUTO / 20;
								    totaldanzaauta += danzaauta;
								}
							}
						}
					}
		        }

		    for(new i2 = HOUSE_START_ID; i2 < HOUSE_MAX_ID; i2++)
		    {
		        if(strcmp(House[i2][Owner], pname, true) == 0)
		        {
		            if(House[i2][CoinBought] == false)
		    		{
			            danzadomy = House[i2][Price] / 100 * DAN_ZA_DUM / 20;
			            totaldanzadomy += danzadomy;
					}
		        }
		    }

		    for(new i2 = GARAGE_START_ID; i2 < GARAGE_MAX_ID; i2++)
		    {
		        if(strcmp(Garage[i2][Owner], pname, true) == 0)
		        {
		            if(Garage[i2][CoinBought] == false)
		    		{
			            danzadomy = Garage[i2][Price] / 100 * DAN_ZA_DUM / 20;
			            totaldanzadomy += danzadomy;
					}
		        }
		    }
		    
		    for(new i2 = BIZ_START_ID; i2 < BIZ_MAX_ID; i2++)
		    {
		        if(strcmp(Biz[i2][Owner], pname, true) == 0)
		        {
					new temp[128];
					danzadomy = Biz[i2][Price] / 100 * DAN_ZA_DUM / 20;
		            totaldanzadomy += danzadomy;
		            bizpenize = Biz[i2][Price] / 100;
		            zaklad += bizpenize;
					format(temp, sizeof(temp), BIZPATH, i2);
					if(fexist(temp))
					{
						new INI:File = INI_Open(temp);
						INI_WriteInt(File, "Kasa", zaklad);
						Biz[i2][BKasa] += zaklad;
		   				INI_Close(File);
					}
		        }
		    }
// Načítání
                                                       
public LoadBiz(i,name[],value[])
{
    INI_Int("ID",Biz[i][ID]);
    INI_String("Owner", Biz[i][Owner], MAX_PLAYER_NAME);
    INI_String("Name", Biz[i][Name], 32);
    INI_Int("Locked", Biz[i][Locked]);
    INI_Bool("Lights", Biz[i][LightsInt]);
    INI_Float("X",Biz[i][X]);
    INI_Float("Y",Biz[i][Y]);
    INI_Float("Z",Biz[i][Z]);
    INI_Float("A", Biz[i][A]);
    INI_Int("Kasa", Biz[i][BKasa]);
    INI_Int("Interior",Biz[i][Interior]);
    INI_Int("Price",Biz[i][Price]);
    INI_String("Movein", Biz[i][Movein], MAX_PLAYER_NAME);
    return 1;
}                                                       

 

 // EDIT: Ještě dotaz. V čem může být ten pekelný problém, když se občas stává, že se domy, garáže nebo podniky "pokazí" po restartu a musím je odebrat, aby fungovaly zase textdrawy a mapping z filterscriptů? Samozřejmě nezasažené pickupy zůstávají na místě, kde byly a ty "poškozené" mizí, pokud si dobře pamatuji na souřadnice 0 0 0. A taky se stává, že se někdy pokazí i systém ukládání a stocky na ukládání dat pro hráče a pro jejich vozidla skript za běhu ignoruje. Čím to může být způsobeno?

Edited by Meric
Link to comment
Share on other sites

4 odpovědí na tuto otázku

Recommended Posts

  • 0

V dialógu, kde vyberáš peniaze z kasy daného businessu nemáš urobenú žiadnu kontrolu, z ktorej kasy sa vlastne tá čiastka má odčítať. Tvoj cyklus sa navyše po odčítaní ani neukončí, takže to je pravdepodobne dôvodom, prečo to na jednom serveri fungovať môže (ale nesprávne) a druhom nie.

Čo sa týka toho pripočítavania do kasy, do súboru nezapisuješ nový stav kasy, ale iba tú hodnotu, o ktorú má narásť. V podstate by to za behu serveru nemalo mať vplyv, ale printf() ti určite prezradí, kde je problém.

 

 

Edited by Kubko
Link to comment
Share on other sites

  • 0

Nevím, co přesně máš namysli tou kontrolou, ze které kasy se to má odčítat, měl jsem za to, že právě ten cyklus by měl určit tu danou kasu, protože se předpokládá, že člověk bude stát pouze u jedné. Samozřejmě zde mi přišlo zbytečný volat funkci IsPlayerInRangeOfPoint, protože to je už u příkazu /kasa. Jakou kontrolu máš přesně namysli? 

Edited by Meric
Link to comment
Share on other sites

  • 0

Eh.. No, popravdě tomu pořád stále moc nerozumím, ukázal bys mi to na kódu, prosím? Dost se v tom ztrácím. Asi i to, jak zapsat nový stav kasy, protože teď mě vůbec nenapadá, jak to udělat. Samozřejmě u výplaty určitě nemůžu udělat to, že bych smazal samotné přičítání, jinak by se peníze nemohly nastackovat. Narazil jsem na logický problém a jsem celkem mimo. Tak kdybys byl tak hodný a ukázal mi to na kódu, určitě bych byl vděčný. :)

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...