Иконка ресурса

FREE NukePlayer : 1.0 1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using Facepunch;
using System;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using System.Reflection;
using System.Collections;
using System.IO;
using Rust;

namespace Oxide.Plugins {
    [Info("NukePlayer", "wski", 1.0)]
    [Description("Nuke players in an epic way.")]

    class NukePlayer : RustPlugin {
      private static readonly int playerLayer = LayerMask.GetMask("Player (Server)");
      private static readonly Collider[] colBuffer = (Collider[])typeof(Vis).GetField("colBuffer", (BindingFlags.Static | BindingFlags.NonPublic))?.GetValue(null);

      private List<ZoneList> RadiationZones = new List<ZoneList>();

      void Loaded() {
        permission.RegisterPermission("nukeplayer.use", this);
      }

      #region Core
      [ConsoleCommand("nuke")]
      void cmdNuke(ConsoleSystem.Arg arg) {
        var foundPlayer = rust.FindPlayer(arg.Args[0]);
        if (foundPlayer == null) {
          Puts("Player not found.");
        } else {
          DoNuke(foundPlayer);
        }
      }

      [ChatCommand("nuke")]
      void chatNuke(BasePlayer player, string command, string[] args) {
        if (permission.UserHasPermission(player.UserIDString, "nukeplayer.use")) {
          var foundPlayer = rust.FindPlayer(args[0]);
          if (foundPlayer == null) {
            PrintToChat(player, $"We couldn't find a player named {args[0]}");
            return;
          } else {
            DoNuke(foundPlayer);
          }
        }
      }

      void DoNuke(BasePlayer player) {
        System.Random r = new System.Random();
        int intensityValue = r.Next(5, 35);
        int durationValue = r.Next(50, 150);
        int radiusValue = r.Next(25, 65);
        int timeLeft = 15;

        string intensityMsg = $"<color=#e74c3c>{intensityValue.ToString()} kiloton nuke incoming on {player.displayName} in {timeLeft} seconds!</color>";
        string statsMsg = $"<color=#f1c40f>The fallout radius is </color><color=#e67e22>{radiusValue.ToString()}</color> <color=#f1c40f>and will last for</color> <color=#e67e22>{durationValue.ToString()}</color> <color=#f1c40f>seconds.</color>";
        
        // Let everyone know doom is coming.ConsoleNetwork.BroadcastToAllClients("chat.add", new object[] { null, intensityMsg});
        ConsoleNetwork.BroadcastToAllClients("chat.add", new object[] { null, statsMsg});

        // Play random sounds as it counts down to explosion.string[] prefabSounds = new string[4] {
          "assets/bundled/prefabs/fx/ricochet/ricochet1.prefab",
          "assets/bundled/prefabs/fx/ricochet/ricochet2.prefab",
          "assets/bundled/prefabs/fx/ricochet/ricochet3.prefab",
          "assets/bundled/prefabs/fx/ricochet/ricochet4.prefab"
        };

        // Notify the player that they will be nuked shortly
        timer.Repeat(1f, timeLeft, () =>{
          PrintToChat(player, $"Nuke incoming in {timeLeft.ToString()} seconds...");
          Effect.server.Run(prefabSounds[r.Next(0, 3)], player.transform.position, Vector3.up);
          timeLeft = timeLeft - 1;

          if (timeLeft == 1) {
            Effect.server.Run("assets/bundled/prefabs/fx/weapons/rifle_jingle1.prefab", player.transform.position, Vector3.up);
          }
        });
        
        timer.Once(timeLeft, () => {
          // Do damage and add radiation
          Detonate(player);
          // Set off effects around the player
          NukeEffects(player);
        });
      }
      #endregion Core
    
      #region Effects
      private void Detonate(BasePlayer player) {
        Rust.DamageTypeEntry dmg = new Rust.DamageTypeEntry();
        dmg.amount = 70;
        dmg.type = Rust.DamageType.Generic;
        
        HitInfo hitInfo = new HitInfo() {
            Initiator = null,
            WeaponPrefab = null
        };

        hitInfo.damageTypes.Add(new List<Rust.DamageTypeEntry> { dmg });
        DamageUtil.RadiusDamage(null, null, player.transform.position, 5, 10, new List<Rust.DamageTypeEntry> { dmg }, 133376, true);

        // Init Radiation on the players location
        InitializeZone(player.transform.position, 10, 150, 60, false);
      }

      private void NukeEffects(BasePlayer player) {
        System.Random r = new System.Random();
        // How many explosions within radius to set off
        int explosionCount = 35;
        int explosionRadius = 15;



        for (int i = 1; i <= explosionCount; i++) {
          Vector3 plusOffset = new Vector3(r.Next(1, explosionRadius), r.Next(1, explosionRadius), r.Next(1, explosionRadius));
          Vector3 minusOffset = new Vector3(r.Next(1, explosionRadius), r.Next(1, explosionRadius), r.Next(1, explosionRadius));
          Vector3 explosionLocation = player.transform.position + plusOffset - minusOffset;

          string[] prefabEffects = new string[12] {
            "assets/bundled/prefabs/fx/fire/fire_v2.prefab",
            "assets/bundled/prefabs/fx/ricochet/ricochet1.prefab",
            "assets/bundled/prefabs/fx/ricochet/ricochet2.prefab",
            "assets/bundled/prefabs/fx/ricochet/ricochet3.prefab",
            "assets/bundled/prefabs/fx/ricochet/ricochet4.prefab",
            "assets/prefabs/tools/c4/effects/c4_explosion.prefab",
            "assets/bundled/prefabs/fx/weapons/landmine/landmine_explosion.prefab",
            "assets/prefabs/npc/patrol helicopter/effects/rocket_explosion.prefab",
            "assets/bundled/prefabs/fx/explosions/explosion_01.prefab",
            "assets/bundled/prefabs/fx/explosions/explosion_02.prefab",
            "assets/bundled/prefabs/fx/explosions/explosion_03.prefab",
            "assets/bundled/prefabs/fx/explosions/explosion_core.prefab"
          };

          foreach (string prefabEffect in prefabEffects){
            Effect.server.Run(prefabEffect, explosionLocation, Vector3.up);
          }
        }
      }
      #endregion Effetcs

      // Credits to k1lly0u for code within this region
      #region Radiation Control
      private void InitializeZone(Vector3 Location, float intensity, float duration, float radius, bool explosionType = false) {
        if (!ConVar.Server.radiation)
            ConVar.Server.radiation = true;
        if (explosionType) Effect.server.Run("assets/prefabs/tools/c4/effects/c4_explosion.prefab", Location);
        else Effect.server.Run("assets/prefabs/npc/patrol helicopter/effects/rocket_explosion.prefab", Location);

        var newZone = new GameObject().AddComponent<RadZones>();
        newZone.Activate(Location, radius, intensity);

        var listEntry = new ZoneList { zone = newZone };
        listEntry.time = timer.Once(duration, () => DestroyZone(listEntry));

        RadiationZones.Add(listEntry);
      }
      private void DestroyZone(ZoneList zone){
        if (RadiationZones.Contains(zone)) {
            var index = RadiationZones.FindIndex(a => a.zone == zone.zone);
            RadiationZones[index].time.Destroy();
            UnityEngine.Object.Destroy(RadiationZones[index].zone);
            RadiationZones.Remove(zone);
        }            
      }
      public class ZoneList {
        public RadZones zone;
        public Timer time;
      }

      public class RadZones : MonoBehaviour {
        private int ID;
        private Vector3 Position;
        private float ZoneRadius;
        private float RadiationAmount;

        private List<BasePlayer> InZone;

        private void Awake() {
          gameObject.layer = (int)Layer.Reserved1;
          gameObject.name = "NukeZone";

          var rigidbody = gameObject.AddComponent<Rigidbody>();
          rigidbody.useGravity = false;
          rigidbody.isKinematic = true;
        }

        public void Activate(Vector3 pos, float radius, float amount) {
          ID = UnityEngine.Random.Range(0, 999999999);
          Position = pos;
          ZoneRadius = radius;
          RadiationAmount = amount;

          gameObject.name = $"RadZone {ID}";
          transform.position = Position;
          transform.rotation = new Quaternion();
          UpdateCollider();
          gameObject.SetActive(true);
          enabled = true;

          var Rads = gameObject.GetComponent<TriggerRadiation>();
          Rads = Rads ?? gameObject.AddComponent<TriggerRadiation>();
          Rads.RadiationAmountOverride = RadiationAmount;
          Rads.radiationSize = ZoneRadius;
          Rads.interestLayers = playerLayer;
          Rads.enabled = true;

          if (IsInvoking("UpdateTrigger")) CancelInvoke("UpdateTrigger");
          InvokeRepeating("UpdateTrigger", 5f, 5f);
        }

        private void OnDestroy() {
          CancelInvoke("UpdateTrigger");
          Destroy(gameObject);
        }

        private void UpdateCollider() {
          var sphereCollider = gameObject.GetComponent<SphereCollider>();
          {
            if (sphereCollider == null) {
              sphereCollider = gameObject.AddComponent<SphereCollider>();
              sphereCollider.isTrigger = true;
            }
            sphereCollider.radius = ZoneRadius;
          }
        }
        private void UpdateTrigger()
        {
          InZone = new List<BasePlayer>();
          int entities = Physics.OverlapSphereNonAlloc(Position, ZoneRadius, colBuffer, playerLayer);
          for (var i = 0; i < entities; i++) {
            var player = colBuffer[i].GetComponentInParent<BasePlayer>();
            if (player != null)
                InZone.Add(player);
          }
        }
      }
      #endregion
    }
};

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху