linking objects
#1

not sure if anyone has done this before, I've been using AS3 more than pawn these days and thought about what sa-mp should have that AS3 has, and anyway I decided to do object linking so when you move one object another one moves with it.
In flash you can embed symbols(objects) within each other which you cannot do in sa-mp so I made the script in AS3 first because I find it easier.

http://www.sendspace.com/file/3p71om

then I converted it into pawn.

pawn Код:
#define FILTERSCRIPT

#include <a_samp>
#include <sscanf2>
#include <zcmd>
#define PI 3.141592653589793238462643383279502884

#if defined FILTERSCRIPT
new myobject;
public OnFilterScriptInit()
{
    print("\n---------");
    print("testwefaf,m");
    print("---------\n");
   
    new linkobj1 = CreateObject(1272,3,5,5,0,0,0,200.0);
    myobject = CreateObject(1273,5,7,5,0,0,0,200.0);
    LinkObjectToObject(linkobj1,myobject);
   
    SetTimer("Spin",100,1);
    return 1;
}
new spang;
new objectlinks[20];
new objects[20];
//new objectlinkdist[20];
new objectoffset[20];
forward Spin();
public Spin()
{
    spang += 5;
    if(spang >= 360) spang = 0;
    RotateLinkObject(myobject,spang);
}

public OnFilterScriptExit()
{
    return 1;
}
#endif

stock distance(Float:x1,Float:y1,Float:x2,Float:y2,&Float:fl)
{
    new Float:dx, Float:dy;
    dx = x2-x1;
    dy = y2-y1;
    fl = floatsqroot(dx*dx + dy*dy);
}

stock getAngleBetween2Points(Float:x1,Float:y1,Float:x2,Float:y2)
{
    new A = floatround(atan2((y1 - y2), (x1 - x2)) * (180/PI),floatround_floor);
    return A;
}

stock RotateLinkObject(objectid,Float:zr)
{
    if(objectid == 0) return;
    for(new i=0;i<20;i++)
    {
        if(objectlinks[i] == objectid)
        {
            new Float:xp, Float:yp;
            new Float:cx, Float:cy, Float:cz;
            GetObjectPos(objects[i],cx,cy,cz);
            new Float:tx, Float:ty, Float:tz;
            GetObjectPos(objectid,tx,ty,tz);
           
            new Float:tf = zr + objectoffset[i];
            if(tf >= 360.0) tf = 0.0;
           
            new Float:fl;
            distance(cx,cy,tx,ty,fl);
           
            xp = tx + (floatcos(tf * (PI/180)) * fl);
            yp = ty + (floatsin(tf * (PI/180)) * fl);
           
            printf("xp = %f yp = %f rotation = %f",xp,yp,zr);
            SetObjectRot(objects[i],0,0,zr);
            SetObjectPos(objects[i],xp,yp,cz);
        }
    }
    SetObjectRot(objectid,0,0,zr);
}

stock LinkObjectToObject(objectid,targetid)
{
    objects[0] = objectid;
    objectlinks[0] = targetid;
    new Float:cx,Float:cy,Float:cz;
    new Float:tx,Float:ty,Float:tz;
    GetObjectPos(objectid,cx,cy,cz);
    GetObjectPos(objectid,tx,ty,tz);
    objectoffset[0] = getAngleBetween2Points(cx,cy,tx,ty);
}

stock MoveLinkObject(objectid,Float:x,Float:y,Float:z,speed)
{
    for(new i=0;i<20;i++)
    {
        if(objectlinks[i] == objectid)
        {
            new Float:cx, Float:cy, Float:cz;
            GetObjectPos(objects[i],cx,cy,cz);
            new Float:tx, Float:ty, Float:tz;
            GetObjectPos(myobject,tx,ty,tz);
            MoveObject(objects[i],x + (cx-tx),y + (cy-ty),z + (cz-tz),speed);
        }
    }
    MoveObject(objectid,x,y,z,speed);
}

CMD:testmove(playerid,params[])
{
    new Float:cx, Float:cy, Float:cz;
    GetObjectPos(myobject,cx,cy,cz);
    MoveLinkObject(myobject,cx+15,cy,cz,10);
}

CMD:testlinking(playerid,params[])
{
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    new linkobj1 = CreateObject(1272,x+2,y,z,0,0,0,200.0);
    myobject = CreateObject(1273,x+2.5,y+1,z,0,0,0,200.0);
    LinkObjectToObject(linkobj1,myobject);
}
if you want to test it, load it up as a filterscript and type /testlinking and then use /testmove, it'll rotate on its own.

I was going to finish and release it but I'll just leave it for someone else since I won't use it anyway.
Reply
#2

bump just in case someone wants it
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)