Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <mapandreas>
- #define MAX_BOUNCEOBJECTS 70
- #define SPEED 30
- new timer;
- enum ObjectInfo {
- ObjectID,
- bool:created,
- bool:physics,
- Float:gravity,
- Float:bounce_factor,
- Float:vx,
- Float:vy,
- Float:vz,
- Float:radiuss,
- Float:OldZ,
- Multiple,
- Float:friction
- }
- new OBJ[MAX_BOUNCEOBJECTS][ObjectInfo];
- stock FindFree()
- {
- for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
- if(OBJ[i][created] == false) {
- return i;
- }
- }
- return -1;
- }
- public OnFilterScriptInit()
- {
- timer = SetTimer("Bounce",SPEED,1);
- return 1;
- }
- public OnFilterScriptExit()
- {
- Distruggi();
- return 1;
- }
- stock Distruggi()
- {
- KillTimer(timer);
- for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
- if(OBJ[i][created] == true) {
- DestroyObject(OBJ[i][ObjectID]);
- }
- }
- }
- public OnPlayerCommandText(playerid, cmdtext[])
- {
- if(!strcmp(cmdtext, "/throw", true))
- {
- new Float:pX, Float:pY,Float:pZ,Float:ang;
- GetPlayerFacingAngle(playerid, ang);
- GetPlayerPos(playerid,pX,pY,pZ);
- new ID = FindFree();
- if(ID != -1) {
- OBJ[ID][created] = true;
- OBJ[ID][ObjectID] = CreateObject(1578,pX,pY,pZ,0.0,0.0,0.0);
- OBJ[ID][vx] = floatsin(-ang, degrees) * -5.5;
- OBJ[ID][vy] = floatcos(-ang, degrees) * -5.5;
- OBJ[ID][vz] = -3.5;
- OBJ[ID][gravity] = 10.1;
- OBJ[ID][bounce_factor] = 40.49;
- OBJ[ID][radiuss] = 0.2;
- OBJ[ID][friction] = 0.001;
- OBJ[ID][Multiple] = 0;
- OBJ[ID][physics] = true;
- ApplyAnimation(playerid,"GRENADE","WEAPON_throwu",3.0,0,0,0,0,0);
- }
- return 1;
- }
- return 0;
- }
- forward Bounce();
- public Bounce()
- {
- for(new i = 0; i != MAX_BOUNCEOBJECTS; i++) {
- if(OBJ[i][created] == true && OBJ[i][physics] == true) {
- new Float:pos[3],Float:speed,Float:angle,Float:z;
- GetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
- MapAndreas_FindZ_For2DCoord(pos[0],pos[1],z);
- speed = floatsqroot(OBJ[i][vx]*OBJ[i][vx] + OBJ[i][vy]*OBJ[i][vy]);
- if (speed > OBJ[i][friction]) {
- speed -= OBJ[i][friction] * (SPEED/1000.0);
- } else {
- speed = 0;
- }
- angle = atan2(OBJ[i][vy], OBJ[i][vx]);
- OBJ[i][vx] = floatcos(angle, degrees) * speed;
- OBJ[i][vy] = floatsin(angle, degrees) * speed;
- OBJ[i][vz] += OBJ[i][gravity] * (SPEED/1000.0);
- pos[0] -= OBJ[i][vx] * (SPEED/1000.0);
- pos[1] -= OBJ[i][vy] * (SPEED/1000.0);
- pos[2] -= OBJ[i][vz] * (SPEED/1000.0);
- if((pos[2] - OBJ[i][radiuss]) <= z) {
- if(z > (pos[2] - OBJ[i][radiuss]) + 2) {
- OBJ[i][vx] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
- OBJ[i][vy] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
- } else {
- pos[2] = z + OBJ[i][radiuss];
- }
- OBJ[i][vz] *= -OBJ[i][bounce_factor] * (SPEED/1000.0);
- if(++OBJ[i][Multiple] > 1) OBJ[i][physics] = false,SendClientMessage(2,-1,"A");
- } else {
- OBJ[i][Multiple] = 0;
- OBJ[i][OldZ] = z;
- }
- SetObjectPos(OBJ[i][ObjectID],pos[0],pos[1],pos[2]);
- }
- }
- }
- stock Float:frandom(Float:max, Float:min = 0.0, dp = 4)
- {
- new
- Float:mul = floatpower(10.0, dp),
- imin = floatround(min * mul),
- imax = floatround(max * mul)
- ;
- return float(random(imax - imin) + imin) / mul;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement