#pragma semicolon 1 #include #include #include #include #include #include #define PLUGIN "JB Sandalye Kapmaca (Multi-Mod)" #define VERSION "7.1.0" #define AUTHOR "RholTClan & Gemini / optimized" new const MODEL_SANDALYE[] = "models/rholtclan/rgsandalye31.mdl"; new const SES_MUZIK[] = "rholtclan/sandalye_muzik.wav"; new const SES_SAYAC[] = "buttons/blip1.wav"; new const ENT_CLASS[] = "ent_sandalye"; new const TAG[] = "RholTClan"; new const Float:AUTO_CENTER_ORIGIN[3] = {-2284.5, -191.1, 146.0}; // Packaged sandalye_muzik.wav is 13.19 seconds and contains no WAV loop marker. const Float:MUSIC_REPEAT_INTERVAL = 13.19; enum (<<= 1) { BIT_SERI = 1, BIT_HIZLI, BIT_HAYALET, BIT_SARHOS, BIT_BADAIM, BIT_BUZ, BIT_AY } enum { TASK_COUNTDOWN = 2023, TASK_TIMER, TASK_ELIMINATE, TASK_VALIDATE, TASK_AUTO_START, TASK_SARHOS, TASK_BADAIM, TASK_MUSIC } native Hard_Komut(); native Hard_KomutAc(); native Hard_KomutKapat(); new g_iSelectedFlags, g_iManualChairCount; new bool:g_bManualMode; new Float:g_fCorners[4][3], bool:g_bCornerSet[4]; new bool:g_bAreaDefined, bool:g_bCenterDefined; new Float:g_fAreaMin[3], Float:g_fAreaMax[3], Float:g_fCenterOrigin[3]; new bool:g_bAutoMode, bool:g_bAutoStarting, bool:g_bAutoConfigSaved; new g_iSavedSelectedFlags, g_iSavedManualChairCount; new bool:g_bSavedManualMode, bool:g_bSavedAreaDefined, bool:g_bSavedCenterDefined; new bool:g_bSavedCornerSet[4]; new Float:g_fSavedCorners[4][3], Float:g_fSavedAreaMin[3], Float:g_fSavedAreaMax[3]; new Float:g_fSavedCenterOrigin[3]; new bool:g_bGameActive, bool:g_bRoundActive, bool:g_bCanSit; new bool:g_bEliminating, bool:g_bOwnHardMode, bool:g_bMusicPlaying; new bool:g_bParticipant[MAX_PLAYERS + 1]; new bool:g_bIsSeated[MAX_PLAYERS + 1], bool:g_bIsFrozen[MAX_PLAYERS + 1]; new Float:g_fSavedFriction[MAX_PLAYERS + 1], Float:g_fSavedGravity[MAX_PLAYERS + 1]; new g_iSavedRenderFx[MAX_PLAYERS + 1], g_iSavedRenderMode[MAX_PLAYERS + 1]; new Float:g_fSavedRenderAmount[MAX_PLAYERS + 1], Float:g_fSavedRenderColor[MAX_PLAYERS + 1][3]; new g_iChairByPlayer[MAX_PLAYERS + 1]; new g_iChairs[MAX_PLAYERS], Float:g_fChairOrigins[MAX_PLAYERS][3]; new g_iTotalChairs, g_iOccupiedChairs; new g_iShockwaveSprite, g_iCountdown, g_msgScreenShake, g_iTraceHandle; new Float:g_fRoundDeadline; new g_iPreThinkForward; new HamHook:g_hChairTouch; new HookChain:g_hResetMaxSpeed; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_clcmd("say /sandalye", "Cmd_SandalyeMenu"); register_clcmd("say /chair", "Cmd_SandalyeMenu"); register_clcmd("say /reset", "Cmd_Reset"); register_clcmd("Sandalye_Sayisi_Giriniz", "Cmd_ManualChairCount"); g_hChairTouch = RegisterHam(Ham_Touch, "info_target", "Ham_ChairTouch", false); DisableHamForward(g_hChairTouch); g_hResetMaxSpeed = RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "OnResetMaxSpeed", .post = true); DisableHookChain(g_hResetMaxSpeed); RegisterHookChain(RG_CSGameRules_RestartRound, "OnRestartRound", .post = true); RegisterHookChain(RG_CBasePlayer_Killed, "OnPlayerKilled", .post = true); register_event("TeamInfo", "OnTeamInfo", "a"); g_msgScreenShake = get_user_msgid("ScreenShake"); g_iTraceHandle = create_tr2(); } public plugin_natives() { register_native("SandalyeOyunu_Baslat", "Native_BaslatSandalyeOyunu"); register_native("SandalyeOyunu_Bitir", "Native_BitirSandalyeOyunu"); } SaveManualSettings() { g_iSavedSelectedFlags = g_iSelectedFlags; g_iSavedManualChairCount = g_iManualChairCount; g_bSavedManualMode = g_bManualMode; g_bSavedAreaDefined = g_bAreaDefined; g_bSavedCenterDefined = g_bCenterDefined; for(new i = 0; i < 4; i++) { g_bSavedCornerSet[i] = g_bCornerSet[i]; for(new axis = 0; axis < 3; axis++) g_fSavedCorners[i][axis] = g_fCorners[i][axis]; } for(new axis = 0; axis < 3; axis++) { g_fSavedAreaMin[axis] = g_fAreaMin[axis]; g_fSavedAreaMax[axis] = g_fAreaMax[axis]; g_fSavedCenterOrigin[axis] = g_fCenterOrigin[axis]; } g_bAutoConfigSaved = true; } RestoreManualSettings() { if(!g_bAutoConfigSaved) return; g_iSelectedFlags = g_iSavedSelectedFlags; g_iManualChairCount = g_iSavedManualChairCount; g_bManualMode = g_bSavedManualMode; g_bAreaDefined = g_bSavedAreaDefined; g_bCenterDefined = g_bSavedCenterDefined; for(new i = 0; i < 4; i++) { g_bCornerSet[i] = g_bSavedCornerSet[i]; for(new axis = 0; axis < 3; axis++) g_fCorners[i][axis] = g_fSavedCorners[i][axis]; } for(new axis = 0; axis < 3; axis++) { g_fAreaMin[axis] = g_fSavedAreaMin[axis]; g_fAreaMax[axis] = g_fSavedAreaMax[axis]; g_fCenterOrigin[axis] = g_fSavedCenterOrigin[axis]; } g_bAutoConfigSaved = false; } public Native_BaslatSandalyeOyunu(plugin, params) { if(g_bGameActive) return 0; SaveManualSettings(); g_bAutoMode = true; g_bAutoStarting = true; g_bAreaDefined = false; g_bCenterDefined = true; for(new axis = 0; axis < 3; axis++) g_fCenterOrigin[axis] = AUTO_CENTER_ORIGIN[axis]; Baslat_SandalyeOyunu(0); g_bAutoStarting = false; if(!g_bGameActive) { g_bAutoMode = false; RestoreManualSettings(); return 0; } return 1; } public Native_BitirSandalyeOyunu(plugin, params) { Bitir_SandalyeOyunu(); return 1; } public plugin_precache() { precache_model(MODEL_SANDALYE); precache_sound(SES_MUZIK); precache_sound(SES_SAYAC); g_iShockwaveSprite = precache_model("sprites/shockwave.spr"); } public plugin_end() { Bitir_SandalyeOyunu(); if(g_iTraceHandle) free_tr2(g_iTraceHandle); } bool:CanControl(id) { return id >= 1 && id <= MaxClients && is_user_connected(id) && get_member(id, m_iTeam) == TEAM_CT; } bool:CanEditSettings(id) { if(!CanControl(id)) return false; if(g_bGameActive) { client_print_color(id, id, "^3[%s] ^1Ayarlari degistirmek icin once oyunu bitirin.", TAG); return false; } return true; } public Cmd_Reset(id) { if(!CanControl(id)) return PLUGIN_HANDLED; Bitir_SandalyeOyunu(); return PLUGIN_HANDLED; } public Cmd_SandalyeMenu(id) { if(!CanControl(id)) { client_print_color(id, id, "^3[%s] ^1Sadece CT'ler bu menuyu kullanabilir.", TAG); return PLUGIN_HANDLED; } new szBaslik[256]; formatex(szBaslik, charsmax(szBaslik), "\r[RholTClan] \ySandalye Kapmaca v7.1^n\dAktif Modlar: \w%s", GetActiveModesString()); new menu = menu_create(szBaslik, "Menu_Handler"); if(!g_bCenterDefined) menu_additem(menu, "Oyun Alanini Belirle \d(Secilmedi)", "1"); else if(g_bAreaDefined) menu_additem(menu, "Oyun Alani: \y4 KOSE \d(Degistir)", "1"); else menu_additem(menu, "Oyun Alani: \yMERKEZ \d(Degistir)", "1"); menu_additem(menu, "Mod Ayarlari \d(Tikla ve Sec)", "2"); menu_additem(menu, "Sandalyeleri Kur ve Baslat", "3"); menu_additem(menu, "\rOyunu Bitir / Temizle", "4"); menu_display(id, menu); return PLUGIN_HANDLED; } public Menu_Handler(id, menu, item) { if(!CanControl(id)) { menu_destroy(menu); return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new data[6], name[64]; new access, callback; menu_item_getinfo(menu, item, access, data, 5, name, 63, callback); new key = str_to_num(data); switch(key) { case 1: Cmd_AlanSecimMenu(id); case 2: Cmd_ModSecimMenu(id); case 3: { if(!g_bCenterDefined) { client_print_color(id, id, "^3[%s] ^1Once oyun alanini belirlemelisin!", TAG); Cmd_SandalyeMenu(id); menu_destroy(menu); return PLUGIN_HANDLED; } if(g_bManualMode && g_iManualChairCount <= 0) { client_print_color(id, id, "^3[%s] ^1Manuel mod acik ama sayi girmediniz!", TAG); Cmd_ModSecimMenu(id); menu_destroy(menu); return PLUGIN_HANDLED; } Baslat_SandalyeOyunu(id); } case 4: { Bitir_SandalyeOyunu(); client_print_color(0, id, "^3[%s] ^1Oyun sonlandirildi.", TAG); } } menu_destroy(menu); return PLUGIN_HANDLED; } public Cmd_AlanSecimMenu(id) { if(!CanEditSettings(id)) return; new menu = menu_create("\r[RholTClan] \yAlan Secimi", "AlanMenu_Handler"); menu_additem(menu, "Tek Nokta (Merkez - Baktigin Yer)", "1"); new szItem[64]; formatex(szItem, charsmax(szItem), "4 Kose Belirle \d[%s]", g_bAreaDefined ? "\yAKTIF" : "\rPASIF"); menu_additem(menu, szItem, "2"); menu_display(id, menu); } public AlanMenu_Handler(id, menu, item) { if(!CanEditSettings(id)) { menu_destroy(menu); return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu); Cmd_SandalyeMenu(id); return PLUGIN_HANDLED; } new data[6]; menu_item_getinfo(menu, item, _, data, 5, _, _, _); new key = str_to_num(data); switch(key) { case 1: { get_entvar(id, var_origin, g_fCenterOrigin); g_fCenterOrigin[2] -= 30.0; g_bAreaDefined = false; g_bCenterDefined = true; // Reset corners for(new i=0; i<4; i++) g_bCornerSet[i] = false; GorselEfekt(g_fCenterOrigin); client_print_color(0, id, "^3[%s] ^1Merkez belirlendi (Tek Nokta)!", TAG); Cmd_SandalyeMenu(id); } case 2: Cmd_KoseMenu(id); } menu_destroy(menu); return PLUGIN_HANDLED; } public Cmd_KoseMenu(id) { if(!CanEditSettings(id)) return; new szTitle[64]; formatex(szTitle, charsmax(szTitle), "\r[RholTClan] \y4 Kose Belirle"); new menu = menu_create(szTitle, "KoseMenu_Handler"); for(new i=0; i<4; i++) { new szItem[64]; if(g_bCornerSet[i]) formatex(szItem, charsmax(szItem), "Kose %d \y[BELIRLENDI]", i+1); else formatex(szItem, charsmax(szItem), "Kose %d \d[Baktigin Yer]", i+1); new szInfo[2]; num_to_str(i+1, szInfo, 1); menu_additem(menu, szItem, szInfo); } menu_additem(menu, "\yAlani Kaydet ve Olustur", "5"); menu_display(id, menu); } public KoseMenu_Handler(id, menu, item) { if(!CanEditSettings(id)) { menu_destroy(menu); return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu); Cmd_AlanSecimMenu(id); return PLUGIN_HANDLED; } new data[6]; menu_item_getinfo(menu, item, _, data, 5, _, _, _); new key = str_to_num(data); if(key >= 1 && key <= 4) { new idx = key - 1; get_entvar(id, var_origin, g_fCorners[idx]); g_fCorners[idx][2] -= 30.0; g_bCornerSet[idx] = true; GorselEfekt(g_fCorners[idx]); client_print_color(id, id, "^3[%s] ^1Kose %d belirlendi!", TAG, key); Cmd_KoseMenu(id); } else if(key == 5) { for(new i=0; i<4; i++) { if(!g_bCornerSet[i]) { client_print_color(id, id, "^3[%s] ^1Tum koseleri belirlemelisiniz!", TAG); Cmd_KoseMenu(id); menu_destroy(menu); return PLUGIN_HANDLED; } } g_fAreaMin[0] = 99999.0; g_fAreaMin[1] = 99999.0; g_fAreaMax[0] = -99999.0; g_fAreaMax[1] = -99999.0; new Float:avgZ = 0.0; for(new i=0; i<4; i++) { if(g_fCorners[i][0] < g_fAreaMin[0]) g_fAreaMin[0] = g_fCorners[i][0]; if(g_fCorners[i][1] < g_fAreaMin[1]) g_fAreaMin[1] = g_fCorners[i][1]; if(g_fCorners[i][0] > g_fAreaMax[0]) g_fAreaMax[0] = g_fCorners[i][0]; if(g_fCorners[i][1] > g_fAreaMax[1]) g_fAreaMax[1] = g_fCorners[i][1]; avgZ += g_fCorners[i][2]; } if(g_fAreaMax[0] - g_fAreaMin[0] < 100.0 || g_fAreaMax[1] - g_fAreaMin[1] < 100.0) { client_print_color(id, id, "^3[%s] ^1Oyun alani en az 100 x 100 birim olmali!", TAG); menu_destroy(menu); Cmd_KoseMenu(id); return PLUGIN_HANDLED; } g_bCenterDefined = true; g_fCenterOrigin[0] = (g_fAreaMin[0] + g_fAreaMax[0]) / 2.0; g_fCenterOrigin[1] = (g_fAreaMin[1] + g_fAreaMax[1]) / 2.0; g_fCenterOrigin[2] = avgZ / 4.0; g_bAreaDefined = true; client_print_color(0, id, "^3[%s] ^14 Koseli Oyun Alani Olusturuldu!", TAG); Cmd_SandalyeMenu(id); } menu_destroy(menu); return PLUGIN_HANDLED; } public Cmd_ModSecimMenu(id) { if(!CanEditSettings(id)) return; new menu = menu_create("\r[RholTClan] \yMod Ayarlari (Coklu Secim)", "ModMenu_Handler"); AddMenuItemWithStatus(menu, "Seri Mod (2 Kisi Ele)", BIT_SERI, "1"); AddMenuItemWithStatus(menu, "Hizli Mod (3 Kisi Ele)", BIT_HIZLI, "2"); menu_additem(menu, "KAOS MODU MENUSU \r(Efektler)", "3"); new szItem[64]; if(g_bManualMode) formatex(szItem, charsmax(szItem), "\yManuel Sayi: \r[ACIK - %d]", g_iManualChairCount); else formatex(szItem, charsmax(szItem), "\wManuel Sayi: \d[KAPALI]"); menu_additem(menu, szItem, "0"); menu_display(id, menu); } public ModMenu_Handler(id, menu, item) { if(!CanEditSettings(id)) { menu_destroy(menu); return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu); Cmd_SandalyeMenu(id); return PLUGIN_HANDLED; } new data[6]; menu_item_getinfo(menu, item, _, data, 5, _, _, _); new key = str_to_num(data); switch(key) { case 1: g_iSelectedFlags ^= BIT_SERI; case 2: g_iSelectedFlags ^= BIT_HIZLI; case 3: Cmd_KaosMenu(id); case 0: { if(g_bManualMode) { g_bManualMode = false; } else { client_print_color(id, id, "^3[%s] ^1Manuel sayi giriniz:", TAG); client_cmd(id, "messagemode Sandalye_Sayisi_Giriniz"); menu_destroy(menu); return PLUGIN_HANDLED; } } } menu_destroy(menu); if(key != 3) Cmd_ModSecimMenu(id); return PLUGIN_HANDLED; } AddMenuItemWithStatus(menu, const szName[], iBit, const szInfo[]) { new szItem[64]; if(g_iSelectedFlags & iBit) formatex(szItem, charsmax(szItem), "\y%s: \r[ACIK]", szName); else formatex(szItem, charsmax(szItem), "\w%s: \d[KAPALI]", szName); menu_additem(menu, szItem, szInfo); } public Cmd_KaosMenu(id) { if(!CanEditSettings(id)) return; new menu = menu_create("\r[RholTClan] \yKaos Modu Ayarlari", "KaosMenu_Handler"); AddMenuItemWithStatus(menu, "Hayalet Mod (Gorunmezlik)", BIT_HAYALET, "1"); AddMenuItemWithStatus(menu, "Sarhos Mod (Ekran Sallanir)", BIT_SARHOS, "2"); AddMenuItemWithStatus(menu, "BAD AIM (Sert Recoil)", BIT_BADAIM, "3"); AddMenuItemWithStatus(menu, "BUZ Mod (Kaygan Zemin)", BIT_BUZ, "4"); AddMenuItemWithStatus(menu, "AY Modu (Dusuk Yercekimi)", BIT_AY, "5"); menu_display(id, menu); } public KaosMenu_Handler(id, menu, item) { if(!CanEditSettings(id)) { menu_destroy(menu); return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu); Cmd_ModSecimMenu(id); return PLUGIN_HANDLED; } new data[6]; menu_item_getinfo(menu, item, _, data, 5, _, _, _); new key = str_to_num(data); switch(key) { case 1: g_iSelectedFlags ^= BIT_HAYALET; case 2: g_iSelectedFlags ^= BIT_SARHOS; case 3: g_iSelectedFlags ^= BIT_BADAIM; case 4: g_iSelectedFlags ^= BIT_BUZ; case 5: g_iSelectedFlags ^= BIT_AY; } menu_destroy(menu); Cmd_KaosMenu(id); return PLUGIN_HANDLED; } public Cmd_ManualChairCount(id) { if(!CanEditSettings(id)) return PLUGIN_HANDLED; if(!CanControl(id)) return PLUGIN_HANDLED; new szArg[32]; read_args(szArg, charsmax(szArg)); remove_quotes(szArg); trim(szArg); if(is_str_num(szArg)) { new iCount = str_to_num(szArg); if(iCount > 0) { g_iManualChairCount = clamp(iCount, 1, MAX_PLAYERS - 1); g_bManualMode = true; client_print_color(id, id, "^3[%s] ^1Manuel sayi ^4%d ^1olarak ayarlandi.", TAG, g_iManualChairCount); } } Cmd_ModSecimMenu(id); return PLUGIN_HANDLED; } // The participant set is captured once; late joiners cannot be eliminated by this game. CollectParticipants(players[MAX_PLAYERS]) { new count; for(new id = 1; id <= MaxClients; id++) { if(g_bParticipant[id] && is_user_alive(id) && get_member(id, m_iTeam) == TEAM_TERRORIST) players[count++] = id; } return count; } SavePlayerState(id) { g_bParticipant[id] = true; g_fSavedFriction[id] = Float:get_entvar(id, var_friction); g_fSavedGravity[id] = Float:get_entvar(id, var_gravity); g_iSavedRenderFx[id] = get_entvar(id, var_renderfx); g_iSavedRenderMode[id] = get_entvar(id, var_rendermode); g_fSavedRenderAmount[id] = Float:get_entvar(id, var_renderamt); get_entvar(id, var_rendercolor, g_fSavedRenderColor[id]); } RestorePlayerPhysics(id) { if(!g_bParticipant[id] || !is_user_connected(id)) return; UnfreezePlayer(id); set_entvar(id, var_punchangle, Float:{0.0, 0.0, 0.0}); set_entvar(id, var_friction, g_fSavedFriction[id]); set_entvar(id, var_gravity, g_fSavedGravity[id]); set_entvar(id, var_renderfx, g_iSavedRenderFx[id]); set_entvar(id, var_rendermode, g_iSavedRenderMode[id]); set_entvar(id, var_renderamt, g_fSavedRenderAmount[id]); set_entvar(id, var_rendercolor, g_fSavedRenderColor[id]); } ResetSlot(id) { g_bParticipant[id] = false; g_bIsSeated[id] = false; g_bIsFrozen[id] = false; g_iChairByPlayer[id] = 0; } StopTasks() { remove_task(TASK_COUNTDOWN); remove_task(TASK_TIMER); remove_task(TASK_ELIMINATE); remove_task(TASK_VALIDATE); remove_task(TASK_AUTO_START); remove_task(TASK_SARHOS); remove_task(TASK_BADAIM); remove_task(TASK_MUSIC); } public Baslat_SandalyeOyunu(id) { if(id && (!CanControl(id) || g_bGameActive)) { if(CanControl(id)) client_print_color(id, id, "^3[%s] ^1Oyun zaten aktif. Once oyunu bitirin.", TAG); return; } if(!g_bCenterDefined) return; new players[MAX_PLAYERS], count; if(!g_bGameActive) { get_players_ex(players, count, GetPlayers_ExcludeDead | GetPlayers_MatchTeam, "TERRORIST"); if(count < 2) { client_print_color(id, print_team_default, "^3[%s] ^1En az 2 canli mahkum gerekli!", TAG); return; } // Do not release a hard-command mode that another game already owned. g_bOwnHardMode = !bool:Hard_Komut(); if(g_bOwnHardMode) Hard_KomutAc(); for(new i = 0; i < count; i++) SavePlayerState(players[i]); g_bGameActive = true; EnableHamForward(g_hChairTouch); EnableHookChain(g_hResetMaxSpeed); g_iPreThinkForward = register_forward(FM_PlayerPreThink, "Fwd_PlayerPreThink"); } else { count = CollectParticipants(players); if(count < 2) { FinishIfOnlyOne(); return; } } StopTasks(); TemizleSandalyeler(); g_bRoundActive = true; g_bCanSit = false; g_bEliminating = false; g_iOccupiedChairs = 0; new wanted = count - 1; if(g_bManualMode) wanted = g_iManualChairCount; else if(g_iSelectedFlags & BIT_HIZLI) wanted = count - 3; else if(g_iSelectedFlags & BIT_SERI) wanted = count - 2; wanted = clamp(wanted, 1, count - 1); for(new i = 0; i < count; i++) { new player = players[i]; RestorePlayerPhysics(player); g_bIsSeated[player] = false; g_iChairByPlayer[player] = 0; MoveToCenter(player); set_entvar(player, var_health, 100.0); FreezePlayer(player); } SpawnChairsScattered(wanted); if(!g_iTotalChairs) { client_print_color(0, print_team_default, "^3[%s] ^1Guvenli sandalye yeri bulunamadi; daha genis bir alan secin.", TAG); Bitir_SandalyeOyunu(); return; } if(g_iTotalChairs < wanted) client_print_color(0, print_team_default, "^3[%s] ^1Alana %d/%d sandalye sigdi.", TAG, g_iTotalChairs, wanted); client_print_color(0, print_team_default, "^3[%s] ^1Aktif Modlar: ^4%s", TAG, GetActiveModesString()); client_print_color(0, print_team_default, "^3[%s] ^1Toplam Sandalye: ^4%d", TAG, g_iTotalChairs); g_iCountdown = 5; Task_GameCountdown(); set_task(1.0, "Task_GameCountdown", TASK_COUNTDOWN, _, _, "b"); } public Task_GameCountdown() { if(!g_bGameActive || !g_bRoundActive) { remove_task(TASK_COUNTDOWN); return; } if(g_iCountdown > 0) { set_dhudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 1.0, 0.1, 0.1); show_dhudmessage(0, "SANDALYE KAPMACA^n%d SANIYE SONRA BASLIYOR!", g_iCountdown--); client_cmd(0, "spk %s", SES_SAYAC); } else { remove_task(TASK_COUNTDOWN); OyunuGercektenBaslat(); } } public OyunuGercektenBaslat() { if(!g_bGameActive || !g_bRoundActive) return; if(FinishIfOnlyOne()) return; new players[MAX_PLAYERS], count = CollectParticipants(players); for(new i = 0; i < count; i++) { new id = players[i]; UnfreezePlayer(id); if(g_iSelectedFlags & BIT_BUZ) set_entvar(id, var_friction, 0.1); if(g_iSelectedFlags & BIT_AY) set_entvar(id, var_gravity, 0.3); } g_bCanSit = true; client_print_color(0, print_team_default, "^3[%s] ^130 Saniyeniz var! Oturmayan elenir!", TAG); MuzikCal(true); g_fRoundDeadline = get_gametime() + 30.0; Task_GameTimer(); set_task(1.0, "Task_GameTimer", TASK_TIMER, _, _, "b"); if(g_iSelectedFlags & BIT_SARHOS) set_task(0.2, "Task_SarhosEfekti", TASK_SARHOS, _, _, "b"); if(g_iSelectedFlags & BIT_BADAIM) set_task(0.15, "Task_BadAimEfekti", TASK_BADAIM, _, _, "b"); } public Task_GameTimer() { if(!g_bRoundActive || !g_bCanSit) { remove_task(TASK_TIMER); return; } if(FinishIfOnlyOne()) return; new remaining = floatround(g_fRoundDeadline - get_gametime(), floatround_ceil); if(remaining <= 0) { CheckLosers(); return; } set_dhudmessage(255, 255, 0, -1.0, 0.2, 0, 0.0, 1.0, 0.1, 0.1); show_dhudmessage(0, "SANDALYE KAPMACA BASLADI!^nKALAN SURE: %d", remaining); } bool:CanReceiveEffect(id) { return g_bParticipant[id] && !g_bIsSeated[id] && is_user_alive(id) && get_member(id, m_iTeam) == TEAM_TERRORIST; } public Task_SarhosEfekti() { if(!g_bRoundActive || !g_bCanSit) { remove_task(TASK_SARHOS); return; } for(new id = 1; id <= MaxClients; id++) { if(!CanReceiveEffect(id)) continue; message_begin(MSG_ONE_UNRELIABLE, g_msgScreenShake, _, id); // ScreenShake uses 16-bit fixed-point fields; the old 255 << 12 overflowed. write_short(5 << 12); write_short(1 << 12); write_short(1 << 12); message_end(); new Float:punch[3]; punch[0] = random_float(-5.0, 5.0); punch[1] = random_float(-5.0, 5.0); set_entvar(id, var_punchangle, punch); } } public Task_BadAimEfekti() { if(!g_bRoundActive || !g_bCanSit) { remove_task(TASK_BADAIM); return; } for(new id = 1; id <= MaxClients; id++) { if(!CanReceiveEffect(id)) continue; new Float:punch[3]; punch[0] = random_float(-30.0, 30.0); punch[1] = random_float(-30.0, 30.0); set_entvar(id, var_punchangle, punch); } } public SpawnChairsScattered(count) { new Float:radius = 600.0 + float(count) * 25.0; new Float:distance = g_bAreaDefined ? (count > 20 ? 30.0 : (count > 10 ? 40.0 : 60.0)) : 90.0; for(new i = 0; i < count; i++) { new Float:origin[3], Float:angles[3]; new bool:found; // Relax only spacing, never collision checks, when an area is crowded. for(new pass = 0; pass < 2 && !found; pass++) { for(new attempt = 0; attempt < 50; attempt++) { if(g_bAreaDefined) { origin[0] = random_float(g_fAreaMin[0] + 25.0, g_fAreaMax[0] - 25.0); origin[1] = random_float(g_fAreaMin[1] + 25.0, g_fAreaMax[1] - 25.0); } else { origin[0] = g_fCenterOrigin[0] + random_float(-radius, radius); origin[1] = g_fCenterOrigin[1] + random_float(-radius, radius); } origin[2] = g_fCenterOrigin[2]; if(!IsSpawnPointValid(origin)) continue; if(IsTooCloseToOtherChairs(origin, pass ? distance * 0.5 : distance)) continue; if(DistanceSquared(origin, g_fCenterOrigin) < 48.0 * 48.0) continue; found = true; break; } } if(!found) continue; angles[1] = random_float(0.0, 360.0); CreateChairEntity(origin, angles); } } Float:DistanceSquared(const Float:a[3], const Float:b[3]) { new Float:dx = a[0] - b[0], Float:dy = a[1] - b[1], Float:dz = a[2] - b[2]; return dx * dx + dy * dy + dz * dz; } bool:IsTooCloseToOtherChairs(const Float:origin[3], Float:distance) { new Float:limit = distance * distance; for(new i = 0; i < g_iTotalChairs; i++) if(DistanceSquared(origin, g_fChairOrigins[i]) < limit) return true; return false; } bool:IsSpawnPointValid(const Float:origin[3]) { new Float:hullOrigin[3]; hullOrigin = origin; // Selected points are near floor level; lift the human hull clear of the floor. hullOrigin[2] += 36.0; engfunc(EngFunc_TraceHull, hullOrigin, hullOrigin, IGNORE_MONSTERS, HULL_HUMAN, 0, g_iTraceHandle); return !get_tr2(g_iTraceHandle, TR_StartSolid) && !get_tr2(g_iTraceHandle, TR_AllSolid); } CreateChairEntity(const Float:origin[3], const Float:angles[3]) { if(g_iTotalChairs >= MAX_PLAYERS) return 0; new ent = create_entity("info_target"); if(!is_valid_ent(ent)) return 0; entity_set_string(ent, EV_SZ_classname, ENT_CLASS); entity_set_model(ent, MODEL_SANDALYE); entity_set_size(ent, Float:{-20.0, -20.0, 0.0}, Float:{20.0, 20.0, 40.0}); entity_set_int(ent, EV_INT_solid, SOLID_TRIGGER); entity_set_int(ent, EV_INT_movetype, MOVETYPE_TOSS); entity_set_float(ent, EV_FL_takedamage, DAMAGE_NO); new Float:position[3]; position = origin; position[2] += 15.0; entity_set_origin(ent, position); entity_set_vector(ent, EV_VEC_angles, angles); entity_set_int(ent, EV_INT_iuser1, 0); if(g_iSelectedFlags & BIT_HAYALET) { set_entvar(ent, var_rendermode, kRenderTransColor); set_entvar(ent, var_renderamt, 30.0); } dllfunc(DLLFunc_Spawn, ent); entity_set_int(ent, EV_INT_solid, SOLID_TRIGGER); entity_set_size(ent, Float:{-20.0, -20.0, 0.0}, Float:{20.0, 20.0, 40.0}); if(!drop_to_floor(ent)) { remove_entity(ent); return 0; } g_iChairs[g_iTotalChairs] = ent; get_entvar(ent, var_origin, g_fChairOrigins[g_iTotalChairs]); g_iTotalChairs++; return ent; } MoveToCenter(id) { new Float:origin[3]; for(new attempt = 0; attempt < 20; attempt++) { origin = g_fCenterOrigin; origin[0] += random_float(-80.0, 80.0); origin[1] += random_float(-80.0, 80.0); origin[2] += 40.0; engfunc(EngFunc_TraceHull, origin, origin, DONT_IGNORE_MONSTERS, HULL_HUMAN, id, g_iTraceHandle); if(get_tr2(g_iTraceHandle, TR_StartSolid) || get_tr2(g_iTraceHandle, TR_AllSolid)) continue; engfunc(EngFunc_SetOrigin, id, origin); return; } // Leave the player at their valid position rather than teleport into a wall/player. } bool:IsGameChair(ent) { for(new i = 0; i < g_iTotalChairs; i++) { if(g_iChairs[i] != ent || !is_valid_ent(ent)) continue; new classname[32]; entity_get_string(ent, EV_SZ_classname, classname, charsmax(classname)); return bool:equal(classname, ENT_CLASS); } return false; } public Ham_ChairTouch(ent, id) { if(!g_bCanSit || !g_bRoundActive || id < 1 || id > MaxClients) return HAM_IGNORED; if(!g_bParticipant[id] || g_bIsSeated[id] || !is_user_alive(id)) return HAM_IGNORED; if(get_member(id, m_iTeam) != TEAM_TERRORIST || !is_valid_ent(ent) || !IsGameChair(ent)) return HAM_IGNORED; if(entity_get_int(ent, EV_INT_iuser1)) return HAM_IGNORED; entity_set_int(ent, EV_INT_iuser1, id); g_iChairByPlayer[id] = ent; g_iOccupiedChairs++; g_bIsSeated[id] = true; new Float:origin[3]; get_entvar(ent, var_origin, origin); origin[2] += 40.0; engfunc(EngFunc_SetOrigin, id, origin); FreezePlayer(id); SetPlayerGlow(id); client_print(id, print_center, "SANDALYEYI KAPTIN!"); if(g_iOccupiedChairs >= g_iTotalChairs) CheckLosers(); return HAM_IGNORED; } public CheckLosers() { if(!g_bGameActive || !g_bRoundActive || !g_bCanSit) return; g_bRoundActive = false; g_bCanSit = false; MuzikCal(false); remove_task(TASK_TIMER); remove_task(TASK_SARHOS); remove_task(TASK_BADAIM); for(new id = 1; id <= MaxClients; id++) { if(!g_bParticipant[id] || !is_user_connected(id)) continue; set_entvar(id, var_punchangle, Float:{0.0, 0.0, 0.0}); set_entvar(id, var_friction, g_fSavedFriction[id]); set_entvar(id, var_gravity, g_fSavedGravity[id]); FreezePlayer(id); } client_print_color(0, print_team_default, "^3[%s] ^1Muzik durdu! Ayakta kalanlar eleniyor...", TAG); remove_task(TASK_ELIMINATE); set_task(2.0, "Task_EliminateAndReset", TASK_ELIMINATE); } public Task_EliminateAndReset() { if(!g_bGameActive || g_bRoundActive) return; new players[MAX_PLAYERS], count = CollectParticipants(players); if(count <= 1) { FinishIfOnlyOne(); return; } // Our own kills must not invoke game cleanup in the middle of this loop. g_bEliminating = true; new survivors, bool:eliminated; for(new i = 0; i < count; i++) { new id = players[i]; if(!g_bIsSeated[id]) { RestorePlayerPhysics(id); ResetSlot(id); user_kill(id, 1); eliminated = true; } else { survivors++; RestorePlayerPhysics(id); g_bIsSeated[id] = false; g_iChairByPlayer[id] = 0; MoveToCenter(id); } } g_bEliminating = false; if(eliminated) GorselEfekt(g_fCenterOrigin); TemizleSandalyeler(); if(survivors <= 1) { FinishIfOnlyOne(); } else { client_print_color(0, print_team_default, "^3[%s] ^1Kalanlar merkeze cekildi. Yeni tur 3 saniye icinde basliyor...", TAG); set_task(3.0, "Task_OtomatikBaslat", TASK_AUTO_START); } } public Task_OtomatikBaslat() { if(g_bGameActive) Baslat_SandalyeOyunu(0); } bool:FinishIfOnlyOne() { if(!g_bGameActive || g_bEliminating) return false; new players[MAX_PLAYERS], count = CollectParticipants(players); if(count > 1) return false; if(count == 1) client_print_color(0, print_team_default, "^3[%s] ^4%n ^1SANDALYE KAPMACA OYUNUNU KAZANDI!", TAG, players[0]); else client_print_color(0, print_team_default, "^3[%s] ^1Oyunda mahkum kalmadi; oyun bitti.", TAG); Bitir_SandalyeOyunu(); return true; } public Bitir_SandalyeOyunu() { new bool:notifyOtoKomut = g_bAutoMode && !g_bAutoStarting; g_bAutoMode = false; g_bGameActive = false; g_bRoundActive = false; g_bCanSit = false; g_bEliminating = false; StopTasks(); DisableHamForward(g_hChairTouch); DisableHookChain(g_hResetMaxSpeed); if(g_iPreThinkForward) { unregister_forward(FM_PlayerPreThink, g_iPreThinkForward); g_iPreThinkForward = 0; } TemizleSandalyeler(); MuzikCal(false); for(new id = 1; id <= MaxClients; id++) { RestorePlayerPhysics(id); ResetSlot(id); } if(g_bOwnHardMode) { Hard_KomutKapat(); g_bOwnHardMode = false; } if(g_bAutoConfigSaved) RestoreManualSettings(); else { g_iSelectedFlags = 0; g_bManualMode = false; g_iManualChairCount = 0; } if(notifyOtoKomut) server_cmd("otokomut_sandalye_bitti"); } public OnRestartRound() { if(g_bGameActive) Bitir_SandalyeOyunu(); g_iSelectedFlags = 0; g_bManualMode = false; } ReleaseParticipant(id) { new ent = g_iChairByPlayer[id]; if(g_bIsSeated[id] && is_valid_ent(ent) && IsGameChair(ent)) { entity_set_int(ent, EV_INT_iuser1, 0); if(g_iOccupiedChairs > 0) g_iOccupiedChairs--; } RestorePlayerPhysics(id); ResetSlot(id); } public OnPlayerKilled(victim, attacker, gib) { if(!g_bGameActive || g_bEliminating || !g_bParticipant[victim]) return; ReleaseParticipant(victim); FinishIfOnlyOne(); } public client_putinserver(id) { ResetSlot(id); } public client_disconnected(id) { if(g_bParticipant[id]) ReleaseParticipant(id); ResetSlot(id); if(g_bGameActive && !g_bEliminating) { remove_task(TASK_VALIDATE); set_task(0.1, "Task_ValidateParticipants", TASK_VALIDATE); } } public OnTeamInfo() { new id = read_data(1); if(id < 1 || id > MaxClients || !g_bParticipant[id]) return; new team[16]; read_data(2, team, charsmax(team)); if(!equal(team, "TERRORIST")) { ReleaseParticipant(id); if(g_bGameActive && !g_bEliminating) { remove_task(TASK_VALIDATE); set_task(0.1, "Task_ValidateParticipants", TASK_VALIDATE); } } } public Task_ValidateParticipants() { FinishIfOnlyOne(); } public TemizleSandalyeler() { for(new i = 0; i < g_iTotalChairs; i++) { if(IsGameChair(g_iChairs[i])) remove_entity(g_iChairs[i]); g_iChairs[i] = 0; } g_iTotalChairs = 0; g_iOccupiedChairs = 0; } public MuzikCal(bool:cal) { if(cal) { if(!g_bMusicPlaying) { client_cmd(0, "spk %s", SES_MUZIK); remove_task(TASK_MUSIC); set_task(MUSIC_REPEAT_INTERVAL, "Task_RepeatMusic", TASK_MUSIC, _, _, "b"); } g_bMusicPlaying = true; } else if(g_bMusicPlaying) { remove_task(TASK_MUSIC); client_cmd(0, "stopsound"); g_bMusicPlaying = false; } } public Task_RepeatMusic() { if(!g_bMusicPlaying || !g_bRoundActive || !g_bCanSit) { remove_task(TASK_MUSIC); return; } client_cmd(0, "spk %s", SES_MUZIK); } FreezePlayer(id) { if(!is_user_alive(id)) return; g_bIsFrozen[id] = true; set_entvar(id, var_velocity, Float:{0.0, 0.0, 0.0}); set_entvar(id, var_maxspeed, 1.0); } UnfreezePlayer(id) { if(!g_bIsFrozen[id]) return; g_bIsFrozen[id] = false; if(is_user_alive(id)) rg_reset_maxspeed(id); } public OnResetMaxSpeed(id) { if(g_bIsFrozen[id]) set_entvar(id, var_maxspeed, 1.0); return HC_CONTINUE; } public Fwd_PlayerPreThink(id) { if(!g_bIsFrozen[id]) return FMRES_IGNORED; if(!is_user_alive(id)) return FMRES_IGNORED; set_entvar(id, var_velocity, Float:{0.0, 0.0, 0.0}); set_entvar(id, var_maxspeed, 1.0); return FMRES_HANDLED; } SetPlayerGlow(id) { set_entvar(id, var_renderfx, kRenderFxGlowShell); set_entvar(id, var_rendercolor, Float:{0.0, 255.0, 0.0}); set_entvar(id, var_rendermode, kRenderNormal); set_entvar(id, var_renderamt, 20.0); } GorselEfekt(const Float:origin[3]) { engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0); write_byte(TE_BEAMCYLINDER); write_coord_f(origin[0]); write_coord_f(origin[1]); write_coord_f(origin[2]); write_coord_f(origin[0]); write_coord_f(origin[1]); write_coord_f(origin[2] + 200.0); write_short(g_iShockwaveSprite); write_byte(0); write_byte(0); write_byte(4); write_byte(20); write_byte(0); write_byte(255); write_byte(0); write_byte(0); write_byte(100); write_byte(0); message_end(); } GetActiveModesString() { static buffer[192]; buffer[0] = EOS; if(g_bManualMode) add(buffer, charsmax(buffer), " [MANUEL]"); else { if(g_iSelectedFlags & BIT_SERI) add(buffer, charsmax(buffer), " [SERI]"); if(g_iSelectedFlags & BIT_HIZLI) add(buffer, charsmax(buffer), " [HIZLI]"); if(!buffer[0]) add(buffer, charsmax(buffer), " [STANDART]"); } if(g_iSelectedFlags & BIT_HAYALET) add(buffer, charsmax(buffer), " [HAYALET]"); if(g_iSelectedFlags & BIT_SARHOS) add(buffer, charsmax(buffer), " [SARHOS]"); if(g_iSelectedFlags & BIT_BADAIM) add(buffer, charsmax(buffer), " [BAD AIM]"); if(g_iSelectedFlags & BIT_BUZ) add(buffer, charsmax(buffer), " [BUZ]"); if(g_iSelectedFlags & BIT_AY) add(buffer, charsmax(buffer), " [AY]"); return buffer; }