Szerző Téma: Legközelebbi játékos probléma.  (Megtekintve 2364 alkalommal)

Legközelebbi játékos probléma.
« Dátum: 2014. március 29. - 01:03:27 »
0 Show voters
Sziasztok. Legközelebbi játékos lekérdezésénél az a probléma, hogy, ha nincs a közelembe  játékos akkor kiírja sokszor.
 
forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
   
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 2.0, x2,y2,z2))
{
    SendClientMessage(playerid, piros, \"(( Nincs a közeledben! ))\");
           tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
           if(tmpdis < dist)
           {
               dist = tmpdis;
               targetid = i;
           }
}
}
    return targetid;
}

 
Tehát abban szeretnék segítséget kérni, hogy, ha nincs a közelembe akkor csak egyszer írja ki!
« Utoljára szerkesztve: 2014. március 29. - 12:32:14 írta Dfoglalo »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
Legközelebbi játékos probléma.
« Válasz #1 Dátum: 2014. március 29. - 01:08:07 »
+1 Show voters
Ha a for ciklus alatt írod ki, jó, hogy sokszor küldi el. Többet is segítek majd holnap, ha kell, és ha addigra nem elõznek meg, de most alvás. :)

Legközelebbi játékos probléma.
« Válasz #2 Dátum: 2014. március 29. - 01:14:37 »
0 Show voters
Igen, tudom, hogy úgy többször írja ki, de amikor máshogy próbáltam akkor mégrosszabb volt.

Legközelebbi játékos probléma.
« Válasz #3 Dátum: 2014. március 29. - 02:09:06 »
+1 Show voters
Tessék, próbáld ezzel, ez hibátlan, a ClosestPlayer(playerid) tér vissza a legközelebbi játékos id-jére.
 
stock Float:GetDistanceToPlayer(playerid,playerid2)
{
        new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
        if (!IsPlayerConnected(playerid) || !IsPlayerConnected(playerid2)) {
                return -1.00;
        }
        GetPlayerPos(playerid,x1,y1,z1);
        GetPlayerPos(playerid2,x2,y2,z2);
        return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
stock ClosestPlayer(p1)
{
        new Float:dis,Float:dis2,playerid;
        playerid = -1;
        dis = 99999.99;
        foreach(Player,i)
{
               dis2 = GetDistanceToPlayer(p1, i);
           if(dis2 < dis && dis2 != -1.00)
           {
         dis = dis2;
         playerid = i;
           }
}
        return playerid;
}

 
Ez a megoldás a foreach-ot használja, ha neked nincs meg írd át for ciklusra.
« Utoljára szerkesztve: 2014. március 29. - 12:32:27 írta Dfoglalo »

Legközelebbi játékos probléma.
« Válasz #4 Dátum: 2014. március 29. - 09:21:22 »
0 Show voters
Köszönöm, hogy bemásoltad, de miért? Enyém is mûködik csak van egy apró hiba benne. ;)

Nem elérhető CANNONN

  • 2139
    • Profil megtekintése
Legközelebbi játékos probléma.
« Válasz #5 Dátum: 2014. március 29. - 09:54:24 »
+1 Show voters
Sajnos nem volt alkalmam tesztelni, de próbáld meg így!
 

forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 2.0, x2,y2,z2))
        {
   tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
   if(tmpdis < dist)
   {
     dist = tmpdis;
     targetid = i;
   }
        } else targetid = -1;
if( targetid == -1 ) SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");
}
    return targetid;
}
« Utoljára szerkesztve: 2014. március 29. - 12:33:18 írta Dfoglalo »

Legközelebbi játékos probléma.
« Válasz #6 Dátum: 2014. március 29. - 10:13:18 »
0 Show voters
Idézetet írta: Cannonn date=1396083264\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"47420\" data-ipsquote-contentclass=\"forums_Topic
Sajnos nem volt alkalmam tesztelni, de próbáld meg így!
 

forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 2.0, x2,y2,z2))
        {
   tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
   if(tmpdis < dist)
   {
     dist = tmpdis;
     targetid = i;
   }
        } else targetid = -1;
if( targetid == -1 ) SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");
}
    return targetid;
}

 

Sajnos most is sokszor írja ki!
« Utoljára szerkesztve: 2014. március 29. - 12:35:00 írta Dfoglalo »

Nem elérhető CANNONN

  • 2139
    • Profil megtekintése
Legközelebbi játékos probléma.
« Válasz #7 Dátum: 2014. március 29. - 10:18:45 »
0 Show voters

forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 2.0, x2,y2,z2))
        {
   tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
   if(tmpdis < dist)
   {
     dist = tmpdis;
     targetid = i;
   }
        } else targetid = -1;
}
if( targetid != -1 ) return targetid;
else return SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");
}
« Utoljára szerkesztve: 2014. március 29. - 12:35:04 írta Dfoglalo »

Legközelebbi játékos probléma.
« Válasz #8 Dátum: 2014. március 29. - 12:31:25 »
0 Show voters
Ez már majdnem jó egy kicsi belejavítással.
Most az a probléma, hogy, ha megbilincseltem valakit és utána próbálom mindenkitõl messze akkor ismeretlen parancsot ad és azt is írja, hogy senki nincs a közelembe.
 
forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 4.0, x2,y2,z2))
       {
            tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
            if(tmpdis < dist)
            {
      dist = tmpdis;
              targetid = i;
            }
       } else targetid = -1;
     } if( targetid == -1 ) SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");
    return targetid;
}

 

