HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #define PLUGINNAME "Enemy spotted"
  2. #define VERSION "0.1"
  3. #define AUTHOR "JGHG"
  4. /*
  5. Copyleft 2005
  6. Plugin topic: http://www.amxmodx.org/forums/viewtopic.php?p=90073
  7.  
  8.  
  9. ENEMY SPOTTED
  10. =============
  11. Makes "Enemy spotted" radio messages go "Three enemies spotted" if the person has three people in his view.
  12.  
  13. /JGHG
  14.  
  15.  
  16. VERSIONS
  17. ========
  18. 050204 0.1 First version
  19. */
  20.  
  21. #include <amxmodx>
  22.  
  23. #include <engine>
  24.  
  25. #define PI 3.1415926535897932384626433832795
  26. #define VIEWSPAN 48.0 // degrees, tweakable
  27.  
  28. // Globals below
  29. new g_MAXPLAYERS
  30. new Float:g_ONEEIGHTYTHROUGHPI
  31. // Globals above
  32.  
  33. public plugin_modules() {
  34. require_module("engine")
  35. }
  36.  
  37. visible_enemies(id) {
  38. new Float:origin[3], Float:targetOrigin[3], team = get_user_team(id), hitIndex, Float:view_offset[3], Float:hitOrigin[3], visibleCount = 0
  39. entity_get_vector(id, EV_VEC_origin, origin)
  40. entity_get_vector(id, EV_VEC_view_ofs, view_offset)
  41. origin[0] += view_offset[0]
  42. origin[1] += view_offset[1]
  43. origin[2] += view_offset[2]
  44.  
  45. new Float:viewangles[3]
  46. entity_get_vector(id, EV_VEC_v_angle, viewangles)
  47.  
  48. for(new i = 1; i <= g_MAXPLAYERS; i++) {
  49. if (!is_user_connected(i) || !is_user_alive(i) || team == get_user_team(i))
  50. continue
  51.  
  52. entity_get_vector(i, EV_VEC_origin, targetOrigin)
  53. hitIndex = trace_line(id, origin, targetOrigin, hitOrigin)
  54. if (hitIndex != i)
  55. continue
  56.  
  57. // Find out if i is within id's scope.
  58.  
  59. // Get angle to target.
  60. new Float:x = hitOrigin[0] - origin[0]
  61. new Float:z = hitOrigin[1] - origin[1]
  62. new Float:radians = floatatan(z/x, radian) // div by 0? :-P
  63. new Float:degreeeeees = radians * g_ONEEIGHTYTHROUGHPI
  64. if (origin[0] > hitOrigin[0]) {
  65. if (origin[1] < hitOrigin[1])
  66. degreeeeees += 180.0
  67. else if (origin[1] > hitOrigin[1])
  68. degreeeeees -= 180.0
  69. }
  70. new Float:difference = viewangles[1] - degreeeeees
  71. //new bool:visible = false
  72. if (difference >= -VIEWSPAN && difference <= VIEWSPAN) {
  73. //visible = true
  74. visibleCount++
  75. }
  76. //client_print(id, print_chat, "%s angle from %d to %d is %f, your angles: %f %f %f, difference: %f^n", visible ? "YES" : "NO", id, i, degreeeeees, viewangles[0], viewangles[1], viewangles[2], difference)
  77. }
  78.  
  79. return visibleCount
  80. }
  81.  
  82. public message_TextMsg(msg_id, msg_dest, index) {
  83. if (get_msg_args() != 5 || get_msg_argtype(5) != ARG_STRING)
  84. return PLUGIN_CONTINUE
  85.  
  86. new argument[64]
  87. get_msg_arg_string(5, argument, 63)
  88. if (!equal("#Enemy_spotted", argument))
  89. return PLUGIN_CONTINUE
  90.  
  91. new id_sz[10]
  92. get_msg_arg_string(2, id_sz, 9)
  93. new visible = visible_enemies(str_to_num(id_sz))
  94. new visibleString[32]
  95. getnumbers(visible, visibleString, 31)
  96.  
  97. /*
  98. new name[128]
  99. get_msg_arg_string(4, name, 127)
  100. format(name, 127, "%s (%d %s)", name, visible, visible == 1 ? "enemy" : "enemies")
  101. set_msg_arg_string(4, name)
  102. */
  103.  
  104. format(argument, 63, "%c%s %s spotted.", visibleString[0] - 32, visibleString[1], visible == 1 ? "enemy" : "enemies")
  105. set_msg_arg_string(5, argument)
  106.  
  107. return PLUGIN_CONTINUE
  108. }
  109.  
  110. stock getnumbers(number, wordnumbers[], length) {
  111. if (number < 0) {
  112. format(wordnumbers, length, "error")
  113. return
  114. }
  115. else if (number == 0) {
  116. format(wordnumbers, length, "zero")
  117. }
  118.  
  119. new numberstr[20]
  120. num_to_str(number, numberstr, 19)
  121. new stlen = strlen(numberstr), bool:getzero = false, bool:jumpnext = false
  122. if (stlen == 1)
  123. getzero = true
  124.  
  125. do {
  126. if (jumpnext)
  127. jumpnext = false
  128. else if (numberstr[0] != '0') {
  129. switch (stlen) {
  130. case 9: {
  131. if (getsingledigit(numberstr[0], wordnumbers, length))
  132. format(wordnumbers, length, "%s hundred%s", wordnumbers, numberstr[1] == '0' && numberstr[2] == '0' ? " million" : "")
  133. }
  134. case 8: {
  135. jumpnext = gettens(wordnumbers, length, numberstr)
  136. if (jumpnext)
  137. format(wordnumbers, length, "%s million", wordnumbers)
  138. }
  139. case 7: {
  140. getsingledigit(numberstr[0], wordnumbers, length)
  141. format(wordnumbers, length, "%s million", wordnumbers)
  142. }
  143. case 6: {
  144. if (getsingledigit(numberstr[0], wordnumbers, length))
  145. format(wordnumbers, length, "%s hundred%s", wordnumbers, numberstr[1] == '0' && numberstr[2] == '0' ? " thousand" : "")
  146. }
  147. case 5: {
  148. jumpnext = gettens(wordnumbers, length, numberstr)
  149. if (numberstr[0] == '1' || numberstr[1] == '0')
  150. format(wordnumbers, length, "%s thousand", wordnumbers)
  151. }
  152. case 4: {
  153. getsingledigit(numberstr[0], wordnumbers, length)
  154. format(wordnumbers, length, "%s thousand", wordnumbers)
  155. }
  156. case 3: {
  157. getsingledigit(numberstr[0], wordnumbers, length)
  158. format(wordnumbers, length, "%s hundred", wordnumbers)
  159. }
  160. case 2: jumpnext = gettens(wordnumbers, length, numberstr)
  161. case 1: {
  162. getsingledigit(numberstr[0], wordnumbers, length, getzero)
  163. break // could've trimmed, but of no use here
  164. }
  165. default: {
  166. format(wordnumbers, length, "%s TOO LONG", wordnumbers)
  167. break
  168. }
  169. }
  170. }
  171.  
  172. jghg_trim(numberstr, length, 1)
  173. stlen = strlen(numberstr)
  174. }
  175. while (stlen > 0)
  176.  
  177. // Trim a char from left if first char is a space (very likely)
  178. if (wordnumbers[0] == ' ')
  179. jghg_trim(wordnumbers, length, 1)
  180. }
  181.  
  182. // Returns true if next char should be jumped
  183. stock bool:gettens(wordnumbers[], length, numberstr[]) {
  184. new digitstr[11], bool:dont = false, bool:jumpnext = false
  185. switch (numberstr[0]) {
  186. case '1': {
  187. jumpnext = true
  188. switch (numberstr[1]) {
  189. case '0': digitstr = "ten"
  190. case '1': digitstr = "eleven"
  191. case '2': digitstr = "twelve"
  192. case '3': digitstr = "thirteen"
  193. case '4': digitstr = "fourteen"
  194. case '5': digitstr = "fifteen"
  195. case '6': digitstr = "sixteen"
  196. case '7': digitstr = "seventeen"
  197. case '8': digitstr = "eighteen"
  198. case '9': digitstr = "nineteen"
  199. default: digitstr = "TEENSERROR"
  200. }
  201. }
  202. case '2': digitstr = "twenty"
  203. case '3': digitstr = "thirty"
  204. case '4': digitstr = "fourty"
  205. case '5': digitstr = "fifty"
  206. case '6': digitstr = "sixty"
  207. case '7': digitstr = "seventy"
  208. case '8': digitstr = "eighty"
  209. case '9': digitstr = "ninety"
  210. case '0': dont = true // do nothing
  211. default : digitstr = "TENSERROR"
  212. }
  213. if (!dont)
  214. format(wordnumbers, length, "%s %s", wordnumbers, digitstr)
  215.  
  216. return jumpnext
  217. }
  218.  
  219. // Returns true when sets, else false
  220. stock getsingledigit(digit[], numbers[], length, bool:getzero = false) {
  221. new digitstr[11]
  222. switch (digit[0]) {
  223. case '1': digitstr = "one"
  224. case '2': digitstr = "two"
  225. case '3': digitstr = "three"
  226. case '4': digitstr = "four"
  227. case '5': digitstr = "five"
  228. case '6': digitstr = "six"
  229. case '7': digitstr = "seven"
  230. case '8': digitstr = "eight"
  231. case '9': digitstr = "nine"
  232. case '0': {
  233. if (getzero)
  234. digitstr = "zero"
  235. else
  236. return false
  237. }
  238. default : digitstr = "digiterror"
  239. }
  240. format(numbers, length, "%s %s", numbers, digitstr)
  241.  
  242. return true
  243. }
  244.  
  245. stock jghg_trim(stringtotrim[], len, charstotrim, bool:fromleft = true) {
  246. if (charstotrim <= 0)
  247. return
  248.  
  249. if (fromleft) {
  250. new maxlen = strlen(stringtotrim)
  251. if (charstotrim > maxlen)
  252. charstotrim = maxlen
  253.  
  254. format(stringtotrim, len, "%s", stringtotrim[charstotrim])
  255. }
  256. else {
  257. new maxlen = strlen(stringtotrim) - charstotrim
  258. if (maxlen < 0)
  259. maxlen = 0
  260.  
  261. format(stringtotrim, maxlen, "%s", stringtotrim)
  262. }
  263. }
  264.  
  265. public plugin_init() {
  266. register_plugin(PLUGINNAME, VERSION, AUTHOR)
  267.  
  268. //register_event("SendAudio", "event_enemyspotted", "b", "2=%!MRAD_ENEMYSPOT")
  269. //register_event("TextMsg", "event_enemyspotted", "b", "5=#Enemy_spotted")
  270. register_message(get_user_msgid("TextMsg"), "message_TextMsg")
  271.  
  272. g_MAXPLAYERS = get_maxplayers()
  273. g_ONEEIGHTYTHROUGHPI = 180.0 / PI
  274. }
  275. /*
  276. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageBegin ShowMenu(96) Arguments=4
  277.  Destination=One(1) Origin={0.000000 0.000000 0.000000} Entity=1 Classname=playe
  278. r Netname=Johnny got his gun
  279. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 1 (Short): 1023
  280. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 2 (Char): -1
  281. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 3 (Byte): 0
  282. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 4 (String): #RadioC
  283. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageEnd ShowMenu(96)
  284. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageBegin SendAudio(100) Arguments
  285. =3 Destination=One(1) Origin={0.000000 0.000000 0.000000} Entity=1 Classname=pla
  286. yer Netname=Johnny got his gun
  287. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 1 (Byte): 1
  288. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 2 (String): %!MRAD_ENEMYSPOT
  289. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 3 (Short): 100
  290. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageEnd SendAudio(100)
  291. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageBegin TextMsg(77) Arguments=5
  292. Destination=One(1) Origin={0.000000 0.000000 0.000000} Entity=1 Classname=player
  293.  Netname=Johnny got his gun
  294. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 1 (Byte): 5
  295. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 2 (String): 1
  296. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 3 (String): #Game_radio
  297. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 4 (String): Johnny got his gun
  298. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 5 (String): #Enemy_spotted
  299. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageEnd TextMsg(77)
  300. L 02/04/2005 - 09:47:33: [msglogging.amxx] MessageBegin tempentity?(23) Argument
  301. s=5 Destination=One(1) Origin={0.000000 0.000000 0.000000} Entity=1 Classname=pl
  302. ayer Netname=Johnny got his gun
  303. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 1 (Byte): 124
  304. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 2 (Byte): 1
  305. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 3 (Coord): 35.000000
  306. L 02/04/2005 - 09:47:33: [msglogging.amxx] Arg 4 (Short): 96
  307. L 02/04/2005 - 09:47:34: [msglogging.amxx] Arg 5 (Short): 15
  308. L 02/04/2005 - 09:47:34: [msglogging.amxx] MessageEnd tempentity?(23)
  309. L 02/04/2005 - 09:47:36: [msglogging.amxx] Stopped logging of all messages
  310. */