Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.40 KB | None | 0 0
  1.  
  2. // 인클루드
  3. #include <sourcemod>
  4. #include <sdktools>
  5. #include <cstrike>
  6. #include <geoip.inc>
  7. #include <string.inc>
  8. #include <sdkhooks>
  9.  
  10. #pragma semicolon 1
  11.  
  12. #define die1 "booster.wav"
  13. #define die2 "emfty.wav"
  14. #define die3 "full.wav"
  15. #define Color "\x07FF80FF"
  16. #define Color2 "\x07F84960"
  17. #define Color3 "\x07FAF4C0"
  18. #define Color4 "\x07664B00"
  19. #define DMG_FALL (1 << 5)
  20.  
  21. // 저장을 위한 선언
  22. new String:Path[MAXPLAYERS+1];
  23. new const GodColor[3] = {255, 255, 255};//R, G, B
  24. // 초 , 분 , 시간 , 일 선언
  25. new second[MAXPLAYERS+1];
  26. new minute[MAXPLAYERS+1];
  27. new times[MAXPLAYERS+1];
  28. new day[MAXPLAYERS+1];
  29. new Booster[MAXPLAYERS+1] = 0;
  30. new Full = 100;
  31. new BoosterCoolTimeCheck[MAXPLAYERS+1] = 0;
  32. new BCTCounter[MAXPLAYERS+1] = 5;
  33. new Boosterroundcheck = 0;
  34.  
  35. // 옆에 뜨는 Total Playing Time 되게 하는거
  36. new Handle:INFO[MAXPLAYERS+1];
  37. new Handle:htimer[MAXPLAYERS+1];
  38. new Handle:GodTimer;
  39. new Handle:CoolTime[MAXPLAYERS+1] = INVALID_HANDLE;
  40. new Handle:BoosterPower = INVALID_HANDLE;
  41. new Handle:roundtimecheck = INVALID_HANDLE;
  42.  
  43. public OnPluginStart()
  44. {
  45. RegConsoleCmd("sm_booster",booster,"부스터온");
  46.  
  47. HookEvent("player_spawn",eventspawn);
  48. HookEvent("round_freeze_end", eventfreezeendstart);
  49. HookEvent("round_end",eventend);
  50. HookEvent("player_falldamage", EventFallDamage, EventHookMode_Pre);
  51. BoosterPower = CreateConVar("sv_bpower","1200.0","부스터 파워 값(원래값의 1/80 ~ 1/100으로만설정바람)",FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_REPLICATED);
  52. AutoExecConfig(true,"BoosterGage");
  53. }
  54.  
  55. // 플러그인 스타트
  56. public OnMapStart()
  57. {
  58. BuildPath(Path_SM, Path, 64, "data/timerserver_db.txt");
  59. decl String:File1[256];
  60. Format(File1, 256, "sound/%s", die1);
  61. AddFileToDownloadsTable(File1);
  62. PrecacheSound(die1, true);
  63.  
  64. decl String:File2[256];
  65. Format(File2, 256, "sound/%s", die2);
  66. AddFileToDownloadsTable(File2);
  67.  
  68. PrecacheSound(die2, true);
  69.  
  70. decl String:file3[256];
  71. Format(file3, 256, "sound/%s", die3);
  72. AddFileToDownloadsTable(file3);
  73.  
  74. PrecacheSound(die3, true);
  75. }
  76.  
  77. public Action:eventfreezeendstart(Handle:event, const String:name[], bool:dontBroadcast)
  78. {
  79. new Client = GetClientOfUserId(GetEventInt(event,"userid"));
  80. CreateTimer(0.1, GameStartTimer, Client);
  81.  
  82. roundtimecheck = CreateTimer(300.0, timeover, _);
  83.  
  84. for (new i = 1; i <= MaxClients; i++)
  85. {
  86. if (IsClientInGame(i) && IsPlayerAlive(i))
  87. {
  88. SetEntProp(i, Prop_Data, "m_takedamage", 0, 1);
  89. SetEntityRenderColor(i, GodColor[0], GodColor[1], GodColor[2], 150);
  90. PrintToChat(i, "\x04[System Chat] \x03라운드 시작\x04 7\x03초간 무적상태가 됩니다.");
  91.  
  92. GodTimer = CreateTimer(7.0, GOD_END, i);
  93. }
  94. }
  95. }
  96.  
  97. public Action:EventFallDamage(Handle:event, const String:name[], bool:dontBroadcast)
  98. {
  99. new Client = GetClientOfUserId(GetEventInt(event, "userid"));
  100. new DMG = GetEventInt(event, "damage");
  101. if(GodTimer == INVALID_HANDLE)
  102. if(IsPlayerAlive(Client) == true)
  103. SetEntityHealth(Client, GetClientHealth(Client) + DMG);
  104. }
  105.  
  106. public Action:GameStartTimer(Handle:timer, any:Client)
  107. {
  108. if(GetTeamClientCount(1)+GetTeamClientCount(2)+GetTeamClientCount(3) == 0)
  109. {
  110. Boosterroundcheck = 0;
  111. PrintToChat(Client, "\x04[SM] - \x05지금은 부스터를 사용할 수 없습니다.");
  112. }
  113. else if(GetTeamClientCount(1)+GetTeamClientCount(2)+GetTeamClientCount(3) != 0)
  114. {
  115. Boosterroundcheck = 1;
  116. }
  117. }
  118.  
  119.  
  120. public Action:GOD_END(Handle:timer, any:Client)
  121. {
  122. if(IsPlayerAlive(Client) == true)
  123. {
  124. SetEntProp(Client, Prop_Data, "m_takedamage", 2, 1);
  125. SetEntityRenderColor(Client, 255, 255, 255, 255);
  126. PrintToChat(Client, "\x04[System Chat] \x03무적상태가 해제되었습니다.");
  127. GodTimer = INVALID_HANDLE;
  128. }
  129. }
  130.  
  131. public Action:timeover(Handle:timer, any:Client)
  132. {
  133. PrintCenterTextAll("Over Time");
  134. PrintToChatAll("%s[SM] - %s오버타임%s이 되었습니다.\n- %s상대팀%s을 죽이십시오", Color, Color2, Color3, Color2, Color3);
  135. ServerCommand("sm_beacon @all");
  136.  
  137. for(new i = 1; i <= MaxClients; i++)
  138. {
  139. if(AliveCheck(i))
  140. {
  141. Command_weaponremove(i);
  142. SetEntProp(i, Prop_Data, "m_iHealth", 1);
  143. if(GetClientTeam(i) == 2) SetEntityRenderColor(i, 255, 0, 0, 255);
  144. if(GetClientTeam(i) == 3) SetEntityRenderColor(i, 0, 0, 255, 255);
  145. }
  146. }
  147. }
  148.  
  149. public Command_weaponremove(Client)
  150. {
  151. new Weapon_Offset = FindSendPropOffs("CCSPlayer", "m_hMyWeapons");
  152. new String:tempweaponname[60];
  153. new Max_Guns = 48;
  154. for(new gun = 0; gun < Max_Guns; gun = (gun + 4))
  155. {
  156. new Weapon_ID = GetEntDataEnt2(Client, Weapon_Offset + gun);
  157. if(Weapon_ID > 0)
  158. {
  159. GetEdictClassname(Weapon_ID, tempweaponname, 60);
  160. if(AliveCheck(Client) == true)
  161. {
  162. RemovePlayerItem(Client, Weapon_ID);
  163. RemoveEdict(Weapon_ID);
  164. }
  165. }
  166. }
  167. GivePlayerItem(Client, "weapon_ak47");
  168. }
  169.  
  170. public Action:eventend(Handle:event, const String:name[], bool:Brodcast)
  171. {
  172. for(new i = 0;i <= MaxClients; i++)
  173. {
  174. if(CoolTime[i] != INVALID_HANDLE)
  175. {
  176. KillTimer(CoolTime[i]);
  177. CoolTime[i] = INVALID_HANDLE;
  178. }
  179. }
  180. if(roundtimecheck != INVALID_HANDLE)
  181. {
  182. KillTimer(roundtimecheck);
  183. roundtimecheck = INVALID_HANDLE;
  184. }
  185. }
  186.  
  187. public OnMapEnd()
  188. {
  189. for(new i = 1; i <= MaxClients; i++)
  190. {
  191. Save(i);
  192. KillTimer(htimer[i]);
  193. KillTimer(INFO[i]);
  194. KillTimer(GodTimer);
  195. if(CoolTime[i] != INVALID_HANDLE)
  196. {
  197. KillTimer(CoolTime[i]);
  198. CoolTime[i] = INVALID_HANDLE;
  199. }
  200. }
  201. if(roundtimecheck != INVALID_HANDLE)
  202. {
  203. KillTimer(roundtimecheck);
  204. roundtimecheck = INVALID_HANDLE;
  205. }
  206. }
  207.  
  208. public OnClientDisconnect(Client)
  209. {
  210. Save(Client);
  211. KillTimer(htimer[Client]);
  212. KillTimer(INFO[Client]);
  213. KillTimer(GodTimer);
  214. KillTimer(CoolTime[Client]);
  215. if(roundtimecheck != INVALID_HANDLE)
  216. {
  217. KillTimer(roundtimecheck);
  218. roundtimecheck = INVALID_HANDLE;
  219. }
  220. }
  221.  
  222. public Action:eventspawn(Handle:Event, const String:Name[], bool:Broadcast)
  223. {
  224. new Client = GetClientOfUserId(GetEventInt(Event,"userid"));
  225. BCTCounter[Client] = 5;
  226. BoosterCoolTimeCheck[Client] = 0;
  227. Booster[Client] = 100;
  228. PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 초기화 되었습니다.");
  229. EmitSoundToAll(die3, SOUND_FROM_PLAYER, _, _, _, 1.0);
  230. }
  231.  
  232. public Action:booster(Client,Arguments)
  233. {
  234. if(Boosterroundcheck == 1)
  235. {
  236. new Float:BPower = GetConVarFloat(BoosterPower);
  237. if(AliveCheck(Client) == true && BoosterCoolTimeCheck[Client] == 0)
  238. {
  239. if(Booster[Client] >= 1)
  240. {
  241. new Float:eye[3],Float:angle[3];
  242. GetClientEyeAngles(Client,angle);
  243. GetAngleVectors(angle,eye,NULL_VECTOR,NULL_VECTOR);
  244. NormalizeVector(eye,eye);
  245. ScaleVector(eye,Booster[Client]*BPower);
  246. TeleportEntity(Client, NULL_VECTOR, NULL_VECTOR, eye);
  247. PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 방출되었습니다[쿨타임 5초].");
  248. new String:name[64];
  249. GetClientName(Client, name, sizeof(name));
  250. PrintCenterTextAll("===[%s]=== 님이 부스터를 사용하셨습니다.", name);
  251. EmitSoundToAll(die1, SOUND_FROM_PLAYER, _, _, _, 1.0);
  252. Booster[Client] = 0;
  253. BoosterCoolTimeCheck[Client] = 1;
  254. CoolTime[Client] = CreateTimer(1.0, BCT, Client, TIMER_REPEAT);
  255. }
  256. else if(Booster[Client] == 0)
  257. {
  258. PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 부족합니다.");
  259. EmitSoundToAll(die2, SOUND_FROM_PLAYER, _, _, _, 1.0);
  260. }
  261. }
  262. else if(AliveCheck(Client) == true && BoosterCoolTimeCheck[Client] == 1)
  263. {
  264. PrintToChat(Client, "\x04[SM] - \x05아직 쿨타임 입니다[%d 초 남음]", BCTCounter[Client]);
  265. }
  266. }
  267. else if(Boosterroundcheck == 0)
  268. {
  269. PrintToChat(Client,"\x04[SM] - \x05지금은 사용 하실수 없습니다.");
  270. }
  271. return Plugin_Handled;
  272. }
  273.  
  274. public Action:BCT(Handle:timer, any:Client)
  275. {
  276. BCTCounter[Client] -= 1;
  277.  
  278. if(BCTCounter[Client] == 0)
  279. {
  280. PrintToChat(Client, "\x04[SM] - \x05부스터 시전 가능");
  281. BCTCounter[Client] = 5;
  282. BoosterCoolTimeCheck[Client] = 0;
  283. KillTimer(CoolTime[Client]);
  284. CoolTime[Client] = INVALID_HANDLE;
  285. }
  286. }
  287.  
  288. // 저장임 적당히 응용이 쉬움
  289. public Action:Save(Client)
  290. {
  291. if(Client > 0 && IsClientInGame(Client))
  292. {
  293. new String:SteamID[32];
  294. GetClientAuthString(Client, SteamID, 32);
  295.  
  296. decl Handle:Vault;
  297.  
  298. Vault = CreateKeyValues("Vault");
  299.  
  300. if(FileExists(Path))
  301. {
  302. FileToKeyValues(Vault, Path);
  303. }
  304.  
  305. if(second[Client] > 0)
  306. {
  307. KvJumpToKey(Vault, "second", true);
  308. KvSetNum(Vault, SteamID, second[Client]);
  309. KvRewind(Vault);
  310. }
  311. else
  312. {
  313. KvJumpToKey(Vault, "second", false);
  314. KvDeleteKey(Vault, SteamID);
  315. KvRewind(Vault);
  316. }
  317.  
  318. if(minute[Client] > 0)
  319. {
  320. KvJumpToKey(Vault, "minute", true);
  321. KvSetNum(Vault, SteamID, minute[Client]);
  322. KvRewind(Vault);
  323. }
  324. else
  325. {
  326. KvJumpToKey(Vault, "minute", false);
  327. KvDeleteKey(Vault, SteamID);
  328. KvRewind(Vault);
  329. }
  330.  
  331. if(times[Client] > 0)
  332. {
  333. KvJumpToKey(Vault, "times", true);
  334. KvSetNum(Vault, SteamID, times[Client]);
  335. KvRewind(Vault);
  336. }
  337. else
  338. {
  339. KvJumpToKey(Vault, "times", false);
  340. KvDeleteKey(Vault, SteamID);
  341. KvRewind(Vault);
  342. }
  343.  
  344. if(day[Client] > 0)
  345. {
  346. KvJumpToKey(Vault, "day", true);
  347. KvSetNum(Vault, SteamID, day[Client]);
  348. KvRewind(Vault);
  349. }
  350. else
  351. {
  352. KvJumpToKey(Vault, "day", false);
  353. KvDeleteKey(Vault, SteamID);
  354. KvRewind(Vault);
  355. }
  356.  
  357. KvRewind(Vault);
  358.  
  359. KeyValuesToFile(Vault, Path);
  360.  
  361. CloseHandle(Vault);
  362. }
  363. }
  364.  
  365. // 로드임 이거역시 응용하기 쉬움
  366. public Action:Load(Client)
  367. {
  368. if(Client > 0 && Client <= MaxClients)
  369. {
  370. new String:SteamID[32];
  371. GetClientAuthString(Client, SteamID, 32);
  372.  
  373. decl Handle:Vault;
  374.  
  375. Vault = CreateKeyValues("Vault");
  376.  
  377. FileToKeyValues(Vault, Path);
  378.  
  379. KvJumpToKey(Vault, "second", false);
  380. second[Client] = KvGetNum(Vault, SteamID);
  381. KvRewind(Vault);
  382.  
  383. KvJumpToKey(Vault, "minute", false);
  384. minute[Client] = KvGetNum(Vault, SteamID);
  385. KvRewind(Vault);
  386.  
  387. KvJumpToKey(Vault, "times", false);
  388. times[Client] = KvGetNum(Vault, SteamID);
  389. KvRewind(Vault);
  390.  
  391. KvJumpToKey(Vault, "day", false);
  392. day[Client] = KvGetNum(Vault, SteamID);
  393. KvRewind(Vault);
  394.  
  395. CloseHandle(Vault);
  396. }
  397. }
  398.  
  399. public OnClientPutInServer(Client)
  400. {
  401. Load(Client);
  402. htimer[Client] = CreateTimer(1.0, ServerTimer, Client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  403. INFO[Client] = CreateTimer(0.5, ShowCountText2, Client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
  404. PrintToChat(Client, "\x04당신의 플레이 시간 \x03 %d일 %d시간 %d분 %d초", day[Client], times[Client], minute[Client], second[Client]);
  405. }
  406.  
  407. public Action:ServerTimer(Handle:Timer, any:Client)
  408. {
  409. if(IsClientInGame(Client) && IsPlayerAlive(Client))
  410. {
  411. second[Client] += 1;
  412.  
  413. // 만약... 60초 라면
  414. if(second[Client] == 60)
  415. {
  416. // 1분 추가
  417. minute[Client] += 1;
  418. // 60초 감소
  419. second[Client] -= 60;
  420. }
  421. // 만약... 60분 이라면
  422. if(minute[Client] == 60)
  423. {
  424. // 1시간 추가
  425. times[Client] += 1;
  426. // 60분 감소
  427. minute[Client] -= 60;
  428. }
  429. // 만약... 24시간 이라면
  430. if(times[Client] == 24)
  431. {
  432. // 1일을 더해준다
  433. day[Client] += 1;
  434. // 24시간을 감소
  435. times[Client] -= 24;
  436. }
  437. }
  438. }
  439.  
  440. public Action:ShowCountText2(Handle:timer, any:Client)
  441. {
  442. new CT = 0;
  443. new TR = 0;
  444. new plus = 0;
  445.  
  446. for(new i = 1;i <= MaxClients; i++)
  447. {
  448. if(IsClientInGame(i) && IsPlayerAlive(i))
  449. {
  450. if(GetClientTeam(i) == 2) TR++;
  451. else if(GetClientTeam(i) == 3) CT++;
  452. plus++;
  453. }
  454. }
  455. if(IsClientInGame(Client))
  456. {
  457. ActionBooster(Client);
  458. decl String:HudText[256];
  459. Format(HudText, sizeof(HudText), "◎Alive|CT : %d|T : %d|All : %d|\n\n◎플레이 타임[Total] : %d일 %d시간 %d분 %d초\n\n◎부스터 게이지 : %d", CT, TR, plus, day[Client], times[Client], minute[Client], second[Client], Booster[Client]);
  460. // 옆에 뜨는것들
  461. new Handle:buffer = StartMessageOne("KeyHintText", Client);
  462. BfWriteByte(buffer, 1);
  463. BfWriteString(buffer, HudText);
  464. EndMessage();
  465. }
  466. }
  467.  
  468. stock bool:IsClientConnectedIngame(client){
  469.  
  470. if(client > 0 && client <= MaxClients){
  471.  
  472. if(IsClientConnected(client) == true){
  473.  
  474. if(IsClientInGame(client) == true){
  475.  
  476. return true;
  477.  
  478. }else{
  479.  
  480. return false;
  481.  
  482. }
  483.  
  484. }else{
  485.  
  486. return false;
  487.  
  488. }
  489.  
  490. }else{
  491.  
  492. return false;
  493.  
  494. }
  495.  
  496. }
  497.  
  498. public ActionBooster(Client)
  499. {
  500. if(Booster[Client] <Full)
  501. Booster[Client]++;
  502. else if(Booster[Client] == Full)
  503. Booster[Client] = Full;
  504. }
  505.  
  506. stock SendKeyHintTextMsg(Client, String:msg[], any:...){ // 허드띄울라면 이게필요함
  507. new Handle:hudhandle = INVALID_HANDLE;
  508. if(Client == 0){
  509. hudhandle = StartMessageAll("KeyHintText");
  510. }else{
  511. hudhandle = StartMessageOne("KeyHintText", Client);
  512. }
  513. new String:txt[255];
  514. VFormat(txt, sizeof(txt), msg, 3);
  515. if(hudhandle != INVALID_HANDLE){
  516. BfWriteByte(hudhandle, 1);
  517. BfWriteString(hudhandle, txt);
  518. EndMessage();
  519. }
  520. }
  521.  
  522. stock bool:AliveCheck(Client)
  523. {
  524. if(Client > 0 && Client <= MaxClients){
  525. if(IsClientConnected(Client) == true){
  526. if(IsClientInGame(Client) == true){
  527. if(IsPlayerAlive(Client) == true){
  528. return true;
  529. }else{
  530. return false;
  531. }
  532. }else{
  533. return false;
  534. }
  535. }else{
  536. return false;
  537. }
  538. }else{
  539. return false;
  540. }
  541. }
  542. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  543. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset129 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1042\\ f0\\ fs16 \n\\ par }
  544. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement