Иконка ресурса

FREE Navmesher : 0.0.1 0.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Convert = System.Convert;
using Network;
using Oxide.Core.Plugins;
using Oxide.Core;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using Rust.Ai;
using System;
using UnityEngine; 
using UnityEngine.AI; 
using Oxide.Core.Libraries.Covalence;
using Oxide.Plugins;
using Oxide.Core.Plugins;
using System.Threading;
using Oxide.Core;

namespace Oxide.Plugins
{
	[Info("Navmesher", "obsol", "0.0.1")]
	[Description("Re-bakes everything for Agent 0 and spawns everything Agent 0")]
	public class Navmesher : CovalencePlugin
	{			
		private Type navtype;
		void OnTerrainInitialized(){
			
			foreach (MonumentInfo monumentInfo in TerrainMeta.Path.Monuments)
			{
				if ( 
					!monumentInfo.transform.ToString().ToLower().Contains("oilrig") &&
					!monumentInfo.transform.ToString().ToLower().Contains("underwater")
				)
				{
					//Mark monuments as not having navmesh so agents fallback on greater navmesh
					Puts("Disabling navmesh for "+monumentInfo.transform.name);
					monumentInfo.HasNavmesh=false;
				}
            }
            NextFrame(scan1);
			NextFrame(scan3);
			
			//makes the ocean an obstacle so they can't walk into it - since it's tied to the ocean if the ocean is moved dynamically it should move with it (rising seas)
			GameObject ocean = WaterSystem.Ocean.Transform.gameObject;
            NavMeshObstacle nmo = ocean.GetComponent<NavMeshObstacle>();
            nmo = (nmo == null ? ocean.AddComponent<NavMeshObstacle>() : nmo);
            nmo.shape = NavMeshObstacleShape.Box;
            nmo.center = new Vector3(0, 0, 0);
            nmo.size = new Vector3(4000,0.2f,4000);
            nmo.carving = true;
            nmo.enabled = true;
        }
		void scan1(){
			//This tries to destroy monument navmeshes so that there isn't any conflicts between it and the greater navmesh
			//There are some exceptions that instead will be rebaked to agent 0
			Puts("-----------------SCAN 1-----------------");
			UnityEngine.Object[] GameobjectList = Resources.FindObjectsOfTypeAll(typeof(MonumentNavMesh));
			foreach(MonumentNavMesh go in GameobjectList){
				if( 
					!go.transform.ToString().ToLower().Contains("dungeon") &&
					!go.transform.ToString().ToLower().Contains("aiarena") 
				){
					if ( 
						!go.transform.ToString().ToLower().Contains("oilrig") &&
						!go.transform.ToString().ToLower().Contains("underwater")
					)
					{
						Puts("    Destroying "+go.transform.ToString().ToLower());
						//This doesn't seem to be used but just to be safe - if something wants this navmesh we want it to fail and fallback on the greater navmesh
						MonumentNavMesh.use_baked_terrain_mesh= false;
						UnityEngine.Object.Destroy(go);
					}
					else
					{
						Puts("Not Destroying "+go.transform.ToString().ToLower());
						/*
						go.NavMeshAgentTypeIndex = 0;
						go.agentTypeId = 0;
						//Flipping active resets necessary things to allow navmesh build (OnEnable on the class)
						go.gameObject.SetActive(false);
						go.HasBuildOperationStarted=false;
						go.gameObject.SetActive(true);
						//rebake
						go.UpdateNavMeshAndWait();
						*/
					}
				}
			}
			
		}
		
