SA-MP Forums Archive
Nearest Hospital Spawn Upon Death - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: Nearest Hospital Spawn Upon Death (/showthread.php?tid=612349)



Nearest Hospital Spawn Upon Death - marley - 17.07.2016

Hey,

Looked all over using the search function, found a few suggested solutions, however can't seem to find any that work.

Basically what I'm looking for is a piece of script that respawns the player to the nearest Hospital upon death. So far I have the following code, however this doesn't work as I constantly respawn at my initial spawn point in the server.

Any help would be greatly appreciated!

Код:
new Dead[MAX_PLAYERS];
Код:
stock SpawnToHospital(playerid)
{
    Dead[playerid] = 0;
    static const Float:hspawns[8][4] = 
    {
                {2027.77, -1420.52, 15.99, 137.0},
		{1180.85, -1325.57, 12.58, 271.4},
		{1244.437, 331.2261, 18.5547, 7.5465},
		{-2199.719, -2308.075, 29.6181, 322.8928},
		{-2670.285, 616.4364, 13.4531, 183.1042},
		{-316.3832, 1056.045, 18.7344, 1.6017},
		{-1514.823, 2527.119, 54.7443, 2.3546},
		{1578.446, 1770.682, 9.8358, 99.7567}
       
    };
    new Float:spawndist[8];  // Change to the number of hospital spawnpoints you use.
    new Float:distance = 10000.0, closestspawn;
        spawndist[0] = GetPlayerDistanceFromPoint(playerid,2027.77, -1420.52, 15.99); // 1st hospital spawn.
        spawndist[1] = GetPlayerDistanceFromPoint(playerid,1180.85, -1325.57, 12.58); // 2nd hospital spawn.
	spawndist[2] = GetPlayerDistanceFromPoint(playerid,1244.437, 331.2261, 18.5547); // 3rd hospital spawn.
	spawndist[4] = GetPlayerDistanceFromPoint(playerid,-2199.719, -2308.075, 29.6181); // 5th hospital spawn.
	spawndist[3] = GetPlayerDistanceFromPoint(playerid,-2670.285, 616.4364, 13.4531); // 4th hospital spawn.
	spawndist[5] = GetPlayerDistanceFromPoint(playerid,-316.3832, 1056.045, 18.7344); // 6th hospital spawn.
	spawndist[6] = GetPlayerDistanceFromPoint(playerid,-1514.823, 2527.119, 54.7443); // 7th hospital spawn.
	spawndist[7] = GetPlayerDistanceFromPoint(playerid,1578.446, 1770.682, 9.8358); // 8th hospital spawn.

    
    for(new i = 0; i < sizeof(spawndist); i++)
    {
        if(spawndist[i] < distance) distance = spawndist[i], closestspawn = i;
    }
    SetPlayerPos(playerid, hspawns[closestspawn][0], hspawns[closestspawn][1], hspawns[closestspawn][2]);
    SetPlayerFacingAngle(playerid, hspawns[closestspawn][3]);
}
Код:
public OnPlayerConnect(playerid)
{
	Dead[playerid]=0;
        return 1;
}
Код:
public OnPlayerSpawn(playerid)
{
	if(Dead[playerid] == 1) 
	{
		SpawnToHospital(playerid);
	}
	
	SetPlayerInterior(playerid,0);
	TogglePlayerClock(playerid,0);
	if(PlayerInfo[playerid][pInJail] == 1)
	{
	    new string[64];
	   	SetPlayerPos(playerid, 1492.2151,-1768.2281,3285.2859);
	   	format(string, sizeof(string), "* Your character is currently is jail for another %d seconds.", PlayerInfo[playerid][pInJailTime]);
	   	SendClientMessage(playerid, COLOR_ADMIN, string);
	}
    
}



Re: Nearest Hospital Spawn Upon Death - DTV - 17.07.2016

Try changing the loop to something like this (note that I didn't test this):

pawn Код:
new closestspawn = -1;
for(new i = 0; i < sizeof(spawndist); i++)
{
    if(closestspawn == -1 && spawndist[i] < distance)
    {
        closestspawn = i;
        continue;
    }
    else if(closestspawn != -1 && closestspawn != i)
    {
        if(spawndist[i] < spawndist[closestspawn])
        {
            closestspawn = i;
            continue;
        }
        else continue;
    }
}



Re: Nearest Hospital Spawn Upon Death - marley - 17.07.2016

Hey,


Thanks for the reply things have developed a lil further.


So we've made progress, so now when I die it tps me to a hospital, but it isn't the nearest, and for some bizarre reason for a split second it tps me to the train station where the player starts before spawning properly at the wrong hosp

any suggestions?

if it helps this is what the system is based off, which didn't seem to work: https://sampforum.blast.hk/showthread.php?tid=602213


Re: Nearest Hospital Spawn Upon Death - DTV - 17.07.2016

Maybe changing this little bit will work:

pawn Код:
else if(closestspawn != -1 && closestspawn != i)
{
    if(spawndist[i] > spawndist[closestspawn]) continue;
    else if(spawndist[i] < spawndist[closestspawn])
    {
        closestspawn = i;
        continue;
    }
}



Re: Nearest Hospital Spawn Upon Death - [cS]Owain - 17.07.2016

Quote:
Originally Posted by marley
Посмотреть сообщение
for some bizarre reason for a split second it tps me to the train station where the player starts before spawning properly at the wrong hosp
That is because you are setting player position to hospital on OnPlayerSpawn. So player has spawned already to its initial spawn point before you set it to Hospital, you can try using SetSpawnInfo in OnPlayerdeath.

Quote:
Originally Posted by marley
Посмотреть сообщение
So we've made progress, so now when I die it tps me to a hospital, but it isn't the nearest,
The loop working FINE. The reason why this is happening is that you are getting distance when player spawns so it is tp'ing you to the nearest hospital to initial spawn point. For it to work you need player position when he dies store in global variable then use those position to get distance.


Re: Nearest Hospital Spawn Upon Death - oMa37 - 17.07.2016

Just do this, simple.

Somewhere in your code:
PHP код:
   #define MAX_HOSPITALS 8
    
static const Float:hspawns[MAX_HOSPITALS][4] = 
    {
                {
2027.77, -1420.5215.99137.0},
        {
1180.85, -1325.5712.58271.4},
        {
1244.437331.226118.55477.5465},
        {-
2199.719, -2308.07529.6181322.8928},
        {-
2670.285616.436413.4531183.1042},
        {-
316.38321056.04518.73441.6017},
        {-
1514.8232527.11954.74432.3546},
        {
1578.4461770.6829.835899.7567}
       
    }; 
OnPlayerDeath:
PHP код:
new Float:distance 99999.0,
        
Float:tmp_distance
        
closest = -1;
    for(new 
0MAX_HOSPITALSi++)
    {
        
tmp_distance GetPlayerDistanceFromPoint(playeridhspawnsr[i][0], hspawns[i][1], hspawns[i][2]);
        if (
tmp_distance distance)
        {
            
distance tmp_distance;
            
closest i;
        }
    }
    
SetSpawnInfo(playeridNO_TEAMGetPlayerSkin(playerid), hspawns[closest][0],hspawns[closest][1],hspawns[closest][2],hspawns[closest][3], 000000); 
Should Work!


Re: Nearest Hospital Spawn Upon Death - marley - 17.07.2016

It works man, thx a lot!