Jump to content
  • 0

pomoc Uložení auta, proměnná


mourison

Dotaz

Popis problému:


Zdravím, z nějakého důvodu, který nevidím, se mi cyklus nedostane za podmínku

if(oznauto[i])

Došel sjem k tomu, pomocí výpisu čísel.
Moc děkuji za radu :)

Chyby/varování kompilátoru a při běhu:
--

Kód:

 

//Nahoře

new bool:oznauto[MAX_VEHICLES];

Stock
stock SaveAllVehicles(playerid)
{
new saveindex = 0;
	new cesta[512];
		format(cesta, sizeof(cesta), "/Auta/%d.sav", saveindex);
		SCM(playerid,T_GREEN, "1");
			for(new i = 0; i < MAX_VEHICLES; i++)
			{
			SCM(playerid,T_GREEN, "2");
 	 			if(oznauto[i])
	        	{
         		SCM(playerid,T_GREEN, "3");
		 				if(!dini_Exists(cesta))// ak hráčov súbor neexistuje( preto tam je ! )
						{
							dini_Create(cesta);// tak ho vytvoríme
							}
							else// ale ak existuje
							{
							SCM(playerid,T_GREEN, "SAVING");
						 	dini_IntSet(cesta, "Model",AutoData[i][model]);
		                                        dini_FloatSet(cesta, "X", AutoData[i][xspawn]);
		                                        dini_FloatSet(cesta, "Y", AutoData[i][xspawn]);
		                                        dini_FloatSet(cesta, "Z", AutoData[i][xspawn]);
		                                        dini_FloatSet(cesta, "angle", AutoData[i][anglespawn]);
		                                        dini_Set(cesta, "Barva1",AutoData[i][col1]);
		                                        dini_Set(cesta, "Barva2",AutoData[i][col2]);
		                                        dini_FloatSet(cesta, "RespawnTime", AutoData[i][respawn]);
		                                        dini_Set(cesta, "Majitel", AutoData[i][majitel]);
                      		                        saveindex ++;
						}
	        	}
		}
}

//Vytvořenému auto přidám oznauto na true //CreateVehicleEx
new carid = ZiskejAutoSlot();
oznauto[carid] = true;
CreateVehicle(modelid, x, y, z, angle, color1, color2, respawntime);

//Stock NastaveníSlotu
stock ZiskejAutoSlot()
{
    for(new i = 0; i < sizeof(oznauto); i++)
    {
        if(!oznauto[i]) return i;
    }
    return -1;
}

 




Dodatečné poznámky:
--

Link to comment
Share on other sites

3 odpovědí na tuto otázku

Recommended Posts

  • 0

Pár úprav:

- Máš příliš mnoho znaků pro cestu na ukládání. Bohatě stačí 51 (50 + 1). Ba dokonce i ta tvá cesta má jen 12/13+1 znaků.

- Jako dini je dobrý začátek, ale doporučil bych ti spíše dof2. Je to prakticky to samé, akorát modernější a rychlejší.

- K čemu je proměnná saveindex? Pokud je to id každého vozidla, co se ukládá, tak na to můžeš použít proměnnou i.

- Navíc saveindex sice přiřazuješ po každém cyklu hodnotu, ale nic se nestane, protože s ní pracuješ až nad ní.

 

 

Nejdříve bych doporučil zjistit, jakmile najede na id nějakého vozidla, jestliže vůbec existuje. Na to může použít IsValidVehicle. Aby neprojížděl třeba tisícovku neexistujících vozidel úplně zbytečně.

 

Zkus tohle:

 

dini způsob

 

 

stock SaveAllVehicles(playerid)
{
	new cesta[51];
	for(new i = 0; i < MAX_VEHICLES; i++)
	{
		if (IsValidVehicle(i)) 
		{
	 	 	if(oznauto[i])
		    {
				format(cesta, sizeof(cesta), "/Auta/%d.sav", i);
				if(!dini_Exists(cesta)) dini_Create(cesta);// tak ho vytvoríme
				dini_IntSet(cesta, "Model",AutoData[i][model]);
				dini_FloatSet(cesta, "X", AutoData[i][xspawn]);
				dini_FloatSet(cesta, "Y", AutoData[i][xspawn]);
				dini_FloatSet(cesta, "Z", AutoData[i][xspawn]);
				dini_FloatSet(cesta, "angle", AutoData[i][anglespawn]);
				dini_Set(cesta, "Barva1",AutoData[i][col1]);
				dini_Set(cesta, "Barva2",AutoData[i][col2]);
				dini_FloatSet(cesta, "RespawnTime", AutoData[i][respawn]);
				dini_Set(cesta, "Majitel", AutoData[i][majitel]);
			}
	     }
	}
}

 

 

