C#:
/*
!!! JUST INSTALL PLUGIN IN PLUGINS FOLDER, IT WILL WORK NORMALLY !!!
!!! JUST INSTALL PLUGIN IN PLUGINS FOLDER, IT WILL WORK NORMALLY !!!
!!! JUST INSTALL PLUGIN IN PLUGINS FOLDER, IT WILL WORK NORMALLY !!!
Welcome wanderer!
If you are reading this, that means that you tried to open one of my protected plugins.If you want to get the decrypted version of that plugin, message me and tell me why you need it.Contact information:
Email: official.rustworkshop@gmail.com
Website: https://rustworkshop.space/
Discord: Orange#0900
*/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using UnityEngine;
using VLB;
using Time = UnityEngine.Time;
namespace Oxide.Plugins {
[Info("Vehicle Drops", "Orange", "1.0.1")]
[Description("https://rustworkshop.space/resources/vehicle-drops.122/")]
public class VehicleDrops : RustPlugin {
private const string itemShortname = "supply.signal";
private List<DropEntry> thrown = new List<DropEntry>();
private const string parachutePrefab = "assets/prefabs/misc/parachute/parachute.prefab";
private const string permUse = "vehicledrops.use";
private class VehicleEntry {
[JsonProperty(PropertyName = "Shortname")]
public string shortname;
[JsonProperty(PropertyName = "Display name")]
public string displayName = string.Empty;
[JsonProperty(PropertyName = "Prefab")]
public string prefab;
[JsonProperty(PropertyName = "Skin ID")]
public ulong skinID = 0;
[JsonProperty(PropertyName = "Delivery time (seconds)")]
public int deliveryTime = 0;
[JsonProperty(PropertyName = "Plane fly height")]
public float flyHeight = 100f;
[JsonProperty(PropertyName = "Fuel inside vehicle")]
public int fuelToGive = 0;
[JsonProperty(PropertyName = "Fall speed (percents)")]
public float fallSpeed = 100f;
}
private class DropEntry {
public Vector3 position;
public string prefab;
public VehicleEntry definition;
}
private void Init() {
permission.RegisterPermission(permUse, this);
cmd.AddChatCommand("vehicledrops.give", this, nameof(cmdGiveChat));
cmd.AddConsoleCommand("vehicledrops.give", this, nameof(cmdGiveConsole));
}
private void OnExplosiveThrown(BasePlayer player, SupplySignal entity, ThrownWeapon item) {
CheckGrenade(player, entity, item);
}
private void OnExplosiveDropped(BasePlayer player, SupplySignal entity, ThrownWeapon item) {
CheckGrenade(player, entity, item);
}
private void OnEntitySpawned(SupplyDrop drop) {
CheckDrop(drop);
}
private void OnEntitySpawned(CargoPlane entity) {
timer.Once(1f, () => {
if (entity.IsValid() == true) {
var entry = thrown.FirstOrDefault(x => Vector2Distance(entity.dropPosition, x.position) < 50f);
if (entry != null) {
if (entry.definition.deliveryTime > 0) {
entity.secondsToTake = entry.definition.deliveryTime * 2;
}
if (entry.definition.flyHeight > 0) {
var y = TerrainMeta.HeightMap.GetHeight(entity.dropPosition) + entry.definition.flyHeight;
entity.startPos.y = y;
entity.endPos.y = y;
}
}
}
}
);
}
private void cmdGiveChat(BasePlayer player, string command, string[] args) {
if (permission.UserHasPermission(player.UserIDString, permUse) == false) {
SendMessage(player, MessageType.Permission);
return;
}
cmdGive(player, args);
}
private void cmdGiveConsole(ConsoleSystem.Arg arg) {
var player = arg.Player();
if (player != null) {
if (permission.UserHasPermission(player.UserIDString, permUse) == false) {
SendMessage(arg, MessageType.Permission);
}
else {
cmdGive(arg, arg.Args);
}
return;
}
if (arg.IsAdmin == true) {
cmdGive(arg, arg.Args);
}
else {
SendMessage(arg, MessageType.Permission);
}
}
private void cmdGive(object sender, string[] args) {
args = args ?? new string[] {
}
;
if (args.Length < 2) {
SendMessage(sender, MessageType.Usage);
return;
}
var target = FindPlayer(args[0]);
var player = target as BasePlayer;
if (player == null) {
var str = target.ToString();
SendMessage(sender, str);
return;
}
var shortname = args[1].ToLower();
var info = config.vehicles.FirstOrDefault(x => string.Equals(shortname, x.shortname, StringComparison.OrdinalIgnoreCase));
if (info == null) {
SendMessage(sender, MessageType.UnknownVehicle, "shortname", shortname);
return;
}
SendMessage(sender, MessageType.Success, "player", player.displayName);
GiveItem(player, info);
}
private void GiveItem(BasePlayer player, VehicleEntry info) {
var item = ItemManager.CreateByName(itemShortname, 1, info.skinID);
if (item != null) {
item.name = info.displayName;
item.text = info.prefab;
player.GiveItem(item);
}
}
private void CheckGrenade(BasePlayer player, SupplySignal entity, ThrownWeapon weapon) {
var item = weapon.GetItem();
if (item == null || item.skin == 0) {
return;
}
var info = config.vehicles.FirstOrDefault(x => x.skinID == item.skin);
if (info == null) {
return;
}
var prefab = info.prefab;
var position = player.transform.position;
thrown.Add(new DropEntry {
prefab = prefab, position = position, definition = info
}
);
}
private void CheckDrop(SupplyDrop drop) {
var info = thrown.FirstOrDefault(x => Vector2Distance(drop.transform.position, x.position) < 25f);
if (info == null) {
return;
}
else {
thrown.Remove(info);
}
var entity = GameManager.server.CreateEntity(info.prefab, drop.transform.position);
if (entity == null) {
return;
}
drop.Kill();
entity.Spawn();
var def = info.definition;
var obj = entity.GetOrAddComponent<DroppingVehicle>();
if (def.fallSpeed > 0f) {
obj.fallSpeed = info.definition.fallSpeed / 100f;
}
if (def.fuelToGive > 0) {
var fuel = (entity as BaseVehicle)?.GetFuelSystem()?.GetFuelContainer();
if (fuel != null) {
var item = ItemManager.Create(fuel.allowedItem, def.fuelToGive);
if (item != null) {
item.MoveToContainer(fuel.inventory);
}
}
}
}
private static ConfigData config = new ConfigData();
private class ConfigData {
[JsonProperty(PropertyName = "Vehicles")]
public VehicleEntry[] vehicles = {
new VehicleEntry {
shortname = "Example", displayName = "There are 3 example vehicles, you can add more!", prefab = "http://bit.ly/orange_entities",
}
, new VehicleEntry {
shortname = "rhib", displayName = "Military Boat", prefab = "assets/content/vehicles/boats/rhib/rhib.prefab", skinID = 1942896432
}
, new VehicleEntry {
shortname = "rowboat", displayName = "Boat", prefab = "assets/content/vehicles/boats/rowboat/rowboat.prefab", skinID = 1942897238
}
, new VehicleEntry {
shortname = "minicopter", displayName = "Minicopter", prefab = "assets/content/vehicles/minicopter/minicopter.entity.prefab", skinID = 1942898011
}
,
}
;
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<ConfigData>();
if (config == null) {
LoadDefaultConfig();
}
}
catch {
for (var i = 0; i < 3; i++) {
PrintError("Configuration file is corrupt! Check your config file at https://jsonlint.com/");
}
LoadDefaultConfig();
return;
}
ValidateConfig();
SaveConfig();
}
private static void ValidateConfig() {
}
protected override void LoadDefaultConfig() {
config = new ConfigData();
}
protected override void SaveConfig() {
Config.WriteObject(config);
}
private Dictionary<object, string> langMessages = new Dictionary<object, string> {
{
MessageType.Usage, "Usage:\n vehicledrops.give player shortname"
}
, {
MessageType.Permission, "<color=#ff0000>You don't have permission to use that!</color>"
}
, {
MessageType.UnknownVehicle, "Unknown vehicle '{shortname}', '{prefab}'"
}
, {
MessageType.Success, "Player {player} successfully got an item!"
}
}
;
private enum MessageType {
Success, Usage, Permission, UnknownVehicle,
}
protected override void LoadDefaultMessages() {
var dictionary = new Dictionary<string, string>();
foreach (var pair in langMessages) {
var key = pair.Key.ToString();
var value = pair.Value;
dictionary.TryAdd(key, value);
}
lang.RegisterMessages(dictionary, this);
}
private string GetMessage(MessageType key, string playerID = null, params object[] args) {
var message = lang.GetMessage(key.ToString(), this, playerID);
var organized = OrganizeArgs(args);
message = ReplaceArgs(message, organized);
return message;
}
private static Dictionary<string, object> OrganizeArgs(object[] args) {
var dic = new Dictionary<string, object>();
for (var i = 0; i < args.Length; i += 2) {
var value = args[i].ToString();
var nextValue = i + 1 < args.Length ? args[i + 1] : null;
dic.Add(value, nextValue);
}
return dic;
}
private static string ReplaceArgs(string message, Dictionary<string, object> args) {
if (args == null || args.Count < 1) {
return message;
}
foreach (var pair in args) {
var s0 = "{" + pair.Key + "}";
var s1 = pair.Key;
var s2 = pair.Value != null ? pair.Value.ToString() : "null";
message = message.Replace(s0, s2, StringComparison.InvariantCultureIgnoreCase);
message = message.Replace(s1, s2, StringComparison.InvariantCultureIgnoreCase);
}
return message;
}
private void SendMessage(object receiver, MessageType key, params object[] args) {
var userID = (receiver as BasePlayer)?.UserIDString;
var message = GetMessage(key, userID, args);
SendMessage(receiver, message);
}
private void SendMessage(object receiver, string message) {
if (receiver == null) {
return;
}
var console = receiver as ConsoleSystem.Arg;
if (console != null) {
SendReply(console, message);
return;
}
var player = receiver as BasePlayer;
if (player != null) {
player.ChatMessage(message);
return;
}
}
private object FindPlayer(string targetName) {
var match = new Predicate<BasePlayer>(x => x.UserIDString == targetName || x.displayName.Contains(targetName, CompareOptions.IgnoreCase));
var targets = BasePlayer.activePlayerList.Where(x => match(x)).ToArray();
if (targets.Length == 0) {
return $"There are no players with that 'Name' or 'Steam ID' ({targetName})";
}
if (targets.Length > 1) {
return $"There are multiple players with that 'Name' :\n{targets.Select(x => x.displayName).ToSentence()}";
}
return targets[0];
}
private static float Vector2Distance(Vector3 pos1, Vector3 pos2) {
var pos3 = new Vector2(pos1.x, pos2.z);
var pos4 = new Vector2(pos2.x, pos2.z);
return Vector2.Distance(pos3, pos4);
}
private class DroppingVehicle : MonoBehaviour {
private BaseVehicle vehicle;
private BaseEntity parachute;
public float fallSpeed;
private void Awake() {
vehicle = GetComponent<BaseVehicle>();
}
private void Start() {
AddParachute();
}
private void OnDestroy() {
RemoveParachute();
}
private void AddParachute() {
if (vehicle.rigidBody != null) {
vehicle.rigidBody.useGravity = false;
}
parachute = GameManager.server.CreateEntity(parachutePrefab);
if (parachute != null) {
parachute.SetParent(vehicle, "parachute_attach");
parachute.Spawn();
}
}
private void RemoveParachute() {
if (vehicle.IsValid() == true && vehicle.rigidBody != null) {
vehicle.rigidBody.useGravity = true;
}
if (parachute.IsValid() == true) {
parachute.Kill();
parachute = null;
}
}
private void OnCollisionEnter(Collision collision) {
Destroy(this);
}
private void FixedUpdate() {
if (parachute.IsValid() == true) {
vehicle.transform.position -= new Vector3(0, fallSpeed * 10f * Time.deltaTime, 0);
}
}
}
}
}