Advertisement
LatinZ

s_actors.inc - Create actors unlimitedly! (YSI)

Jul 6th, 2016
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.84 KB | None | 0 0
  1. /*
  2. * s_actors.inc version YSI.
  3. * Create actors unlimitedly!
  4. *
  5. * Thanks for the base include:
  6. * Emmet_,
  7. * Abagail,
  8. * Kar,
  9. * kvanningsen,
  10. * ziggi.
  11. *
  12. * LatinZ: Restructuring of the entire code and new features added.
  13. *
  14. * Created on April 30, 2015 @ 7:21 AM.
  15. * Last updated on 06/07/2016 9:40 PM.
  16. */
  17.  
  18. // Maximum amount of allocated slots.
  19. #if !defined MAX_DYNAMIC_ACTORS
  20. #define MAX_DYNAMIC_ACTORS (2000)
  21. #endif
  22.  
  23. // Maximum stream distance.
  24. #if !defined MAX_ACTOR_STREAM_DISTANCE
  25. #define MAX_ACTOR_STREAM_DISTANCE (50.0) // Distance which the actor is removed recommend 50 meters and it is not so far and so close.
  26. #endif
  27.  
  28. // " task " for check actor's.
  29. #if !defined ACTOR_STREAM_TICK_RATE
  30. #define ACTOR_STREAM_TICK_RATE (250) // 250 miliseconds.
  31. #endif
  32.  
  33. // Maximum actor's per area
  34.  
  35. #if !defined MAX_ACTORS_AREA
  36. #define MAX_ACTORS_AREA (50) // 50 actors per area, Not exceed 50 or emerge bug's strange.
  37. #endif
  38.  
  39. // Height of label NAME.
  40.  
  41. #if !defined HEIGHT_LABEL_NAME
  42. #define HEIGHT_LABEL_NAME (1.1) // Recommended 1.1, default height of the players.
  43. #endif
  44.  
  45. // Viewing distance to the label name.
  46.  
  47. #if !defined VIEWING_DISTANCE_LABEL_NAME
  48. #define VIEWING_DISTANCE_LABEL_NAME (15.0) // 15 meters, change to taste.
  49. #endif
  50.  
  51. // Height of label " say ".
  52.  
  53. #if !defined HEIGHT_LABEL_SAY
  54. #define HEIGHT_LABEL_SAY (1.2) // Recommended 1.2, change to taste.
  55. #endif
  56.  
  57. // Viewing distance to the label " say ".
  58.  
  59. #if !defined VIEWING_DISTANCE_LABEL_SAY
  60. #define VIEWING_DISTANCE_LABEL_SAY (20.0) // 20 meters, change to taste.
  61. #endif
  62.  
  63. // Viewing distance to the label " say ".
  64.  
  65. #if !defined TIME_HIDE_LABEL_SAY
  66. #define TIME_HIDE_LABEL_SAY (5000) // 5 seconds... change to taste.
  67. #endif
  68.  
  69. // Time of spawn (function SpawnDynamicActor)
  70.  
  71. #if !defined TIME_DEFAULT_SPAWN
  72. #define TIME_DEFAULT_SPAWN (4000) // 4 seconds... change to taste.
  73. #endif
  74.  
  75. // Internal defines
  76.  
  77. #define MAX_DYNAMIC_ACTOR_ANIM_LIB_NAME (32)
  78. #define MAX_DYNAMIC_ACTOR_ANIM_NAME (32)
  79.  
  80. enum e_DynamicActors {
  81. e_iName[MAX_PLAYER_NAME],
  82. e_iColor,
  83. e_iActorModel,
  84. e_iActorWorld,
  85. e_iActorID,
  86. bool:e_iSlotUsed,
  87. bool:e_Destroy,
  88. bool:e_bInvulnerable,
  89. Float:e_fActorX,
  90. Float:e_fActorY,
  91. Float:e_fActorZ,
  92. Float:e_fActorA,
  93. Float:e_fActorHealth,
  94. Float:e_fOffSetLabel[3],
  95. STREAMER_TAG_3D_TEXT_LABEL e_iLabel,
  96. STREAMER_TAG_3D_TEXT_LABEL e_iLabelText,
  97. STREAMER_TAG_3D_TEXT_LABEL e_iLabelName,
  98. };
  99.  
  100. enum e_AnimationInfo {
  101. e_sAnimLibrary[MAX_DYNAMIC_ACTOR_ANIM_LIB_NAME char],
  102. e_sAnimName[MAX_DYNAMIC_ACTOR_ANIM_NAME char],
  103. e_iAnimLockX,
  104. e_iAnimLockY,
  105. e_iAnimFreeze,
  106. e_iAnimTime,
  107. bool:e_bAnimation,
  108. Float:e_fAnimDelta,
  109. };
  110.  
  111. static
  112. s_DynamicActors[MAX_DYNAMIC_ACTORS][e_DynamicActors],
  113. s_ActorAnimation[MAX_DYNAMIC_ACTORS][e_AnimationInfo];
  114.  
  115. new
  116. _actors_amount;
  117.  
  118. // Loop of actor's
  119.  
  120. #define _Search_Slot(%0) \
  121. for(new %0 = 0; %0 < MAX_DYNAMIC_ACTORS; %0 ++)
  122.  
  123. #define Loop_Only_Dynamic_Actors(%0) \
  124. for(new %0 = 0; %0 <= _actors_amount; %0 ++)
  125.  
  126. forward OnDynamicActorStreamIn(actorid, forplayerid);
  127. forward OnDynamicActorStreamOut(actorid, forplayerid);
  128. forward OnPlayerGiveDamageDynamicActor(playerid, actorid, Float:amount, weaponid, bodypart);
  129. forward OnDynamicActorDeath(actorid, killerid, weaponid);
  130. forward OnDynamicActorSpawn(actorid);
  131.  
  132. public OnFilterScriptExit()
  133. {
  134. Loop_Only_Dynamic_Actors(i) {
  135. if(s_DynamicActors[i][e_iSlotUsed]) DestroyDynamicActor(i);
  136. }
  137.  
  138. #if defined AS_OnFilterScriptExit
  139. return AS_OnFilterScriptExit();
  140. #else
  141. return true;
  142. #endif
  143. }
  144.  
  145. public OnGameModeExit()
  146. {
  147. Loop_Only_Dynamic_Actors(i) {
  148. if(s_DynamicActors[i][e_iSlotUsed]) DestroyDynamicActor(i);
  149. }
  150.  
  151. #if defined AS_OnGameModeExit
  152. return AS_OnGameModeExit();
  153. #else
  154. return true;
  155. #endif
  156. }
  157.  
  158. stock CreateDynamicActor(name[MAX_PLAYER_NAME], modelid, Float:x, Float:y, Float:z, Float:angle, worldid = 0, bool:invulnerable = true, Float:health = 100.0)
  159. {
  160. new amount = 0;
  161. foreach(new i : Player) {
  162. Loop_Only_Dynamic_Actors(a) {
  163. if(IsDynamicActorInStreamRange(a, i)) amount++;
  164. if(amount == MAX_ACTORS_AREA) return printf("It has reached the maximum of actors in area: X: %f Y: %f Z: %f", x, y, z);
  165. }
  166. }
  167. new slot = INVALID_ACTOR_ID;
  168. _Search_Slot(i) {
  169. if(!s_DynamicActors[i][e_iSlotUsed]) {
  170. slot = i;
  171. break;
  172. }
  173. }
  174. new _name = GetDynamicActorID(name);
  175. if(slot > 0 && _name >= 0) return false;
  176. if(slot == INVALID_ACTOR_ID) return false;
  177. s_DynamicActors[slot][e_iName] = name;
  178. s_DynamicActors[slot][e_iColor] = -1;
  179. s_DynamicActors[slot][e_iLabelName] = CreateDynamic3DTextLabel(name, -1, x, y, z + HEIGHT_LABEL_NAME, VIEWING_DISTANCE_LABEL_NAME);
  180. s_DynamicActors[slot][e_iSlotUsed] = true;
  181. s_DynamicActors[slot][e_iActorModel] = modelid;
  182. s_DynamicActors[slot][e_fActorX] = x;
  183. s_DynamicActors[slot][e_fActorY] = y;
  184. s_DynamicActors[slot][e_fActorZ] = z;
  185. s_DynamicActors[slot][e_fActorA] = angle;
  186. s_DynamicActors[slot][e_iActorWorld] = worldid;
  187. s_DynamicActors[slot][e_bInvulnerable] = invulnerable;
  188. s_DynamicActors[slot][e_fActorHealth] = health;
  189. s_DynamicActors[slot][e_iActorID] = CreateActor(s_DynamicActors[slot][e_iActorModel], s_DynamicActors[slot][e_fActorX], s_DynamicActors[slot][e_fActorY], s_DynamicActors[slot][e_fActorZ], s_DynamicActors[slot][e_fActorA]);
  190. s_DynamicActors[slot][e_Destroy] = false;
  191. _actors_amount++;
  192. SetActorVirtualWorld(s_DynamicActors[slot][e_iActorID], worldid);
  193. SetActorHealth(s_DynamicActors[slot][e_iActorID], health);
  194. SetActorInvulnerable(s_DynamicActors[slot][e_iActorID], invulnerable);
  195. return slot;
  196. }
  197.  
  198. stock IsValidDynamicActor(actorid)
  199. {
  200. if(actorid < 0 || actorid > MAX_DYNAMIC_ACTORS || !s_DynamicActors[actorid][e_iSlotUsed] || s_DynamicActors[actorid][e_iActorID] == INVALID_ACTOR_ID) return false;
  201. return true;
  202. }
  203.  
  204. stock DestroyDynamicActor(actorid)
  205. {
  206. if(!IsValidDynamicActor(actorid)) return false;
  207. DestroyActor(s_DynamicActors[actorid][e_iActorID]);
  208. ClearDynamicActorAnimations(actorid);
  209. DeleteDynamicActor3DTextLabel(actorid);
  210. s_DynamicActors[actorid][e_iName] = -1;
  211. s_DynamicActors[actorid][e_iColor] = -1;
  212. s_DynamicActors[actorid][e_iSlotUsed] = false;
  213. s_DynamicActors[actorid][e_iActorModel] = -1;
  214. s_DynamicActors[actorid][e_fActorX] = -1;
  215. s_DynamicActors[actorid][e_fActorY] = -1;
  216. s_DynamicActors[actorid][e_fActorZ] = -1;
  217. s_DynamicActors[actorid][e_fActorA] = -1;
  218. s_DynamicActors[actorid][e_iActorWorld] = -1;
  219. s_DynamicActors[actorid][e_bInvulnerable] = false;
  220. s_DynamicActors[actorid][e_fActorHealth] = -1;
  221. s_DynamicActors[actorid][e_iActorID] = INVALID_ACTOR_ID;
  222. _actors_amount--;
  223. return true;
  224. }
  225.  
  226. stock IsDynamicActorStreamedIn(actorid, forplayerid)
  227. {
  228. if(!IsValidDynamicActor(actorid)) return false;
  229. return IsActorStreamedIn(s_DynamicActors[actorid][e_iActorID], forplayerid);
  230. }
  231.  
  232. stock IsDynamicActorInStreamRange(actorid, forplayerid)
  233. {
  234. if(!IsValidDynamicActor(actorid)) return false;
  235. if(s_DynamicActors[actorid][e_iActorWorld] != GetPlayerVirtualWorld(forplayerid)) return false;
  236. if(IsPlayerInRangeOfPoint(forplayerid, MAX_ACTOR_STREAM_DISTANCE, s_DynamicActors[actorid][e_fActorX], s_DynamicActors[actorid][e_fActorY], s_DynamicActors[actorid][e_fActorZ])) return true;
  237. return false;
  238. }
  239.  
  240. stock SetDynamicActorVirtualWorld(actorid, worldid)
  241. {
  242. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  243. s_DynamicActors[actorid][e_iActorWorld] = worldid;
  244. SetActorVirtualWorld(s_DynamicActors[actorid][e_iActorID], worldid);
  245. return true;
  246. }
  247.  
  248. stock GetDynamicActorVirtualWorld(actorid)
  249. {
  250. if(!IsValidDynamicActor(actorid)) return false;
  251. return s_DynamicActors[actorid][e_iActorWorld];
  252. }
  253.  
  254. stock ApplyDynamicActorAnimation(actorid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time)
  255. {
  256. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  257. if(loop) {
  258. strpack(s_ActorAnimation[actorid][e_sAnimLibrary], animlib, MAX_DYNAMIC_ACTOR_ANIM_LIB_NAME);
  259. strpack(s_ActorAnimation[actorid][e_sAnimName], animname, MAX_DYNAMIC_ACTOR_ANIM_NAME);
  260. s_ActorAnimation[actorid][e_bAnimation] = true;
  261. s_ActorAnimation[actorid][e_fAnimDelta] = fDelta;
  262. s_ActorAnimation[actorid][e_iAnimLockX] = lockx;
  263. s_ActorAnimation[actorid][e_iAnimLockY] = locky;
  264. s_ActorAnimation[actorid][e_iAnimFreeze] = freeze;
  265. s_ActorAnimation[actorid][e_iAnimTime] = time;
  266. ApplyActorAnimation(s_DynamicActors[actorid][e_iActorID], animlib, animname, fDelta, loop, lockx, locky, freeze, time);
  267. }
  268. return ApplyActorAnimation(s_DynamicActors[actorid][e_iActorID], animlib, animname, fDelta, loop, lockx, locky, freeze, time);
  269. }
  270.  
  271. stock ClearDynamicActorAnimations(actorid)
  272. {
  273. if(!IsValidDynamicActor(actorid)) return false;
  274. if(s_ActorAnimation[actorid][e_bAnimation])
  275. {
  276. s_ActorAnimation[actorid][e_bAnimation] = false;
  277. s_ActorAnimation[actorid][e_fAnimDelta] = 0.0;
  278. s_ActorAnimation[actorid][e_iAnimLockX] = 0;
  279. s_ActorAnimation[actorid][e_iAnimLockY] = 0;
  280. s_ActorAnimation[actorid][e_iAnimFreeze] = 0;
  281. s_ActorAnimation[actorid][e_iAnimTime] = 0;
  282. }
  283. return ClearActorAnimations(s_DynamicActors[actorid][e_iActorID]);
  284. }
  285.  
  286. stock SetDynamicActorPos(actorid, Float:x, Float:y, Float:z)
  287. {
  288. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  289. s_DynamicActors[actorid][e_fActorX] = x;
  290. s_DynamicActors[actorid][e_fActorY] = y;
  291. s_DynamicActors[actorid][e_fActorZ] = z;
  292. s_DynamicActors[actorid][e_fOffSetLabel][0] = s_DynamicActors[actorid][e_fOffSetLabel][0] + x;
  293. s_DynamicActors[actorid][e_fOffSetLabel][1] = s_DynamicActors[actorid][e_fOffSetLabel][1] + y;
  294. s_DynamicActors[actorid][e_fOffSetLabel][2] = s_DynamicActors[actorid][e_fOffSetLabel][2] + z;
  295. if(IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel])) SetDynamic3DTextPos(s_DynamicActors[actorid][e_iLabel], s_DynamicActors[actorid][e_fOffSetLabel][0], s_DynamicActors[actorid][e_fOffSetLabel][1], s_DynamicActors[actorid][e_fOffSetLabel][2]);
  296. if(IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelName])) SetDynamic3DTextPos(s_DynamicActors[actorid][e_iLabelName], x, y, z + HEIGHT_LABEL_NAME);
  297. return SetActorPos(s_DynamicActors[actorid][e_iActorID], x, y, z);
  298. }
  299.  
  300. stock GetDynamicActorPos(actorid, &Float:x, &Float:y, &Float:z)
  301. {
  302. if(!IsValidDynamicActor(actorid)) return false;
  303. x = s_DynamicActors[actorid][e_fActorX];
  304. y = s_DynamicActors[actorid][e_fActorY];
  305. z = s_DynamicActors[actorid][e_fActorZ];
  306. return true;
  307. }
  308.  
  309. stock SetDynamicActorFacingAngle(actorid, Float:angle)
  310. {
  311. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  312. s_DynamicActors[actorid][e_fActorA] = angle;
  313. return _Debug();
  314. }
  315.  
  316. stock GetDynamicActorFacingAngle(actorid, &Float:angle)
  317. {
  318. if(!IsValidDynamicActor(actorid)) return false;
  319. angle = s_DynamicActors[actorid][e_fActorA];
  320. return true;
  321. }
  322.  
  323. stock SetDynamicActorSkin(actorid, skinid)
  324. {
  325. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  326. s_DynamicActors[actorid][e_iActorModel] = skinid;
  327. return _Debug();
  328. }
  329.  
  330. stock GetDynamicActorSkin(actorid)
  331. {
  332. if(!IsValidDynamicActor(actorid)) return false;
  333. return s_DynamicActors[actorid][e_iActorModel];
  334. }
  335.  
  336. stock IsDynamicActorDead(actorid)
  337. {
  338. if(!IsValidDynamicActor(actorid) || s_DynamicActors[actorid][e_fActorHealth] > 0) return false;
  339. return true;
  340. }
  341.  
  342. stock SetDynamicActorHealth(actorid, Float:health)
  343. {
  344. if(!IsValidDynamicActor(actorid) || s_DynamicActors[actorid][e_bInvulnerable]) return false;
  345. s_DynamicActors[actorid][e_fActorHealth] = health;
  346. if(s_DynamicActors[actorid][e_fActorHealth] < 1)
  347. {
  348. SetActorHealth(actorid, 0.0);
  349. s_DynamicActors[actorid][e_fActorHealth] = 0.0;
  350. return CallLocalFunction("OnPlayerGiveDamageActor", "i", actorid);
  351. }
  352. return SetActorHealth(s_DynamicActors[actorid][e_iActorID], health);
  353. }
  354.  
  355. stock GetDynamicActorHealth(actorid, &Float:health)
  356. {
  357. if(!IsValidDynamicActor(actorid)) return false;
  358. return GetActorHealth(s_DynamicActors[actorid][e_iActorID], s_DynamicActors[actorid][e_fActorHealth]);
  359. }
  360.  
  361. stock SetDynamicActorInvulnerable(actorid, bool:invulnerable = true)
  362. {
  363. if(!IsValidDynamicActor(actorid) || IsDynamicActorDead(actorid)) return false;
  364. s_DynamicActors[actorid][e_bInvulnerable] = invulnerable;
  365. return SetActorInvulnerable(actorid, invulnerable);
  366. }
  367.  
  368. stock IsDynamicActorInvulnerable(actorid)
  369. {
  370. if(!IsValidDynamicActor(actorid)) return false;
  371. if(!s_DynamicActors[actorid][e_bInvulnerable]) return false;
  372. return true;
  373. }
  374.  
  375. stock AttachDynamicActor3DTextLabel(actorid, text[], color, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:distance = VIEWING_DISTANCE_LABEL_NAME)
  376. {
  377. if(!IsValidDynamicActor(actorid) || IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel])) return false;
  378. new Float:pos3D[3];
  379. GetDynamicActorPos(actorid, pos3D[0], pos3D[1], pos3D[2]);
  380. s_DynamicActors[actorid][e_fOffSetLabel][0] = fOffsetX;
  381. s_DynamicActors[actorid][e_fOffSetLabel][1] = fOffsetY;
  382. s_DynamicActors[actorid][e_fOffSetLabel][2] = (0.8) + fOffsetZ;
  383. s_DynamicActors[actorid][e_iLabel] = CreateDynamic3DTextLabel(text, color, pos3D[0] + fOffsetX, pos3D[1] + fOffsetY, (pos3D[2] + 0.8) + fOffsetZ, distance);
  384. return true;
  385. }
  386.  
  387. stock UpdateDynamicActor3DTextLabel(actorid, color, text[])
  388. {
  389. if(!IsValidDynamicActor(actorid) || !IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel])) return false;
  390. return UpdateDynamic3DTextLabelText(s_DynamicActors[actorid][e_iLabel], color, text);
  391. }
  392.  
  393. stock DeleteDynamicActor3DTextLabel(actorid)
  394. {
  395. if(!IsValidDynamicActor(actorid) || !IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel])) return false;
  396. return DestroyDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel]);
  397. }
  398.  
  399. stock SetDynamicActorName(actorid, name[MAX_PLAYER_NAME])
  400. {
  401. if(!IsValidDynamicActor(actorid)) return false;
  402. s_DynamicActors[actorid][e_iName] = name;
  403. return UpdateDynamic3DTextLabelText(s_DynamicActors[actorid][e_iLabelName], s_DynamicActors[actorid][e_iColor], name);
  404. }
  405.  
  406. stock SetDynamicActorColor(actorid, color)
  407. {
  408. if(!IsValidDynamicActor(actorid)) return false;
  409. s_DynamicActors[actorid][e_iColor] = color;
  410. return UpdateDynamic3DTextLabelText(s_DynamicActors[actorid][e_iLabelName], color, s_DynamicActors[actorid][e_iName]);
  411. }
  412.  
  413. stock GetDynamicActorInternalID(actorid)
  414. {
  415. if(!IsValidDynamicActor(actorid)) return false;
  416. return s_DynamicActors[actorid][e_iActorID];
  417. }
  418.  
  419. stock GetDynamicActorName(actorid)
  420. {
  421. //if(!IsValidDynamicActor(actorid)) return false;
  422. new _name[MAX_PLAYER_NAME];
  423. format(_name, sizeof(_name), "%s", s_DynamicActors[actorid][e_iName]);
  424. return _name;
  425. }
  426.  
  427. stock GetDynamicActorID(name[MAX_PLAYER_NAME])
  428. {
  429. Loop_Only_Dynamic_Actors(a) {
  430. if(IsValidDynamicActor(a)) {
  431. if(strcmp(name, s_DynamicActors[a][e_iName], true) == 0) return a;
  432. }
  433. }
  434. return -1;
  435. }
  436.  
  437. stock IsPlayerInRangeOfDynamicActor(playerid, actorid, Float:range = 7.0)
  438. {
  439. if(!IsValidDynamicActor(actorid) || s_DynamicActors[actorid][e_iActorWorld] != GetPlayerVirtualWorld(playerid)) return false;
  440. if(IsPlayerInRangeOfPoint(playerid, range, s_DynamicActors[actorid][e_fActorX], s_DynamicActors[actorid][e_fActorY], s_DynamicActors[actorid][e_fActorZ])) return true;
  441. return false;
  442. }
  443.  
  444. stock DynamicActorSay(actorid, text[], color, Float:distance = VIEWING_DISTANCE_LABEL_SAY)
  445. {
  446. if(!IsValidDynamicActor(actorid) || IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelText]) || IsDynamicActorDead(actorid)) return false;
  447. new Float:pos3D[3];
  448. GetDynamicActorPos(actorid, pos3D[0], pos3D[1], pos3D[2]);
  449. s_DynamicActors[actorid][e_iLabelText] = CreateDynamic3DTextLabel(text, color, pos3D[0], pos3D[1], (pos3D[2] + HEIGHT_LABEL_SAY), distance);
  450. defer DeleteDynamicActorSay(actorid);
  451. return true;
  452. }
  453. stock SpawnDynamicActor(actorid, skinid, Float:x, Float:y, Float:z, Float:angle, worldid = 0, bool:invulnerable = true, Float:health = 100.0)
  454. {
  455. if(!IsValidDynamicActor(actorid)) return false;
  456. s_DynamicActors[actorid][e_iActorModel] = skinid;
  457. s_DynamicActors[actorid][e_fActorX] = x;
  458. s_DynamicActors[actorid][e_fActorY] = y;
  459. s_DynamicActors[actorid][e_fActorZ] = z;
  460. s_DynamicActors[actorid][e_fActorA] = angle;
  461. s_DynamicActors[actorid][e_iActorWorld] = worldid;
  462. s_DynamicActors[actorid][e_bInvulnerable] = invulnerable;
  463. s_DynamicActors[actorid][e_fActorHealth] = health;
  464. s_DynamicActors[actorid][e_fOffSetLabel][0] = s_DynamicActors[actorid][e_fOffSetLabel][0] + x;
  465. s_DynamicActors[actorid][e_fOffSetLabel][1] = s_DynamicActors[actorid][e_fOffSetLabel][1] + y;
  466. s_DynamicActors[actorid][e_fOffSetLabel][2] = s_DynamicActors[actorid][e_fOffSetLabel][2] + z;
  467. defer _SpawnDynamicActor(s_DynamicActors[actorid][e_iActorID]);
  468. return true;
  469. }
  470.  
  471. stock SetDynamic3DTextPos(Text3D:id,Float:x,Float:y,Float:z) {
  472. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL,id,E_STREAMER_X,x);
  473. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL,id,E_STREAMER_Y,y);
  474. Streamer_SetFloatData(STREAMER_TYPE_3D_TEXT_LABEL,id,E_STREAMER_Z,z);
  475. }
  476.  
  477. task UpdateActorStream[ACTOR_STREAM_TICK_RATE]()
  478. {
  479. Loop_Only_Dynamic_Actors(actorid) {
  480. if(IsValidDynamicActor(actorid)) {
  481. #if defined _inc_foreach
  482. foreach (new i : Player) {
  483. #else
  484. for (new i = GetPlayerPoolSize(); i != -1; i--) {
  485. if (!IsPlayerConnected(i) || IsPlayerNPC(i)) {
  486. continue;
  487. }
  488. #endif
  489. if(!IsDynamicActorInStreamRange(actorid, i)) {
  490. DestroyActor(s_DynamicActors[actorid][e_iActorID]);
  491. s_DynamicActors[actorid][e_Destroy] = true;
  492. }
  493. }
  494. if(s_DynamicActors[actorid][e_Destroy] == false) return false;
  495. _CreateActor(s_DynamicActors[actorid][e_iActorID], s_DynamicActors[actorid][e_iActorModel], s_DynamicActors[actorid][e_fActorA]);
  496. }
  497. }
  498. return true;
  499. }
  500.  
  501. forward _CreateActor(actorid, skinid, Float:angle);
  502. public _CreateActor(actorid, skinid, Float:angle)
  503. {
  504. new internal_actor;
  505. internal_actor = CreateActor(skinid, s_DynamicActors[actorid][e_fActorX], s_DynamicActors[actorid][e_fActorY], s_DynamicActors[actorid][e_fActorZ], angle);
  506. if(internal_actor == INVALID_ACTOR_ID) return printf("[Error] Could not stream dynamic actor %d. The SA-MP limit has been reached.", actorid);
  507. if (s_DynamicActors[actorid][e_iActorWorld] != -1) SetActorVirtualWorld(internal_actor, s_DynamicActors[actorid][e_iActorWorld]);
  508. if(s_ActorAnimation[actorid][e_bAnimation]) {
  509. ApplyActorAnimation(internal_actor, s_ActorAnimation[actorid][e_sAnimLibrary], s_ActorAnimation[actorid][e_sAnimName], s_ActorAnimation[actorid][e_fAnimDelta], true, s_ActorAnimation[actorid][e_iAnimLockX], s_ActorAnimation[actorid][e_iAnimLockY], s_ActorAnimation[actorid][e_iAnimFreeze], s_ActorAnimation[actorid][e_iAnimTime]);
  510. }
  511. else ApplyActorAnimation(internal_actor, s_ActorAnimation[actorid][e_sAnimLibrary], s_ActorAnimation[actorid][e_sAnimName], s_ActorAnimation[actorid][e_fAnimDelta], false, s_ActorAnimation[actorid][e_iAnimLockX], s_ActorAnimation[actorid][e_iAnimLockY], s_ActorAnimation[actorid][e_iAnimFreeze], s_ActorAnimation[actorid][e_iAnimTime]);
  512. SetActorInvulnerable(internal_actor, s_DynamicActors[actorid][e_bInvulnerable]);
  513. SetActorHealth(internal_actor, s_DynamicActors[actorid][e_fActorHealth]);
  514. return s_DynamicActors[actorid][e_Destroy] = false;
  515. }
  516.  
  517. public OnActorStreamIn(actorid, forplayerid)
  518. {
  519.  
  520. if(IsValidDynamicActor(actorid) && s_DynamicActors[actorid][e_iActorID] == actorid) {
  521. CallLocalFunction("OnDynamicActorStreamIn", "ii", actorid, forplayerid);
  522. }
  523.  
  524. #if defined AS_OnActorStreamIn
  525. return AS_OnActorStreamIn(actorid, playerid);
  526. #else
  527. return true;
  528. #endif
  529. }
  530.  
  531. public OnActorStreamOut(actorid, forplayerid)
  532. {
  533.  
  534. if(IsValidDynamicActor(actorid) && s_DynamicActors[actorid][e_iActorID] == actorid) {
  535. CallLocalFunction("OnDynamicActorStreamOut", "ii", actorid, forplayerid);
  536. }
  537.  
  538. #if defined AS_OnActorStreamOut
  539. return AS_OnActorStreamOut(actorid, playerid);
  540. #else
  541. return true;
  542. #endif
  543. }
  544.  
  545. public OnPlayerGiveDamageActor(playerid, damaged_actorid, Float:amount, weaponid, bodypart)
  546. {
  547. if(s_DynamicActors[damaged_actorid][e_bInvulnerable]) return false;
  548. s_DynamicActors[damaged_actorid][e_fActorHealth] = s_DynamicActors[damaged_actorid][e_fActorHealth] - amount;
  549. SetActorHealth(s_DynamicActors[damaged_actorid][e_iActorID], s_DynamicActors[damaged_actorid][e_fActorHealth]);
  550. if(s_DynamicActors[damaged_actorid][e_fActorHealth] < 1)
  551. {
  552. ClearDynamicActorAnimations(s_DynamicActors[damaged_actorid][e_iActorID]);
  553. DeleteDynamicActor3DTextLabel(s_DynamicActors[damaged_actorid][e_iActorID]);
  554. _DeleteDynamicActorSay(s_DynamicActors[damaged_actorid][e_iActorID]);
  555. SetActorHealth(s_DynamicActors[damaged_actorid][e_iActorID], 0.0);
  556. s_DynamicActors[damaged_actorid][e_fActorHealth] = 0.0;
  557. return CallLocalFunction("OnDynamicActorDeath", "iii", damaged_actorid, playerid, weaponid);
  558. }
  559. if(IsValidDynamicActor(damaged_actorid) && s_DynamicActors[damaged_actorid][e_iActorID] == damaged_actorid) {
  560. CallLocalFunction("OnPlayerGiveDamageDynamicActor", "iifii", playerid, damaged_actorid, amount, weaponid, bodypart);
  561. }
  562.  
  563. #if defined AS_OnPlayerGiveDamageActor
  564. return AS_OnPlayerGiveDamageActor(playerid, damaged_actorid, amount, weaponid, bodypart);
  565. #else
  566. return true;
  567. #endif
  568. }
  569.  
  570. timer DeleteDynamicActorSay[TIME_HIDE_LABEL_SAY](actorid)
  571. {
  572. if(!IsValidDynamicActor(actorid) || !IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelText]) || s_DynamicActors[actorid][e_iActorID] == INVALID_ACTOR_ID) return false;
  573. return DestroyDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelText]);
  574. }
  575.  
  576. timer _SpawnDynamicActor[TIME_DEFAULT_SPAWN](actorid)
  577. {
  578. if(!IsValidDynamicActor(actorid)) return false;
  579. if(IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabel])) SetDynamic3DTextPos(s_DynamicActors[actorid][e_iLabel], s_DynamicActors[actorid][e_fOffSetLabel][0], s_DynamicActors[actorid][e_fOffSetLabel][1], s_DynamicActors[actorid][e_fOffSetLabel][2]);
  580. if(IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelName])) SetDynamic3DTextPos(s_DynamicActors[actorid][e_iLabelName], s_DynamicActors[actorid][e_fActorX], s_DynamicActors[actorid][e_fActorY], s_DynamicActors[actorid][e_fActorZ] + HEIGHT_LABEL_NAME);
  581. _Debug();
  582. return CallLocalFunction("OnDynamicActorSpawn", "i", actorid);
  583. }
  584.  
  585. stock _DeleteDynamicActorSay(actorid)
  586. {
  587. if(!IsValidDynamicActor(actorid) || !IsValidDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelText]) || s_DynamicActors[actorid][e_iActorID] == INVALID_ACTOR_ID) return false;
  588. return DestroyDynamic3DTextLabel(s_DynamicActors[actorid][e_iLabelText]);
  589. }
  590.  
  591. stock _Debug()
  592. {
  593. Loop_Only_Dynamic_Actors(actorid) {
  594. if(IsValidDynamicActor(actorid)) {
  595. DestroyActor(s_DynamicActors[actorid][e_iActorID]);
  596. s_DynamicActors[actorid][e_Destroy] = true;
  597. }
  598. }
  599. return true;
  600. }
  601.  
  602. #if defined _ALS_OnFilterScriptExit
  603. #undef OnFilterScriptExit
  604. #else
  605. #define _ALS_OnFilterScriptExit
  606. #endif
  607.  
  608. #define OnFilterScriptExit AS_OnFilterScriptExit
  609.  
  610. #if defined AS_OnFilterScriptExit
  611. forward AS_OnFilterScriptExit();
  612. #endif
  613.  
  614. #if defined _ALS_OnGameModeExit
  615. #undef OnGameModeExit
  616. #else
  617. #define _ALS_OnGameModeExit
  618. #endif
  619.  
  620. #define OnGameModeExit AS_OnGameModeExit
  621.  
  622. #if defined AS_OnGameModeExit
  623. forward AS_OnGameModeExit();
  624. #endif
  625.  
  626. #if defined _ALS_OnActorStreamIn
  627. #undef OnActorStreamIn
  628. #else
  629. #define _ALS_OnActorStreamIn
  630. #endif
  631.  
  632. #define OnActorStreamIn AS_OnActorStreamIn
  633.  
  634. #if defined AS_OnActorStreamIn
  635. forward AS_OnActorStreamIn(actorid, playerid);
  636. #endif
  637.  
  638. #if defined _ALS_OnActorStreamOut
  639. #undef OnActorStreamOut
  640. #else
  641. #define _ALS_OnActorStreamOut
  642. #endif
  643.  
  644. #define OnActorStreamOut AS_OnActorStreamOut
  645.  
  646. #if defined AS_OnActorStreamOut
  647. forward AS_OnActorStreamOut(actorid, playerid);
  648. #endif
  649.  
  650. #if defined _ALS_OnPlayerGiveDamageActor
  651. #undef OnPlayerGiveDamageActor
  652. #else
  653. #define _ALS_OnPlayerGiveDamageActor
  654. #endif
  655.  
  656. #define OnPlayerGiveDamageActor AS_OnPlayerGiveDamageActor
  657.  
  658. #if defined AS_OnPlayerGiveDamageActor
  659. forward AS_OnPlayerGiveDamageActor(playerid, damaged_actorid, Float:amount, weaponid, bodypart);
  660. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement