Advertisement
LatinZ

s_actors.inc - Create actors unlimitedly! (no YSI)

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