C#:
using System.Collections.Generic;
using UnityEngine;
using Oxide.Core;
namespace Oxide.Plugins;
[Info("MyMini", "&anhe", "1.0.9")]
[Description("Spawns a personal minicopter using /mymini, /mini and /fly.")]
public class MyMini : RustPlugin
{
private const string PermissionUse = "mymini.use";
private const string DataFile = "MyMini";
private Dictionary<ulong, ulong> playerMinis = new();
private void Init() =>
permission.RegisterPermission(PermissionUse, this);
private void OnServerInitialized()
{
playerMinis =
Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, ulong>>(DataFile)
?? new Dictionary<ulong, ulong>();
}
private void OnServerSave() =>
Interface.Oxide.DataFileSystem.WriteObject(DataFile, playerMinis);
private void Unload() =>
Interface.Oxide.DataFileSystem.WriteObject(DataFile, playerMinis);
[ChatCommand("mymini")]
[ChatCommand("mini")]
[ChatCommand("fly")]
private void MyMiniCommand(BasePlayer player, string command, string[] args)
{
if (!permission.UserHasPermission(player.UserIDString, PermissionUse))
return;
if (playerMinis.TryGetValue(player.userID, out ulong oldMiniId))
{
BaseNetworkable oldEntity =
BaseNetworkable.serverEntities.Find(new NetworkableId(oldMiniId));
if (oldEntity is BaseEntity oldMini && !oldMini.IsDestroyed)
oldMini.Kill();
}
Vector3 position = player.transform.position + Vector3.up * .32f;
Vector3 direction = player.eyes.BodyForward();
direction.y = 0f;
int obstacleMask = LayerMask.GetMask(
"World",
"Construction",
"Deployed"
);
if (
Physics.Raycast(position, direction, 3f, obstacleMask, QueryTriggerInteraction.Ignore) ||
Physics.Raycast(position, -direction, 4f, obstacleMask, QueryTriggerInteraction.Ignore) ||
Physics.Raycast(position, player.transform.right, 4f, obstacleMask, QueryTriggerInteraction.Ignore) ||
Physics.Raycast(position, -player.transform.right, 4f, obstacleMask, QueryTriggerInteraction.Ignore)
)
{
SendReply(player, "There is not enough space.");
return;
}
if (
GameManager.server.CreateEntity(
"assets/content/vehicles/minicopter/minicopter.entity.prefab",
position,
Quaternion.LookRotation(direction)
) is not BaseEntity mini
) {
SendReply(player, "Failed to spawn the minicopter.");
return;
}
mini.Spawn();
playerMinis[player.userID] = mini.net.ID.Value;
if (
mini.GetComponentInChildren<StorageContainer>() is StorageContainer fuelStorage &&
ItemManager.CreateByName("lowgradefuel", 500) is Item fuel
)
fuel.MoveToContainer(fuelStorage.inventory);
if (mini is Minicopter _mini)
{
_mini.AttemptMount(player);
using (var setFlags = _mini.StartSetFlags(BaseEntity.FlagsUpdateMode.SendNetworkUpdate_Flags))
{
setFlags.Set(BaseEntity.Flags.On, true);
}
}
}
}