C#:
using System.Collections.Generic;
using UnityEngine;
using Rust;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using System.Reflection;
using System;
using System.Linq;
using System.Globalization;
using Oxide.Core.Configuration;
using Oxide.Core;
using UnityEngine.SceneManagement;
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using UnityEngine.AI;
namespace Oxide.Plugins
{
[Info("SpawnToPlayer", "BarakudaX777", "0.1.1")]
[Description("Spawn entity to player")]
class SpawnToPlayer : RustPlugin
{
#region Класс
public class SpawnElement
{
[JsonProperty("Название")] public string name;
[JsonProperty("ID предмета для замены")] public int item;
[JsonProperty("Скин")] public ulong skin;
[JsonProperty("Префаб")] public string prefab;
[JsonProperty("Допускать спавн на землю")] public bool inGround;
[JsonProperty("Допускать спавн на строениях")] public bool inConstr;
}
private Configuration config;
public class Configuration
{
[JsonProperty("Элементы")] public List<SpawnElement> SpawnElements;
public static Configuration GetNewCong()
{
return new Configuration
{
SpawnElements = new List<SpawnElement>
{
new SpawnElement
{
name = "sedan",
item=-295829489,
skin = 1773629815,
prefab = "assets/content/vehicles/sedan_a/sedantest.entity.prefab",
inGround = true,
inConstr=false
},
new SpawnElement
{
name = "horse",
item=-295829489,
skin = 1766455225,
prefab = "assets/rust.ai/nextai/testridablehorse.prefab",
inGround = true,
inConstr=false
},
}
};
}
}
#endregion
protected override void LoadConfig()
{
base.LoadConfig();
try
{
config = Config.ReadObject<Configuration>();
if (config?.SpawnElements == null) LoadDefaultConfig();
}
catch
{
PrintWarning($"Что то с этим конфигом не так! 'oxide/config/{Name}', создаём новую конфигурацию!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewCong();
private minorVersion=175;
protected override void SaveConfig() => Config.WriteObject(config);
[ConsoleCommand("spawnto")]
void SpawntoConsoleCommand(ConsoleSystem.Arg arg)
{
if (arg == null || arg.FullString.Length == 0){PrintError("Не указаны параметры");return;}
BasePlayer player = BasePlayer.Find(arg.Args[0]);
if (player == null){PrintError($"[Ошибка] Не удается найти игрока {arg.Args[0]}");return;}
if (!player.IsAdmin){SendReply(player, "Команда доступна только администраторам");return;}
string name = arg.Args[1];
if (string.IsNullOrEmpty(name)){PrintError($"[Ошибка] Не указан параметр префаба");return;}
foreach (var el in config.SpawnElements)
{
if ((el==null)|| (name!=el.name)) continue;
GiveEntityElement(player,el);
SendReply(player, "Предмет получен");
continue;
}
}
private void GiveEntityElement(BasePlayer player,SpawnElement sp)
{
Item ent = ItemManager.CreateByItemID(sp.item, 1, sp.skin);
ent.MoveToContainer(player.inventory.containerMain);
}
void OnEntityBuilt(Planner planner, GameObject gameobject)
{
BaseEntity entity = gameobject.ToBaseEntity();
BasePlayer player = planner.GetOwnerPlayer();
if(player == null || entity == null) return;
foreach (var el in config.SpawnElements)
{
if (entity.skinID != el.skin) continue;
entity.Kill();
Vector3 ePos = entity.transform.position;
BaseEntity EntityElement = GameManager.server.CreateEntity(el.prefab, ePos, entity.transform.rotation, true);
RaycastHit rHit;
if (Physics.Raycast(new Vector3(ePos.x,ePos.y+1, ePos.z), Vector3.down, out rHit, 2f, LayerMask.GetMask(new string[] {"Construction"})) && rHit.GetEntity() != null)
{
if (!el.inConstr){
player.ChatMessage("Данный предмет нельзя ставить на строения (фундамент, потолки и тд)");
GiveEntityElement(player,el);
EntityElement.Kill();
continue;
}
}
else
{
if (!el.inGround){
player.ChatMessage("Данный предмет не может распологаться на земле");
GiveEntityElement(player,el);
EntityElement.Kill();
continue;
}
}
EntityElement.OwnerID = player.userID;
EntityElement.Spawn();
}
}
}
}