Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: Sinner.man poslato Jun 11, 2020, 18:04:33 POSLE PODNE

Naslov: Kretanje aktora od tacke A do tacke B
Poruka od: Sinner.man poslato Jun 11, 2020, 18:04:33 POSLE PODNE
Problem(error/warning): Pitanje, kako da ubacim aktora u igru koji se krece od tacke A do tacke B i nazad i na kojem mjestu u modu, (ATH MOD)
Dio skripte: [ pawn ]vaš odgovor[ /pawn ]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log): [ code ][ /code ]
Slika/video ingame problema(obavezno ako je ingame problem):
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: ᗪ卂乂 poslato Jun 11, 2020, 18:08:21 POSLE PODNE
To se ne zove aktor nego NPC
https://forum.sa-mp.com/showthread.php?t=95034
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: __vedran.xyz77 poslato Jun 11, 2020, 18:34:40 POSLE PODNE
Citat: ᗪ卂乂 poslato Jun 11, 2020, 18:08:21 POSLE PODNE
To se ne zove aktor nego NPC
https://forum.sa-mp.com/showthread.php?t=95034 (https://forum.sa-mp.com/showthread.php?t=95034)
Tehnicki ako ne zelis NPC-a mozes i sa actorom da uradis posto imas one animacije za hodanje i slicno, upotreba tajmera, animacija moze da uradi nesto slicno sto i NPC-ovi rade a da ti pritom ostane slot
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: Sinner.man poslato Jun 11, 2020, 18:36:15 POSLE PODNE
znam ja to sve, nebitno jel actor ili NPC, pitanje je kako ??
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: __vedran.xyz77 poslato Jun 11, 2020, 18:41:44 POSLE PODNE
Citat: Sinner.man poslato Jun 11, 2020, 18:36:15 POSLE PODNE
znam ja to sve, nebitno jel actor ili NPC, pitanje je kako ??
[pawn]

new actorid;
CMD:startactor(playerid)
{
     actorid = CreateActor(294,5,5,5,5);
     ApplyActorAnimation(actorid,"PED","WALK_gang1",4.1,1,1,1,1,1);
     // procenis koliko mu vremena treba da ode do tacke b
     SetTimerEx("StopActorAnim",10000,false,"i",actorid);
     return(true);
}


forward StopActorAnim(actor);
public StopActorAnim(actor)
{
     printf("Actor je stigao na lokaciju");
     ClearActorAnimations(actor);
     return(true);
}
[/pawn]


Za NPC-ove imas pun kurac tutorijala, udjes ig snimis ga stavis ucitavanje rute koju si snimio konektujes itd
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: Sinner.man poslato Jun 11, 2020, 18:55:42 POSLE PODNE
Citat: //>> Vedran poslato Jun 11, 2020, 18:41:44 POSLE PODNE
[pawn]

new actorid;
CMD:startactor(playerid)
{
     actorid = CreateActor(294,5,5,5,5);
     ApplyActorAnimation(actorid,"PED","WALK_gang1",4.1,1,1,1,1,1);
     // procenis koliko mu vremena treba da ode do tacke b
     SetTimerEx("StopActorAnim",10000,false,"i",actorid);
     return(true);
}


forward StopActorAnim(actor);
public StopActorAnim(actor)
{
     printf("Actor je stigao na lokaciju");
     ClearActorAnimations(actor);
     return(true);
}
[/pawn]


