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):
To se ne zove aktor nego NPC
https://forum.sa-mp.com/showthread.php?t=95034
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
znam ja to sve, nebitno jel actor ili NPC, pitanje je kako ??
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
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;
Moras da napises svoju skriptu, ti mu govoris gde ce se kreirati nemas odredjeno gde moras ...
Ne moze sa aktorom jer ne može da se kreće radi animaciju u mestu
Koji kurac trazis kad nemas blage veze
Malo je teze za tebe ovo da odradis, nauci jos malo pa onda probaj ili smisli neki drugi nacin da uradis to sto hoces...
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]