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));
}
}
}