Advertisement
Guest User

Animals of SA:MP

a guest
Nov 11th, 2016
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.00 KB | None | 0 0
  1. #include <a_samp>
  2. //#include <streamer>
  3. #include <a_mysql>
  4.  
  5. /*
  6. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7.  
  8. Animals of SA-MP by Sound.
  9. Copyright 2016.
  10.  
  11. File Version: 0.3.0
  12.  
  13. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14. functions:
  15.  
  16. CreateAnimal(type, Float:pX, Float:pY, Float:pZ, Float:angle, respawn = ANIMAL_RESPAWN_TIME, bool:inv = true, Float:health = 100.0);
  17. DestroyAnimal(animalid);
  18. GetAnimalObjectID(animalid);
  19. GetAnimalPos(animalid, &Float:X, &Float:Y, &Float:Z);
  20. SetAnimalPos(animalid, Float:X, Float:Y, Float:Z);
  21. SetAnimalAngle(animalid, Float:angle);
  22. GetAnimalAngle(animalid, &Float:angle);
  23. IsAnimalInvulnerable(animalid);
  24. SetAnimalInvulnerable(animalid, bool: inv);
  25. SetAnimalHealth(animalid, Float:health);
  26. GetAnimalHealth(animalid, &Float:health);
  27. SetAnimalDamageFromWeapon(weaponid, Float:damage);
  28. MoveAnimal(animalid, Float:X, Float:Y, Float:Z, Float:speed);
  29. StopAnimal(animalid);
  30. SpawnAnimal(animalid);
  31. KillAnimal(animalid);
  32. IsAnimalLife(animalid);
  33. GetAnimalType(animalid);
  34. IsAnimalLife(animalid);
  35. GetCreateAnimals();
  36. IsValidAnimal(animalid);
  37. SetAnimalBloodWhenFired(animalid, bool:blood);
  38. IsAnimalBlood(animalid);
  39. IsPlayerInRangeOfAnimal(playerid, animalid, Float:range);
  40. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  41. CallBack:
  42.  
  43. public OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, Float:damage)
  44. public OnAnimalDeath(animalid, killerid)
  45. public OnAnimalSpawn(animalid)
  46. public OnAnimalUpdate(animalid)
  47. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  48. Macro:
  49.  
  50. MAX_ANIMALS
  51. ANIMAL_RESPAWN_TIME
  52. ANIMAL_TYPE_COW
  53. ANIMAL_TYPE_DEER
  54. ANIMAL_TYPE_SHARK
  55. ANIMAL_TYPE_TURTLE
  56. ANIMAL_TYPE_DOLPHIN
  57. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  58. Change:
  59.  
  60. * 0.1.0
  61. - Release.
  62.  
  63. * 0.1.1
  64. - Исправлена функция SetAnimalRevival.
  65. - Добавленно описание каждой функции.
  66. - Исправленны автовызываемые функции.
  67.  
  68. * 0.1.2
  69. - Исправлена ошибка при создании животного.
  70. - Исправлены серьезные недочеты.
  71.  
  72. * 0.2.0
  73. - Добавлены функции SetAnimalBlood и IsAnimalBlood.
  74. - Исправлены некотрые недочеты.
  75.  
  76. * 0.2.1
  77. - Удалена функция SetAnimalRevival.
  78. - Исправлены мелкие недочеты.
  79.  
  80. * 0.2.2
  81. - Исправлены серьезные ошибки.
  82.  
  83. * 0.3.0
  84. - Добавлена функция IsPlayerInRangeOfAnimal.
  85. - Добавлена автовызываемая функция OnAnimalUpdate.
  86. - Исправлены некоторые несовместимости со стримером.
  87. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  88.  
  89. Специально для Pawn-Wiki.ru
  90. */
  91. forward OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, Float:damage);
  92. forward OnAnimalDeath(animalid, killerid);
  93. forward OnAnimalSpawn(animalid);
  94. forward OnAnimalUpdate(animalid);
  95.  
  96. enum
  97. {
  98. ANIMAL_TYPE_COW,
  99. ANIMAL_TYPE_DEER,
  100. ANIMAL_TYPE_SHARK,
  101. ANIMAL_TYPE_TURTLE,
  102. ANIMAL_TYPE_DOLPHIN,
  103.  
  104. ANIMAL_RESPAWN_TIME = 3000,
  105. MAX_ANIMALS = 50,
  106. INVALID_ANIMAL_ID = -1
  107. };
  108.  
  109. static const Float:so_inc@animal_fixz[] = {0.9, 0.5, 0.0, 0.5, 0.0};
  110. static const Float:so_inc@animal_fixa[] = {180.0, 90.0, 0.0, 0.0, 0.0};
  111. static const so_inc@animal_type_obj[] = {19833, 19315, 1608, 1609, 1607};
  112. static Float:so_inc@animal_damage[] =
  113. {
  114. 0.5, 5.0, 10.0, 10.0, 10.0, 10.0 ,10.0,
  115. 10.0, 10.0, 25.0, 10.0, 10.0, 10.0, 10.0,
  116. 10.0, 10.0, 100.0, 0.0, 50.0 ,0.0, 0.0,
  117. 0.0, 15.0, 15.0, 40.0, 30.0, 40.0, 40.0,
  118. 15.0, 25.0, 35.0, 35.0, 15.0, 50.0, 50.0,
  119. 100.0, 100.0, 5.0, 20.0
  120. };
  121.  
  122. static so_inc@animal_count;
  123. static so_inc@animals[MAX_ANIMALS] = {-1, ...};
  124. static Float:so_inc@animal_pos_X[MAX_ANIMALS], Float:so_inc@animal_pos_Y[MAX_ANIMALS], Float:so_inc@animal_pos_Z[MAX_ANIMALS];
  125. static Float:so_inc@animal_angle[MAX_ANIMALS];
  126. static bool:so_inc@animal_inv[MAX_ANIMALS char];
  127. static Float:so_inc@animal_health[MAX_ANIMALS];
  128. static Float:so_inc@animal_heal_status[MAX_ANIMALS];
  129. static so_inc@animal_type[MAX_ANIMALS char];
  130. static so_inc@animal_life[MAX_ANIMALS char];
  131. static so_inc@animal_respawn_time[MAX_ANIMALS];
  132. static so_inc@animal_blood[MAX_ANIMALS char];
  133. static so_inc@animal_blood_obj[MAX_ANIMALS];
  134. static so_inc@animal_timer[MAX_ANIMALS];
  135.  
  136. /*
  137. Функция CreateAnimal: Создает животное.
  138.  
  139. Параметры:
  140. type - Тип животного.
  141. Float:X - Кооридината по оси X.
  142. Float:Y - Кооридината по оси Y.
  143. Float:Z - Кооридината по оси Z.
  144. Float:angle - Угол поворота животного.
  145. respawn - Время, через которое животное заспавнится после смерти. 0 - не респавнится.
  146. bool:inv - Уязвимо ли животное.
  147. Float:health - Кол-во здоровья.
  148.  
  149. Возвращает: ID созданого животного.
  150. */
  151.  
  152. stock CreateAnimal(type, Float:pX, Float:pY, Float:pZ, Float:angle, respawn = ANIMAL_RESPAWN_TIME, bool:inv = true, Float:health = 100.0)
  153. {
  154. if((GetCreateAnimals() >= MAX_ANIMALS) || (respawn <= -1) || (health <= -0.1))
  155. return INVALID_ANIMAL_ID;
  156.  
  157. #if !defined Streamer_IncludeFileVersion
  158. so_inc@animals[so_inc@animal_count] = CreateObject(so_inc@animal_type_obj[type], pX, pY, pZ - so_inc@animal_fixz[type], 0.0, 0.0, angle + so_inc@animal_fixa[type]);
  159. if(so_inc@animals[so_inc@animal_count] == INVALID_OBJECT_ID)
  160. {
  161. so_inc@animals[so_inc@animal_count] = -1;
  162. return INVALID_ANIMAL_ID;
  163. }
  164. #else
  165. so_inc@animals[so_inc@animal_count] = CreateDynamicObject(so_inc@animal_type_obj[type], pX, pY, pZ - so_inc@animal_fixz[type], 0.0, 0.0, angle + so_inc@animal_fixa[type]);
  166. if(so_inc@animals[so_inc@animal_count] == INVALID_STREAMER_ID)
  167. {
  168. so_inc@animals[so_inc@animal_count] = -1;
  169. return INVALID_ANIMAL_ID;
  170. }
  171. #endif
  172.  
  173.  
  174. so_inc@animal_pos_X[so_inc@animal_count] = pX;
  175. so_inc@animal_pos_Y[so_inc@animal_count] = pY;
  176. so_inc@animal_pos_Z[so_inc@animal_count] = pZ;
  177. so_inc@animal_angle[so_inc@animal_count] = angle;
  178. so_inc@animal_inv{so_inc@animal_count} = inv;
  179. so_inc@animal_health[so_inc@animal_count] =
  180. so_inc@animal_heal_status[so_inc@animal_count] = health;
  181. so_inc@animal_type{so_inc@animal_count} = type;
  182. so_inc@animal_life{so_inc@animal_count} = true;
  183. so_inc@animal_respawn_time[so_inc@animal_count] = respawn;
  184. so_inc@animal_timer[so_inc@animal_count] = SetTimerEx("OnAnimalUpdate", 1000, true, "i", so_inc@animal_count);
  185.  
  186. new animalid = so_inc@animal_count;
  187. so_inc@animal_count++;
  188.  
  189. return animalid;
  190. }
  191. /*
  192. Функция DestroyAnimal: Удаляет животное.
  193.  
  194. Параметры: animalid - ID существуещего животного.
  195.  
  196. Возвращает: 1 при успешном удалении и 0, если животное не существует.
  197. */
  198.  
  199. stock DestroyAnimal(animalid)
  200. {
  201. if(!IsValidAnimal(animalid))
  202. return 0;
  203.  
  204. #if !defined Streamer_IncludeFileVersion
  205. DestroyObject
  206. #else
  207. DestroyDynamicObject
  208. #endif
  209. (so_inc@animals[animalid]);
  210.  
  211.  
  212. so_inc@animals[animalid] = -1;
  213. so_inc@animal_pos_X[animalid] =
  214. so_inc@animal_pos_Y[animalid] =
  215. so_inc@animal_pos_Z[animalid] =
  216. so_inc@animal_angle[animalid] =
  217. so_inc@animal_heal_status[animalid] =
  218. so_inc@animal_health[animalid] = 0.0;
  219.  
  220. so_inc@animal_type{animalid} = 0;
  221.  
  222. so_inc@animal_blood{animalid} = false;
  223. so_inc@animal_inv{animalid} = false;
  224. so_inc@animal_life{animalid} = true;
  225.  
  226. KillTimer(so_inc@animal_timer[animalid]);
  227.  
  228. so_inc@animal_count--;
  229.  
  230. return 1;
  231. }
  232. /*
  233. Функция GetAnimalObjectID: Узнает ID объекта животного.
  234.  
  235. Параметры: animalid - ID существуещего животного.
  236.  
  237. Возвращает: ID объекта и INVALID_OBJECT_ID, если животное не существует.
  238. */
  239. stock GetAnimalObjectID(animalid)
  240. {
  241. if(!IsValidAnimal(animalid))
  242. #if !defined Streamer_IncludeFileVersion
  243. return INVALID_OBJECT_ID;
  244. #else
  245. return INVALID_STREAMER_ID;
  246. #endif
  247.  
  248. return so_inc@animals[animalid];
  249. }
  250. /*
  251. Функция GetAnimalPos: Узнает позицию животного.
  252.  
  253. Параметры:
  254. animalid - ID существуещего животного.
  255. &Float:X - Переменная для записи координаты оси X.
  256. &Float:Y - Переменная для записи координаты оси Y.
  257. &Float:Z - Переменная для записи координаты оси Z.
  258.  
  259. Возвращает: 1 если функция успешна и 0, если животное не существует.
  260. */
  261. stock GetAnimalPos(animalid, &Float:X, &Float:Y, &Float:Z)
  262. {
  263. if(!IsValidAnimal(animalid))
  264. return 0;
  265.  
  266. #if !defined Streamer_IncludeFileVersion
  267. GetObjectPos
  268. #else
  269. GetDynamicObjectPos
  270. #endif
  271. (so_inc@animals[animalid], X, Y, Z);
  272.  
  273. return 1;
  274. }
  275. /*
  276. Функция SetAnimalPos: Устанавливает позицию животного.
  277.  
  278. Параметры:
  279. animalid - ID существуещего животного.
  280. Float:X - Координата по оси X.
  281. Float:Y - Координата по оси Y.
  282. Float:Z - Координата по оси Z.
  283.  
  284. Возвращает: 1 если функция успешна и 0, если животное не существует.
  285. */
  286. stock SetAnimalPos(animalid, Float:X, Float:Y, Float:Z)
  287. {
  288. if(!IsValidAnimal(animalid))
  289. return 0;
  290.  
  291. #if !defined Streamer_IncludeFileVersion
  292. SetObjectPos
  293. #else
  294. SetDynamicObjectPos
  295. #endif
  296. (so_inc@animals[animalid], X, Y, Z - so_inc@animal_fixz[GetAnimalType(animalid)]);
  297.  
  298. return 1;
  299. }
  300. /*
  301. Функция GetAnimalAngle: Узнает угол поворота животного.
  302.  
  303. Параметры:
  304. animalid - ID существуещего животного.
  305. &Float:angle - Переменная для записи угла поворота.
  306.  
  307. Возвращает: 1 если функция успешна и 0, если животное не существует.
  308. */
  309. stock GetAnimalAngle(animalid, &Float:angle)
  310. {
  311. if(!IsValidAnimal(animalid))
  312. return 0;
  313.  
  314. new Float:X, Float:Z, Float:Y;
  315. #if !defined Streamer_IncludeFileVersion
  316. GetObjectRot
  317. #else
  318. GetDynamicObjectRot
  319. #endif
  320. (so_inc@animals[animalid], X, Y, Z);
  321.  
  322. angle = Z;
  323.  
  324. return 1;
  325. }
  326. /*
  327. Функция SetAnimalAngle: Устанавливает угол поворота животного.
  328.  
  329. Параметры:
  330. animalid - ID существуещего животного.
  331. &Float:angle - Угол поворота.
  332.  
  333. Возвращает: 1 если функция успешна и 0, если животное не существует.
  334. */
  335. stock SetAnimalAngle(animalid, Float:angle)
  336. {
  337. if(!IsValidAnimal(animalid))
  338. return 0;
  339.  
  340. #if !defined Streamer_IncludeFileVersion
  341. SetObjectRot
  342. #else
  343. SetDynamicObjectRot
  344. #endif
  345. (so_inc@animals[animalid], 0.0, 0.0, angle + so_inc@animal_fixa[GetAnimalType(animalid)]);
  346.  
  347. return 1;
  348. }
  349. /*
  350. Функция IsAnimalInvulnerable: Узнает уязвимо ли животное.
  351.  
  352. Параметры: animalid - ID существуещего животного.
  353.  
  354. Возвращает: 1 если животное уязвимо и 0, если не уязвимо или животное не существует.
  355. */
  356. stock IsAnimalInvulnerable(animalid)
  357. {
  358. if(!IsValidAnimal(animalid))
  359. return 0;
  360.  
  361. return so_inc@animal_inv{animalid};
  362. }
  363. /*
  364. Функция SetAnimalInvulnerable: Устанавливает уязвимость животному.
  365.  
  366. Параметры:
  367. animalid - ID существуещего животного.
  368. bool:inv - Установить уязвимость.
  369.  
  370. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  371. */
  372. stock SetAnimalInvulnerable(animalid, bool: inv)
  373. {
  374. if(!IsValidAnimal(animalid))
  375. return 0;
  376.  
  377. so_inc@animal_inv{animalid} = inv;
  378.  
  379. return 1;
  380. }
  381. /*
  382. Функция SetAnimalHealth: Устанавливает здоровье животному.
  383.  
  384. Параметры:
  385. animalid - ID существуещего животного.
  386. Float:health - Кол-во здоровья.
  387.  
  388. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  389. */
  390. stock SetAnimalHealth(animalid, Float:health)
  391. {
  392. if(!IsValidAnimal(animalid))
  393. return 0;
  394.  
  395. if(health <= 0.0)
  396. {
  397. new Float:angle;
  398. GetAnimalAngle(animalid, angle);
  399. #if !defined Streamer_IncludeFileVersion
  400. SetObjectRot
  401. #else
  402. SetDynamicObjectRot
  403. #endif
  404. (so_inc@animals[animalid],
  405. (GetAnimalType(animalid) == ANIMAL_TYPE_DEER) ? (90.0) : (0.0),
  406. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (90.0) : (0.0),
  407. angle);
  408. so_inc@animal_life{animalid} = false;
  409.  
  410. OnAnimalDeath(animalid, INVALID_PLAYER_ID);
  411. }
  412.  
  413. so_inc@animal_heal_status[animalid] = health;
  414.  
  415. return 1;
  416. }
  417. /*
  418. Функция GetAnimalHealth: Получает кол-во здоровья животного.
  419.  
  420. Параметры:
  421. animalid - ID существуещего животного.
  422. ?Float:health - Переменная для записи здоровья.
  423.  
  424. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  425. */
  426. stock GetAnimalHealth(animalid, &Float:health)
  427. {
  428. if(!IsValidAnimal(animalid))
  429. return 0;
  430.  
  431. health = so_inc@animal_heal_status[animalid];
  432.  
  433. return 1;
  434. }
  435. /*
  436. Функция SetAnimalDamageFromWeapon: Устанавливает урон от опеределенного оружия.
  437.  
  438. Параметры:
  439. weaponid - ID оружия.
  440. Float:damage - Кол-во урона.
  441.  
  442. Возвращает: 1 если функция выполнена успешно и 0, если было указанно невалидный ID оружия.
  443. */
  444. stock SetAnimalDamageFromWeapon(weaponid, Float:damage)
  445. {
  446. if(weaponid > sizeof(so_inc@animal_damage))
  447. return 0;
  448.  
  449. so_inc@animal_damage[weaponid] = damage;
  450. return 1;
  451. }
  452. /*
  453. Функция MoveAnimal: Включает движение животного.
  454.  
  455. Параметры:
  456. animalid - ID животного.
  457. Float:X - Координата движения до оси X.
  458. Float:Y - Координата движения до оси Y.
  459. Float:Z - Координата движения до оси Z.
  460. Float:speed - Скорость движения.
  461.  
  462. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  463. */
  464. stock MoveAnimal(animalid, Float:X, Float:Y, Float:Z, Float:speed)
  465. {
  466. if(!IsValidAnimal(animalid))
  467. return 0;
  468.  
  469. new Float:aX, Float:aY, Float:aZ;
  470. GetAnimalPos(animalid, aX, aY, aZ);
  471. #if !defined Streamer_IncludeFileVersion
  472. MoveObject
  473. #else
  474. MoveDynamicObject
  475. #endif
  476. (so_inc@animals[animalid], X, Y, Z - so_inc@animal_fixz[GetAnimalType(animalid)], speed);
  477.  
  478. SetAnimalAngle(animalid, atan2(Y-aY, X-aX) - 90.0);
  479.  
  480. return 1;
  481. }
  482. /*
  483. Функция SpawnAnimal: Респавнит животное.
  484.  
  485. Параметры:
  486. animalid - ID животного.
  487.  
  488. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  489. */
  490. stock SpawnAnimal(animalid)
  491. {
  492. if(!IsValidAnimal(animalid))
  493. return 0;
  494.  
  495. return OnAnimalSpawn(animalid) & 1;
  496. }
  497. /*
  498. Функция KillAmimal: Убивает животное.
  499.  
  500. Параметры:
  501. animalid - ID животного.
  502.  
  503. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  504. */
  505. stock KillAnimal(animalid)
  506. {
  507. if(!IsValidAnimal(animalid))
  508. return 0;
  509.  
  510. new Float:angle;
  511. GetAnimalAngle(animalid, angle);
  512. #if !defined Streamer_IncludeFileVersion
  513. SetObjectRot
  514. #else
  515. SetDynamicObjectRot
  516. #endif
  517. (so_inc@animals[animalid],
  518. (GetAnimalType(animalid) == ANIMAL_TYPE_DEER) ? (90.0) : (0.0),
  519. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (90.0) : (0.0),
  520. angle);
  521.  
  522. new Float:X, Float:Y, Float:Z;
  523. #if !defined Streamer_IncludeFileVersion
  524. GetObjectPos
  525. #else
  526. GetDynamicObjectPos
  527. #endif
  528. (so_inc@animals[animalid], X, Y, Z);
  529.  
  530. if(GetAnimalType(animalid) == ANIMAL_TYPE_DEER)
  531. #if !defined Streamer_IncludeFileVersion
  532. SetObjectPos
  533. #else
  534. SetDynamicObjectPos
  535. #endif
  536. (so_inc@animals[animalid], X, Y, Z - 0.4);
  537.  
  538. so_inc@animal_life{animalid} = false;
  539.  
  540. return OnAnimalDeath(animalid, INVALID_PLAYER_ID) & 1;
  541. }
  542. /*
  543. Функция SetAnimalRespawnTime: Устанавливает время респавна животного.
  544.  
  545. Параметры:
  546. animalid - ID животного.
  547. respawn_time - Время респавна.
  548.  
  549. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  550. */
  551. stock SetAnimalRespawnTime(animalid, respawn_time)
  552. {
  553. if(!IsValidAnimal(animalid))
  554. return 0;
  555.  
  556. so_inc@animal_respawn_time[animalid] = respawn_time;
  557.  
  558. return 1;
  559. }
  560. /*
  561. Функция GetAnimalRespawnTime: Узнает время респавна животного.
  562.  
  563. Параметры:
  564. animalid - ID животного.
  565.  
  566. Возвращает: Время респавна животного и 0, если животное не существует.
  567. */
  568. stock GetAnimalRespawnTime(animalid)
  569. {
  570. if(!IsValidAnimal(animalid))
  571. return 0;
  572.  
  573. return so_inc@animal_respawn_time[animalid];
  574. }
  575. /*
  576. Функция StopAnimal: Останавливает животное.
  577.  
  578. Параметры:
  579. animalid - ID животного.
  580.  
  581. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  582. */
  583. stock StopAnimal(animalid)
  584. {
  585. if(!IsValidAnimal(animalid))
  586. return 0;
  587. #if !defined Streamer_IncludeFileVersion
  588. StopObject(so_inc@animals[animalid]);
  589. #else
  590. StopDynamicObject(so_inc@animals[animalid]);
  591. #endif
  592.  
  593. return 1;
  594. }
  595. /*
  596. Функция IsValidAnimal: Узнает, существует ли животное.
  597.  
  598. Параметры:
  599. animalid - ID животного.
  600.  
  601. Возвращает: 1 если животное существует и 0, если животное не существует.
  602. */
  603. stock IsValidAnimal(animalid)
  604. {
  605. if(so_inc@animals[animalid] == INVALID_ANIMAL_ID || animalid >= MAX_ANIMALS
  606. || animalid < 0)
  607. return 0;
  608.  
  609. return 1;
  610. }
  611. /*
  612. Функция GetCreateAnimals: Узнает кол-во созданных животных.
  613.  
  614. Параметры: -
  615.  
  616. Возвращает: Кол-во созданных животных.
  617. */
  618. stock GetCreateAnimals()
  619. return so_inc@animal_count;
  620. /*
  621. Функция GetAnimalType: Узнает тип животного.
  622.  
  623. Параметры: animalid - ID животного.
  624.  
  625. Возвращает: Тип животного и -1, если животное не существует.
  626. */
  627. stock GetAnimalType(animalid)
  628. {
  629. if(!IsValidAnimal(animalid))
  630. return -1;
  631.  
  632. return so_inc@animal_type{animalid};
  633. }
  634. /*
  635. Функция IsAnimalLife: Узнает, живое ли животное.
  636.  
  637. Параметры: animalid - ID животного.
  638.  
  639. Возвращает: 1 если животное живое и 0, если животное мертво или не существует.
  640. */
  641. stock IsAnimalLife(animalid)
  642. {
  643. if(!IsValidAnimal(animalid))
  644. return 0;
  645.  
  646. return so_inc@animal_life{animalid};
  647. }
  648. /*
  649. Функция SetAnimalBlood: Устанавливает кровь животному.
  650.  
  651. Параметры:
  652. animalid - ID животного.
  653. bool:blood - Включить/выключить кровь
  654.  
  655. Возвращает: 1 если функция выполнена успешно и 0, если животное не существует.
  656. */
  657. stock SetAnimalBlood(animalid, bool:blood)
  658. {
  659. if(!IsValidAnimal(animalid))
  660. return 0;
  661.  
  662. so_inc@animal_blood{animalid} = blood;
  663.  
  664. return 1;
  665. }
  666. /*
  667. Функция IsAnimalBlood: Узнает, установлена ли кровь животному.
  668.  
  669. Параметры: animalid - ID животного.
  670.  
  671. Возвращает: 1 если кровь установлена и 0, если нет или животное не существует.
  672. */
  673. stock IsAnimalBlood(animalid)
  674. {
  675. if(!IsValidAnimal(animalid))
  676. return 0;
  677.  
  678. return so_inc@animal_blood{animalid};
  679. }
  680. /*
  681. Функция IsPlayerInRangeOfAnimal: Узнает, находится ли игрок в радиусе с животным.
  682.  
  683. Параметры:
  684. playerid - ID игрока.
  685. animalid - ID животного.
  686. Float:range - Радиус.
  687.  
  688. Возвращает: 1 если игрок находится в радиусе с животным и 0, если нет или животное не существует.
  689. */
  690. stock IsPlayerInRangeOfAnimal(playerid, animalid, Float:range)
  691. {
  692. if(!IsValidAnimal(animalid))
  693. return 0;
  694.  
  695. new Float:X, Float:Y, Float:Z;
  696. #if !defined Streamer_IncludeFileVersion
  697. GetObjectPos
  698. #else
  699. GetDynamicObjectPos
  700. #endif
  701. (so_inc@animals[animalid], X, Y, Z);
  702.  
  703. return IsPlayerInRangeOfPoint(playerid, range, X, Y, Z);
  704. }
  705.  
  706. #if !defined Streamer_IncludeFileVersion
  707. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  708. {
  709. if(hittype == BULLET_HIT_TYPE_OBJECT)
  710. {
  711. for(new animalid; animalid < MAX_ANIMALS; animalid++)
  712. {
  713. if(!IsValidAnimal(animalid))
  714. continue;
  715.  
  716. if(hitid == so_inc@animals[animalid])
  717. {
  718. if(IsAnimalBlood(animalid))
  719. {
  720. new Float:X, Float:Y, Float:Z;
  721. GetObjectPos(so_inc@animals[animalid], X, Y, Z);
  722. if(so_inc@animal_blood_obj[animalid] != 0)
  723. DestroyObject(so_inc@animal_blood_obj[animalid]), so_inc@animal_blood_obj[animalid] = 0;
  724.  
  725. so_inc@animal_blood_obj[animalid] = CreateObject(18668, X, Y,
  726. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (Z - 1.0) : (Z - 1.4),
  727. 0.0, 0.0, 0.0);
  728. }
  729. new Float:damage;
  730. if(!so_inc@animal_inv{animalid} && so_inc@animal_life{animalid})
  731. {
  732. damage = so_inc@animal_damage[weaponid];
  733.  
  734. so_inc@animal_heal_status[animalid] -= damage;
  735.  
  736. new Float:health;
  737. GetAnimalHealth(animalid, health);
  738.  
  739. if(health <= 0.0)
  740. {
  741. new Float:angle;
  742. GetAnimalAngle(animalid, angle);
  743. SetObjectRot(so_inc@animals[animalid],
  744. (GetAnimalType(animalid) == ANIMAL_TYPE_DEER) ? (90.0) : (0.0),
  745. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (90.0) : (0.0),
  746. angle);
  747.  
  748. new Float:X, Float:Y, Float:Z;
  749. GetObjectPos(so_inc@animals[animalid], X, Y, Z);
  750. if(GetAnimalType(animalid) == ANIMAL_TYPE_DEER)
  751. SetObjectPos(so_inc@animals[animalid], X, Y, Z - 0.4);
  752.  
  753. OnAnimalDeath(animalid, playerid);
  754. so_inc@animal_life{animalid} = false;
  755. }
  756. OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, damage);
  757. }
  758.  
  759. }
  760. }
  761. }
  762. #if defined so_pub_OnPlayerWeaponShot
  763. forward so_pub_OnPlayerWeaponShot(animalid);
  764. #endif
  765. return 1;
  766. }
  767. #else
  768. public OnPlayerShootDynamicObject(playerid, weaponid, STREAMER_TAG_OBJECT objectid, Float:x, Float:y, Float:z)
  769. {
  770. for(new animalid; animalid < MAX_ANIMALS; animalid++)
  771. {
  772. if(!IsValidAnimal(animalid))
  773. continue;
  774. if(objectid != so_inc@animals[animalid])
  775. continue;
  776. if(IsAnimalBlood(animalid))
  777. {
  778. new Float:X, Float:Y, Float:Z;
  779. GetDynamicObjectPos(so_inc@animals[animalid], X, Y, Z);
  780. if(so_inc@animal_blood_obj[animalid] != 0)
  781. DestroyDynamicObject(so_inc@animal_blood_obj[animalid]), so_inc@animal_blood_obj[animalid] = 0;
  782.  
  783. so_inc@animal_blood_obj[animalid] = CreateDynamicObject(18668, X, Y,
  784. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (Z - 1.0) : (Z - 1.4),
  785. 0.0, 0.0, 0.0);
  786. }
  787.  
  788. new Float:damage;
  789. if(!so_inc@animal_inv{animalid} && so_inc@animal_life{animalid})
  790. {
  791. damage = so_inc@animal_damage[weaponid];
  792.  
  793. so_inc@animal_heal_status[animalid] -= damage;
  794.  
  795. new Float:health;
  796. GetAnimalHealth(animalid, health);
  797. if(health <= 0.0)
  798. {
  799. new Float:angle;
  800. GetAnimalAngle(animalid, angle);
  801. SetDynamicObjectRot(so_inc@animals[animalid],
  802. (GetAnimalType(animalid) == ANIMAL_TYPE_DEER) ? (90.0) : (0.0),
  803. (GetAnimalType(animalid) == ANIMAL_TYPE_COW) ? (90.0) : (0.0),
  804. angle);
  805.  
  806. new Float:X, Float:Y, Float:Z;
  807. GetDynamicObjectPos(so_inc@animals[animalid], X, Y, Z);
  808. if(GetAnimalType(animalid) == ANIMAL_TYPE_DEER)
  809. SetDynamicObjectPos(so_inc@animals[animalid], X, Y, Z - 0.4);
  810.  
  811. OnAnimalDeath(animalid, playerid);
  812. so_inc@animal_life{animalid} = false;
  813. }
  814. OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, damage);
  815. }
  816.  
  817. }
  818. #if defined so_OnPlayerShootDynamicObject
  819. forward so_OnPlayerShootDynamicObject(animalid);
  820. #endif
  821. return 1;
  822. }
  823. #endif
  824. /*
  825. Паблик OnPlayerGiveDamageAnimal: Получает информацию о нанесеном уроне для животного от игрока.
  826.  
  827. Параметры:
  828. playerid - ID игрока, который нанес урон.
  829. animalid - ID животного, которое получило урон.
  830. weaponid - ID оружия.
  831. Float:damage - Кол-во урона.
  832.  
  833. Возвращает: -
  834. */
  835. public OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, Float:damage)
  836. {
  837. #if defined so_pub_OnPlayerGiveDamageAnimal
  838. so_pub_OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, damage);
  839. #endif
  840. return 1;
  841. }
  842. /*
  843. Паблик OnAnimalDeath: Получает информацио о смерти животного.
  844.  
  845. Параметры:
  846. animalid - ID животного, которое убили.
  847. killerid - ID убийцы.
  848.  
  849. Возвращает: -
  850. */
  851. public OnAnimalDeath(animalid, killerid)
  852. {
  853. StopAnimal(animalid);
  854. if(GetAnimalRespawnTime(animalid))
  855. SetTimerEx("OnAnimalSpawn", GetAnimalRespawnTime(animalid), false, "i", animalid);
  856.  
  857. #if defined so_pub_OnAnimalDeath
  858. so_pub_OnAnimalDeath(animalid, killerid);
  859. #endif
  860.  
  861. return 1;
  862. }
  863. /*
  864. Паблик OnAnimalSpawn: Вызывается, когда животное респавнится.
  865.  
  866. Параметры:
  867. animalid - ID животного.
  868.  
  869. Возвращает: -
  870. */
  871. public OnAnimalSpawn(animalid)
  872. {
  873. StopAnimal(animalid);
  874. SetAnimalPos(animalid, so_inc@animal_pos_X[animalid], so_inc@animal_pos_Y[animalid], so_inc@animal_pos_Z[animalid]);
  875. SetAnimalAngle(animalid, so_inc@animal_angle[animalid]);
  876.  
  877. so_inc@animal_life{animalid} = true;
  878. so_inc@animal_heal_status[animalid] = so_inc@animal_health[animalid];
  879.  
  880. #if defined so_pub_OnAnimalSpawn
  881. so_pub_OnAnimalSpawn(animalid);
  882. #endif
  883.  
  884. return 1;
  885. }
  886. /*
  887. Паблик OnAnimalUpdate: Вызывается раз в 1 секунду, либо когда происходят изменения связанные с созданным животным.
  888.  
  889. Параметры:
  890. animalid - ID животного.
  891.  
  892. Возвращает: -
  893. */
  894. public OnAnimalUpdate(animalid)
  895. {
  896. #if defined so_pub_OnAnimalUpdate
  897. so_pub_OnAnimalUpdate(animalid);
  898. #endif
  899. return 1;
  900. }
  901.  
  902. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  903. #if defined _ALS_OnPlayerGiveDamageAnimal
  904. #undef OnPlayerGiveDamageAnimal
  905. #else
  906. #define _ALS_OnPlayerGiveDamageAnimal
  907. #endif
  908. #if defined so_pub_OnPlayerGiveDamageAnimal
  909. forward so_pub_OnPlayerGiveDamageAnimal(playerid, animalid, weaponid, Float:damage);
  910. #endif
  911. #define OnPlayerGiveDamageAnimal so_pub_OnPlayerGiveDamageAnimal
  912. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  913. #if defined _ALS_OnAnimalDeath
  914. #undef OnAnimalDeath
  915. #else
  916. #define _ALS_OnAnimalDeath
  917. #endif
  918. #if defined so_pub_OnAnimalDeath
  919. forward so_pub_OnAnimalDeath(animalid, killerid);
  920. #endif
  921. #define OnAnimalDeath so_pub_OnAnimalDeath
  922. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  923. #if defined _ALS_OnAnimalSpawn
  924. #undef OnAnimalSpawn
  925. #else
  926. #define _ALS_OnAnimalSpawn
  927. #endif
  928. #if defined so_pub_OnAnimalSpawn
  929. forward so_pub_OnAnimalSpawn(animalid);
  930. #endif
  931. #define OnAnimalSpawn so_pub_OnAnimalSpawn
  932. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  933. #if defined _ALS_OnAnimalUpdate
  934. #undef OnAnimalUpdate
  935. #else
  936. #define _ALS_OnAnimalUpdate
  937. #endif
  938. #if defined so_pub_OnAnimalUpdate
  939. forward so_pub_OnAnimalUpdate(animalid);
  940. #endif
  941. #define OnAnimalUpdate so_pub_OnAnimalUpdate
  942. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  943. // samp
  944. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  945. #if defined _ALS_OnPlayerShootDynamicObject
  946. #undef OnPlayerShootDynamicObject
  947. #else
  948. #define _ALS_OnPlayerShootDynamicObject
  949. #endif
  950. #if defined so_OnPlayerShootDynamicObject
  951. forward so_OnPlayerShootDynamicObject(animalid);
  952. #endif
  953. #define OnPlayerShootDynamicObject so_OnPlayerShootDynamicObject
  954. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
  955. #if defined _ALS_OnPlayerWeaponShot
  956. #undef OnPlayerWeaponShot
  957. #else
  958. #define _ALS_OnPlayerWeaponShot
  959. #endif
  960. #if defined so_pub_OnPlayerWeaponShot
  961. forward so_pub_OnPlayerWeaponShot(animalid);
  962. #endif
  963. #define OnPlayerWeaponShot so_pub_OnPlayerWeaponShot
  964. /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement