GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: tudvari - 2014. szeptember 28. - 21:30:53

Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 28. - 21:30:53
Sziasztok!
Régebben nagyon sokat gondolkodtam azon, hogy a vontatás parancsom miért nem mûködik, pontosabban miért nem mûködik rendeltetés szerûen, és most hosszú szünet után megint el kezdtem rajta gondolkodni, de idáig sikertelenül.
Így gondoltam megosztom veletek, hátha rájöttök a hibára. Elõre is köszönöm a segítséget.
http://pastebin.com/MzeBYQpQ
Cím: Vontatás parancs
Írta: rayle - 2014. szeptember 28. - 21:44:05
Mi a baj vele?
Cím: Vontatás parancs
Írta: KovaNovik - 2014. szeptember 28. - 21:45:08
Nem néztem rendesen át, de mi van, ha kocsi == -1 helyett kocsi == INVALID_VEHICLE_ID-t használsz? Az nem -1, 65535. :)
Hülyeség.
Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 28. - 23:00:47
Igazából eléggé furcsa, mert ilyet még nem tapasztaltam.
Egy játékos tapasztalata:
 
Alapból nem kapcsolja rá a V-s autót ugyan úgy azt írja hogy vontató 89 vontatni való 89
De ha odaállunk egy frakciós vagy munka jármûvel, nagyon közel a V-s autóhoz és úgy próbáljuk meg megint felcsatolni akkor sikeresen felcsatolja és azt írja vontató 89 vontatni való 159 (a v-s autó) így már tudunk vontatni…….Olyan mintha valamiért a frakciós jármûvet akarná rácsatolni de mégis a V-st teszi rá :)
De néha van úgy hogy a frakkisat csatolja rá és ilyenkor egybe megy a két jármû mint egy szendvics…..kb ennyi az észrevétel
[/quote]
A V-s autó annyiból különbözik a sima autótól, hogy a hozzá tartozó változóknál lévõ ID változó értéké nem 0. (de ennek nem kéne befolyásoló tényezõnek lennie.)
A frakciójármû pedig annyiból különbözik, hogy létrehozásukkor eltárolom az id-jüket egy tömbben, hogy késõbb hivatkozni tudjak rájuk.
Cím: Vontatás parancs
Írta: Kovacs_Richard - 2014. szeptember 29. - 10:05:05
ezt próbáld ki:
 
CMD:vontat(playerid)
{
// ha nincs belépve a játékos
if(Belepve[playerid] == 0) { return Logolj(playerid); }
// ha nincs jármûben
if(!IsPlayerInAnyVehicle(playerid)) { return SendClientMessage(playerid,HIBA,\"Nem vagy autóban!\"); }
// játékos jármûvének lekérdezése
new vehid = GetPlayerVehicleID(playerid);
// ha nem vontatóban ül a játékos
if(GetVehicleModel(vehid) != 525) { return SendClientMessage(playerid,HIBA,\"Ez nem vontatókocsi!\"); }
// ha nem vontat a jármû
if(GetVehicleTrailer(vehid) == 0)
{
    new vid = GetClosestVehicle(playerid);
    // ha nincs jármû a közelében
    if(vid == -1 || GetDistanceToVehicle(playerid,vid) > 10.0) { return SendClientMessage(playerid, HIBA, \"A közelben nincs jármû!\"); }
AttachTrailerToVehicle(vid, vehid);
SendClientMessage(playerid,SIKERES,\"Felcsatolva.\");
}
// ha vontat a jármû
else
{
DetachTrailerFromVehicle(vehid);
SendClientMessage(playerid,SIKERES,\"Lecsatolva.\");
}
return 1;
}
stock GetClosestVehicle(playerid)
{
if(!IsPlayerConnected(playerid)) { return -1; } // ha nincs csatlakozva a játékos
// Ezt kihagynám ebben az esetben, mert akkor a játékos a saját autóját vontatná...csak így máshol kell ellenõrizni, hogy jármûben van e
//if(IsPlayerInAnyVehicle(playerid)) { return GetPlayerVehicleID(playerid); } // ha jármûben van a játékos
new closestvehicle = -1; // legközelebbi jármû
new Float:closestdist = 5000.0; // legközelebbi távolság
for(new v = 1; v < MAX_VEHICLES; v++)
{
    if(!GetVehicleModel(v)) { continue; } // Ha nincs létrehozva a jármû
new Float:dist = GetDistanceToVehicle(playerid,v); // a játékos és a jármû közötti távolság lekérdezése
if(dist < closestdist) // ha közelebb van mint az elõzõ \'legközelebbi jármû\'
{
   closestdist = dist;
   closestvehicle = v;
}
}
return closestvehicle; // legközelebbi jármû ID-val tér vissza, vagy ha nincs jármû akkor -1-el
}

 
A tiedében egy elég nagy hiba volt:
 
new kocsi = -1;
if(IsPlayerInAnyVehicle(playerid)) kocsi = GetPlayerVehicleID(playerid);
if(kocsi != -1)
return kocsi;

 
ha jármûben volt akkor a saját jármûvét adta vissza a függvény így azt akarta csatolni...esetleg még egy függvény paraméterrel add, meg hogy saját jármûvet figyeljen e, vagy külön függvényt hozz létre...amit írtam abban a saját jármûvet nem veszi figyelembe
Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 29. - 21:03:00
Te hol láttad ezt a részletet?
Épp az, hogy kikötöttem, hogy jármûben legyen, majd elmentettem az ID-jét, hogy késõbb a ciklusban kiköthessem, hogy a kocsi ne lehessen az a kocsi, amiben õ maga ül.
Cím: Vontatás parancs
Írta: Kovacs_Richard - 2014. szeptember 30. - 08:39:34
ez a 2 sor ugyanaz akkor...szóval felesleges 2x lekérdezni és eltárolni ugyanazt az ID-t...
 
new kocsi = GetClosestVehicle(playerid);
new vehid = GetPlayerVehicleID(playerid);

 
tehát a GetClosestVehicle függvény használata itt felesleges...
Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 30. - 12:24:49
Az jogos, de ettõl még nem fog mûködni a parancs.
(mivel a getclosestvehicle a játékos jármûvét adja vissza, ha jármûben ül.)
 
   if(IsPlayerInAnyVehicle(playerid)) kocsi = GetPlayerVehicleID(playerid);
if(kocsi != -1)
return kocsi;
Cím: Vontatás parancs
Írta: Kovacs_Richard - 2014. szeptember 30. - 12:51:44
írtam 1-et azt próbáld ki mûködik e megfelelõen, ott újra írtam a függvényt
Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 30. - 13:35:07
Majd valamikor megpróbálom. De engem inkább az érdekelne, hogy az enyém miért nem megy.
Cím: Vontatás parancs
Írta: Kovacs_Richard - 2014. szeptember 30. - 14:06:59
na szerintem megtaláltam...
beírtam commentbe:
 
// ha nincs a közelében jármû
// ez hibás...mivel az elõzõ ciklusban az elsõ if miatt az id lehet a saját jármû >>> if(id == -1) { id = x; }
// tehát ez nem fut le soha...plusz ha a saját kocsi 1-es akkor hiába van másik jármû a közelébe mivel
// if(GetDistanceToVehicle(playerid,id) > GetDistanceToVehicle(playerid,x) && kocsi != x)
// feltétel nem lesz igaz ebben az esetben
// tehát saját jármû id után nem ellenõrzi a jármûveket, valószínûleg ez a hiba...
// pl 100-as a kocsi akkor 1-99-ig tudja csatolni, de 100 fölött már nem, mivel a saját kocsinál egyik sem lesz közelebb

 
itt az egész:



// vontat parancs
CMD:vontat(playerid)
{
// Ha a játékos be van lépve
    if(Belepve[playerid]!= 0)
    {
        // Ha a játékos jármûben van
        if(IsPlayerInAnyVehicle(playerid))
        {
            // játékos jármûvének lekérdezése
            new vehid = GetPlayerVehicleID(playerid);
            // Ha vontatóban ül a játékos
            if(GetVehicleModel(vehid) == 525)
            {
                // legközelebbi jármû lekérdezése (ugyanaz mint a játékos jármûve!)
                new kocsi = GetClosestVehicle(playerid);
                // legközelebbi jármû változó
                new id= -1;
                // jármûvek bejárása
                for(new x=0;x<MAX_VEHICLES;x++)
                {
                    // ha közelebb van a játékoshoz a jármû mint 10 méter
                    if(GetDistanceToVehicle(playerid, x) < 10)
                    {
                        // ha a jármû -1
                        if(id == -1)
                        {
                            // legközelebbi jármû változó = éppen ellenõrzött jármû
                            id = x;
                        }
                        // ha a jármû nem -1
                        else
                        {
                            // ha a \'legközelebbi jármû\' messzebb van mint az éppen ellenõrzött jármû ÉS nem a játékos jármûve
                            if(GetDistanceToVehicle(playerid,id) > GetDistanceToVehicle(playerid,x) && kocsi != x)
                            {
                                // legközelebbi jármû változó = éppen ellenõrzött jármû
                                id=x;
                            }
                        }
                    }
                }
                // ha nincs a közelében jármû
      // ez hibás...mivel az elõzõ ciklusban az elsõ if miatt az id lehet a saját jármû >>> if(id == -1) { id = x; }
      // tehát ez nem fut le soha...plusz ha a saját kocsi 1-es akkor hiába van másik jármû a közelébe mivel
      // if(GetDistanceToVehicle(playerid,id) > GetDistanceToVehicle(playerid,x) && kocsi != x)
      // feltétel nem lesz igaz ebben az esetben
      // tehát saját jármû id után nem ellenõrzi a jármûveket, valószínûleg ez a hiba...
      // pl 100-as a kocsi akkor 1-99-ig tudja csatolni, de 100 fölött már nem, mivel a saját kocsinál egyik sem lesz közelebb
                if(id == -1) return SendClientMessage(playerid, HIBA, \"A közelben nincs jármû!\");
      // ha nincs trailer csatolva a játékos jármûvéhez
      if(GetVehicleTrailer(vehid) == 0)
                {
                     // jármû csatolás
                      AttachTrailerToVehicle(id, vehid);
                      SendClientMessage(playerid,SIKERES,\"Felcsatolva.\");
                      new string[256];
                      format(string,sizeof(string),\"TESZT: Vontató: %d | Vontatni való: %d\",kocsi,id);
                      SendClientMessage(playerid,-1,string);
                      return 1;
                }
                // ha van trailer csatolva a játékos jármûvéhez
                else
                {
                    // jármû leválasztása
                      DetachTrailerFromVehicle(vehid);
                    SendClientMessage(playerid,SIKERES,\"Lecsatolva.\");
                   new string[256];
                    format(string,sizeof(string),\"TESZT: Vontató: %d | Vontatni való: %d\",kocsi,id);
                    SendClientMessage(playerid,-1,string);
                    return 1;
      }
   }
            else SendClientMessage(playerid,HIBA,\"Ez nem vontatókocsi!\");
        }
        else SendClientMessage(playerid,HIBA,\"Nem vagy autóban!\");
    }
    else Logolj(playerid);
    return 1;
}

 
 
[mod]Javítottam helyetted a

taget

tagre![/mod]
Cím: Vontatás parancs
Írta: tudvari - 2014. szeptember 30. - 18:18:05
Köszi, valószínûleg ez volt a hiba. Kibõvítettem az elsõ if-et egy kritériummal, hogy az x nem lehet a saját kocsi. Ment a sok +
Cím: Vontatás parancs
Írta: Flash - 2014. október 18. - 19:08:32
[gmod]Zárok![/gmod]