Za NPC-ove imas pun kurac tutorijala, udjes ig snimis ga stavis ucitavanje rute koju si snimio konektujes itd
Pitanja,
gdje u skripti tu podesavam lokacije, odakle-dokle ide,
I treba mi da stalno se krece da se ne zaustavlja, gdje ubacujem ovo new actorid;
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: __vedran.xyz77 poslato Jun 11, 2020, 21:16:45 POSLE PODNE
Moras da napises svoju skriptu, ti mu govoris gde ce se kreirati nemas odredjeno gde moras ...
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: ᗪ卂乂 poslato Jun 12, 2020, 19:39:54 POSLE PODNE
Ne moze sa aktorom jer ne može da se kreće radi animaciju u mestu
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: rane poslato Jun 12, 2020, 23:14:16 POSLE PODNE
Koji kurac trazis kad nemas blage veze
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: ᗪ卂乂 poslato Jun 12, 2020, 23:23:49 POSLE PODNE
Malo je teze za tebe ovo da odradis, nauci jos malo pa onda probaj ili smisli neki drugi nacin da uradis to sto hoces...
Naslov: Odg: Kretanje aktora od tacke A do tacke B
Poruka od: algorhitmically poslato Jun 12, 2020, 23:54:53 POSLE PODNE
Moguce je pomeranje actora.
Na ovaj nacin mu postavljas ugao gledista ka putanji, imas odredjivanje sledeceg koraka i kada se priblizi dovoljno pozvace se cusom callback OnActorMoved.
Dole sam ti napravio komande za test pa mozes isprobati. Ako planiras da koristis ovo uzmi mapandreas i za svaki korak actora mu nadji odredjenu Z poziciju za odredjene XY koordinate kako bi se on kretao uvek po podlozi.  Mozes mu povecati i brzinu(povecas 4 parametar iz funkcije GetXYInFrontOfActor u HandleActorMovement callback-u), takodje i animaciju ali ako je budes menjao lockx i locky parametre drzi na 0 kako se actor ne bi vracao na prvobitne pozicije.
Ovde vidis koncept i kako se radi, na tebi je da li ces koristiti i unaprediti ovo.

Koristenje:
new actor = CreateActor(skin, X, Y, Z, ugao);
MoveActor(actor, 15.0, 15.0);

[pawn]
forward HandleActorMovement(actorid, Float:dX, Float:dY);
forward OnActorMoved(actorid);

new actor, a_timer;

static Float:absoluteangle(Float:a)
{
   while(a < 0.0) a += 360.0;
   while(a > 360.0) a -= 360.0;

   return a;
}

static Float:GetAngleToPoint(Float:fPointX, Float:fPointY, Float:fDestX, Float:fDestY)
{
   return absoluteangle(-(90-(atan2((fDestY - fPointY), (fDestX - fPointX)))));
}

static Float:GetDistanceBetweenTwoPoints(Float:x1, Float:y1, Float:x2, Float:y2)
{
    return floatsqroot(floatabs((floatpower((x2 - x1), 2) + floatpower((y2 - y1), 2))));
}

static GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance)
{
    new Float:a;
    GetActorPos(actorid, x, y, a);
    GetActorFacingAngle(actorid, a);
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
}

static MoveActor(actorid, Float:PosX, Float:PosZ)
{
   if(IsValidActor(actorid))
   {
       if(a_timer)
       {
           KillTimer(a_timer);
       }
       a_timer = SetTimerEx("HandleActorMovement", 800, true, "iff", actorid, PosX, PosZ);
       return 1;
    }
    return 0;
}

public HandleActorMovement(actorid, Float:dX, Float:dY)
{
    new Float:X, Float:Y, Float:Z, Float:x, Float:y;
    GetActorPos(actorid, X, Y, Z);
    SetActorFacingAngle(actorid, GetAngleToPoint(X, Y, dX, dY));
    GetXYInFrontOfActor(actorid, x, y, 0.9);
    SetActorPos(actorid, x, y, Z);
    ApplyActorAnimation(actorid, "PED", "WALK_civi", 4.0, 1, 1, 1, 0, 0);
    if(GetDistanceBetweenTwoPoints(X, Y, dX, dY) <= 3.0)
    {
        if(a_timer)
        {
            KillTimer(a_timer);
      }
        ClearActorAnimations(actorid);
      OnActorMoved(actorid);
   }
   return 1;
}

public OnActorMoved(actorid)
{
   SendClientMessageToAll(-1, "Pomerio se.");
   // Kada actor zavrsi sa kretanjem
   return 1;
}

/*----------------------------
   Komande za testiranje
-----------------------------*/

CMD:newactor(playerid, params[])
{
   CreateActor(294, 15.0, 15.0, 5.0, 0.0);
   return 1;
}

CMD:moveactor(playerid, params[])
{
    MoveActor(actor, 30.0, 30.0);
   return 1;
}

CMD:moveactor2(playerid, params[])
{
    MoveActor(actor, 45.0, 15.0);
   return 1;
[/pawn]