dof2 způsob

 

 

stock SaveAllVehicles(playerid)
{
	new cesta[51];
	for(new i = 0; i < MAX_VEHICLES; i++)
	{
		if (IsValidVehicle(i)) 
		{
	 	 	if(oznauto[i])
		    {
				format(cesta, sizeof(cesta), "/Auta/%d.sav", i);
				if(!DOF2_FileExists(cesta)) DOF2_CreateFile(cesta);
				DOF2_SetInt(cesta, "Model",AutoData[i][model]);
				DOF2_SetFloat(cesta, "X", AutoData[i][xspawn]);
				DOF2_SetFloat(cesta, "Y", AutoData[i][xspawn]);
				DOF2_SetFloat(cesta, "Z", AutoData[i][xspawn]);
				DOF2_SetFloat(cesta, "angle", AutoData[i][anglespawn]);
				DOF2_SetString(cesta, "Barva1",AutoData[i][col1]);
				DOF2_SetString(cesta, "Barva2",AutoData[i][col2]);
				DOF2_SetFloat(cesta, "RespawnTime", AutoData[i][respawn]);
				DOF2_SetString(cesta, "Majitel", AutoData[i][majitel]);
				DOF2_SaveFile();
			}
	    }
	}
}

 

Link to comment
Share on other sites

  • 0

- Nejdriv bych ti doporucil aby sis na local svr poridil crashdetect, je to sikovna vecicka, ktera ti dokaze odkryt runtime chybu, tzn chybu ktera ti zastavi kod. napr zasah na neplatny index pole atp...

- Druha varianta, ktera mne napada je ta, ze si nekde to pole vynulujes a tedy ten cyklus ti to neprojde (napr pokud to mas v OnPlayerDisconnect tak si dej pozor jestli to opravdu nejdriv ukladas a az potom nulujes promenou).

 

Sice nevim jaky presny ucel tvuj kod ma, ale napadlo mne lepsi reseni, ktere mozna i vyresi problem:

new bool:oznauto[MAX_VEHICLES] = {-1,...};

stock SaveAllVehicles(playerid)
{
	new saveindex = 0,cesta[128];
	format(cesta, sizeof(cesta), "/Auta/%d.sav", saveindex);//POZOR zde bude vzdy string "/Auta/0.sav" !!!
	for(new i = 0; i < MAX_VEHICLES; i++)
	{
 	 	if(oznauto[i] != -1)
		{
		    //format(cesta, sizeof(cesta), "/Auta/%d.sav", saveindex);//nema to byt na teto urovni?
			if(!dini_Exists(cesta)) dini_Create(cesta);
			//zde jsem odmazal else, sice si dini uz moc nepamatuju ale dini_create vytvori prazdny soubor a s tim else by tam nevlozil obsah
			dini_IntSet(cesta, "Model",AutoData[i][model]);
			dini_FloatSet(cesta, "X", AutoData[i][xspawn]);
			dini_FloatSet(cesta, "Y", AutoData[i][xspawn]);
			dini_FloatSet(cesta, "Z", AutoData[i][xspawn]);
			dini_FloatSet(cesta, "angle", AutoData[i][anglespawn]);
			dini_Set(cesta, "Barva1",AutoData[i][col1]);
			dini_Set(cesta, "Barva2",AutoData[i][col2]);
			dini_FloatSet(cesta, "RespawnTime", AutoData[i][respawn]);
			dini_Set(cesta, "Majitel", AutoData[i][majitel]);
			saveindex++;
		}
	}
}

stock CreateVehicleForPlayer(playerid,modelid, x, y, z, angle, color1, color2, respawntime)
{
	new vehicleid = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawntime);
	if(vehicleid != INVALID_VEHICLE_ID) oznauto[vehicleid] = playerid;
	return vehicleid;
}

Navic to ma vyhodu ze podle vehicleid si muzes zjistit kdo je majitelem vytvoreneho vozidla (-1 pokud vozidlo majitele nema)

Edited by ATomas
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...