Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 인클루드
- #include <sourcemod>
- #include <sdktools>
- #include <cstrike>
- #include <geoip.inc>
- #include <string.inc>
- #include <sdkhooks>
- #pragma semicolon 1
- #define die1 "booster.wav"
- #define die2 "emfty.wav"
- #define die3 "full.wav"
- #define Color "\x07FF80FF"
- #define Color2 "\x07F84960"
- #define Color3 "\x07FAF4C0"
- #define Color4 "\x07664B00"
- #define DMG_FALL (1 << 5)
- // 저장을 위한 선언
- new String:Path[MAXPLAYERS+1];
- new const GodColor[3] = {255, 255, 255};//R, G, B
- // 초 , 분 , 시간 , 일 선언
- new second[MAXPLAYERS+1];
- new minute[MAXPLAYERS+1];
- new times[MAXPLAYERS+1];
- new day[MAXPLAYERS+1];
- new Booster[MAXPLAYERS+1] = 0;
- new Full = 100;
- new BoosterCoolTimeCheck[MAXPLAYERS+1] = 0;
- new BCTCounter[MAXPLAYERS+1] = 5;
- new Boosterroundcheck = 0;
- // 옆에 뜨는 Total Playing Time 되게 하는거
- new Handle:INFO[MAXPLAYERS+1];
- new Handle:htimer[MAXPLAYERS+1];
- new Handle:GodTimer;
- new Handle:CoolTime[MAXPLAYERS+1] = INVALID_HANDLE;
- new Handle:BoosterPower = INVALID_HANDLE;
- public OnPluginStart()
- {
- RegConsoleCmd("sm_booster",booster,"부스터온");
- HookEvent("player_spawn",eventspawn);
- HookEvent("round_start", eventstart);
- HookEvent("round_end",eventend);
- BoosterPower = CreateConVar("sv_bpower","1200.0","부스터 파워 값(원래값의 1/80 ~ 1/100으로만설정바람)",FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_REPLICATED);
- AutoExecConfig(true,"BoosterGage");
- }
- // 플러그인 스타트
- public OnMapStart()
- {
- BuildPath(Path_SM, Path, 64, "data/timerserver_db.txt");
- decl String:File1[256];
- Format(File1, 256, "sound/%s", die1);
- AddFileToDownloadsTable(File1);
- PrecacheSound(die1, true);
- decl String:File2[256];
- Format(File2, 256, "sound/%s", die2);
- AddFileToDownloadsTable(File2);
- PrecacheSound(die2, true);
- decl String:file3[256];
- Format(file3, 256, "sound/%s", die3);
- AddFileToDownloadsTable(file3);
- PrecacheSound(die3, true);
- }
- public Action:eventstart(Handle:event, const String:name[], bool:dontBroadcast)
- {
- new Client = GetClientOfUserId(GetEventInt(event,"userid"));
- CreateTimer(0.1, GameStartTimer, Client);
- for (new i = 1; i <= MaxClients; i++)
- {
- if (IsClientInGame(i) && IsPlayerAlive(i))
- {
- SetEntProp(i, Prop_Data, "m_takedamage", 0, 1);
- SetEntityRenderColor(i, GodColor[0], GodColor[1], GodColor[2], 150);
- PrintToChat(i, "\x04[System Chat] \x03라운드 시작\x04 7\x03초간 무적상태가 됩니다.");
- GodTimer = CreateTimer(7.0, GOD_END, i);
- }
- }
- }
- public Action:OnTakeDamage(victim, &attacker, &inflict, &Float:damage, &damagetype)
- {
- if(damagetype & DMG_FALL)
- {
- damage = 0.0;
- return Plugin_Handled;
- }
- return Plugin_Continue;
- }
- public Action:GameStartTimer(Handle:timer, any:Client)
- {
- if(GetTeamClientCount(1)+GetTeamClientCount(2)+GetTeamClientCount(3) == 0)
- {
- Boosterroundcheck = 0;
- PrintToChat(Client, "\x04[SM] - \x05지금은 부스터를 사용할 수 없습니다.");
- }
- else if(GetTeamClientCount(1)+GetTeamClientCount(2)+GetTeamClientCount(3) != 0)
- {
- Boosterroundcheck = 1;
- }
- }
- public Action:GOD_END(Handle:timer, any:Client)
- {
- if(IsPlayerAlive(Client) == true)
- {
- SetEntProp(Client, Prop_Data, "m_takedamage", 2, 1);
- SetEntityRenderColor(Client, 255, 255, 255, 255);
- PrintToChat(Client, "\x04[System Chat] \x03무적상태가 해제되었습니다.");
- GodTimer = INVALID_HANDLE;
- }
- }
- public Action:eventend(Handle:event, const String:name[], bool:Brodcast)
- {
- for(new i = 0;i <= MaxClients; i++)
- {
- if(CoolTime[i] != INVALID_HANDLE)
- {
- KillTimer(CoolTime[i]);
- CoolTime[i] = INVALID_HANDLE;
- }
- }
- }
- public OnMapEnd()
- {
- for(new i = 1; i <= MaxClients; i++)
- {
- Save(i);
- KillTimer(htimer[i]);
- KillTimer(INFO[i]);
- KillTimer(GodTimer);
- if(CoolTime[i] != INVALID_HANDLE)
- {
- KillTimer(CoolTime[i]);
- CoolTime[i] = INVALID_HANDLE;
- }
- }
- }
- public OnClientDisconnect(Client)
- {
- Save(Client);
- KillTimer(htimer[Client]);
- KillTimer(INFO[Client]);
- KillTimer(GodTimer);
- KillTimer(CoolTime[Client]);
- }
- public Action:eventspawn(Handle:Event, const String:Name[], bool:Broadcast)
- {
- new Client = GetClientOfUserId(GetEventInt(Event,"userid"));
- BCTCounter[Client] = 5;
- BoosterCoolTimeCheck[Client] = 0;
- Booster[Client] = 100;
- PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 초기화 되었습니다.");
- EmitSoundToAll(die3, SOUND_FROM_PLAYER, _, _, _, 1.0);
- }
- public Action:booster(Client,Arguments)
- {
- if(Boosterroundcheck == 1)
- {
- new Float:BPower = GetConVarFloat(BoosterPower);
- if(AliveCheck(Client) == true && BoosterCoolTimeCheck[Client] == 0)
- {
- if(Booster[Client] >= 1)
- {
- new Float:eye[3],Float:angle[3];
- GetClientEyeAngles(Client,angle);
- GetAngleVectors(angle,eye,NULL_VECTOR,NULL_VECTOR);
- NormalizeVector(eye,eye);
- ScaleVector(eye,Booster[Client]*BPower);
- TeleportEntity(Client, NULL_VECTOR, NULL_VECTOR, eye);
- PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 방출되었습니다[쿨타임 5초].");
- new String:name[64];
- GetClientName(Client, name, sizeof(name));
- PrintCenterTextAll("===[%s]=== 님이 부스터를 사용하셨습니다.", name);
- EmitSoundToAll(die1, SOUND_FROM_PLAYER, _, _, _, 1.0);
- Booster[Client] = 0;
- BoosterCoolTimeCheck[Client] = 1;
- CoolTime[Client] = CreateTimer(1.0, BCT, Client, TIMER_REPEAT);
- }
- else if(Booster[Client] == 0)
- {
- PrintToChat(Client,"\x04[SM] - \x05부스터 게이지가 부족합니다.");
- EmitSoundToAll(die2, SOUND_FROM_PLAYER, _, _, _, 1.0);
- }
- }
- else if(AliveCheck(Client) == true && BoosterCoolTimeCheck[Client] == 1)
- {
- PrintToChat(Client, "\x04[SM] - \x05아직 쿨타임 입니다[%d 초 남음]", BCTCounter[Client]);
- }
- }
- else if(Boosterroundcheck == 0)
- {
- PrintToChat(Client,"\x04[SM] - \x05지금은 사용 하실수 없습니다.");
- }
- return Plugin_Handled;
- }
- public Action:BCT(Handle:timer, any:Client)
- {
- BCTCounter[Client] -= 1;
- if(BCTCounter[Client] == 0)
- {
- PrintToChat(Client, "\x04[SM] - \x05부스터 시전 가능");
- BCTCounter[Client] = 5;
- BoosterCoolTimeCheck[Client] = 0;
- KillTimer(CoolTime[Client]);
- CoolTime[Client] = INVALID_HANDLE;
- }
- }
- // 저장임 적당히 응용이 쉬움
- public Action:Save(Client)
- {
- if(Client > 0 && IsClientInGame(Client))
- {
- new String:SteamID[32];
- GetClientAuthString(Client, SteamID, 32);
- decl Handle:Vault;
- Vault = CreateKeyValues("Vault");
- if(FileExists(Path))
- {
- FileToKeyValues(Vault, Path);
- }
- if(second[Client] > 0)
- {
- KvJumpToKey(Vault, "second", true);
- KvSetNum(Vault, SteamID, second[Client]);
- KvRewind(Vault);
- }
- else
- {
- KvJumpToKey(Vault, "second", false);
- KvDeleteKey(Vault, SteamID);
- KvRewind(Vault);
- }
- if(minute[Client] > 0)
- {
- KvJumpToKey(Vault, "minute", true);
- KvSetNum(Vault, SteamID, minute[Client]);
- KvRewind(Vault);
- }
- else
- {
- KvJumpToKey(Vault, "minute", false);
- KvDeleteKey(Vault, SteamID);
- KvRewind(Vault);
- }
- if(times[Client] > 0)
- {
- KvJumpToKey(Vault, "times", true);
- KvSetNum(Vault, SteamID, times[Client]);
- KvRewind(Vault);
- }
- else
- {
- KvJumpToKey(Vault, "times", false);
- KvDeleteKey(Vault, SteamID);
- KvRewind(Vault);
- }
- if(day[Client] > 0)
- {
- KvJumpToKey(Vault, "day", true);
- KvSetNum(Vault, SteamID, day[Client]);
- KvRewind(Vault);
- }
- else
- {
- KvJumpToKey(Vault, "day", false);
- KvDeleteKey(Vault, SteamID);
- KvRewind(Vault);
- }
- KvRewind(Vault);
- KeyValuesToFile(Vault, Path);
- CloseHandle(Vault);
- }
- }
- // 로드임 이거역시 응용하기 쉬움
- public Action:Load(Client)
- {
- if(Client > 0 && Client <= MaxClients)
- {
- new String:SteamID[32];
- GetClientAuthString(Client, SteamID, 32);
- decl Handle:Vault;
- Vault = CreateKeyValues("Vault");
- FileToKeyValues(Vault, Path);
- KvJumpToKey(Vault, "second", false);
- second[Client] = KvGetNum(Vault, SteamID);
- KvRewind(Vault);
- KvJumpToKey(Vault, "minute", false);
- minute[Client] = KvGetNum(Vault, SteamID);
- KvRewind(Vault);
- KvJumpToKey(Vault, "times", false);
- times[Client] = KvGetNum(Vault, SteamID);
- KvRewind(Vault);
- KvJumpToKey(Vault, "day", false);
- day[Client] = KvGetNum(Vault, SteamID);
- KvRewind(Vault);
- CloseHandle(Vault);
- }
- }
- public OnClientPutInServer(Client)
- {
- Load(Client);
- SDKHook(Client, SDKHook_OnTakeDamage, OnTakeDamage);
- htimer[Client] = CreateTimer(1.0, ServerTimer, Client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
- INFO[Client] = CreateTimer(0.5, ShowCountText2, Client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
- PrintToChat(Client, "\x04당신의 플레이 시간 \x03 %d일 %d시간 %d분 %d초", day[Client], times[Client], minute[Client], second[Client]);
- }
- public Action:ServerTimer(Handle:Timer, any:Client)
- {
- if(IsClientInGame(Client) && IsPlayerAlive(Client))
- {
- second[Client] += 1;
- // 만약... 60초 라면
- if(second[Client] == 60)
- {
- // 1분 추가
- minute[Client] += 1;
- // 60초 감소
- second[Client] -= 60;
- }
- // 만약... 60분 이라면
- if(minute[Client] == 60)
- {
- // 1시간 추가
- times[Client] += 1;
- // 60분 감소
- minute[Client] -= 60;
- }
- // 만약... 24시간 이라면
- if(times[Client] == 24)
- {
- // 1일을 더해준다
- day[Client] += 1;
- // 24시간을 감소
- times[Client] -= 24;
- }
- }
- }
- public Action:ShowCountText2(Handle:timer, any:Client)
- {
- new CT = 0;
- new TR = 0;
- new plus = 0;
- for(new i = 1;i <= MaxClients; i++)
- {
- if(IsClientInGame(i) && IsPlayerAlive(i))
- {
- if(GetClientTeam(i) == 2) TR++;
- else if(GetClientTeam(i) == 3) CT++;
- plus++;
- }
- }
- if(IsClientInGame(Client))
- {
- ActionBooster(Client);
- decl String:HudText[256];
- 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]);
- // 옆에 뜨는것들
- new Handle:buffer = StartMessageOne("KeyHintText", Client);
- BfWriteByte(buffer, 1);
- BfWriteString(buffer, HudText);
- EndMessage();
- }
- }
- stock bool:IsClientConnectedIngame(client){
- if(client > 0 && client <= MaxClients){
- if(IsClientConnected(client) == true){
- if(IsClientInGame(client) == true){
- return true;
- }else{
- return false;
- }
- }else{
- return false;
- }
- }else{
- return false;
- }
- }
- public ActionBooster(Client)
- {
- if(Booster[Client] <Full)
- Booster[Client]++;
- else if(Booster[Client] == Full)
- Booster[Client] = Full;
- }
- stock SendKeyHintTextMsg(Client, String:msg[], any:...){ // 허드띄울라면 이게필요함
- new Handle:hudhandle = INVALID_HANDLE;
- if(Client == 0){
- hudhandle = StartMessageAll("KeyHintText");
- }else{
- hudhandle = StartMessageOne("KeyHintText", Client);
- }
- new String:txt[255];
- VFormat(txt, sizeof(txt), msg, 3);
- if(hudhandle != INVALID_HANDLE){
- BfWriteByte(hudhandle, 1);
- BfWriteString(hudhandle, txt);
- EndMessage();
- }
- }
- stock bool:AliveCheck(Client)
- {
- if(Client > 0 && Client <= MaxClients){
- if(IsClientConnected(Client) == true){
- if(IsClientInGame(Client) == true){
- if(IsPlayerAlive(Client) == true){
- return true;
- }else{
- return false;
- }
- }else{
- return false;
- }
- }else{
- return false;
- }
- }else{
- return false;
- }
- }
- /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
- *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset129 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1042\\ f0\\ fs16 \n\\ par }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement