C#:
using Newtonsoft.Json;
using Rust;
using System.Collections.Generic;
using System.Linq;
using ConVar;
using Oxide.Core.Plugins;
using UnityEngine;
using Physics = UnityEngine.Physics;
using Vector3 = UnityEngine.Vector3;
namespace Oxide.Plugins
{
[Info("LuckyBlock", "JSONCMD", "0.0.3")]
class LuckyBlock : RustPlugin
{
#region Variables
[PluginReference] private Plugin IQChat;
private ConfigData Configuration;
private readonly List<float> RandomShift = new List<float>
{
9f,
-9f,
-9.5f,
9.5f,
8f,
-8f,
10f,
-10f
};
private List<Vector3> SpawnPoints = new List<Vector3>();
private List<StorageContainer> LuckyLastList = new List<StorageContainer>();
#endregion
void Init() => ReadConfig();
private void OnServerInitialized() => NextTick(() => {
GetRoads();
Puts($"Найдено позиций : {SpawnPoints.Count}");
OnPlayerToggleTimer();
});
#region WorldTimers
public void OnPlayerToggleTimer()
{
timer.Every(Configuration.timer_timer, () =>
{
foreach (var pos in SpawnPoints)
{
StorageContainer boxes = (StorageContainer)GameManager.server.CreateEntity("assets/bundled/prefabs/radtown/dmloot/dm c4.prefab",pos) as StorageContainer;
boxes.enableSaving = true;
boxes.skinID = 228;
boxes.SetFlag(BaseEntity.Flags.Busy, true);
boxes.SetFlag(BaseEntity.Flags.Locked, true);
boxes.Spawn();
boxes.inventory.Clear();
if (!LuckyLastList.Contains(boxes))
LuckyLastList.Add(boxes);
boxes.Invoke(() =>
{
if (LuckyLastList.Contains(boxes))
LuckyLastList.Remove(boxes);
boxes.Kill();
}, Configuration.destroySeconds);
}
});
}
#endregion
#region Hooks
void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
{
if (entity == null || info == null || entity.skinID != 228) return;
int Index = Oxide.Core.Random.Range(0, 100);
if (Index >= 0 && Index <= 49)
{
SpawnRockets(info.Initiator);
}
else if (Index >= 50 && Index <= 60)
{
var items = entity as StorageContainer;
foreach (var dictionaryConfig in Configuration.c_items)
{
ItemManager.CreateByName($"{dictionaryConfig.shortname}", dictionaryConfig.amount,
dictionaryConfig.skinID).MoveToContainer(items.inventory);
}
}
else if (Index >= 61 && Index <= 75)
{
}else
{
rust.RunServerCommand($"entity.spawn polarbear ({entity.transform.position.x},{entity.transform.position.y},{entity.transform.position.z})");
}
}
void Unload()
{
foreach (StorageContainer storageContainer in LuckyLastList.Where(x => x != null && !x.IsDestroyed))
storageContainer.Kill();
}
#endregion
#region Functional Voids
private void SpawnRockets(BaseEntity ent)
{
var position = ent.transform.position;
var radius = 3;
var damage = 50;
var effects = new List<string>
{
"assets/prefabs/weapons/rocketlauncher/effects/rocket_explosion.prefab"
};
foreach (var effect in effects)
{
var x = Core.Random.Range(-radius, radius);
var y = Core.Random.Range(0, radius);
var z = Core.Random.Range(-radius, radius);
Effect.server.Run(effect, position + new Vector3(x, y, z));
}
Effect.server.Run("assets/prefabs/weapons/rocketlauncher/effects/rocket_explosion.prefab", position);
List<BaseCombatEntity> entities = new List<BaseCombatEntity>();
Vis.Entities(position, radius, entities);
if (entities == null || entities.Count == 0) return;
foreach (var entitys in entities.Where(x => x.health > 0))
entitys.Hurt(damage, DamageType.Explosion);
}
public void SendChat(BasePlayer player, string Message, Chat.ChatChannel channel = Chat.ChatChannel.Global)
{
if (IQChat)
IQChat?.Call("API_ALERT_PLAYER", player, Message, "", "");
else player.SendConsoleCommand("chat.add", channel, 0, Message);
}
bool GetCheckPositiont(Vector3 Position)
{
if (Physics.CheckSphere(Position, 15f, LayerMask.GetMask("Construction", "Default", "Deployed", "Trigger", "Player (Server)", "Trigger", "Prevent Building" )))
return false;
return true;
}
private void GetRoads()
{
foreach (PathList x in TerrainMeta.Path.Roads)
foreach (var point in x.Path.Points.Where(p => GetCheckPositiont(p)))
{
Vector3 SpawnPosition = new Vector3(point.x + RandomShift.GetRandom(), point.y, point.z + RandomShift.GetRandom());
SpawnPosition.y = TerrainMeta.HeightMap.GetHeight(SpawnPosition);
SpawnPoints.Add(SpawnPosition);
}
}
#endregion
#region Config
class ConfigData
{
[JsonProperty("Время спавна лакиблока")] public float timer_timer = 3600f;
[JsonProperty("Время диспавна лакиблока")] public float destroySeconds = 360f;
[JsonProperty("Список предметов при уничтожении")] public List<itemData> c_items;
}
class itemData
{
public string shortname { get; set; }
public int amount { get; set; }
public ulong skinID { get; set; }
public itemData(string shortname, int amount, ulong skinID = 0)
{
this.shortname = shortname;
this.amount = amount;
this.skinID = skinID;
}
}
void ReadConfig()
{
Configuration = Config.ReadObject<ConfigData>();
}
void SaveConfig(object config) => Config.WriteObject(config, true);
protected override void LoadDefaultConfig()
{
var config = new ConfigData();
config.c_items = new List<itemData>()
{
new itemData("rifle.ak", 1)
};
SaveConfig(config);
ReadConfig();
}
#endregion
}
}