		void scan3(){
			//I forget what counts as a dynamic navmesh but update navmesh so it encompasses more than what was baked in natively
			Puts("-----------------SCAN 3-----------------");
			UnityEngine.Object[] GameobjectList = Resources.FindObjectsOfTypeAll(typeof(DynamicNavMesh));
			foreach(DynamicNavMesh go in GameobjectList){
				if( 
					!go.transform.ToString().ToLower().Contains("dungeon") &&
					!go.transform.ToString().ToLower().Contains("aiarena") 
				){
					if ( 
						!go.transform.ToString().ToLower().Contains("oilrig") &&
						!go.transform.ToString().ToLower().Contains("underwater")
					)
					{
						Puts("Scanning"+go.transform.ToString().ToLower());
						//We're all Agent 0 here!
						go.NavMeshAgentTypeIndex=0;
						go.agentTypeId=0;
						//Flipping active resets necessary things to allow navmesh build (OnEnable on the class)				
						go.gameObject.SetActive(false);
						go.HasBuildOperationStarted = false;
						go.gameObject.SetActive(true);
						//rebake
						go.UpdateNavMeshAndWait();
					}
				}
			}
			
		}
		void OnEntitySpawned(BaseNpc bn){
			//Navmesh fuckery for animal npc.No animals? Delete this.int oldID=0;
			if(bn.GetComponent<BaseNavigator>() ==null ) return;
			//Set navmesh agent id to 0
			if(bn.GetNavAgent!=null)
				bn.GetNavAgent.agentTypeID=0;
			BaseNavigator bnav=bn.GetComponent<BaseNavigator>();
			//Note the old ID in case we want to flip back 
			oldID = bnav.navMeshQueryFilter.agentTypeID;
			//Make sure navmesh is used
			bnav.SetNavMeshEnabled(true);
			//Set the agent id
			bnav.navMeshQueryFilter.agentTypeID= NavMesh.GetSettingsByIndex(0).agentTypeID;
			bnav.Agent.agentTypeID= NavMesh.GetSettingsByIndex(0).agentTypeID;
			//Set the filter mask to 25 (I forget what that ends up standing for)
			bnav.defaultAreaMask = 25;
			bnav.navMeshQueryFilter.areaMask= 25;
			//Resume naviation
            bnav.Resume();
			//Note current position
			Vector3 position = 	bn.transform.position;		
			//Try warping to it to get agent on navmesh.On fail, revert agent ID
			if(!bnav.Warp(position)){						
				bnav.Agent.agentTypeID=oldID;
			}
			//Try warping with original ID, if fail, kill
			if(!bnav.Warp(position)){	
				Puts(((char)27)+"[94m"+"Killing "+bn.transform.name);//
				bn.Kill();
			}
		}
		void OnEntitySpawned(NPCPlayer bn){
				BaseNavigator bnav = bn.GetComponent<BaseNavigator>();
				if(bnav==null)return;
				//Note the old ID in case we want to flip back 
				int oldID = bnav.Agent.agentTypeID;
				//Set the filter mask to 25 (I forget what that ends up standing for)
				bnav.defaultAreaMask = 25;
				bnav.navMeshQueryFilter.areaMask= 25;				
				//Set the agent id
				bnav.navMeshQueryFilter.agentTypeID= NavMesh.GetSettingsByIndex(0).agentTypeID;
				bnav.Agent.agentTypeID= NavMesh.GetSettingsByIndex(0).agentTypeID;
				
				//Try placing on navmesh.On fail, revert agent ID
				Vector3 position = 	bn.transform.position;	
				if(!bnav.PlaceOnNavMesh(0)){						
					bnav.Agent.agentTypeID=oldID;
				}
				//Try placing on navmesh with original ID.if fail, kill
				if(!bnav.PlaceOnNavMesh(0))
				{	
					bn.Kill();
				}				
		}
		private void OnServerInitialized()
        {
			UnityEngine.Object[] bandittrigger= Resources.FindObjectsOfTypeAll(typeof(TriggerBanditZone));
			//This whole thing makes TriggerBanditZone freak out and I don't know what it does anyways so delete it
			foreach(TriggerBanditZone hn in bandittrigger){
				try{GameObject.Destroy(hn);}catch(Exception e){}
				
			}
			scan1();
        }
			
	}
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху