Advertisement
iJumbo

Bounce object

Jan 20th, 2014
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 3.29 KB | None | 0 0
  1. #include <a_samp>
  2. #include <mapandreas>
  3. #define MAX_BOUNCEOBJECTS 70
  4. #define SPEED 30
  5. new timer;
  6.  
  7. enum ObjectInfo {
  8.     ObjectID,
  9.     bool:created,
  10.     bool:physics,
  11.     Float:gravity,
  12.     Float:bounce_factor,
  13.     Float:vx,
  14.     Float:vy,
  15.     Float:vz,
  16.     Float:radiuss,
  17.     Float:OldZ,
  18.     Multiple,
  19.     Float:friction
  20. }
  21.  
  22. new OBJ[MAX_BOUNCEOBJECTS][ObjectInfo];
  23.  
  24. stock FindFree()
  25. {
  26.     for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
  27.         if(OBJ[i][created] == false) {
  28.             return i;
  29.         }
  30.     }
  31.     return -1;
  32. }
  33. public OnFilterScriptInit()
  34. {
  35.     timer = SetTimer("Bounce",SPEED,1);
  36.     return 1;
  37. }
  38. public OnFilterScriptExit()
  39. {
  40.     Distruggi();
  41.     return 1;
  42. }
  43. stock Distruggi()
  44. {
  45.     KillTimer(timer);
  46.     for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
  47.         if(OBJ[i][created] == true) {
  48.             DestroyObject(OBJ[i][ObjectID]);
  49.         }
  50.     }
  51. }
  52. public OnPlayerCommandText(playerid, cmdtext[])
  53. {
  54.     if(!strcmp(cmdtext, "/throw", true))
  55.     {
  56.         new Float:pX, Float:pY,Float:pZ,Float:ang;
  57.         GetPlayerFacingAngle(playerid, ang);
  58.         GetPlayerPos(playerid,pX,pY,pZ);
  59.         new ID = FindFree();
  60.         if(ID != -1) {
  61.             OBJ[ID][created] = true;
  62.             OBJ[ID][ObjectID] = CreateObject(1578,pX,pY,pZ,0.0,0.0,0.0);
  63.             OBJ[ID][vx] = floatsin(-ang, degrees) * -5.5;
  64.             OBJ[ID][vy] = floatcos(-ang, degrees) * -5.5;
  65.             OBJ[ID][vz] = -3.5;
  66.             OBJ[ID][gravity] = 10.1;
  67.             OBJ[ID][bounce_factor] = 40.49;
  68.             OBJ[ID][radiuss] = 0.2;
  69.             OBJ[ID][friction] =  0.001;
  70.             OBJ[ID][Multiple] = 0;
  71.             OBJ[ID][physics] = true;
  72.             ApplyAnimation(playerid,"GRENADE","WEAPON_throwu",3.0,0,0,0,0,0);
  73.         }
  74.         return 1;
  75.     }
  76.     return 0;
  77. }
  78. forward Bounce();
  79. public Bounce()
  80. {
  81.     for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
  82.         if(OBJ[i][created] == true && OBJ[i][physics] == true) {
  83.             new Float:pos[3],Float:speed,Float:angle,Float:z;
  84.             GetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
  85.             MapAndreas_FindZ_For2DCoord(pos[0],pos[1],z);
  86.             speed = floatsqroot(OBJ[i][vx]*OBJ[i][vx] + OBJ[i][vy]*OBJ[i][vy]);
  87.             if (speed > OBJ[i][friction]) {
  88.                 speed -= OBJ[i][friction] * (SPEED/1000.0);
  89.             } else {
  90.                 speed = 0;
  91.             }
  92.             angle = atan2(OBJ[i][vy], OBJ[i][vx]);
  93.             OBJ[i][vx] = floatcos(angle, degrees) * speed;
  94.             OBJ[i][vy] = floatsin(angle, degrees) * speed;
  95.  
  96.             OBJ[i][vz] += OBJ[i][gravity] * (SPEED/1000.0);
  97.             pos[0] -= OBJ[i][vx] * (SPEED/1000.0);
  98.             pos[1] -= OBJ[i][vy] * (SPEED/1000.0);
  99.             pos[2] -= OBJ[i][vz] * (SPEED/1000.0);
  100.             if((pos[2] - OBJ[i][radiuss]) <= z) {
  101.                 if(z > (pos[2] - OBJ[i][radiuss]) + 2) {
  102.                     OBJ[i][vx] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
  103.                     OBJ[i][vy] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
  104.                 } else {
  105.                     pos[2] = z + OBJ[i][radiuss];
  106.                 }
  107.                 OBJ[i][vz] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
  108.                 if(++OBJ[i][Multiple] > 1) OBJ[i][physics] = false,SendClientMessage(2,-1,"A");
  109.             } else {
  110.                 OBJ[i][Multiple] = 0;
  111.                 OBJ[i][OldZ] = z;
  112.             }
  113.             SetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
  114.         }
  115.     }
  116. }
  117.  
  118.  
  119. stock Float:frandom(Float:max, Float:min = 0.0, dp = 4)
  120. {
  121.     new
  122.         Float:mul = floatpower(10.0, dp),
  123.         imin = floatround(min * mul),
  124.         imax = floatround(max * mul)
  125.     ;
  126.     return float(random(imax - imin) + imin) / mul;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement