C#:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Linq;
using Oxide.Core;
using Rust;
using Newtonsoft.Json;
using Facepunch;
namespace Oxide.Plugins {
[Info("WaterJunk", "Nimant", "1.0.1")]
class WaterJunk : RustPlugin {
private static WaterJunk rymlmTePzV;
private static bool YEeXWTKJGfbBNnridSUhopAugsqU = false;
private static bool GDrpIUQdwTfF = false;
private static int ypvVZJdFgSCZFSxJ;
private static int UPMzJRWYGEhiABUMujpus;
private static int YtbMObKcOb;
private static Dictionary<string, int> FZjYeUpepDaYV = new Dictionary<string, int>();
private static Hash<string, List<Vector3>> NfQCVVZLggASLWHGKlzdnJTeOSprI = new Hash<string, List<Vector3>>();
private static List<string> skgEwgawkEdCtU = new List<string>() {
"assets/prefabs/misc/divesite/divesite_a.prefab", "assets/prefabs/misc/divesite/divesite_b.prefab", "assets/prefabs/misc/divesite/divesite_c.prefab", "assets/prefabs/misc/junkpile_water/junkpile_water_a.prefab", "assets/prefabs/misc/junkpile_water/junkpile_water_b.prefab", "assets/prefabs/misc/junkpile_water/junkpile_water_c.prefab"
}
;
private void Init() {
fXuUPHHvkieVLpBXOFP();
rymlmTePzV = this;
}
private void OnServerInitialized() {
YtbMObKcOb = (int)Math.Round((IaGgoWxyOQHXZQRZEmxk.JHowPsRrqVYNMQuTYLF*TerrainMeta.Size.x*TerrainMeta.Size.z)/380000f);
FZjYeUpepDaYV.Clear();
foreach(var kWXidzBqcIV in IaGgoWxyOQHXZQRZEmxk.GfyTMmypSmyQxduXePS) FZjYeUpepDaYV.Add(kWXidzBqcIV.Key, (int)Math.Round((kWXidzBqcIV.Value*YtbMObKcOb)/100f));
var eEYsszhrsEkrltF = new GameObject().AddComponent<RZjCxJjJeTOdQdVIUBtaaDu>();
MeIXwGlTgkqDUItoIwheCKWebnU();
}
private BaseEntity OGEilmAGdPVTF(string luTMuulwxnEAYcLBgOnY, Vector3 dvYaEGWudLZFqsNFcbf) {
var cxsLpEzudkXNjTNoDJCMFDJfHyudOW = Instantiate.GameObject(GameManager.server.FindPrefab(luTMuulwxnEAYcLBgOnY), dvYaEGWudLZFqsNFcbf, Quaternion.Euler(0, UnityEngine.Random.Range(0.0f, 360.0f), 0));
cxsLpEzudkXNjTNoDJCMFDJfHyudOW.name = luTMuulwxnEAYcLBgOnY;
SceneManager.MoveGameObjectToScene(cxsLpEzudkXNjTNoDJCMFDJfHyudOW, Rust.Server.EntityScene);
UnityEngine.Object.Destroy(cxsLpEzudkXNjTNoDJCMFDJfHyudOW.GetComponent<Spawnable>());
if (!cxsLpEzudkXNjTNoDJCMFDJfHyudOW.activeSelf) cxsLpEzudkXNjTNoDJCMFDJfHyudOW.SetActive(true);
BaseEntity wMghgkVGtZu = cxsLpEzudkXNjTNoDJCMFDJfHyudOW.GetComponent<BaseEntity>();
return wMghgkVGtZu;
}
private void MeIXwGlTgkqDUItoIwheCKWebnU() {
if (YEeXWTKJGfbBNnridSUhopAugsqU) CommunityEntity.ServerInstance.StartCoroutine(wOPUuozLtUwqLCiBXzs());
timer.Once(30f, MeIXwGlTgkqDUItoIwheCKWebnU);
}
private IEnumerator wOPUuozLtUwqLCiBXzs() {
foreach(var eEpAvnuOdVyHGEDQ in skgEwgawkEdCtU) {
if (!IaGgoWxyOQHXZQRZEmxk.HpgKUMGDsnFDSd && eEpAvnuOdVyHGEDQ.Contains("junk")) continue;
if (!IaGgoWxyOQHXZQRZEmxk.pihxFMuncQhTZlLIrrORtmmjzvUZjI && eEpAvnuOdVyHGEDQ.Contains("divesite")) continue;
var MsdJyHktoMGrfSFy = (BaseNetworkable.serverEntities.OfType<BaseEntity>().Where(b => b.PrefabName == eEpAvnuOdVyHGEDQ && !b.IsDestroyed)).GroupBy(x=> pOmnwiHqaz(x.transform.position)).ToDictionary(x=> x.Key, x=> x.Count());
foreach(var vjBgvyrLpCjbNGSvNpjnFlsnhq in FZjYeUpepDaYV.Where(x=> NfQCVVZLggASLWHGKlzdnJTeOSprI.ContainsKey(x.Key))) {
if (!MsdJyHktoMGrfSFy.ContainsKey(vjBgvyrLpCjbNGSvNpjnFlsnhq.Key)) MsdJyHktoMGrfSFy.Add(vjBgvyrLpCjbNGSvNpjnFlsnhq.Key, 0);
for(int ii=MsdJyHktoMGrfSFy[vjBgvyrLpCjbNGSvNpjnFlsnhq.Key];ii<vjBgvyrLpCjbNGSvNpjnFlsnhq.Value;ii++) {
object dvYaEGWudLZFqsNFcbf = ZmIelINErvaSGpvDevJHh(eEpAvnuOdVyHGEDQ.Contains("junk"), vjBgvyrLpCjbNGSvNpjnFlsnhq.Key);
if (!(dvYaEGWudLZFqsNFcbf is Vector3)) continue;
var PNteHUiqifhXQHfMiXbQ = OGEilmAGdPVTF(eEpAvnuOdVyHGEDQ, (Vector3)dvYaEGWudLZFqsNFcbf);
PNteHUiqifhXQHfMiXbQ.enableSaving = false;
PNteHUiqifhXQHfMiXbQ.Spawn();
yield return null;
}
}
}
}
private object ZmIelINErvaSGpvDevJHh(bool aRGsUFlRSW, string vjBgvyrLpCjbNGSvNpjnFlsnhq) {
Vector3 OHwOfKtafn = NfQCVVZLggASLWHGKlzdnJTeOSprI[vjBgvyrLpCjbNGSvNpjnFlsnhq].ElementAt(UnityEngine.Random.Range(0, NfQCVVZLggASLWHGKlzdnJTeOSprI[vjBgvyrLpCjbNGSvNpjnFlsnhq].Count - 1));
if (OHwOfKtafn == Vector3.zero) return null;
OHwOfKtafn = aRGsUFlRSW ? new Vector3(OHwOfKtafn.x, 0f, OHwOfKtafn.z) : new Vector3(OHwOfKtafn.x, OHwOfKtafn.y - 0.75f, OHwOfKtafn.z);
bool kHWgjumifwlKHHUGleZziw = false;
if (!aRGsUFlRSW) {
if (!lMFKYJvChh(OHwOfKtafn, new Vector3(OHwOfKtafn.x-20f, 300, OHwOfKtafn.z)) || !lMFKYJvChh(OHwOfKtafn, new Vector3(OHwOfKtafn.x+20f, 300, OHwOfKtafn.z)) || !lMFKYJvChh(OHwOfKtafn, new Vector3(OHwOfKtafn.x, 300, OHwOfKtafn.z-20f)) || !lMFKYJvChh(OHwOfKtafn, new Vector3(OHwOfKtafn.x, 300, OHwOfKtafn.z+20f))) kHWgjumifwlKHHUGleZziw = true;
}
int DvUAKvmDPwLCnsoDB = 0;
if (!kHWgjumifwlKHHUGleZziw) {
List<BaseEntity> lzNsjmVKXLpoj = Facepunch.Pool.GetList<BaseEntity>();
Vis.Entities(OHwOfKtafn, 25f, lzNsjmVKXLpoj, LayerMask.GetMask("Construction", "Deployable", "Player (Server)", "World"));
DvUAKvmDPwLCnsoDB = lzNsjmVKXLpoj.Count;
Facepunch.Pool.FreeList(ref lzNsjmVKXLpoj);
}
if (DvUAKvmDPwLCnsoDB > 0 || kHWgjumifwlKHHUGleZziw) {
if (++UPMzJRWYGEhiABUMujpus > 300) {
if (!GDrpIUQdwTfF) {
PrintWarning("Не все водные мусорные кучи или корабли заспавнились в нужном количестве.Попробуйте уменьшить рейт спавна и перезагрузить сервер.");
GDrpIUQdwTfF = true;
}
return null;
}
return ZmIelINErvaSGpvDevJHh(aRGsUFlRSW, vjBgvyrLpCjbNGSvNpjnFlsnhq);
}
UPMzJRWYGEhiABUMujpus = 0;
return OHwOfKtafn;
}
private class RZjCxJjJeTOdQdVIUBtaaDu : MonoBehaviour {
private List<Vector3> PqLefdErMlDjxSrzmVbcuSLxBNwsx = new List<Vector3>();
private IEnumerator LUYTyCLMeXqyCfblqG() {
int YUXslQJDIUTZwMDsmdZvs = (int)Math.Round(TerrainMeta.Size.x / -2f);
int bbmPkxILCEjMzPCPAxUANIpv = (int)Math.Round(TerrainMeta.Size.z / -2f);
int OJJdVqumZFOLHSMOvngruZKSvp = (int)Math.Round(TerrainMeta.Size.x / 2f);
int XRnomdQoIpepXngZcyw = (int)Math.Round(TerrainMeta.Size.z / 2f);
float DpmYNsFEvtbLrCghLMoDzAOuxCD = 18f*18f;
var KMYLEWqABqjNLAIlABC = IaGgoWxyOQHXZQRZEmxk.GfyTMmypSmyQxduXePS;
RaycastHit jEBFoApbsxfXy;
float bMUCwwwoqfGQkzQZPDb = 0f;
string vjBgvyrLpCjbNGSvNpjnFlsnhq = "";
int DvUAKvmDPwLCnsoDB = 0;
Vector3 dFbQyGxPDcpDGaGdgc = default(Vector3);
for(int x = YUXslQJDIUTZwMDsmdZvs; x < OJJdVqumZFOLHSMOvngruZKSvp; x += 15) {
for(int z = bbmPkxILCEjMzPCPAxUANIpv; z < XRnomdQoIpepXngZcyw; z += 15) {
if (++DvUAKvmDPwLCnsoDB % 50 == 0) yield return null;
bMUCwwwoqfGQkzQZPDb = TerrainMeta.HeightMap.GetHeight(new Vector3(x, 0f, z));
if (bMUCwwwoqfGQkzQZPDb < -20f) {
dFbQyGxPDcpDGaGdgc = new Vector3(x, bMUCwwwoqfGQkzQZPDb, z);
Physics.SphereCast(new Vector3(dFbQyGxPDcpDGaGdgc.x, 300, dFbQyGxPDcpDGaGdgc.z), 2.5f, Vector3.down, out jEBFoApbsxfXy, 400, LayerMask.GetMask("Terrain", "World"));
if (jEBFoApbsxfXy.point.y >= -20f || (jEBFoApbsxfXy.collider != null && jEBFoApbsxfXy.collider.name != "Terrain")) continue;
dFbQyGxPDcpDGaGdgc.y = jEBFoApbsxfXy.point.y;
if (!PqLefdErMlDjxSrzmVbcuSLxBNwsx.Exists(r=>(dFbQyGxPDcpDGaGdgc - r).sqrMagnitude < DpmYNsFEvtbLrCghLMoDzAOuxCD)) {
vjBgvyrLpCjbNGSvNpjnFlsnhq = pOmnwiHqaz(dFbQyGxPDcpDGaGdgc);
PqLefdErMlDjxSrzmVbcuSLxBNwsx.Add(dFbQyGxPDcpDGaGdgc);
if (!NfQCVVZLggASLWHGKlzdnJTeOSprI.ContainsKey(vjBgvyrLpCjbNGSvNpjnFlsnhq)) NfQCVVZLggASLWHGKlzdnJTeOSprI.Add(vjBgvyrLpCjbNGSvNpjnFlsnhq, new List<Vector3>());
NfQCVVZLggASLWHGKlzdnJTeOSprI[vjBgvyrLpCjbNGSvNpjnFlsnhq].Add(dFbQyGxPDcpDGaGdgc);
}
}
}
}
}
private IEnumerator Start() {
rymlmTePzV.Puts("Генерируются места спавна водных мусорных куч и кораблей...");
yield return StartCoroutine("LUYTyCLMeXqyCfblqG");
StopCoroutine("LUYTyCLMeXqyCfblqG");
ypvVZJdFgSCZFSxJ = PqLefdErMlDjxSrzmVbcuSLxBNwsx.Count;
if (ypvVZJdFgSCZFSxJ > 0) {
rymlmTePzV.Puts($"Места спавна водных мусорных куч и кораблей созданы.");
YEeXWTKJGfbBNnridSUhopAugsqU = true;
}
else rymlmTePzV.PrintError($"Места спавна водных мусорных куч и кораблей не созданы.Работа плагина невозможна!");
Destroy(this);
}
}
private static string pOmnwiHqaz(Vector3 dvYaEGWudLZFqsNFcbf) {
Dictionary<string, float> tNDhjdSjHGoVTVVV = new Dictionary<string, float> {
{
"Arctic", TerrainMeta.BiomeMap.GetBiome(dvYaEGWudLZFqsNFcbf, TerrainBiome.ARCTIC)
}
, {
"Arid", TerrainMeta.BiomeMap.GetBiome(dvYaEGWudLZFqsNFcbf, TerrainBiome.ARID)
}
, {
"Temperate", TerrainMeta.BiomeMap.GetBiome(dvYaEGWudLZFqsNFcbf, TerrainBiome.TEMPERATE)
}
, {
"Tundra", TerrainMeta.BiomeMap.GetBiome(dvYaEGWudLZFqsNFcbf, TerrainBiome.TUNDRA)
}
}
;
return tNDhjdSjHGoVTVVV.OrderByDescending(x => x.Value).ToArray()[0].Key;
}
private bool lMFKYJvChh(Vector3 vnIwGEXCLLZvTjtJlXWyjIr, Vector3 dvYaEGWudLZFqsNFcbf) {
RaycastHit jEBFoApbsxfXy;
Physics.SphereCast(dvYaEGWudLZFqsNFcbf, 2.5f, Vector3.down, out jEBFoApbsxfXy, 400, LayerMask.GetMask("Terrain", "World"));
return !((jEBFoApbsxfXy.point.y >= vnIwGEXCLLZvTjtJlXWyjIr.y && (jEBFoApbsxfXy.point.y - vnIwGEXCLLZvTjtJlXWyjIr.y) > 2.5f) || (jEBFoApbsxfXy.point.y < vnIwGEXCLLZvTjtJlXWyjIr.y && (vnIwGEXCLLZvTjtJlXWyjIr.y - jEBFoApbsxfXy.point.y) > 2.5f) );
}
private static ieXyiKBEfkpHDQArZurKwtJ IaGgoWxyOQHXZQRZEmxk;
private class ieXyiKBEfkpHDQArZurKwtJ {
[JsonProperty(PropertyName = "Разрешить спавн кораблей")]
public bool pihxFMuncQhTZlLIrrORtmmjzvUZjI;
[JsonProperty(PropertyName = "Разрешить спавн мусорных куч на воде")]
public bool HpgKUMGDsnFDSd;
[JsonProperty(PropertyName = "Рейт спавна мусорных куч и кораблей")]
public float JHowPsRrqVYNMQuTYLF;
[JsonProperty(PropertyName = "Распределение мусорных куч и кораблей по биомам (0-100%)")]
public Dictionary<string, int> GfyTMmypSmyQxduXePS {
get;
set;
}
}
private void fXuUPHHvkieVLpBXOFP() => IaGgoWxyOQHXZQRZEmxk = Config.ReadObject<ieXyiKBEfkpHDQArZurKwtJ>();
protected override void LoadDefaultConfig() {
IaGgoWxyOQHXZQRZEmxk = new ieXyiKBEfkpHDQArZurKwtJ {
pihxFMuncQhTZlLIrrORtmmjzvUZjI = true, HpgKUMGDsnFDSd = true, JHowPsRrqVYNMQuTYLF = 1f, GfyTMmypSmyQxduXePS = new Dictionary<string, int> {
{
"Arid", 48
}
, {
"Temperate", 48
}
, {
"Tundra", 4
}
, {
"Arctic", 0
}
}
}
;
yDsmKgWJiXJgWPpVwKaDY(IaGgoWxyOQHXZQRZEmxk);
}
private void yDsmKgWJiXJgWPpVwKaDY(ieXyiKBEfkpHDQArZurKwtJ ACtrHeKLLDmTTJCBdLvXG) => Config.WriteObject(ACtrHeKLLDmTTJCBdLvXG, true);
}
}