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

FREE CommandBook : 0.0.1 0.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using System.Collections;
using System;
using System.Reflection;
using System.Data;
using UnityEngine;
using Oxide.Core;
namespace Oxide.Plugins {
    [Info("CommandBook", "bmlee2", "0.0.1")]
    class CommandBook : RustPlugin {
        private FieldInfo CPstartPos;
        private FieldInfo CPendPos;
        private FieldInfo CPdropped;
        private FieldInfo CPsecondsToTake;
        private FieldInfo CPsecondsTaken;
        private MethodInfo CreateEntity;
        private Vector3 centerPos;
        private float secondsToTake;
        private BaseEntity cargoplane;
        private Dictionary<CargoPlane, Vector3> dropPoint;
        private Dictionary<CargoPlane, int> dropNumber;
        private Dictionary<CargoPlane, double> nextDrop;
        private static readonly DateTime epoch = new DateTime(1970, 1, 1);
        private float dropMinX;
        private float dropMaxX;
        private float dropMinY;
        private float dropMaxY;
        private float dropMinZ;
        private float dropMaxZ;
        private int dropMinCrates;
        private int dropMaxCrates;
        private float airdropSpeed;
        private bool showDropLocation;
        private bool Changed;
        private System.Random getrandom;
        private object syncLock;
        private int minDropCratesInterval;
        private int maxDropCratesInterval;
        private double nextCheck;
        private List<CargoPlane> RemoveListND;
        private Dictionary<CargoPlane, int> RemoveListNUM;
        private Dictionary<CargoPlane, double> AddDrop;
        void Loaded() {
            RemoveListND = new List<CargoPlane>();
            RemoveListNUM = new Dictionary<CargoPlane, int>();
            AddDrop = new Dictionary<CargoPlane, double>();
            getrandom = new System.Random();
            syncLock = new object();
            centerPos = new UnityEngine.Vector3(0f, 0f, 0f);
            dropPoint = new Dictionary<CargoPlane, Vector3>();
            dropNumber = new Dictionary<CargoPlane, int>();
            nextDrop = new Dictionary<CargoPlane, double>();
            CPstartPos = typeof(CargoPlane).GetField("startPos", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
            CPendPos = typeof(CargoPlane).GetField("endPos", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
            CPdropped = typeof(CargoPlane).GetField("dropped", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
            CPsecondsToTake = typeof(CargoPlane).GetField("secondsToTake", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
            CPsecondsTaken = typeof(CargoPlane).GetField("secondsTaken", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
            LoadVariables();
        }
        void LoadVariables() {
            dropMinX = Convert.ToSingle(-((World.Size/2) - 500));
            dropMaxX = Convert.ToSingle((World.Size / 2) - 500);
            dropMinZ = Convert.ToSingle(-((World.Size / 2) - 500));
            dropMaxZ = Convert.ToSingle((World.Size / 2) - 500);
            dropMinY = Convert.ToSingle(200f);
            dropMaxY = Convert.ToSingle(300f);
            dropMinCrates = Convert.ToInt32(1);
            dropMaxCrates = Convert.ToInt32(3);
            minDropCratesInterval = Convert.ToInt32(3);
            maxDropCratesInterval = Convert.ToInt32(10);
            showDropLocation = Convert.ToBoolean(false);
            airdropSpeed = Convert.ToSingle(40f);
        }
        int GetRandomNumber(int min, int max) {
            return getrandom.Next(min, max);
        }
        double CurrentTime() {
            return System.DateTime.UtcNow.Subtract(epoch).TotalSeconds;
        }
        Vector3 FindDropPoint(CargoPlane cargoplane) {
            if (dropPoint.ContainsKey(cargoplane)) return (Vector3)dropPoint[cargoplane];
            var RandomX = Convert.ToSingle(GetRandomNumber((int)dropMinX, (int)dropMaxX+1));
            var RandomY = Convert.ToSingle(GetRandomNumber((int)dropMinY, (int)dropMaxY+1));
            var RandomZ = Convert.ToSingle(GetRandomNumber((int)dropMinZ, (int)dropMaxZ+1));
            if (RandomX == 0f) RandomX = 1f;
            if (RandomZ == 0f) RandomZ = 1f;
            return new UnityEngine.Vector3(RandomX, RandomY, RandomZ);
        }
        int RandomCrateDrop(CargoPlane cargoplane) {
            return GetRandomNumber(dropMinCrates, dropMaxCrates+1);
        }
        double RandomDropInterval() {
            return Convert.ToDouble(GetRandomNumber(minDropCratesInterval, maxDropCratesInterval + 1));
        }
        void FindStartAndEndPos(Vector3 target, out Vector3 startpos, out Vector3 endpos, out float distance) {
            var directionFromCenter = (target - centerPos).normalized;
            var directionAngles = Quaternion.LookRotation(directionFromCenter );
            var toRight = directionAngles * Vector3.right;
            var toLeft = directionAngles * Vector3.left;
            startpos = target;
            var multiplier = 1000f;
            var i = 0f;
            for(int o=0;o<50;o++) {
                var temPos = startpos + toRight * i * multiplier;
                if (((float)Math.Abs(temPos.x + multiplier) > (World.Size / 2)) || ((float)Math.Abs(temPos.x - multiplier) > (World.Size / 2)) || ((float)Math.Abs(temPos.z - multiplier) > (World.Size / 2)) || ((float)Math.Abs(temPos.z + multiplier) > (World.Size / 2))) {
                    multiplier = multiplier / 10f;
                    i = 0f;
                }
                else {
                    temPos.y = startpos.y;
                    startpos = temPos;
                    i = i + 1f;
                }
                if (multiplier < 1f) {
                    break;
                }
            }
            distance = Vector3.Distance(startpos, target);
            endpos = target - toRight * distance;
        }
        void BroadcastToChat(string msg) {
            ConsoleSystem.Broadcast("chat.add \"SERVER\" " + msg.QuoteSafe() + " 1.0", new object[0]);
        }
        void OnTick() {
            if (CurrentTime() >= nextCheck) {
                var currentTime = CurrentTime();
                if (nextDrop.Count > 0) {
                    foreach (KeyValuePair<CargoPlane, double> entry in nextDrop) {
                        if (entry.Value >= currentTime) {
                            CPdropped.SetValue(entry.Key, false);
                            RemoveListND.Add(entry.Key as CargoPlane);
                        }
                    }
                    foreach (CargoPlane cp in RemoveListND) {
                        nextDrop.Remove(cp);
                    }
                    RemoveListND.Clear();
                }
                nextCheck = currentTime + 1;
            }
        }
        void CheckAirdropDrops() {
            foreach(KeyValuePair<CargoPlane, int> entry in dropNumber) {
                if((bool)CPdropped.GetValue(entry.Key)) {
                    if(entry.Value > 1) {
                        if (!(nextDrop.ContainsKey(entry.Key))) {
                            AddDrop.Add(entry.Key, RandomDropInterval() + CurrentTime());
                            RemoveListNUM.Add(entry.Key as CargoPlane, entry.Value - 1);
                        }
                    }
                }
            }
            foreach (KeyValuePair<CargoPlane, double> entry in AddDrop) {
                nextDrop.Add(entry.Key, entry.Value);
            }
            AddDrop.Clear();
            foreach (KeyValuePair<CargoPlane, int> entry in RemoveListNUM) {
                if (entry.Value <= 0) dropNumber.Remove(entry.Key);
                else dropNumber[entry.Key] = entry.Value;
            }
            RemoveListNUM.Clear();
        }
        void OnEntitySpawned(BaseEntity entity) {
            if(entity != null) {
                if (entity as CargoPlane) {
                    var cargoplane = entity as CargoPlane;
                    Vector3 startPos;
                    Vector3 endPos;
                    float distance;
                    var dropTarget = FindDropPoint(cargoplane);
                    FindStartAndEndPos(dropTarget, out startPos, out endPos, out distance);
                    float secondstotake = distance * 2 / airdropSpeed;
                    cargoplane.transform.rotation = Quaternion.LookRotation(endPos - startPos);
                    CPstartPos.SetValue(cargoplane, startPos);
                    CPendPos.SetValue(cargoplane, endPos);
                    CPsecondsToTake.SetValue(cargoplane, secondstotake);
                    dropNumber.Add(cargoplane, RandomCrateDrop(cargoplane));
                }
                else if(entity as SupplyDrop) {
                    CheckAirdropDrops();
                }
            }
        }
        void AllowNextDrop() {
            Interface.GetMod().CallHook("AllowDrop", new object[0] {
            }
            );
        }
        [ChatCommand("pm")]
        void cmdChatPM(BasePlayer player, string command, string[] args) {
            if (args.Length > 0) {
                List<string> pm = new List<string>(args);
                string SendTo = pm[0];
                var playz = new List<string>();
                var Online = BasePlayer.activePlayerList as List<BasePlayer>;
                foreach(BasePlayer playerz in Online) {
                    playz.Add(playerz.displayName);
                }
                if (playz.Contains(SendTo)) {
                    var SendzTo = BasePlayer.Find(SendTo);
                    pm.RemoveAt(0);
                    if (pm.Count > 0) {
                        var message = String.Join(" ", pm.ToArray());
                        SendReply(player, "To " + SendTo + ": " + message);
                        SendReply(SendzTo, "From " + player.displayName + ": " + message);
                    }
                    else {
                        SendReply(player, "Error: Uh, you done forgot da message, silly!");
                    }
                }
                else {
                    SendReply(player, "Player is not currently online.");
                }
            }
            else {
                SendReply(player, "Format: /pm [player] [message]");
            }
        }
        [ChatCommand("who")]
        void cmdChatWho(BasePlayer player, string command, string[] args) {
            var playz = new List<string>();
            var Online = BasePlayer.activePlayerList as List<BasePlayer>;
            foreach(BasePlayer playerz in Online) {
                playz.Add(playerz.displayName);
            }
            var PlayerList = String.Join(", ", playz.ToArray());
            SendReply(player, playz.Count + " player(s) online:");
            SendReply(player, PlayerList);
        }
        [ChatCommand("broadcast")]
        void cmdChatBroadcast(BasePlayer player, string command, string[] args) {
            if (player.net.connection.authLevel > 0) {
                if (args.Length > 0) {
                    var message = String.Join(" ", args);
                    PrintToChat(message);
                }
                else {
                    SendReply(player, "Error: Uh, you're supposed to include a message, no? <.<");
                }
            }
            else {
                SendReply(player, "Error: You do not have permission to use this command.");
            }
        }
        [ChatCommand("cdrop")]
        void cmdCDrop(BasePlayer player, string command, string[] args) {
            if (player.net.connection.authLevel < 1) {
                SendReply(player, "Error: You do not have permission to use this command.");
                return;
            }
            if (args == null || args.Length < 3) {
                SendReply(player, "Format: /cdrop [x] [y] [z]");
                return;
            }
            AllowNextDrop();
            BaseEntity entity = GameManager.server.CreateEntity("events/cargo_plane", new Vector3(), new Quaternion());
            if (entity != null) {
                var targetPos = new Vector3();
                targetPos.x = Convert.ToSingle(args[0]);
                targetPos.y = Convert.ToSingle(args[1]);
                targetPos.z = Convert.ToSingle(args[2]);
                dropPoint.Add(entity as CargoPlane, targetPos);
                entity.Spawn(true);
                dropPoint.Remove(entity as CargoPlane);
                SendReply(player, "Dropping package at X=" + args[0] + ", Y=" + args[1] + ", Z=" + args[2]);
            }
        }
        [ChatCommand("pdrop")]
        void cmdChatPDrop(BasePlayer player, string command, string[] args) {
            if (player.net.connection.authLevel < 1) {
                SendReply(player, "Error: You do not have permission to use this command.");
                return;
            }
            if (args == null || args.Length < 1) {
                SendReply(player, "Format: /pdrop [player]");
                return;
            }
            string SendTo = args[0];
            var playz = new List<string>();
            var Online = BasePlayer.activePlayerList as List<BasePlayer>;
            foreach(BasePlayer playerz in Online) {
                playz.Add(playerz.displayName);
            }
            if (playz.Contains(SendTo)) {
                var SendzTo = BasePlayer.Find(SendTo);
                AllowNextDrop();
                BaseEntity entity = GameManager.server.CreateEntity("events/cargo_plane", new Vector3(), new Quaternion());
                if (entity != null) {
                    var targetPos = new Vector3();
                    targetPos.x = Convert.ToSingle(SendzTo.transform.position.x + 2);
                    targetPos.y = Convert.ToSingle((SendzTo.transform.position.y + 30));
                    targetPos.z = Convert.ToSingle(SendzTo.transform.position.z + 2);
                    dropPoint.Add(entity as CargoPlane, targetPos);
                    entity.Spawn(true);
                    dropPoint.Remove(entity as CargoPlane);
                    SendReply(player, "Dropping package near " + SendTo);
                    SendReply(SendzTo, "What's that I hear in the distance? Could it be...a plane?");
                }
            }
            else {
                SendReply(player, "Player is not currently online.");
            }
        }
        [ChatCommand("coords")]
        void cmdChatCoords(BasePlayer player, string command, string[] args) {
            SendReply(player, "X=" + Convert.ToString(player.transform.position.x) + ", Y=" + Convert.ToString(player.transform.position.x) + ", Z=" + Convert.ToString(player.transform.position.z));
        }
    }
}

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