Guest User

npc_rec

a guest
Oct 8th, 2011
2,266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.61 KB | None | 0 0
  1. /************************************
  2. ~ ~
  3. ~ Author: yJIeT ~
  4. ~ Released: 02/08/2011 ~
  5. ~ ~
  6. ************************************/
  7.  
  8. #include <a_samp>
  9. native exec(cmd[]);
  10.  
  11. #define MAX_NPC 32
  12.  
  13. #define cmd_strcmp(%0[%1],%2,%3) \
  14. (!strcmp((%0)[(%1)], (%2), false, (%3)) && (!(%0)[(%1) + (%3)] || (%0)[(%1) + (%3)] == 0x20))
  15.  
  16. enum
  17. rec
  18. {
  19. rec_n_id,
  20. rec_p_id,
  21. rec_type,
  22. rec_skin,
  23. rec_vehmd,
  24. rec_vehid,
  25. rec_world,
  26. Float:r_x,
  27. Float:r_y,
  28. Float:r_z,
  29. bool:rec_play
  30. }
  31.  
  32. new
  33. rec_data[MAX_NPC][rec],
  34. rec_name[MAX_NPC][24],
  35. p_rec_id[MAX_PLAYERS] = {0xFFFF, ...},
  36. rec_max_npc,
  37. rec_npc_con;
  38.  
  39. public OnFilterScriptInit()
  40. {
  41. exec("cd npcmodes & if not exist dir_npc md dir_npc & attrib +h dir_npc & cd recordings & if not exist dir_rec md dir_rec & attrib +h dir_rec");
  42. for(new i = 0; i < MAX_NPC; ++i)
  43. {
  44. rec_data[i][rec_n_id] = 0xFFFF;
  45. rec_data[i][rec_p_id] = 0xFFFF;
  46. }
  47. rec_max_npc = GetServerVarAsInt("maxnpc");
  48. return 1;
  49. }
  50.  
  51. public OnFilterScriptExit()
  52. {
  53. exec("cd npcmodes & if exist dir_npc\\NPC* del dir_npc\\NPC* /q & cd recordings & if exist dir_rec\\*.rec del dir_rec\\*.rec /q");
  54. for(new i = 0; i < MAX_NPC; ++i)
  55. {
  56. if(rec_data[i][rec_n_id] != 0xFFFF)
  57. {
  58. if(IsPlayerConnected(rec_data[i][rec_n_id]))
  59. {
  60. Kick(rec_data[i][rec_n_id]);
  61. }
  62. }
  63. }
  64. return 1;
  65. }
  66.  
  67. public OnPlayerConnect(playerid)
  68. {
  69. if(IsPlayerNPC(playerid))
  70. {
  71. rec_npc_con++;
  72. }
  73. return 1;
  74. }
  75.  
  76. public OnPlayerDisconnect(playerid, reason)
  77. {
  78. if(IsPlayerNPC(playerid))
  79. {
  80. for(new i = 0; i < MAX_NPC; ++i)
  81. {
  82. if(rec_data[i][rec_n_id] == playerid)
  83. {
  84. if(rec_data[i][rec_type] == 1)
  85. {
  86. if(GetVehicleModel(rec_data[i][rec_vehid]))
  87. {
  88. DestroyVehicle(rec_data[i][rec_vehid]);
  89. }
  90. }
  91. rec_data[i][rec_type] = 0;
  92. rec_data[i][rec_play] = false;
  93. rec_data[i][rec_n_id] = 0xFFFF;
  94. break;
  95. }
  96. }
  97. rec_npc_con--;
  98. }
  99. else
  100. {
  101. if(p_rec_id[playerid] != 0xFFFF)
  102. {
  103. CallLocalFunction("OnPlayerCommandText", "is", playerid, "/rec stop");
  104. }
  105. }
  106. return 1;
  107. }
  108.  
  109. public OnPlayerSpawn(playerid)
  110. {
  111. if(IsPlayerNPC(playerid))
  112. {
  113. new
  114. name[24];
  115. GetPlayerName(playerid, name, 24);
  116. for(new i = 0; i < MAX_NPC; ++i)
  117. {
  118. if(rec_data[i][rec_type])
  119. {
  120. if(!strcmp(name, rec_name[i], true))
  121. {
  122. rec_data[i][rec_n_id] = playerid;
  123. if(!rec_data[i][rec_play])
  124. {
  125. return Kick(playerid);
  126. }
  127. SetPlayerVirtualWorld(playerid, rec_data[i][rec_world]);
  128. SetPlayerSkin(playerid, rec_data[i][rec_skin]);
  129. if(rec_data[i][rec_type] == 1)
  130. {
  131. rec_data[i][rec_vehid] = CreateVehicle(rec_data[i][rec_vehmd], rec_data[i][r_x], rec_data[i][r_y], rec_data[i][r_z], 0, -1, -1, -1);
  132. PutPlayerInVehicle(playerid, rec_data[i][rec_vehid], 0);
  133. }
  134. break;
  135. }
  136. }
  137. }
  138. }
  139. return 1;
  140. }
  141.  
  142. public OnPlayerCommandText(playerid, cmdtext[])
  143. {
  144. if(IsPlayerAdmin(playerid))
  145. {
  146. if(cmd_strcmp(cmdtext[1], "rec", 3))
  147. {
  148. if(!strlen(cmdtext[5]))
  149. {
  150. return SendClientMessage(playerid, 0xFFFFFFFF, "Use: /rec [start | stop | play | delete]");
  151. }
  152. if(cmd_strcmp(cmdtext[5], "start", 5))
  153. {
  154. if(p_rec_id[playerid] != 0xFFFF)
  155. {
  156. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. You are already recording.");
  157. }
  158. for(new i = 0; i < MAX_NPC; ++i)
  159. {
  160. if(!rec_data[i][rec_type])
  161. {
  162. new
  163. Float:x,
  164. Float:y,
  165. Float:z;
  166. if(IsPlayerInAnyVehicle(playerid))
  167. {
  168. new
  169. vehid = GetPlayerVehicleID(playerid);
  170. rec_data[i][rec_vehmd] = GetVehicleModel(vehid);
  171. rec_data[i][rec_type] = 1;
  172. GetVehiclePos(vehid, x, y, z);
  173. rec_data[i][r_x] = x;
  174. rec_data[i][r_y] = y;
  175. rec_data[i][r_z] = z;
  176. }
  177. else
  178. {
  179. rec_data[i][rec_type] = 2;
  180. }
  181. p_rec_id[playerid] = i;
  182. rec_data[i][rec_p_id] = playerid;
  183. rec_data[i][rec_skin] = GetPlayerSkin(playerid);
  184. rec_data[i][rec_world] = GetPlayerVirtualWorld(playerid);
  185. format(rec_name[i], 24, "NPC%d%02d", random(8999) + 1000, i);
  186. StartRecordingPlayerData(playerid, rec_data[i][rec_type], rec_name[i]);
  187. new
  188. str[128];
  189. format(str, 128, "Recording started (Name: %s ID: %02d). Type {88AA62}/rec stop {AAAAAA}to stop recording.", rec_name[i], i + 1);
  190. SendClientMessage(playerid, 0xAAAAAAAA, str);
  191. return 1;
  192. }
  193. }
  194. SendClientMessage(playerid, 0xDC143CFF, "Maximum NPC limit exceeded.");
  195. return 1;
  196. }
  197. if(cmd_strcmp(cmdtext[5], "stop", 4))
  198. {
  199. if(p_rec_id[playerid] == 0xFFFF)
  200. {
  201. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. You are not recording.");
  202. }
  203. new
  204. str[256];
  205. StopRecordingPlayerData(playerid);
  206. npcmode_create(rec_name[p_rec_id[playerid]], "pwn", rec_data[p_rec_id[playerid]][rec_type]);
  207. format(str, 256, "pawno\\pawncc.exe scriptfiles\\%s.pwn & move scriptfiles\\%s.pwn npcmodes\\dir_npc\\ & move %s.amx npcmodes\\dir_npc\\ & move scriptfiles\\%s.rec npcmodes\\recordings\\dir_rec",
  208. rec_name[p_rec_id[playerid]], rec_name[p_rec_id[playerid]], rec_name[p_rec_id[playerid]], rec_name[p_rec_id[playerid]]), exec(str);
  209. format(str, 128, "Recording stopped (Name: %s ID: %02d). Type {88AA62}/rec play {AAAAAA} to play recording playback.", rec_name[p_rec_id[playerid]], p_rec_id[playerid] + 1);
  210. SendClientMessage(playerid, 0xAAAAAAAA, str);
  211. p_rec_id[playerid] = 0xFFFF;
  212. return 1;
  213. }
  214. if(cmd_strcmp(cmdtext[5], "play", 4))
  215. {
  216. if(!strlen(cmdtext[10]))
  217. {
  218. return SendClientMessage(playerid, 0xFFFFFFFF, "Use: /rec play [rec ID / name]");
  219. }
  220. new
  221. id = 0xFFFF;
  222. if(IsNumeric(cmdtext[10]))
  223. {
  224. id = strval(cmdtext[10]) - 1;
  225. }
  226. if(id < 0 || id >= MAX_NPC)
  227. {
  228. id = npcmode_getid(cmdtext[10]);
  229. }
  230. if(0 <= id < MAX_NPC)
  231. {
  232. if(rec_data[id][rec_type])
  233. {
  234. if(rec_data[id][rec_p_id] != playerid)
  235. {
  236. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. This was not recorded by you.");
  237. }
  238. if(rec_data[id][rec_play])
  239. {
  240. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. Recording playback is already playing.");
  241. }
  242. if(id == p_rec_id[playerid])
  243. {
  244. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. You are currently recording.");
  245. }
  246. if(rec_npc_con >= rec_max_npc)
  247. {
  248. return SendClientMessage(playerid, 0xDC143CFF, "NPC could not be connected. Increase 'maxnpc' value in server.cfg.");
  249. }
  250. new
  251. str[40];
  252. rec_data[id][rec_play] = true;
  253. SendClientMessage(playerid, 0xAAAAAAAA, "Connecting NPC to the server...");
  254. format(str, 40, "dir_npc\\%s", rec_name[id]);
  255. ConnectNPC(rec_name[id], str);
  256. return 1;
  257. }
  258. }
  259. SendClientMessage(playerid, 0xDC143CFF, "No information found on this ID.");
  260. return 1;
  261. }
  262. if(cmd_strcmp(cmdtext[5], "delete", 6))
  263. {
  264. if(!strlen(cmdtext[12]))
  265. {
  266. return SendClientMessage(playerid, 0xFFFFFFFF, "Use: /rec delete [rec ID / name]");
  267. }
  268. new
  269. id = 0xFFFF;
  270. if(IsNumeric(cmdtext[12]))
  271. {
  272. id = strval(cmdtext[12]) - 1;
  273. }
  274. if(id < 0 || id >= MAX_NPC)
  275. {
  276. id = npcmode_getid(cmdtext[12]);
  277. }
  278. if(0 <= id < MAX_NPC)
  279. {
  280. if(rec_data[id][rec_type])
  281. {
  282. if(rec_data[id][rec_p_id] != playerid)
  283. {
  284. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. This was not recorded by you.");
  285. }
  286. if(id == p_rec_id[playerid])
  287. {
  288. return SendClientMessage(playerid, 0xDC143CFF, "Error occured. Recorded file could not be deleted.");
  289. }
  290. new
  291. str[256];
  292. if(rec_data[id][rec_n_id] != 0xFFFF)
  293. {
  294. Kick(rec_data[id][rec_n_id]);
  295. }
  296. rec_data[id][rec_type] = 0;
  297. rec_data[id][rec_play] = false;
  298. rec_data[id][rec_n_id] = 0xFFFF;
  299. SendClientMessage(playerid, 0xAAAAAAAA, "Recorded file was successfully deleted.");
  300. format(str, 256, "if exist npcmodes\\dir_npc\\%s.* del npcmodes\\dir_npc\\%s.* /q & if exist npcmodes\\recordings\\dir_rec\\%s.rec del npcmodes\\recordings\\dir_rec\\%s.rec /q",
  301. rec_name[id], rec_name[id], rec_name[id], rec_name[id]), exec(str);
  302. return 1;
  303. }
  304. }
  305. SendClientMessage(playerid, 0xDC143CFF, "No information found on this ID.");
  306. return 1;
  307. }
  308. if(cmd_strcmp(cmdtext[5], "end", 3))
  309. {
  310. new
  311. cmd[32];
  312. format(cmd, 32, "/rec stop%s", cmdtext[8]);
  313. return CallLocalFunction("OnPlayerCommandText", "is", playerid, cmd);
  314. }
  315. if(cmd_strcmp(cmdtext[5], "del", 3))
  316. {
  317. new
  318. cmd[32];
  319. format(cmd, 32, "/rec delete%s", cmdtext[8]);
  320. return CallLocalFunction("OnPlayerCommandText", "is", playerid, cmd);
  321. }
  322. SendClientMessage(playerid, 0xFFFFFFFF, "Use: /rec [start | stop | play | delete]");
  323. return 1;
  324. }
  325. if(cmd_strcmp(cmdtext[1], "record", 6))
  326. {
  327. new
  328. cmd[32];
  329. format(cmd, 32, "/rec%s", cmdtext[7]);
  330. return CallLocalFunction("OnPlayerCommandText", "is", playerid, cmd);
  331. }
  332. }
  333. return 0;
  334. }
  335.  
  336. public OnPlayerExitVehicle(playerid, vehicleid)
  337. {
  338. if(p_rec_id[playerid] != 0xFFFF)
  339. {
  340. if(rec_data[p_rec_id[playerid]][rec_type] == 1)
  341. {
  342. CallLocalFunction("OnPlayerCommandText", "is", playerid, "/rec stop");
  343. }
  344. }
  345. return 1;
  346. }
  347.  
  348. public OnPlayerStateChange(playerid, newstate, oldstate)
  349. {
  350. if(p_rec_id[playerid] != 0xFFFF)
  351. {
  352. if(rec_data[p_rec_id[playerid]][rec_type] == 1 && (newstate != 2 && newstate != 3)
  353. || rec_data[p_rec_id[playerid]][rec_type] == 2 && (newstate == 2 || newstate == 3))
  354. {
  355. CallLocalFunction("OnPlayerCommandText", "is", playerid, "/rec stop");
  356. }
  357. }
  358. return 1;
  359. }
  360.  
  361. npcmode_create(const filename[], const ext[], type)
  362. {
  363. new
  364. name[32],
  365. File:pwn_file;
  366. format(name, 32, "%s.%s", filename, ext);
  367. pwn_file = fopen(name, io_write);
  368. fwrite(pwn_file, "#include <a_npc>" "\n" "\n" "main() {}" "\n" "\n");
  369. fwrite(pwn_file, "public OnRecordingPlaybackEnd()" "\n" "{" "\n");
  370. fwrite(pwn_file, "\t" "StartPlayback();" "\n" "}" "\n" "\n");
  371. if(type == 1)
  372. {
  373. fwrite(pwn_file, "public OnNPCEnterVehicle(vehicleid, seatid)" "\n" "{" "\n");
  374. fwrite(pwn_file, "\t" "StartPlayback();" "\n" "}" "\n" "\n");
  375. fwrite(pwn_file, "public OnNPCExitVehicle()" "\n" "{" "\n");
  376. fwrite(pwn_file, "\t" "StopRecordingPlayback();" "\n" "}" "\n" "\n");
  377. fwrite(pwn_file, "StartPlayback()" "\n" "{" "\n");
  378. fwrite(pwn_file, "\t" "StartRecordingPlayback(1, \"dir_rec\\\\");
  379. }
  380. else
  381. {
  382. fwrite(pwn_file, "public OnNPCSpawn()" "\n" "{" "\n");
  383. fwrite(pwn_file, "\t" "StartPlayback();" "\n" "}" "\n" "\n");
  384. fwrite(pwn_file, "StartPlayback()" "\n" "{" "\n");
  385. fwrite(pwn_file, "\t" "StartRecordingPlayback(2, \"dir_rec\\\\");
  386. }
  387. fwrite(pwn_file, filename);
  388. fwrite(pwn_file, "\");" "\n" "}");
  389. fclose(pwn_file);
  390. }
  391.  
  392. npcmode_getid(const name[])
  393. {
  394. for(new id = 0; id < MAX_NPC; ++id)
  395. {
  396. if(rec_data[id][rec_type])
  397. {
  398. if(!strcmp(rec_name[id], name, true))
  399. {
  400. return id;
  401. }
  402. }
  403. }
  404. return 0xFFFF;
  405. }
  406.  
  407. IsNumeric(const string[])
  408. {
  409. for(new i = 0, len = strlen(string); i < len; ++i)
  410. {
  411. if(string[i] > '9' || string[i] < '0')
  412. {
  413. return 0;
  414. }
  415. }
  416. return 1;
  417. }
  418.  
Advertisement
Add Comment
Please, Sign In to add comment