CMD:bilincsel(playerid, params[])
{
if(admins[playerid][frakcio] == 4 || admins[playerid][frakcio] == 5 ||admins[playerid][frakcio] == 6 || admins[playerid][frakcio] == 7 || admins[playerid][frakcio] == 8 || admins[playerid][frakcio] == 9 || admins[playerid][frakcio] == 10 || admins[playerid][frakcio] == 11 || admins[playerid][frakcio] == 12 || admins[playerid][frakcio] == 13 ||
admins[playerid][frakcio] == 14 || admins[playerid][frakcio] == 15 ||admins[playerid][frakcio] == 16 || admins[playerid][frakcio] == 17 || admins[playerid][frakcio] == 36 || admins[playerid][frakcio] == 37 || admins[playerid][frakcio] == 38 || admins[playerid][frakcio] == 39 || admins[playerid][frakcio] == 40)
{
    if(szolg[playerid] == 1)
    {
        new playes = GetClosestPlayerToPlayer(playerid);
        if(bilincsbe[playes] == 0)
        {
      TogglePlayerControllable(playes,0);
      SetPlayerSpecialAction(playes, SPECIAL_ACTION_CUFFED);
         SetPlayerAttachedObject(playes, 0, 19418, 6, -0.011000, 0.028000, -0.022000, -15.600012, -33.699977, -81.700035, 0.891999, 1.000000, 1.168000);
      SendClientMessage(playes,piros,\"(( Egy rendõr megbilincsel. ))\");
      SendClientMessage(playerid,narancssárga,\"(( Megbilincseltél valakit. ))\");
      cmd_me(playerid,\"megbilincselt valakit.\");
      bilincsbe[playes] = 1;
   } else SendClientMessage(playerid, piros,\"(( Õ már meg van bilincselve! ))\");
} else SendClientMessage(playerid, piros,\"(( Nem vagy szolgálatban! ))\");
} else return 0;
return 1;
}
« Utoljára szerkesztve: 2014. március 29. - 12:56:56 írta TheChansee »

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Legközelebbi játékos probléma.
« Válasz #9 Dátum: 2014. március 29. - 13:24:17 »
+1 Show voters
Idézetet írta: TheChansee date=1396092685\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"47420\" data-ipsquote-contentclass=\"forums_Topic
Ez már majdnem jó egy kicsi belejavítással.
Most az a probléma, hogy, ha megbilincseltem valakit és utána próbálom mindenkitõl messze akkor ismeretlen parancsot ad és azt is írja, hogy senki nincs a közelembe.
 


     } if( targetid == -1 ) SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");

 
helyett:
 

     } if( targetid == -1 ) return SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");

 
Ide már csak egy kis részlete jön a köcsög, akadékoskodó (és egyben segítõkész, egyszerûségre törekvõ) személyemnek:
 

if(admins[playerid][frakcio] == 4 || admins[playerid][frakcio] == 5 ||admins[playerid][frakcio] == 6 || admins[playerid][frakcio] == 7 || admins[playerid][frakcio] == 8 || admins[playerid][frakcio] == 9 || admins[playerid][frakcio] == 10 || admins[playerid][frakcio] == 11 || admins[playerid][frakcio] == 12 || admins[playerid][frakcio] == 13 ||
admins[playerid][frakcio] == 14 || admins[playerid][frakcio] == 15 ||admins[playerid][frakcio] == 16 || admins[playerid][frakcio] == 17 || admins[playerid][frakcio] == 36 || admins[playerid][frakcio] == 37 || admins[playerid][frakcio] == 38 || admins[playerid][frakcio] == 39 || admins[playerid][frakcio] == 40)

 
helyett:
 

switch(admins[playerid][frakcio])
{
    case 4,5,6,7,8,9,10,11,12,13,14,15,16,17,36,37,38,39,40:
    {
        //Ide jöjjön a parancs többi része, ami eddig az óriási if alatt volt.
    }
}

 
Sok szerencsét, további jó scriptelést!  :thumbsup:

Legközelebbi játékos probléma.
« Válasz #10 Dátum: 2014. március 29. - 14:09:56 »
0 Show voters
Most teljesen megbolondult a rendszer. :DD

Legközelebbi játékos probléma.
« Válasz #11 Dátum: 2014. március 29. - 14:22:50 »
0 Show voters
Nem lehet, hogy többször fut le, azért írja ki annyiszor?

Legközelebbi játékos probléma.
« Válasz #12 Dátum: 2014. március 29. - 14:53:55 »
0 Show voters
CMD:bilincsel(playerid, params[])
{
if(admins[playerid][frakcio] == 4 || admins[playerid][frakcio] == 5 ||admins[playerid][frakcio] == 6 || admins[playerid][frakcio] == 7 || admins[playerid][frakcio] == 8 || admins[playerid][frakcio] == 9 || admins[playerid][frakcio] == 10 || admins[playerid][frakcio] == 11 || admins[playerid][frakcio] == 12 || admins[playerid][frakcio] == 13 ||
admins[playerid][frakcio] == 14 || admins[playerid][frakcio] == 15 ||admins[playerid][frakcio] == 16 || admins[playerid][frakcio] == 17 || admins[playerid][frakcio] == 36 || admins[playerid][frakcio] == 37 || admins[playerid][frakcio] == 38 || admins[playerid][frakcio] == 39 || admins[playerid][frakcio] == 40)
{
    if(szolg[playerid] == 1)
    {
        new playes = GetClosestPlayerToPlayer(playerid);
        if(bilincsbe[playes] == 0)
        {
      TogglePlayerControllable(playes,0);
      SetPlayerSpecialAction(playes, SPECIAL_ACTION_CUFFED);
         SetPlayerAttachedObject(playes, 0, 19418, 6, -0.011000, 0.028000, -0.022000, -15.600012, -33.699977, -81.700035, 0.891999, 1.000000, 1.168000);
      SendClientMessage(playes,piros,\"(( Egy rendõr megbilincsel. ))\");
      SendClientMessage(playerid,narancssárga,\"(( Megbilincseltél valakit. ))\");
      cmd_me(playerid,\"megbilincselt valakit.\");
      bilincsbe[playes] = 1;
   } else SendClientMessage(playerid, piros,\"(( Õ már meg van bilincselve! ))\");
} else SendClientMessage(playerid, piros,\"(( Nem vagy szolgálatban! ))\");
} else return 0;
return 1;
}
forward GetClosestPlayerToPlayer(playerid);
public GetClosestPlayerToPlayer(playerid)
{
    new Float:dist = 1000.0;
    new targetid = INVALID_PLAYER_ID;
    new Float:x1,Float:y1,Float:z1;
    new Float:x2,Float:y2,Float:z2;
    new Float:tmpdis;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(i == playerid) continue;
        GetPlayerPos(i,x2,y2,z2);
        if(IsPlayerInRangeOfPoint(playerid, 4.0, x2,y2,z2))
       {
            tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
            if(tmpdis < dist)
            {
      dist = tmpdis;
              targetid = i;
            }
       } else targetid = -1;
     }
if(targetid == -1) return SendClientMessage(playerid, piros, \"(( Senki nincs a közeledben! ))\");
return targetid;
}

 
Most nem veszi figyelembe, hogy milyen közel van, most akármilyen messze van a legközelebbi játékosra teszi, illetve közben ismeretlen parancsot is ír.
« Utoljára szerkesztve: 2014. március 29. - 15:30:56 írta TheChansee »

Nem elérhető KovaNovik

  • 1121
  • KovaNovik
    • Profil megtekintése
Legközelebbi játékos probléma.
« Válasz #13 Dátum: 2014. március 29. - 15:31:51 »
+1 Show voters
Nos..
1, Nem jó code taget tettél be.
2, Csináltam neked egy saját függvényt ehhez, hogy biztos mûködjön, hiszen ezt teszteltem.
 

stock LegkozelebbiJatekos(playerid, Float:korzet)
{
new Float:jpoz[3], Float:tav = korzet, legkjatekos;
for(new a = 0; a < LegfJatekos; a++)
{
if(!IsPlayerConnected(a)) continue;
if(a == playerid) continue;
if(GetPlayerVirtualWorld(playerid) != GetPlayerVirtualWorld(a)) continue;
if(GetPlayerInterior(playerid) != GetPlayerInterior(a)) continue;
GetPlayerPos(a, jpoz[0], jpoz[1], jpoz[2]);
if(GetPlayerDistanceFromPoint(playerid, jpoz[0], jpoz[1], jpoz[2]) > tav) continue;
                else
{
   tav = GetPlayerDistanceFromPoint(playerid, jpoz[0], jpoz[1], jpoz[2]);
   legkjatekos = a;
}
}
if(tav < korzet) return legkjatekos;
else return -1;
}

 
Ezt beillesztve a mododba, a parancs helyesen:
 

CMD:bilincsel(playerid)
{
switch(admins[playerid][frakcio])
{
case 4,5,6,7,8,9,10,11,12,13,14,15,16,17,36,37,38,39,40:
{
   if(szolg[playerid] != 1) return SendClientMessage(playerid, piros, \"(( Nem vagy szolgálatban! ))\");
   new bilincselt = LegkozelebbiJatekos(playerid, 2.5);
                        if(bilincselt == -1) return SendClientMessage(playerid, piros, \"(( Nincs a közeledben senki! ))\");
            if(bilincsbe[bilincselt] != 0) return SendClientMessage(playerid, piros, \"(( Õ már meg van bilincselve! ))\");
   bilincsbe[bilincselt] = 1;
   TogglePlayerControllable(bilincselt, 0);
   SetPlayerSpecialAction(bilincselt, SPECIAL_ACTION_CUFFED);
   SetPlayerAttachedObject(bilincselt, 0, 19418, 6, -0.011000, 0.028000, -0.022000, -15.600012, -33.699977, -81.700035, 0.891999, 1.000000, 1.168000);
   SendClientMessage(bilincselt, piros, \"(( Egy rendõr megbilincselt. ))\");
   SendClientMessage(playerid, narancssárga, \"(( Megbilincseltél valakit. ))\");
   cmd_me(playerid, \"megbilincselt valakit.\");
           }
       default: return SendClientMessage(playerid, piros, \"(( Nem vagy megfelelõ frakcióban! ))\");
}
return 1;
}

 
Azt hiszem javítottam rajta egy ici-picit :D
Sajnos most nem tudok mindent elmagyarázni.
Viszont még belefér a szokásos:
Sok szerencsét és további jó scriptelést! :thumbsup:
« Utoljára szerkesztve: 2014. március 29. - 15:38:46 írta KovaNovik »

Legközelebbi játékos probléma.
« Válasz #14 Dátum: 2014. március 29. - 16:13:24 »
0 Show voters
Megolvda, ezer millió hála mindenkinek. Mindenkinek ment a \"+\". Sziasztok! További szép hétvégét és jó scriptelést mindenkinek.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal