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

FREE Ninjutsu : 0.1.1 0.1.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
#region Using
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;
#endregion
namespace Oxide.Plugins
{
	[Info("Ninjutsu", "obsol", "0.1.1")]
	[Description("Make a focus stone by tossing the appropriate recipe into a fire, gesture while holding to trigger effects")]
	public class Ninjutsu : CovalencePlugin
	{
		#region Variables
		private EnvSync _envSync;
		HashSet<BasePlayer> hiphopPlayers = new HashSet<BasePlayer>();
		HashSet<BasePlayer> silly1Players = new HashSet<BasePlayer>();
		HashSet<BasePlayer> silly2Players = new HashSet<BasePlayer>();
		
		List<BaseNetworkable.SaveInfo> bushGhosts = new List<BaseNetworkable.SaveInfo>();
		List<BaseNetworkable.SaveInfo> meanGhosts = new List<BaseNetworkable.SaveInfo>();
		List<Wisp> wisps = new List<Wisp>();
		Dictionary<BasePlayer,long> muteTimeouts = new Dictionary<BasePlayer,long>();
		Dictionary<BasePlayer,long> nightTimeouts = new Dictionary<BasePlayer,long>();
		Dictionary<BasePlayer,long> phaseTimeouts = new Dictionary<BasePlayer,long>();
		Dictionary<BasePlayer,long> bushTimeouts = new Dictionary<BasePlayer,long>();
		Dictionary<BasePlayer,long> ignoreTimeouts = new Dictionary<BasePlayer,long>();
		Dictionary<BaseCombatEntity,long> summonTimeouts = new Dictionary<BaseCombatEntity,long>();
		
		int zombieQueue=0;
		int wolfQueue=0;
		
		int zombieMax=10;
		int wolfMax=10;
		bool cleanSkins = false;
		long muteDuration = 300;
		long nightDuration = 300;
		long phaseDuration = 300;
		long bushDuration = 300;
		long ignoreDuration = 300;
		long summonDuration = 300;
		
		List<BaseCombatEntity> zombiePop=new List<BaseCombatEntity>();
		List<BaseCombatEntity> wolfPop=new List<BaseCombatEntity>();
				
		string[] bushes = {
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_temp/bush_willow_a.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_temp/bush_willow_b.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_temp/bush_willow_c.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_temp/bush_willow_d.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_arid_desert/mormon_tea_a.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_arid_desert/mormon_tea_b.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_arid_desert/mormon_tea_c.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_arid_desert/mormon_tea_d.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_tundra/bush_spicebush_a.prefab",
			"assets/bundled/prefabs/autospawn/resource/v3_bushes_tundra/bush_spicebush_c.prefab"
		};
		string[] means = {
			"assets/rust.ai/agents/bear/bear.prefab",
			"assets/rust.ai/agents/wolf/wolf.prefab",
			"assets/prefabs/npc/scarecrow/scarecrow.prefab",
			"assets/prefabs/npc/scarecrow/scarecrow.prefab",
			"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_any.prefab",
			"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_any.prefab",
			"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_any.prefab",
			"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_any.prefab",
			"assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab"
		};
		string[] plants = {
			"assets/bundled/prefabs/autospawn/collectable/berry-black/berry-black-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/berry-blue/berry-blue-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/berry-green/berry-green-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/berry-red/berry-red-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/berry-white/berry-white-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/berry-yellow/berry-yellow-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/hemp/hemp-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/hemp/hemp-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/hemp/hemp-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/hemp/hemp-collectable.prefab",
			"assets/bundled/prefabs/autospawn/collectable/mushrooms/mushroom-cluster-5.prefab",
			"assets/bundled/prefabs/autospawn/collectable/mushrooms/mushroom-cluster-6.prefab",
			"assets/bundled/prefabs/autospawn/collectable/potato/potato-collectable.prefab"
		};
		string[] loots = {
			"assets/bundled/prefabs/radtown/underwater_labs/crate_ammunition.prefab",
			"assets/bundled/prefabs/radtown/underwater_labs/crate_ammunition.prefab",
			"assets/bundled/prefabs/radtown/crate_basic.prefab",
			"assets/bundled/prefabs/radtown/crate_basic.prefab",
			"assets/bundled/prefabs/radtown/crate_basic.prefab",
			"assets/bundled/prefabs/radtown/crate_basic.prefab",
			"assets/bundled/prefabs/radtown/crate_elite.prefab",
			"assets/bundled/prefabs/radtown/underwater_labs/crate_food_1.prefab",
			"assets/bundled/prefabs/radtown/underwater_labs/crate_food_2.prefab",
			"assets/bundled/prefabs/radtown/underwater_labs/crate_medical.prefab",
			"assets/bundled/prefabs/radtown/crate_normal.prefab",
			"assets/bundled/prefabs/radtown/crate_tools.prefab",
			"assets/bundled/prefabs/radtown/loot_barrel_1.prefab",
			"assets/bundled/prefabs/radtown/loot_barrel_2.prefab",
			"assets/bundled/prefabs/radtown/oil_barrel.prefab",
			"assets/content/props/roadsigns/roadsign1.prefab",
			"assets/content/props/roadsigns/roadsign2.prefab",
			"assets/content/props/roadsigns/roadsign3.prefab",
			"assets/content/props/roadsigns/roadsign4.prefab",
			"assets/content/props/roadsigns/roadsign5.prefab",
			"assets/bundled/prefabs/radtown/underwater_labs/tech_parts_2.prefab",
			"assets/bundled/prefabs/radtown/vehicle_parts.prefab"
		};
		#endregion
		#region Loaded
		void OnServerInitialized(){
			timer.Every(121f,() =>{
				weatherVote();
			});
			timer.Every(133f,() =>{
				handleSummons();
			});
			timer.Every(45f,() =>{
				unphase();
			});
			timer.Every(12f,() =>{
				updateTime();
			});
			timer.Every(22f,() =>{
				updateIgnore();
			});
			timer.Every(100f,() =>{
				updateBushes();
			});	
			timer.Every(17f,() =>{
				cleanWisps();
			});
			timer.Every(37f, () =>
			{
				foreach (BasePlayer basePlayer2 in BasePlayer.activePlayerList)
				{
					checkPlayerDancing(basePlayer2);
				}
			});
			
			 CinematicEntity[] oldLights = GameObject.FindObjectsOfType<CinematicEntity>();
			 foreach(CinematicEntity oldLight in oldLights.ToArray()){
				 oldLight.Kill();
			 }
            _envSync = BaseNetworkable.serverEntities.OfType<EnvSync>().FirstOrDefault();
			if (!_envSync.limitNetworking)
				_envSync.limitNetworking = true;
			else
				_envSync.limitNetworking = false;
			for(int i = 0; i < bushes.Length; i++){
				BaseNetworkable.SaveInfo si2 = new BaseNetworkable.SaveInfo();
				BaseEntity be = GameManager.server.CreateEntity(bushes[i], new Vector3(0,0,0), Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);
				be.Spawn();
				si2.msg = Facepunch.Pool.Get<ProtoBuf.Entity>();
				be.Save(si2);
				be.Kill();
				bushGhosts.Add(si2);
			}
			for(int i = 0; i < means.Length; i++){
				BaseNetworkable.SaveInfo si2 = new BaseNetworkable.SaveInfo();
				BaseEntity be = GameManager.server.CreateEntity(means[i], new Vector3(0,0,0), Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);
				be.Spawn();
				si2.msg = Facepunch.Pool.Get<ProtoBuf.Entity>();
				be.Save(si2);
				be.Kill();
				meanGhosts.Add(si2);
			}
			
		}
		#endregion
		class Wisp{
			public BaseEntity[] lights = new BaseEntity[5];
			public BasePlayer owner;
			public long timeout;
			string[] lightStr = {
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_3p_cool.prefab",
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_3p_warm.prefab",
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_point_cool.prefab",
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_point_warm.prefab",
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_point_red.prefab",
					"assets/bundled/prefabs/modding/cinematic/cinelights/cinelight_point_green.prefab"
				};
			
			public Wisp(BasePlayer bp){				
				lights[0]=spawnLight(lightStr[5],bp,new Vector3(0,0,2));
				lights[1]=spawnLight(lightStr[5],bp,new Vector3(0,0,2));
				lights[2]=spawnLight(lightStr[3],bp,new Vector3(-1,0,1));
				lights[3]=spawnLight(lightStr[3],bp,new Vector3(1,0,1));
				lights[4]=spawnLight(lightStr[2],bp,new Vector3(0,0,-2));
			}
			BaseEntity spawnLight(string s, BasePlayer bp, Vector3 offset){
					BaseEntity be = GameManager.server.CreateEntity(s, bp.transform.position+new Vector3(0,2f,0), Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);//
					be.transform.parent=bp.transform;
					be.transform.localPosition+=offset;
					be.syncPosition=true;
					be.Spawn();
					be.syncPosition=true;
					be.SetFlag(BaseEntity.Flags.Reserved1,true);
					be.SetParent(bp,0, true, true);		
					return be;
			}
			public void Kill(){
				lights[0].Kill();
				lights[1].Kill();
				lights[2].Kill();
				lights[3].Kill();
				lights[4].Kill();
			}
		}
		void cleanWisps(){
			foreach(Wisp w in wisps.ToArray()){
				if(w.timeout<System.DateTime.Now.Ticks){
					w.Kill();
					wisps.Remove(w);
				}
			}
		}
		void ForcespawnEnt(BasePlayer player, string entity, bool limitAngle){
			RaycastHit raycastHit;
			if (!Physics.Raycast( player.eyes.HeadRay(), out raycastHit, 5f))
			{
				return ;
			}
			Vector3 lhs;
			float yRotation = 0;
			
			if(limitAngle){
				lhs= Quaternion.LookRotation(raycastHit.normal,  raycastHit.point) * Quaternion.Euler(90, 0, 0) * (Vector3.up)+ new Vector3(0,yRotation,0);
				if (!(Mathf.Acos(Vector3.Dot(lhs- new Vector3(0,yRotation,0), Vector3.up)) < 0.61086524f))
				{
					return ;
				}
			}
			else{
				lhs= Quaternion.LookRotation(raycastHit.normal,  raycastHit.point) * Quaternion.Euler(yRotation, 0, 0) * Vector3.up;
			}
			
			BaseEntity be = GameManager.server.CreateEntity(entity, raycastHit.point, Quaternion.LookRotation(lhs,Vector3.up), true);
			be.Spawn();
			
		}
		#region GetLookingAts
		public Vector3 getNearbyPos(BaseEntity player, float range){								
			Vector3 position = player.transform.position;
			position = new Vector3(position.x+UnityEngine.Random.Range(0,range),0,position.z+UnityEngine.Random.Range(0,range));
			position=new Vector3(position.x,TerrainMeta.HeightMap.GetHeight(position),position.z);	
			return position;
			
		}
		public Vector3 getNearbyPos(Vector3 position, float range){		
			position = new Vector3(position.x+UnityEngine.Random.Range(0,range),0,position.z+UnityEngine.Random.Range(0,range));
			position=new Vector3(position.x,TerrainMeta.HeightMap.GetHeight(position),position.z);	
			return position;
			
		}
		public Vector3 getLookingAtVect(BasePlayer player){			
			RaycastHit hit;
			if (Physics.Raycast(player.eyes.HeadRay(), out hit,1000)){
				return hit.point;
			}
			return new Vector3(0,0,0);
		}		
		public BasePlayer getLookingAtPlayer(BasePlayer player){			
			RaycastHit hit;
			if (Physics.Raycast(player.eyes.HeadRay(), out hit)){
				var entity = hit.GetEntity();
				if (entity != null){if(entity.GetComponent<BasePlayer>()!=null) return entity.GetComponent<BasePlayer>();}
			}
			return null;
		}
		public BaseAnimalNPC getLookingAtAnimal(BasePlayer player){			
			RaycastHit hit;
			if (Physics.Raycast(player.eyes.HeadRay(), out hit)){
				var entity = hit.GetEntity();
				if (entity != null){if(entity.GetComponent<BaseAnimalNPC>()!=null) return entity.GetComponent<BaseAnimalNPC>();}
			}
			return null;
		}
		public Transform getLookingAtRaw(BasePlayer player){			
			RaycastHit hit;
			if (Physics.Raycast(player.eyes.HeadRay(), out hit)){
				var entity = hit.transform;
				return entity;
			}
			return null;
		}
		public BaseEntity getLookingAt(BasePlayer player){			
			RaycastHit hit;
			if (Physics.Raycast(player.eyes.HeadRay(), out hit)){
				var entity = hit.GetEntity();
				if (entity != null){if(entity.GetComponent<BaseEntity>()!=null) return entity.GetComponent<BaseEntity>();}
			}
			return null;
		}
		#endregion
		#region Timers
		void checkPlayerDancing(BasePlayer player){
			Item item = player.GetActiveItem();
			if(player.InGesture==false||item==null||!item.name.Contains("Focus")){
				if(hiphopPlayers.Contains(player))
					hiphopPlayers.Remove(player);
				if(silly1Players.Contains(player))
					silly1Players.Remove(player);
				if(silly2Players.Contains(player))
					silly2Players.Remove(player);
			}else{
				float magicCost = 0;
				float magicDmg = 0;	
				switch(player.currentGesture.gestureCommand){
					case "hiphopdance":
						if(!hiphopPlayers.Contains(player))
							hiphopPlayers.Add(player);
						if(silly1Players.Contains(player))
							silly1Players.Remove(player);
						if(silly2Players.Contains(player))
							silly2Players.Remove(player);	
						magicCost +=(5);
						break;
					case "sillydance":
						if(hiphopPlayers.Contains(player))
							hiphopPlayers.Remove(player);
						if(!silly1Players.Contains(player))
							silly1Players.Add(player);
						if(silly2Players.Contains(player))
							silly2Players.Remove(player);	
						magicCost +=(5);									
						break;
					case "sillydance2":
						if(hiphopPlayers.Contains(player))
							hiphopPlayers.Remove(player);
						if(silly1Players.Contains(player))
							silly1Players.Remove(player);
						if(!silly2Players.Contains(player))
							silly2Players.Add(player);		
						magicCost +=(5);					
						break;
					default:
						if(hiphopPlayers.Contains(player))
							hiphopPlayers.Remove(player);
						if(silly1Players.Contains(player))
							silly1Players.Remove(player);
						if(silly2Players.Contains(player))
							silly2Players.Remove(player);
						break;
				}				
				if(item.condition < magicCost){
					player.StopSpectating();
					player.StartSleeping();
					player.EndSleeping();
					player.Hurt((magicCost-item.condition)*magicDmg);
				}
				item.LoseCondition(magicCost);
				
			}
		}
		void handleSummons(){ // done
			
			foreach (BasePlayer basePlayer2 in silly2Players)
			{
				Item item = basePlayer2.GetActiveItem();
				if(item==null||!item.name.Contains("Focus")) return;
				switch(item.name)
				{
					case "Magic Focus": //Loot DONE 
					#region Loot
						//Roll dice, find location, spawn loot
						Vector3 position = getNearbyPos(basePlayer2,30);
						int idx = UnityEngine.Random.Range(0,loots.Length-1);
						BaseEntity be = GameManager.server.CreateEntity(loots[idx], position, Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);
						be.Spawn();
						break;
					#endregion
					case "Natural Focus": //Plants DONE
					#region plants
						//find nearest growable, tick
						BaseEntity[] nearbyPlants = new BaseEntity[10];
						BaseEntity.Query.Server.GetInSphere(basePlayer2.transform.position, 15,nearbyPlants,isCrop);
						BaseEntity nearestPlant = null;
						foreach(BaseEntity bp in nearbyPlants){
							if(bp==null||bp.transform==null)continue;
							if(bp!=basePlayer2&&(nearestPlant==null||Vector3.Distance(bp.transform.position,basePlayer2.transform.position)<Vector3.Distance(nearestPlant.transform.position,basePlayer2.transform.position))){
								nearestPlant=bp;
							}
						}
						if(nearestPlant!=null){
							(nearestPlant as GrowableEntity).RunUpdate();
							(nearestPlant as GrowableEntity).RunUpdate();
							(nearestPlant as GrowableEntity).RunUpdate();
						}
						break;
					#endregion
					case "Corrupted Focus": //Wolves DONE
					#region wolves
						wolfQueue++;
						break;
					#endregion
					case "Techno Focus": //Vehicles DONE
					#region vehicls
						//find nearest vehicle, repair
						BaseEntity[] nearbyCars = new BaseEntity[10];
						BaseEntity.Query.Server.GetInSphere(basePlayer2.transform.position, 15,nearbyCars,isVehicle);
						BaseEntity nearestCar = null;
						foreach(BaseEntity bp in nearbyCars){
							if(bp==null||bp.transform==null)continue;
							if(bp!=basePlayer2&&(nearestCar==null||Vector3.Distance(bp.transform.position,basePlayer2.transform.position)<Vector3.Distance(nearestCar.transform.position,basePlayer2.transform.position))){
								nearestCar=bp;
							}
						}
						if(nearestCar!=null){
							(nearestCar as BaseCombatEntity).Heal(50);
						}
						break;
					#endregion
					case "Spirit Focus": //Zombies DONE
					#region zombies
						//Find a player, find forward, *-5, spawn and warp  
						zombieQueue++;
						break;
					#endregion zombies
				}	
			}
			//Find a player, find forward, *-5, spawn and warp
			string prefab = (UnityEngine.Random.Range(0,1)==0?"assets/prefabs/npc/scarecrow/scarecrow.prefab":"assets/rust.ai/agents/wolf/wolf.prefab");
			BasePlayer[] bps = BasePlayer.allPlayerList.ToArray();
			BasePlayer target = bps[UnityEngine.Random.Range(0,bps.Length-1)];
			Vector3 targetpos = getNearbyPos(target.transform.position-(target.transform.forward*10),5);
			
			BaseEntity beSpawned = null;
			if(wolfQueue>0 && prefab.Contains("wolf") && wolfPop.Count()<wolfMax){
				beSpawned = GameManager.server.CreateEntity(prefab, targetpos, Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);
				wolfQueue--;
				beSpawned.Spawn();
				wolfPop.Add(beSpawned as BaseCombatEntity);
			}
			if(zombieQueue>0 && prefab.Contains("scarecrow") && zombiePop.Count()<zombieMax){
				beSpawned = GameManager.server.CreateEntity(prefab, targetpos, target.transform.rotation, true);
				zombieQueue--;
				beSpawned.Spawn();
				zombiePop.Add(beSpawned as BaseCombatEntity);
			}
			if(beSpawned!=null){
				beSpawned.GetComponent<BaseNavigator>()?.Warp(targetpos);
			}
		}
		void weatherVote(){ //done
			int rain = 0;
			int fog = 0;
			int clear = 0;
			int day = 0;
			int night = 0;
			foreach (BasePlayer basePlayer2 in silly1Players)
			{
				Item item = basePlayer2.GetActiveItem();
				if(item==null||!item.name.Contains("Focus")) return;
				switch(item.name)
				{
					case "Magic Focus": // Day
						day++;
						break;
					case "Natural Focus": // Clear
						clear++;
						break;
					case "Corrupted Focus": // Night
						night++;
						break;
					case "Techno Focus": // Storm
						rain++;
						break;
					case "Spirit Focus": //Fog
						fog++;
						break;
				}
			}
			
			if(rain>0||fog>0||clear>0){
				if(rain>fog){
					if(rain>clear){
						//RAIN
						server.Command("weather.load","Storm");			
					}else{
						//CLEAR
						server.Command("weather.load","Clear");	
					}
				}else{
					if(fog>clear){
						//FOG
						server.Command("weather.load","Fog");
					}else{
						//CLEAR
						server.Command("weather.load","Clear");	
					}
				}
			}
			
			if(day>0||night>0){
				if(day>night){
					server.Command("env.time","9");
				}else{
					server.Command("env.time","21");
				}
			}
		}
		void unphase(){ ///done
			foreach (BasePlayer basePlayer2 in BasePlayer.activePlayerList)
			{
				if(basePlayer2.IsSpectating() && (!phaseTimeouts.ContainsKey(basePlayer2) || phaseTimeouts[basePlayer2] < System.DateTime.Now.Ticks)){					
					basePlayer2.StopSpectating();
					basePlayer2.StartSleeping();
					basePlayer2.EndSleeping();
					if(phaseTimeouts.ContainsKey(basePlayer2)) phaseTimeouts.Remove(basePlayer2);
				}
			}
			
		}
		void updateTime(){		///done
			foreach (BasePlayer basePlayer2 in BasePlayer.activePlayerList)
			{
				if(!nightTimeouts.ContainsKey(basePlayer2) || nightTimeouts[basePlayer2] < System.DateTime.Now.Ticks){
					if(basePlayer2.Connection==null) continue;
					if (Net.sv.write.Start())
					{
						Network.Connection connection = basePlayer2.Connection;
						connection.validate.entityUpdates = connection.validate.entityUpdates + 1;
						BaseNetworkable.SaveInfo saveInfo = new global::BaseNetworkable.SaveInfo
						{
							forConnection = connection,
							forDisk = false
						};
						Net.sv.write.PacketID(Message.Type.Entities);
						Net.sv.write.UInt32(connection.validate.entityUpdates);
						using (saveInfo.msg = Facepunch.Pool.Get<ProtoBuf.Entity>())
						{
							_envSync.Save(saveInfo);
							if (saveInfo.msg.baseEntity == null)
							{
								return;
							}
							if (saveInfo.msg.baseNetworkable == null)
							{
								return;
							}
							saveInfo.msg.ToProto(Net.sv.write);
							_envSync.PostSave(saveInfo);
							Net.sv.write.Send(new SendInfo(connection));
						}
					}
					
					if(nightTimeouts.ContainsKey(basePlayer2)) nightTimeouts.Remove(basePlayer2);
				}
			}
		}
		void updateIgnore(){ //done			
			foreach (BasePlayer basePlayer2 in BasePlayer.activePlayerList)
			{
				if((!ignoreTimeouts.ContainsKey(basePlayer2) || ignoreTimeouts[basePlayer2] < System.DateTime.Now.Ticks)){					
					if(ignoreTimeouts.ContainsKey(basePlayer2)) ignoreTimeouts.Remove(basePlayer2);
						Rust.AI.SimpleAIMemory.RemoveIgnorePlayer(basePlayer2);
				}
			}
		}
		void updateBushes(){ // done
			
			foreach (BasePlayer basePlayer2 in BasePlayer.activePlayerList)
			{
				if((bushTimeouts.ContainsKey(basePlayer2) && bushTimeouts[basePlayer2] < System.DateTime.Now.Ticks)){
					if(bushTimeouts.ContainsKey(basePlayer2)) bushTimeouts.Remove(basePlayer2);
					//move the bushes back to 0 0 0
					foreach(BaseNetworkable.SaveInfo si in bushGhosts){
						if(basePlayer2.Connection==null) continue;
						if (Net.sv.write.Start())
						{
							Network.Connection connection = basePlayer2.Connection;
							connection.validate.entityUpdates = connection.validate.entityUpdates + 1;
							si.msg.baseEntity.pos = new Vector3(0,0,0);
							Net.sv.write.PacketID(Message.Type.Entities);
							Net.sv.write.UInt32(connection.validate.entityUpdates);
							si.msg.ToProto(Net.sv.write);
							Net.sv.write.Send(new SendInfo(connection));
						}
					}
				}
			}
		}
		#endregion
		#region Filters
		bool isPlant(BaseEntity be){
			return (be!=null&& be is CollectibleEntity && (be as CollectibleEntity).IsFood());
		}
		bool isVehicle(BaseEntity be){
			return (be!=null&& (
			be is BaseBoat ||
			be is BaseHelicopterVehicle ||
			be is BaseSubmarine ||
			be is BaseVehicleModule ||
			be is TrainCar 
			));
		}
		bool isCrop(BaseEntity be){
			return (be!=null&& be is GrowableEntity);
		}
		bool isOre(BaseEntity be){
			return (be!=null&& be is OreResourceEntity);
		}
		bool isHuman(BasePlayer bp){
			return bp!=null && (!((bp is HumanNPC && ((bp as HumanNPC).Brain==null||(bp as HumanNPC).Brain.Navigator==null))||bp is NPCShopKeeper)||bp.IsConnected);
		}
		bool isPlayer(BasePlayer bp){
			return bp!=null && bp.IsConnected;
		}
		bool isCorpse(BaseEntity bp){
			return bp!=null && bp is BaseCorpse;
		}
		bool isGenerator(BaseEntity bp){
			return bp!=null &&
			bp is FuelElectricGenerator &&
			bp is ElectricWindmill &&
			bp is ElectricGenerator &&
			bp is ElectricBattery &&
			bp is SolarPanel
			;
		}
		bool isBattery(BaseEntity bp){
			return bp!=null &&
			bp is ElectricBattery
			;
		}
		bool isAnimal(BaseEntity bp){
			return bp!=null && bp is BaseNpc;
		}
		bool isDoor(BaseEntity bp){
			return bp!=null && bp is Door;
		}
		#endregion
		#region Native Hooks
		void OnEntityDeath(BaseCombatEntity entity, HitInfo info){
			if(zombiePop.Contains(entity)){
				zombiePop.Remove(entity);
			}
			if(wolfPop.Contains(entity)){
				wolfPop.Remove(entity);
			}
		}
		void OnItemDropped(Item oldItem, BaseEntity entity){
			if(oldItem==null) return;
			BasePlayer bp = oldItem.GetOwnerPlayer();
			if(bp==null) return;
			BaseOven bo = getLookingAt(bp) as BaseOven;
			if(bo==null || !(bo.transform.name.Contains("campfire"))) return;
			if(!(bo.IsOn() && bo.FindBurnable()!=null)) return;
			Item item = ItemManager.CreateByName("rock", 1, 0UL);
			item.name = "Blank Focus";
			BaseEntity heldEntity = item.GetHeldEntity();
			ulong skinid =0;
			if((oldItem).info.displayName.translated=="Human Skull" || oldItem.name=="Corrupted Focus"){
				(item).name="Corrupted Focus";//https://steamcommunity.com/sharedfiles/filedetails/?id=2879592409
				skinid = (cleanSkins?2879592409:1547263616);
				
			}
			else if((oldItem).info.displayName.translated=="Wolf Skull" || oldItem.name=="Natural Focus"){
				(item).name="Natural Focus";//https://steamcommunity.com/sharedfiles/filedetails/?id=2879594478
				skinid = (cleanSkins?2879594478:2775197508);
				
			}
			else if(oldItem.info.displayName.translated=="Targeting Computer" || oldItem.name=="Techno Focus"){
				(item).name="Techno Focus";//https://steamcommunity.com/sharedfiles/filedetails/?id=2879593582
				skinid = (cleanSkins?2879593582:2018319624);
											
			}
			else if(oldItem.info.displayName.translated=="Pookie Bear" || oldItem.name=="Spirit Focus"){
				(item).name="Spirit Focus";//https://steamcommunity.com/sharedfiles/filedetails/?id=2879596340
				skinid = (cleanSkins?2879596340:1341378161);
											
			}
			else if(oldItem.info.displayName.translated=="Rock" || oldItem.name=="Magic Focus"){
				(item).name="Magic Focus";//https://steamcommunity.com/sharedfiles/filedetails/?id=2879590224
				skinid = (cleanSkins?2879590224:2366530202);
											
			}
			if(item.name!="Blank Focus"){
				item.skin=skinid;//1547263616
				heldEntity.skinID = skinid;
				item.MarkDirty();
				heldEntity.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
				item.CreateWorldObject(bo.transform.position+new Vector3(0,0.5f,0), default(Quaternion), null, 0U);
			}
			oldItem.RemoveFromWorld();
			return;				
				
		}
		bool? CanUseGesture(BasePlayer player, GestureConfig gesture){
			Puts(gesture.gestureCommand);
			float magicCost = 0;
			float magicDmg = 0;	
			bool unphase = false;
			if(player.GetHeldEntity().HasFlag(BaseEntity.Flags.Broken)){
				return null;
			}
			Item item = player.GetActiveItem();
			if(item==null||!item.name.Contains("Focus")) return null;
			switch(item.name)
			{
				case "Magic Focus": //2 left
					switch(gesture.gestureCommand)
					{
						case "clap"://smoke grenade
							#region magic clap
							magicCost +=(10);	
							server.Command("spawn","40mm_grenade_smoke",(getLookingAtVect(player)+new Vector3(7,50,0)).ToString());	
							server.Command("spawn","40mm_grenade_smoke",(getLookingAtVect(player)+new Vector3(-7,50,0)).ToString());	
							server.Command("spawn","40mm_grenade_smoke",(getLookingAtVect(player)+new Vector3(0,50,7)).ToString());	
							server.Command("spawn","40mm_grenade_smoke",(getLookingAtVect(player)+new Vector3(0,50,-7)).ToString());	
							break;	
							#endregion			
						case "ok"://health tea
							#region magic ok 
							magicCost +=(20);	
							player.metabolism.pending_health.value+=50;
							break;
							#endregion
						case "thumbsdown"://wood chest
							#region magic thumbsdown
							ForcespawnEnt(player,"assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab",true);
							
							break;
							#endregion
						case "thumbsup"://ladder
							#region magic thumbsup
							ForcespawnEnt(player,"assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab",false);
							break;
							#endregion
						case "victory"://molotov
							#region magic victory
							magicCost +=(15);
							server.Command("spawn","grenade.molotov.deployed",(getLookingAtVect(player)+new Vector3(0,200,0)).ToString());	
							 
							break;	
							#endregion		
						case "friendly"://NPCs ignore you if they're not already aware of you
							#region magic friendly
							if(ignoreTimeouts.ContainsKey(player)){
								ignoreTimeouts[player] = System.DateTime.Now.Ticks+(ignoreDuration*1000*System.TimeSpan.TicksPerMillisecond);
							}else{
								ignoreTimeouts.Add(player,System.DateTime.Now.Ticks+(ignoreDuration*1000*System.TimeSpan.TicksPerMillisecond));								
							}
							Rust.AI.SimpleAIMemory.AddIgnorePlayer(player);
							break;
							#endregion 
						case "wave"://warp to bag
							#region magic wave
							magicCost +=(30);	
							SleepingBag nearestBag = null;
							foreach(SleepingBag bag in SleepingBag.FindForPlayer(player.userID, true)){
								if(nearestBag==null||Vector3.Distance(bag.transform.position,player.transform.position)<Vector3.Distance(nearestBag.transform.position,player.transform.position))
									nearestBag=bag;
							}
							player.Teleport(nearestBag.transform.position);							
							break;
							#endregion
						case "sillydance"://Push to day
							#region magic sillydance
							silly1Players.Add(player);
							break;
							#endregion
						case "sillydance2"://respawn loot
							#region magic sillydance2
							silly2Players.Add(player);
							break;
							#endregion
						default: break;
					} break;
				case "Natural Focus": // DONE!
					switch(gesture.gestureCommand)
					{
						case "thumbsup"://Find nearest plant
							#region natural thumbsup
							magicCost +=(10);	
							BaseEntity[] nearbyPlants = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 150,nearbyPlants,isPlant);
							BaseEntity nearestPlant = null;
							foreach(BaseEntity bp in nearbyPlants){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestPlant==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestPlant.transform.position,player.transform.position))){
									nearestPlant=bp;
								}
							}
							if(nearestPlant!=null){
								player.SendConsoleCommand("ddraw.text", 60, Color.white, nearestPlant.transform.position, (nearestPlant.ToString()));
							}
							break;
							#endregion
						case "thumbsdown"://Find nearest ore
							#region natural thumbsdown
							magicCost +=(20);	
							BaseEntity[] nearbyOres = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 150,nearbyOres,isOre);
							BaseEntity nearestOre = null;
							foreach(BaseEntity bp in nearbyOres){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestOre==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestOre.transform.position,player.transform.position))){
									nearestOre=bp;
								}
							}
							if(nearestOre!=null){
								player.SendConsoleCommand("ddraw.text", 60, Color.white, nearestOre.transform.position, (nearestOre.ToString()));
							}
							break;		
							#endregion	
						case "friendly"://Find nearest player
							#region natural friendly
							magicCost +=(30);	
							BasePlayer[] nearbyPlayers = new BasePlayer[100];
							BaseEntity.Query.Server.GetPlayersInSphere(player.transform.position, 300,nearbyPlayers,isHuman);
							BasePlayer nearest = null;
							foreach(BasePlayer bp in nearbyPlayers){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearest==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearest.transform.position,player.transform.position))){
									nearest=bp;
								}
							}
							if(nearest!=null){
								player.SendConsoleCommand("ddraw.text", 60, Color.white, nearest.transform.position, (nearest.displayName==null?"[X]":nearest.displayName));
							}
							break;
							#endregion
						case "wave"://Swap with nearby animal
							#region natural wave
							magicCost +=(20);	
							BaseEntity[] nearbyAnimals = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 150,nearbyAnimals,isAnimal);
							BaseEntity nearestAnimal = null;
							foreach(BaseEntity bp in nearbyAnimals){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestAnimal==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestAnimal.transform.position,player.transform.position))){
									nearestAnimal=bp;
								}
							}
							if(nearestAnimal!=null){
								BaseNpc animal = nearestAnimal as BaseNpc;
								BaseNavigator bn = animal.gameObject.GetComponent<BaseNavigator>();
								if(animal!=null&&animal.transform!=null){
									Vector3 oldPos = player.transform.position;
									player.Teleport(nearestAnimal.transform.position);
									if(bn!=null){
										bn.Warp(oldPos);
									}
								}
							}
							break;	
							#endregion
						case "ok":// Tree tea
							#region natural ok
							/*create fake modifer then add to list and mark dirty*/
							magicCost +=(20);			
							ModifierDefintion pm = new ModifierDefintion();
							pm.type=Modifier.ModifierType.Wood_Yield;
							pm.source=Modifier.ModifierSource.Tea;
							pm.value=1.5f;
							pm.duration=30;
							List<ModifierDefintion> listmd = new List<ModifierDefintion>();
							listmd.Add(pm);
							player.modifiers.Add(listmd);
							break;
							#endregion
						case "victory"://Spawn Plants
							#region natural victory
							/*1-3 plants anywhere in 15 m*/
							
							for(int i = 0; i< UnityEngine.Random.Range(1,5);i++){		
								Vector3 position = getNearbyPos(player, 15);
								BaseEntity be = GameManager.server.CreateEntity(plants[UnityEngine.Random.Range(0,plants.Length-1)], position, Quaternion.LookRotation(new Vector3(1,0,0), Vector3.up), true);
								be.Spawn();
							}
							break;
							#endregion
						case "clap"://Stop Bleed
							#region natural clap
							magicCost +=(30);			
							player.metabolism.bleeding.Reset();
							break;
							#endregion
						case "sillydance"://Clear Weather
							#region natural sillydance
							silly1Players.Add(player);
							break;
							#endregion
						case "sillydance2"://Fast Growth
							#region natural sillydance2
							silly2Players.Add(player);
							break;
							#endregion
						default: break;
					} break;
				case "Corrupted Focus": //Done!
					switch(gesture.gestureCommand)
					{
						case "thumbsup": //dehydrate
							#region corrupt thumbsup
							magicCost +=(20);	
							BasePlayer hydratarget = getLookingAtPlayer(player);
							if(hydratarget!=null && hydratarget.metabolism!=null){
								hydratarget.metabolism.hydration.Subtract(40);
							}
							hydratarget.metabolism.SendChangesToClient();
							break;
							#endregion
						case "thumbsdown": //starve
							#region corrupt thumbsdown
							magicCost +=(20);	
							BasePlayer caltgt = getLookingAtPlayer(player);
							if(caltgt!=null && caltgt.metabolism!=null){
								caltgt.metabolism.calories.Subtract(40);
							}
							caltgt.metabolism.SendChangesToClient();
							break;	
							#endregion		
						case "friendly": //radiate
							#region corrupt friendly
							magicCost +=(20);	
							BasePlayer radtgt = getLookingAtPlayer(player);
							if(radtgt!=null && radtgt.metabolism!=null){
								radtgt.metabolism.radiation_poison.Add(10);
							}
							radtgt.metabolism.SendChangesToClient();
							break;
							#endregion
						case "wave": //swap with person
							#region corrupt wave
							magicCost +=(50);	
							BasePlayer[] nearbyPlayers = new BasePlayer[100];
							BaseEntity.Query.Server.GetPlayersInSphere(player.transform.position, 150, nearbyPlayers,isHuman);
							BasePlayer nearest = null;
							foreach(BasePlayer bp in nearbyPlayers){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&
									(nearest==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearest.transform.position,player.transform.position))
									){
										nearest=bp;
								}
							}
							if(nearest!=null&&nearest.transform!=null){
								Vector3 oldPos = player.transform.position;
								player.Teleport(nearest.transform.position);
								nearest.Teleport(oldPos);
								if(nearest is HumanNPC && (nearest as HumanNPC).Brain!=null && (nearest as HumanNPC).Brain.Navigator!=null){
									(nearest as HumanNPC).Brain.Navigator.Warp(oldPos);
								}
							}
							break;
							#endregion
						case "ok": //max health tea
							#region corrupt ok
							magicCost +=(20);			
							ModifierDefintion pm = new ModifierDefintion();
							pm.type=Modifier.ModifierType.Max_Health;
							pm.source=Modifier.ModifierSource.Tea;
							pm.value=120f;
							pm.duration=60;
							List<ModifierDefintion> listmd = new List<ModifierDefintion>();
							listmd.Add(pm);
							player.modifiers.Add(listmd);
							break;
							#endregion
						case "victory": //bleed
							#region corrupt victory
							magicCost +=(20);	
							BasePlayer bleedtgt = getLookingAtPlayer(player);
							if(bleedtgt!=null && bleedtgt.metabolism!=null){
								bleedtgt.metabolism.bleeding.Add(10);
							}
							bleedtgt.metabolism.SendChangesToClient();
							break;
							#endregion
						case "clap": //clear self radiation
							#region corrupt clap
							/*heal rads, 1/10 hp plus condition*/
							magicCost +=(20);	
							if(player!=null && player.metabolism!=null){
								player.metabolism.radiation_poison.Subtract(20);
							}
							player.metabolism.SendChangesToClient();
							break;
							#endregion
						case "sillydance": //push to night
							#region corrupt sillydance
							silly1Players.Add(player);
							break;
							#endregion
						case "sillydance2": //spawn wolves near players
							#region corrupt sillydance2
							silly2Players.Add(player);
							break;
							#endregion
						default: break;
					} break;
				case "Techno Focus":// DONE!
					switch(gesture.gestureCommand)
					{
						case "thumbsup": //Refill nearby battery
							#region tech thumbsup 
							//10hp 100 ele
							magicCost +=(50);	
							BaseEntity[] nearbyBatts = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 30,nearbyBatts,isBattery);
							BaseEntity nearestBatt = null;
							foreach(BaseEntity bp in nearbyBatts){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestBatt==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestBatt.transform.position,player.transform.position))){
									nearestBatt=bp;
								}
							}
							if(nearestBatt!=null){
								ElectricBattery eb= (nearestBatt as ElectricBattery);
								eb.rustWattSeconds += (eb.maxCapactiySeconds/10);
							}
							
							break;
							#endregion
						case "thumbsdown": //Breaks a powersource connection
							#region tech thumbsdown
							magicCost +=(30);	
							BaseEntity[] nearbyGens = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 30,nearbyGens,isGenerator);
							BaseEntity nearestGen = null;
							foreach(BaseEntity bp in nearbyGens){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestGen==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestGen.transform.position,player.transform.position))){
									nearestGen=bp;
								}
							}
							if(nearestGen!=null){
								IOEntity io = nearestGen as IOEntity;
								List<IOEntity.IOSlot> ios = new List<IOEntity.IOSlot> ();
								foreach (global::IOEntity.IOSlot ioslot3 in io.outputs)
								{
									if (ioslot3.connectedTo.Get(true) != null)
									{
										ios.Add(ioslot3);	
									}									
								}
								int max = ios.Count()-1;
								int idx = UnityEngine.Random.Range(0,max);
								ios[idx].Clear();
							}
							
							break;	
							#endregion		
						case "friendly": //Find Vehicle
							#region tech friendly
							magicCost +=(20);	
							BaseEntity[] nearestVcls = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 150,nearestVcls,isVehicle);
							BaseEntity nearestVcl = null;
							foreach(BaseEntity bp in nearestVcls){
								if(bp==null||bp.transform==null)continue;
								if(bp!=player&&(nearestVcl==null||Vector3.Distance(bp.transform.position,player.transform.position)<Vector3.Distance(nearestVcl.transform.position,player.transform.position))){
									nearestVcl=bp;
								}
							}
							if(nearestVcl!=null){
								player.SendConsoleCommand("ddraw.text", 60, Color.white, nearestVcl.transform.position, (nearestVcl.ToString()));
								
							}
							
							
							break;
							#endregion
						case "wave": //Hop to telephone
							#region tech wave
							//check for phone list
							PhoneController[] phones = TelephoneManager.allTelephones.Values.ToArray();
							int idxPhone = UnityEngine.Random.Range(0,phones.Length-1);
							if(phones == null || phones[idxPhone] == null || phones[idxPhone].ParentEntity == null ||phones[idxPhone].ParentEntity.transform) return null;
							player.Teleport(phones[idxPhone].ParentEntity.transform.position);
							break;
							#endregion
						case "ok": //Scrap tea
							#region tech ok
							magicCost +=(20);			
							ModifierDefintion pm = new ModifierDefintion();
							pm.type=Modifier.ModifierType.Scrap_Yield;
							pm.source=Modifier.ModifierSource.Tea;
							pm.value=120f;
							pm.duration=60;
							List<ModifierDefintion> listmd = new List<ModifierDefintion>();
							listmd.Add(pm);
							player.modifiers.Add(listmd);
							break;
							#endregion
						case "victory": //tesla dmg
							#region tech victory 
							//rip out dmg code
							BasePlayer[] nearbyShocked = new BasePlayer[10];
							BaseEntity.Query.Server.GetPlayersInSphere(player.transform.position, 10,nearbyShocked,isPlayer);
							for (int i = 0; i < nearbyShocked.Length; i++)
							{
								global::BaseCombatEntity component = nearbyShocked[i].GetComponent<global::BaseCombatEntity>();
								if (component)
								{
									component.OnAttacked(new global::HitInfo(player, component, Rust.DamageType.ElectricShock, 15));
								}
							}
							player.OnAttacked(new global::HitInfo(player, player, Rust.DamageType.ElectricShock, 10));
							break;
							#endregion
						case "clap": //open door
							#region tech clap
							//takes dmg, takes ful focus, failure does nothing but hurt
							BaseEntity[] nearbyDoors = new BaseEntity[10];
							BaseEntity.Query.Server.GetInSphere(player.transform.position, 20,nearbyDoors,isDoor);
							int idxDoor = UnityEngine.Random.Range(0,nearbyDoors.Length-1);
							(nearbyDoors[idxDoor] as Door).SetOpen(true);
							player.OnAttacked(new global::HitInfo(nearbyDoors[idxDoor], player, Rust.DamageType.ElectricShock, 20));
							break;
							#endregion
						case "sillydance": //storm
							#region tech dance 1
							silly1Players.Add(player);
							break;
							#endregion
						case "sillydance2": //repair vehicle
							#region tech dance 2
							silly2Players.Add(player);
							break;
							#endregion
						default: break;
					} break;
				case "Spirit Focus":// Done!
					switch(gesture.gestureCommand)
					{
						case "shrug": //Self day / AOE night
							magicCost+=10;
							Wisp w = new Wisp(player);
							w.timeout = System.DateTime.Now.Ticks + (System.TimeSpan.TicksPerMillisecond * 1000 * 300);
							wisps.Add(w );
							break;
						case "point": //Self day / AOE night
							magicCost+=10;
							BasePlayer wispTgt = getLookingAtPlayer(player);
							if (wispTgt==null) return null;
							Wisp w2 = new Wisp(wispTgt);
							w2.timeout = System.DateTime.Now.Ticks + (System.TimeSpan.TicksPerMillisecond * 1000 * 300);
							wisps.Add(w2);
							break;
						case "thumbsup": //Self day / AOE night
							#region spirit thumbsup
							//adds to timeouts, during timeout self-time
							magicCost +=(20);			
							DateTime _sunnyDayDate = new DateTime(2024, 1, 25);
							
							if(nightTimeouts.ContainsKey(player)){
								nightTimeouts[player] = 0;
							}
							
							BasePlayer[] nearbyPlayers = new BasePlayer[12];
							BaseEntity.Query.Server.GetPlayersInSphere(getLookingAtVect(player), 30 ,nearbyPlayers,isHuman);
							foreach(BasePlayer bp in nearbyPlayers){
								
								if(bp==null||bp.transform==null)continue;
								if(bp!=player){
									if(bp.Connection==null) continue;
									if (Net.sv.write.Start())
									{
										Network.Connection connection = bp.Connection;
										connection.validate.entityUpdates = connection.validate.entityUpdates + 1;
										BaseNetworkable.SaveInfo saveInfo = new global::BaseNetworkable.SaveInfo
										{
											forConnection = connection,
											forDisk = false
										};
										Net.sv.write.PacketID(Message.Type.Entities);
										Net.sv.write.UInt32(connection.validate.entityUpdates);
										using (saveInfo.msg = Facepunch.Pool.Get<ProtoBuf.Entity>())
										{
											_envSync.Save(saveInfo);
											saveInfo.msg.environment.dateTime = _sunnyDayDate.AddHours(19.5f).ToBinary();
											saveInfo.msg.environment.fog = 1;
											saveInfo.msg.environment.rain = 1;
											saveInfo.msg.environment.clouds = 1;
											if (saveInfo.msg.baseEntity == null)
											{
												return null;
											}
											if (saveInfo.msg.baseNetworkable == null)
											{
												return null;
											}
											saveInfo.msg.ToProto(Net.sv.write);
											_envSync.PostSave(saveInfo);
											Net.sv.write.Send(new SendInfo(connection));
										}
									}
								}else{
									if (Net.sv.write.Start())
									{
										Network.Connection connection = bp.Connection;
										connection.validate.entityUpdates = connection.validate.entityUpdates + 1;
										BaseNetworkable.SaveInfo saveInfo = new global::BaseNetworkable.SaveInfo
										{
											forConnection = connection,
											forDisk = false
										};
										Net.sv.write.PacketID(Message.Type.Entities);
										Net.sv.write.UInt32(connection.validate.entityUpdates);
										using (saveInfo.msg = Facepunch.Pool.Get<ProtoBuf.Entity>())
										{
											_envSync.Save(saveInfo);
											saveInfo.msg.environment.dateTime = _sunnyDayDate.AddHours(6.8f	).ToBinary();
											saveInfo.msg.environment.fog = 0;
											saveInfo.msg.environment.rain = 0;
											saveInfo.msg.environment.clouds = 0;
											if (saveInfo.msg.baseEntity == null)
											{
												return null;
											}
											if (saveInfo.msg.baseNetworkable == null)
											{
												return null;
											}
											saveInfo.msg.ToProto(Net.sv.write);
											_envSync.PostSave(saveInfo);
											Net.sv.write.Send(new SendInfo(connection));
										}
									}									
								}
							}
							break;
							#endregion
						case "thumbsdown": //bush
							#region spirit thumbsdown
							//adds to timeouts, during timeout bushes
							
							if(bushTimeouts.ContainsKey(player)){
								bushTimeouts[player]=0;		
							}
							
							BasePlayer[] nearbyPlayersbush = new BasePlayer[12];
							BaseEntity.Query.Server.GetPlayersInSphere(getLookingAtVect(player), 15 ,nearbyPlayersbush,isHuman);
							foreach(BasePlayer bp in nearbyPlayersbush){
								if(bushTimeouts.ContainsKey(bp)){
									bushTimeouts[bp]=bushDuration + System.DateTime.Now.Ticks;		
								}else{
									bushTimeouts.Add(bp,bushDuration + System.DateTime.Now.Ticks);
								}
								foreach(BaseNetworkable.SaveInfo si in bushGhosts){
									if(bp.Connection==null) continue;
									if (Net.sv.write.Start())
									{
										Network.Connection connection = bp.Connection;
										connection.validate.entityUpdates = connection.validate.entityUpdates + 1;
										Vector3 bushposition = getNearbyPos(bp,10);
										si.msg.baseEntity.pos =bushposition;
										Net.sv.write.PacketID(Message.Type.Entities);
										Net.sv.write.
// ... [Code preview truncated due to length. Full source in attached file] ...

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