Advertisement
pressf880

jugger.nut

Mar 20th, 2025 (edited)
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.75 KB | None | 0 0
  1. const TEAM_CT = 3
  2. const TEAM_T = 2
  3.  
  4. const SND_CT_WIN = "radio/ctwin.wav"
  5. const SND_T_WIN = "radio/terwin.wav"
  6. const SND_ROUND_END = "radio/rounddraw.wav"
  7.  
  8. const MSG_PREFIX = "\x07FF0000[INFO] \x07FFFFFF"
  9.  
  10. m_nMaxPlayers <- MaxClients().tointeger()
  11. m_nRoundTime <- null
  12.  
  13. m_bRoundInit <- false
  14. m_bNotEnough <- false
  15. m_bPickRandom <- true
  16.  
  17. m_hJugger <- null
  18. m_hJuggerWeapon <- null
  19.  
  20. m_CTSpawnPos <- []
  21. m_TSpawnPos <- []
  22.  
  23. function ReplacePos(pos, ent)
  24. {
  25.     local num = 0
  26.  
  27.     for(local e; e = Entities.FindByClassname(e, ent);)
  28.     {
  29.         if(num > pos.len()) continue
  30.         e.SetAbsOrigin(pos[num])
  31.         num++
  32.     }
  33. }
  34.  
  35. for(local e; e = Entities.FindByClassname(e, "info_player_counterterrorist");)
  36. {
  37.     m_CTSpawnPos.append(e.GetOrigin())
  38. }
  39.  
  40. for(local e; e = Entities.FindByClassname(e, "info_player_terrorist");)
  41. {
  42.     m_TSpawnPos.append(e.GetOrigin())
  43. }
  44.  
  45. ReplacePos(m_TSpawnPos, "info_player_counterterrorist")
  46. ReplacePos(m_CTSpawnPos, "info_player_terrorist")
  47.  
  48. SendToServerConsole("mp_restartgame 3;mp_timelimit 0;mp_ignore_round_win_conditions 1;mp_autoteambalance 0;mp_freezetime 5;mp_roundtime 5")
  49.  
  50. ClientPrint(null, 3, MSG_PREFIX + "Скрипт запущен")
  51.  
  52. function CollectEventsInScope(events)
  53. {
  54.     local events_id = UniqueString()
  55.     getroottable()[events_id] <- events
  56.     local events_table = getroottable()[events_id]
  57.     local Instance = Entities.First()
  58.     foreach (name, callback in events)
  59.     {
  60.         local callback_binded = callback.bindenv(this)
  61.         events_table[name] = @(params) Instance.IsValid() ? callback_binded(params) : delete getroottable()[events_id]
  62.     }
  63.     __CollectGameEventCallbacks(events_table)
  64. }
  65.  
  66. CollectEventsInScope
  67. ({
  68.     function OnGameEvent_round_start(d)
  69.     {
  70.         if(CountAlivePlayers(0) < 2)
  71.         {
  72.             m_bNotEnough = true
  73.             ClientPrint(null, 3, MSG_PREFIX + "Недостаточно игроков для начала игры")
  74.             return
  75.         }
  76.  
  77.         m_bRoundInit = true
  78.  
  79.         for(local i = 1; i <= m_nMaxPlayers; i++)
  80.         {
  81.             local ply = PlayerInstanceFromIndex(i)
  82.             if(!ply) continue
  83.  
  84.             ChangeTeam(ply, TEAM_CT)
  85.             ply.SetHealth(100)
  86.             ply.SetModelScale(1.0, 0.0)
  87.             ply.TerminateScriptScope()
  88.  
  89.             NetProps.SetPropString(ply, "m_iszScriptThinkFunction", "")
  90.             NetProps.SetPropInt(ply, "m_takedamage", 2)
  91.             NetProps.SetPropFloat(ply, "m_flMaxspeed", 250.00)
  92.             NetProps.SetPropInt(ply, "m_iAccount", 64000)
  93.         }
  94.        
  95.         m_nRoundTime = NetProps.GetPropInt(Entities.FindByClassname(null, "cs_gamerules"), "m_iRoundTime")
  96.         NetProps.SetPropString(Entities.First(), "m_iszScriptThinkFunction", "")
  97.         EntFire("func_buyzone", "SetTeam", TEAM_CT)
  98.  
  99.         if(m_bPickRandom) m_hJugger = GetRandomPlayer()
  100.  
  101.         ChangeTeam(m_hJugger, TEAM_T)
  102.         StripWeapon(m_hJugger)
  103.         AddThinkToEnt(m_hJugger, "JuggerThink")
  104.         m_hJugger.SetModelScale(1.15, 0.0)
  105.  
  106.         m_hJuggerWeapon = GiveWeapon(m_hJugger, "weapon_m249")
  107.         EntFire("weapon_c4", "Kill")
  108.  
  109.         m_hJugger.SetHealth(1025 * CountAlivePlayers(TEAM_CT))
  110.         NetProps.SetPropFloat(m_hJugger, "m_flMaxspeed", 135.00)
  111.  
  112.         ClientPrint(null, 3, MSG_PREFIX + "Игрок \x07FF0000" + NetProps.GetPropString(m_hJugger, "m_szNetname") + " \x07FFFFFFстал Джаггернаутом")
  113.     }
  114.  
  115.     function OnGameEvent_player_spawn(d)
  116.     {
  117.         if(CountAlivePlayers(0) == 2 && m_bNotEnough)
  118.         {
  119.             m_bNotEnough = false
  120.             ClientPrint(null, 3, MSG_PREFIX + "Зашло нужное количество игроков, игра началась!")
  121.             SendToServerConsole("mp_restartgame 3")
  122.         }
  123.     }
  124.  
  125.     function OnGameEvent_player_death(d)
  126.     {
  127.         local ply = GetPlayerFromUserID(d.userid)
  128.         local attacker = GetPlayerFromUserID(d.attacker)
  129.  
  130.         if(CountAlivePlayers(TEAM_CT) == 0)
  131.         {  
  132.             m_bPickRandom = true
  133.             SendToServerConsole("mp_restartgame 5")
  134.  
  135.             EmitSoundEx(
  136.             {
  137.                 sound_name = SND_T_WIN
  138.                 sound_level = 0
  139.             })
  140.             ShowText("Джаггернаут победил", 255, 0, 0)
  141.             ClientPrint(null, 3, MSG_PREFIX + "Джаггернаут одержал победу")
  142.         }
  143.         else if(CountAlivePlayers(TEAM_T) == 0)
  144.         {
  145.             SendToServerConsole("mp_restartgame 5")
  146.             NetProps.SetPropString(m_hJugger, "m_iszScriptThinkFunction", "")
  147.  
  148.             if(attacker)
  149.             {
  150.                 m_hJugger = attacker
  151.                 m_bPickRandom = false
  152.                 ClientPrint(null, 3, MSG_PREFIX + "Игрок \x07FF0000" + NetProps.GetPropString(attacker, "m_szNetname") + " \x07FFFFFFубил Джаггернаута!")
  153.             }
  154.  
  155.             EmitSoundEx(
  156.             {
  157.                 sound_name = SND_CT_WIN
  158.                 sound_level = 0
  159.             })
  160.             ShowText("Синие победили", 0, 0, 255)
  161.             ClientPrint(null, 3, MSG_PREFIX + "Синие одержали победу")
  162.         }
  163.     }
  164.  
  165.     function OnGameEvent_player_disconnect(d)
  166.     {
  167.         local ply = GetPlayerFromUserID(d.userid)
  168.  
  169.         if(ply == m_hJugger)
  170.         {
  171.             m_hJugger = null
  172.             m_bPickRandom = true
  173.             SendToServerConsole("mp_restartgame 5")
  174.  
  175.             EmitSoundEx(
  176.             {
  177.                 sound_name = SND_CT_WIN
  178.                 sound_level = 0
  179.             })
  180.             ShowText("Синие победили", 0, 0, 255)
  181.             ClientPrint(null, 3, MSG_PREFIX + "Джаггернаут отключился, синие победили")
  182.         }
  183.     }
  184.  
  185.     function OnGameEvent_round_freeze_end(d)
  186.     {
  187.         if(!m_bRoundInit) return
  188.         AddThinkToEnt(Entities.First(), "Think")
  189.     }
  190.  
  191.     function OnScriptHook_OnTakeDamage(d)
  192.     {
  193.         if(!d.attacker) return
  194.  
  195.         if(d.const_entity.IsPlayer() && d.attacker.IsPlayer() && d.const_entity.GetTeam() != d.attacker.GetTeam())
  196.         {
  197.             d.attacker.ValidateScriptScope()
  198.             local sc = d.attacker.GetScriptScope()
  199.  
  200.             if(d.attacker == m_hJugger) d.damage = d.damage / 2
  201.  
  202.             if(!("m_hText" in sc))
  203.             {
  204.                 sc.m_hText <- SpawnEntityFromTable("game_text",
  205.                 {
  206.                     x = -1
  207.                     y = 0.6
  208.                     color = "255 255 255"
  209.                     holdtime = 1
  210.                     fadeout = 0.5
  211.                 })
  212.  
  213.                 NetProps.SetPropBool(sc.m_hText, "m_bForcePurgeFixedupStrings", true)
  214.             }
  215.  
  216.             NetProps.SetPropString(sc.m_hText, "m_iszMessage", "-" + d.damage.tointeger() + "\n" + (d.const_entity.GetHealth() - d.damage + 1 <= 0 ? 0 : d.const_entity.GetHealth() - d.damage + 1).tointeger())
  217.             sc.m_hText.AcceptInput("Display", "", d.attacker, null)
  218.         }
  219.     }
  220. })
  221.  
  222. function CountAlivePlayers(team)
  223. {
  224.     local num = 0
  225.  
  226.     for(local i = 1; i <= m_nMaxPlayers; i++)
  227.     {
  228.         local ply = PlayerInstanceFromIndex(i)
  229.         if(!ply || !ply.IsAlive()) continue
  230.  
  231.         if(team == 0 || ply.GetTeam() == team)
  232.         {
  233.             num++
  234.         }
  235.     }
  236.  
  237.     return num
  238. }
  239.  
  240. function GetRandomPlayer()
  241. {
  242.     local players = []
  243.  
  244.     for(local i = 1; i <= m_nMaxPlayers; i++)
  245.     {
  246.         local ply = PlayerInstanceFromIndex(i)
  247.         if(!ply || !ply.IsAlive()) continue
  248.  
  249.         players.append(ply)
  250.     }
  251.  
  252.     return players[RandomInt(0, players.len() -1)]
  253. }
  254.  
  255. function ChangeTeam(player, team)
  256. {
  257.     NetProps.SetPropInt(player, "m_iPlayerState", 0)
  258.     NetProps.SetPropInt(player, "m_iTeamNum", team)
  259.     player.SetTeam(team)
  260.  
  261.     player.DispatchSpawn()
  262. }
  263.  
  264. function StripWeapon(player)
  265. {
  266.     local weaponStrip = null
  267.     if(!weaponStrip) weaponStrip = Entities.CreateByClassname("player_weaponstrip")
  268.    
  269.     return weaponStrip.AcceptInput("Strip", "", player, null)
  270. }
  271.  
  272. function GiveWeapon(player, classname)
  273. {
  274.     local weapon = SpawnEntityFromTable(classname,
  275.     {
  276.         ammo = 3000
  277.         origin = player.GetOrigin()
  278.         teamnum = player.GetTeam()
  279.     })
  280.  
  281.     weapon.SetClip1(0)
  282.     NetProps.SetPropBool(weapon, "m_bForcePurgeFixedupStrings", true)
  283.  
  284.     return weapon
  285. }
  286.  
  287. function ShowText(msg, r, g, b)
  288. {
  289.     local text = null
  290.  
  291.     if(!text)
  292.     {
  293.         text = SpawnEntityFromTable("game_text",
  294.         {
  295.             x = -1
  296.             y = 0.3
  297.             holdtime = 6
  298.             spawnflags = 1
  299.         })
  300.     }
  301.     text.__KeyValueFromVector("color", Vector(r, g, b))
  302.  
  303.     NetProps.SetPropString(text, "m_iszMessage", msg)
  304.     return text.AcceptInput("Display", "", null, null)
  305. }
  306.  
  307. function JuggerThink()
  308. {
  309.     local weapon = NetProps.GetPropEntity(self, "m_hActiveWeapon")
  310.  
  311.     if(!m_hJuggerWeapon.GetOwner() || weapon != m_hJuggerWeapon)
  312.     {
  313.         m_hJuggerWeapon.Destroy()
  314.         StripWeapon(self)
  315.         m_hJuggerWeapon = GiveWeapon(self, "weapon_m249")
  316.     }
  317.  
  318.     return -1
  319. }
  320.  
  321. function Think()
  322. {
  323.     m_nRoundTime--
  324.  
  325.     if(m_nRoundTime <= 0)
  326.     {
  327.         NetProps.SetPropString(self, "m_iszScriptThinkFunction", "")
  328.         SendToServerConsole("mp_restartgame 5")
  329.  
  330.         for(local i = 1; i <= m_nMaxPlayers; i++)
  331.         {
  332.             local ply = PlayerInstanceFromIndex(i)
  333.             if(!ply || !ply.IsAlive()) continue
  334.  
  335.             NetProps.SetPropInt(ply, "m_takedamage", 0)
  336.         }
  337.  
  338.         EmitSoundEx(
  339.         {
  340.             sound_name = SND_ROUND_END
  341.             sound_level = 0
  342.         })
  343.         ShowText("Раунд закончился", 255, 255, 255)
  344.         ClientPrint(null, 3, MSG_PREFIX + "Раунд завершен")
  345.     }
  346.  
  347.     return 1
  348. }
Tags: vscript CS:S
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement