Question

Подскажите как использовать

 

Что мы имеем как пример

new Float:GpsPositions[16][3] =
{
    {595.2228, 918.2593, 6002.3262},
    {619.6937, 840.1102, 6000.2534},
	...
    {647.0892, 856.9950, 6000.9971}
};

Я так понимаю чтобы получить корды первого нужно это

GpsPositions[0][0], GpsPositions[0][1], GpsPositions[0][2]

 

И у меня есть это

stock EnableGPSForPlayer(playerid, Float: x, Float: y, Float: z, Float:size = 4.0)
{
    gpss[playerid] = 1;
    SetPlayerCheckpoint(playerid, Float: x, Float: y, Float: z, size);
    return true;
}

Но я хочу так

stock EnableGPSForPlayer(playerid, Float: x, Float: y, Float: z, Float:size = 4.0)
{
	gpss[playerid] = 1;
	SetPlayerCheckpoint(playerid, GpsPositions[0][0], GpsPositions[0][1], GpsPositions[0][2], size);
	return true;
}

И это сделать чтобы все координаты через него проходили автоматом, чтобы я писал например EnableGPSForPlayer[0] и мне вызывался последний вариант с кордами [0]?

Edited by Tony_Cannabis

Share this post


Link to post

19 answers to this question

  • 0
1 час назад, Tony_Cannabis сказал:

И это сделать чтобы все координаты через него проходили автоматом, чтобы я писал например EnableGPSForPlayer[0] и мне вызывался последний вариант с кордами [0]?

 

Спойлер

#define D_GPS 1111
  
new Float:GpsPositions[16][3] =
{
    {595.2228, 918.2593, 6002.3262},
    {619.6937, 840.1102, 6000.2534},
	...
    {647.0892, 856.9950, 6000.9971}
};

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid) {
        case D_GPS: {
            case 0: EnableGPSForPlayer(playerid, 0);
        }
    }
    return 0;
}

stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
    gpss[playerid] = 1;
    SetPlayerCheckpoint(playerid, GpsPositions[index][0], GpsPositions[index][1], GpsPositions[index][2], size);
    return true;
}

 

 

Edited by glvde.

Share this post


Link to post
  • 0
19 часов назад, glvde. сказал:

 

  example (закрыть спойлер)


#define D_GPS 1111
  
new Float:GpsPositions[16][3] =
{
    {595.2228, 918.2593, 6002.3262},
    {619.6937, 840.1102, 6000.2534},
	...
    {647.0892, 856.9950, 6000.9971}
};

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid) {
        case D_GPS: {
            case 0: EnableGPSForPlayer(playerid, 0);
        }
    }
    return 0;
}

stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
    gpss[playerid] = 1;
    SetPlayerCheckpoint(playerid, GpsPositions[index][0], GpsPositions[index][1], GpsPositions[index][2], size);
    return true;
}

 

 

Спасибо! А всякую хрень которая в циклах, ее либо в EnableGPSForPlayer, либо отдельно?

 

Хотел засунуть vehiclePos[0], vehiclePos[1], vehiclePos[2]

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

@Tony_Cannabis, хотите сделать поиск автомобиля таким образом?

Share this post


Link to post
  • 0
3 часа назад, glvde. сказал:

@Tony_Cannabis, хотите сделать поиск автомобиля таким образом?

примерно да, ну там автомобили, бизы еще что то, везде цикл, а в циклах veh, biz и тп

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

Есть другие варианты как сделать лучше? 

Share this post


Link to post
  • 0

Я, например, не очень понял что нужно, приведите пример кода и как он должен преобразиться

Share this post


Link to post
  • 0
33 минуты назад, DEST сказал:

Я, например, не очень понял что нужно, приведите пример кода и как он должен преобразиться

Есть цикл такой

			case 1: {
				new max_distance = 100000;
				new id_biz = -1;
				for(new i = gBusinessCount-1; i >= 0; --i)
				{
					if(gBusiness[i][bizzType] != 1) continue;
					new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ]));
					if(here_distance < max_distance)
					{
						id_biz = i;
						max_distance = here_distance;
					}
				}
				if(max_distance == -1 || id_biz == -1) return true;
				EnableGPSForPlayer(playerid, gBusiness[id_biz][bizzX], gBusiness[id_biz][bizzY], gBusiness[id_biz][bizzZ]);
				return true;
			}

и еще много циклов, например эта - проверка на бизнес который поблизости

 

Я хочу  gBusiness[id_biz][bizzX], gBusiness[id_biz][bizzY], gBusiness[id_biz][bizzZ] запихнуть сюда, но без цикла...

 

stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
    gpss[playerid] = 1;
    SetPlayerCheckpoint(playerid, GpsPositions[index][0], GpsPositions[index][1], GpsPositions[index][2], size);
    return true;
}

 

Я так понимаю что можно запихнуть только с циклом, или есть какие либо варианты? И как лучше будет его туда запихнуть если это единственный вариант, Заранее благодарю за помощь!

Share this post


Link to post
  • 0

@Tony_Cannabis 

39 минут назад, Tony_Cannabis сказал:

gBusiness[id_biz][bizzX], gBusiness[id_biz][bizzY], gBusiness[id_biz][bizzZ]

stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
    gpss[playerid] = 1;
    SetPlayerCheckpoint(playerid, gBusiness[index][bizzX], gBusiness[index][bizzY], gBusiness[index][bizzZ], size);
    return true;
}

Сложного ничего нет. Если же хотите делать такую функцию для бизнесов поблизости, то придется с циклом.

Share this post


Link to post
  • 0

@glvde. Если сделаю так? Или покажите как бы вы сделали

 

stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
    gpss[playerid] = 1;
	SetPlayerCheckpoint(playerid, GpsPositions[index][0], GpsPositions[index][1], GpsPositions[index][2], size);
		
	//проверка 
	if (EnableGPSForPlayer(playerid, 0)) {
		new max_distance = 100000;
		new id_biz = -1;
		for(new i = gBusinessCount-1; i >= 0; --i)
		{
			if(gBusiness[i][bizzType] != 1) continue;
			new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ]));
			if(here_distance < max_distance)
			{
				id_biz = i;
				max_distance = here_distance;
			}
		}
		if(max_distance == -1 || id_biz == -1) return true;
    	SetPlayerCheckpoint(playerid, gBusiness[index][bizzX], gBusiness[index][bizzY], gBusiness[index][bizzZ], size);
    	return true;
	}
	return true;
}

 

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

Если я так сделаю а циклов у меня много таких , получится так

 

Цитата

 


stock EnableGPSForPlayer(playerid, index, Float:size = 4.0)
{
	//проверка 
	else if (EnableGPSForPlayer(playerid, 1)) {
		new max_distance = 100000;
		new id_biz = -1;
		for(new i = gBusinessCount-1; i >= 0; --i)
		{
			if(gBusiness[i][bizzType] != 1) continue;
			new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ]));
			if(here_distance < max_distance)
			{
				id_biz = i;
				max_distance = here_distance;
			}
		}
		if(max_distance == -1 || id_biz == -1) return true;
    	SetPlayerCheckpoint(playerid, gBusiness[index][bizzX], gBusiness[index][bizzY], gBusiness[index][bizzZ], size);
    	return true;
	}
	else if (EnableGPSForPlayer(playerid, 2)) {
		for(new i = второйцикл-1; i >= 0; --i)
		{
			if(втораяхрень[i][второйтип] != 3) continue;
			всякая хрень
		}
		if(max_distance == -1 || id_biz == -1) return true;
    	SetPlayerCheckpoint(playerid, втораяхрень[index][bizzX], втораяхрень[index][bizzY], втораяхрень[index][bizzZ], size);
    	return true;
	}
	else if (EnableGPSForPlayer(playerid, 3)) {
		for(new i = третийцикл-1; i >= 0; --i)
		{
			if(третяяхрень[i][третийтип] != 3) continue;
			всякая хрень
		}
		if(max_distance == -1 || id_biz == -1) return true;
    	SetPlayerCheckpoint(playerid, третяяхрень[index][bizzX], третяяхрень[index][bizzY], третяяхрень[index][bizzZ], size);
    	return true;
	}
   	else {
    gpss[playerid] = 1;
	SetPlayerCheckpoint(playerid, GpsPositions[index][0], GpsPositions[index][1], GpsPositions[index][2], size);                                        
	return true;
    }
}

 

 

А это быдлокод по моему мнению, как то можно легче сделать, ну что никто не знает?

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

@Tony_Cannabis кто-то может и знает, но нужно стараться формулировать мысли так, чтобы их кто-то кроме вас еще понимал. 

Если нужно избежать повторения циклов, можно просто вынести его в функцию

stock GetNearbyBusiness(playerid, max_distance = 100000)
{
  new id_biz = -1;
  for(new i = gBusinessCount-1; i >= 0; --i)
  {
    if(gBusiness[i][bizzType] != 1) continue;
    new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ]));
    if(here_distance < max_distance)
    {
      id_biz = i;
      max_distance = here_distance;
    }
  }
  return id_biz; 
}

Если не хочется писать эту функцию для каждого объекта в моде, то есть машины, бизнеса, дома или еще чего, можно макрос сделать и препроцессор сам сгенерит эти функции

 

Share this post


Link to post
  • 0

@DEST 

Если я так сделаю то надо будет эту проверку тоже както затронуть, для домов например 1 для бизов 2 и тп

if(gBusiness[i][bizzType] != 1) continue;

 

Share this post


Link to post
  • 0

@Tony_Cannabis за что отвечает bizzType у бизнеса? И что означает значение 1? 

Share this post


Link to post
  • 0
3 минуты назад, DEST сказал:

@Tony_Cannabis за что отвечает bizzType у бизнеса? И что означает значение 1? 

тип бизнеса, 7 например это азс, 1 закусочные 

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

@Tony_Cannabis тогда также можно в аргумент функции это засунуть 

stock GetNearbyBusinessByType(playerid, bizType, max_distance = 100000)
{
  new id_biz = -1;
  for(new i = gBusinessCount-1; i >= 0; --i)
  {
    if(gBusiness[i][bizzType] != bizType) continue;
    new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), gBusiness[i][bizzX], gBusiness[i][bizzY], gBusiness[i][bizzZ]));
    if(here_distance < max_distance)
    {
      id_biz = i;
      max_distance = here_distance;
    }
  }
  return id_biz; 
}

 

Share this post


Link to post
  • 0
Потом так вызывать?
GetNearbyBusinessByType(playerid, 1)

Share this post


Link to post
  • 0

А можно gBusinessCount тоже менять? Типо 

stock GetNearbyBusinessByType(playerid, bizType, gBusinessCount, max_distance = 10000

т.к. у меня есть еще помимо бизнесов терминалы и прочее

				new id_atm = -1;
				for(new i = 1; i < MAX_ATM; i ++)
				{
					new here_distance = (!IsPlayerInAnyVehicle(playerid)) ? floatround(GetPlayerDistanceFromPoint(playerid, ATMData[i][ATM_Pos][0], ATMData[i][ATM_Pos][1], ATMData[i][ATM_Pos][2])) : floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), ATMData[i][ATM_Pos][0], ATMData[i][ATM_Pos][1], ATMData[i][ATM_Pos][2]));
					if(here_distance < max_distance)
					{
						id_atm = i;
						max_distance = here_distance;
					}
				}

и тут в цикле мне нужна помощь, или отдельный создавать именно под него? т.к. в том i=0, а в этом 1

или в бд с 0 их пронумеровать?

 

уже пронумеровал

Edited by Tony_Cannabis

Share this post


Link to post
  • 0

@Tony_Cannabis отдельную функцию создавать, тут даже в названии получить ближайший бизнес, а не терминал и прочее.  

Share this post


Link to post
  • 0

@DEST А можно gBusinessCount менять? И вызывать что требуется

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0