C#:
// #define DefaultConfig
// #define DebugLog
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using Facepunch;
using Network;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Rust;
using Rust.Ai.Gen2;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
using Oxide.Plugins.RoamingNPCex;
[Info("Roaming NPCs", "walkinrey & Max39ru", "0.4.8")]
public partial class RoamingNPCs : CovalencePlugin {
[PluginReference]
private Plugin DeployableNature, Spawns, WarMode;
public const bool RU = false;
public const string AdminPermission = "roamingnpcs.admin";
public const string PrefabPetBot = "assets/rust.ai/agents/npcplayer/pet/frankensteinpet.prefab";
public const string PrefabPlayer = "assets/prefabs/player/player.prefab";
public static RoamingNPCs instance;
private Timer _timer;
public Configuration config;
public DataBots Data;
public List<string> NicknamesData;
public Dictionary<ulong, CustomPet> listNpcPlayers = new();
public Monuments monuments;
public List<string> visibleAdmins = new();
public List<string> visibleAdminsStash = new();
public static JsonSerializerSettings settingsSerializer = new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore, ContractResolver = new CustomContractResolver()
}
;
public OnBotCreatedEvent OnBotCreated = new OnBotCreatedEvent();
private readonly Dictionary<ulong, Timer> respawnTimers = new();
#region Configuration
public class Configuration {
[JsonProperty(RU ? "Настройка ботов" : "Bots settings", Order = 10)]
public Dictionary<string, BotSetup> bots = new();
[JsonProperty(RU ? "Укажите для генератора ID ботов (от 8 - 15)" : "Specify the ID of the bot generator (8 - 15)")]
private int digits = 9;
public int GetDigits() => Mathf.Clamp(digits, 8, 15);
public BotSetup GetSetup(string nameSetup) {
if (string.IsNullOrEmpty(nameSetup)) return null;
if (bots.TryGetValue(nameSetup, out BotSetup setup)) return setup;
return null;
}
public static Configuration GetDefault() {
return new() {
bots = new() {
["bob_resources_farmer"]
= new(100000000, 300f, 50f) {
Enable = true, Name = "Bob", Corpse = DeadCorpse.PlayerCorpse, Personality = PersonalityBot.Friendly, MaxHealth = 100f, deathItemsBlacklist = new List<ItemSetup>() {
new ItemSetup("knife.skinning", 0)
}
, Controller = new(0.1f, 0.5f) {
RadiusFindEntity = 30f, RateDamageWater = 1f, AccuracyOfFire = 5, ScaleDamageToNPC = 2f, ScaleDamageToAnimal = 2f, ScaleDamageToPlayers = 0.8f, ScaleDamageFromNPC = 0.2f, ScaleDamageFromAnimal = 0.2f, ScaleDamageFromPlayers = 0.8f
}
, ResearcherState = new SetupResearcher() {
BlockListPrefabsMonuments = new List<string>() {
"assets/bundled/prefabs/autospawn/monument/lighthouse/lighthouse.prefab"
}
}
, Wear = new() {
CanLock = true, items = new() {
new("hazmatsuit.lumberjack", 0),
}
}
, MinerState = new() {
CanMiningWood = true, CanFuelUseFromChainsaw = false, CanMiningOre = true, CanMiningBarrel = false, CanMiningRoadSign = false, CanPickupCollectibleItems = true, CanLootedContainer = false, CanPickupDroppedItems = false, CanLootedCorpse = false, CanButcherCorpse = false, PrefabsCorpseToButcher = new() {
"assets/rust.ai/agents/boar/boar.corpse.prefab", "polarbear.corpse", "bear.corpse", "stag.corpse", "wolf.corpse", "crocodile.corpse", "panther.corpse", "tiger.corpse", "chicken.corpse"
}
, BlockListPrefabMining = new() {
"assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree03.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtreeprefab.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree02.prefab"
}
, LootAmountLimitations = new() {
["wood"]
= 10000, ["stones"] = 5000, ["metal.ore"] = 5000, ["sulfur.ore"] = 5000,
}
}
, HunterState = new() {
CanHunt = false, PriorityMelee = true, _radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 2f,
}
, BattleState = new() {
_radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 1f,
}
, FullState = new() {
Stash = new(true, true, 10, 3600f), Box = new(true, true, 0, 5, 3600f),
}
, ItemsOnSpawn = new List<LootItemSetup>() {
new LootItemSetup() {
Item = new ItemSetup("wood", 0), Amount = 1000
}
}
, ItemsMiningOre = new() {
Items = new() {
new(false, false, new("jackhammer", 0)), new(false, false, new("lumberjack.pickaxe", 0)), new(false, false, new("diverpickaxe", 0)), new(true, true, new("pickaxe", 0)), new(false, false, new("stone.pickaxe", 0)), new(false, false, new("rock", 0)),
}
,
}
, ItemsMiningTree = new() {
Items = new() {
new(false, false, new("chainsaw", 0)), new(false, false, new("lumberjack.hatchet", 0)), new(false, false, new("frontier_hatchet", 0)), new(true, true, new("hatchet", 0)), new(false, false, new("stonehatchet", 0)), new(false, false, new("rock", 0)),
}
}
, ItemsWeapon = new() {
CanUseAmmo = false, AmountAmmo = 128, Items = new() {
new(true, true, new("bow.hunting", 0)), new(false, false, new("1965232394", 0)), new(false, false, new("salvaged.cleaver", 0)),
}
}
, ItemsMedical = new() {
Items = new() {
new(false, true, 5, new("syringe.medical", 0)), new(true, false, 1, new("bandage", 0)),
}
}
, ItemsButcher = new() {
Items = new() {
new(true, false, new("knife.skinning", 0)),
}
}
, Phrases = new() {
MinerPhrases = new() {
PhrasesPickupCollectable = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesPickupItem = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesLooting = new(30f, "uinston2/miner/looting/1" ), PhrasesBreaking = new(30f, "uinston2/miner/breaking/1" ), PhrasesMiningOre = new(30f, "uinston2/miner/mining_ore/1" ), PhrasesMiningTree = new(30f, "uinston2/miner/mining_tree/1" ), PhrasesLootingCorpse = new(30f, "uinston2/miner/looting/1" ), PhrasesButcherCorpse = new(30f, "uinston2/miner/butcher_corpse/1" ),
}
, HunterPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/hunter/start_attack/1", "uinston2/hunter/start_attack/2" ),
}
, AttackerPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/attacker/start_attack/1" ), PhrasesRunAway = new(30f, "uinston2/attacker/run_away/1", "uinston2/attacker/run_away/2", "uinston2/attacker/run_away/3" ), PhrasesNotVisibleTarget = new(30f, "uinston2/attacker/not_visible/1", "uinston2/attacker/not_visible/2", "uinston2/attacker/not_visible/3" ),
}
, ResearcherPhrases = new() {
PhrasesBeforeMove = new(30f, "uinston2/researcher/before_move/1" ), PhrasesAfterMove = new(30f, "uinston2/researcher/after_move/1" ),
}
, FullState = new(30f, "uinston2/full_state/1", "uinston2/full_state/2" ), MedicalState = new(30f, "uinston2/medical_state/1", "uinston2/medical_state/2", "uinston2/medical_state/3" ),
}
}
, ["john_looter"] = new(0, 300f, 50f) {
Enable = true, Name = "John", Corpse = DeadCorpse.PlayerCorpse, Personality = PersonalityBot.Defensive, deathItemsBlacklist = new List<ItemSetup>() {
new ItemSetup("rifle.ak.diver", 0), new ItemSetup("knife.skinning", 0)
}
, MaxHealth = 120f, Controller = new(0.1f, 0.5f) {
RadiusFindEntity = 30f, RateDamageWater = 1f, AccuracyOfFire = 5, ScaleDamageToNPC = 2f, ScaleDamageToAnimal = 2f, ScaleDamageToPlayers = 0.8f, ScaleDamageFromNPC = 0.2f, ScaleDamageFromAnimal = 0.2f, ScaleDamageFromPlayers = 0.8f
}
, ResearcherState = new SetupResearcher() {
BlockListPrefabsMonuments = new List<string>() {
"assets/bundled/prefabs/autospawn/monument/lighthouse/lighthouse.prefab"
}
}
, Wear = new() {
CanLock = true, items = new() {
new("hazmatsuit.nomadsuit", 0),
}
}
, MinerState = new() {
CanMiningWood = false, CanFuelUseFromChainsaw = false, CanMiningOre = false, CanMiningBarrel = true, CanMiningRoadSign = true, CanPickupCollectibleItems = true, CanLootedContainer = true, CanPickupDroppedItems = true, CanLootedCorpse = true, CanButcherCorpse = false, PrefabsCorpseToButcher = new() {
"assets/rust.ai/agents/boar/boar.corpse.prefab", "polarbear.corpse", "bear.corpse", "stag.corpse", "wolf.corpse", "crocodile.corpse", "panther.corpse", "tiger.corpse", "chicken.corpse"
}
, BlockListPrefabMining = new() {
"assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree03.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtreeprefab.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree02.prefab"
}
, LootAmountLimitations = new() {
["wood"]
= 10000, ["stones"] = 5000, ["metal.ore"] = 5000, ["sulfur.ore"] = 5000,
}
}
, HunterState = new() {
CanHunt = false, PriorityMelee = true, _radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 2f,
}
, BattleState = new() {
_radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 1f,
}
, FullState = new() {
Stash = new(true, true, 10, 3600f), Box = new(true, true, 0, 5, 3600f),
}
, ItemsOnSpawn = new List<LootItemSetup>() {
new LootItemSetup() {
Item = new ItemSetup("wood", 0), Amount = 1000
}
}
, ItemsMiningOre = new() {
Items = new() {
new(false, false, new("jackhammer", 0)), new(false, false, new("lumberjack.pickaxe", 0)), new(false, false, new("diverpickaxe", 0)), new(true, true, new("pickaxe", 0)), new(false, false, new("stone.pickaxe", 0)), new(false, false, new("rock", 0)),
}
,
}
, ItemsMiningTree = new() {
Items = new() {
new(false, false, new("chainsaw", 0)), new(false, false, new("lumberjack.hatchet", 0)), new(false, false, new("frontier_hatchet", 0)), new(true, true, new("hatchet", 0)), new(false, false, new("stonehatchet", 0)), new(false, false, new("rock", 0)),
}
}
, ItemsWeapon = new() {
CanUseAmmo = true, AmountAmmo = 300, Items = new() {
new(false, true, new("rifle.ak.diver", 0)), new(true, true, new("bow.hunting", 0)), new(true, false, new("1965232394", 0)), new(true, false, new("salvaged.cleaver", 0)),
}
}
, ItemsMedical = new() {
Items = new() {
new(false, true, 5, new("syringe.medical", 0)), new(true, false, 1, new("bandage", 0)),
}
}
, ItemsButcher = new() {
Items = new() {
new(true, false, new("knife.skinning", 0)),
}
}
, Phrases = new() {
MinerPhrases = new() {
PhrasesPickupCollectable = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesPickupItem = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesLooting = new(30f, "uinston2/miner/looting/1" ), PhrasesBreaking = new(30f, "uinston2/miner/breaking/1" ), PhrasesMiningOre = new(30f, "uinston2/miner/mining_ore/1" ), PhrasesMiningTree = new(30f, "uinston2/miner/mining_tree/1" ), PhrasesLootingCorpse = new(30f, "uinston2/miner/looting/1" ), PhrasesButcherCorpse = new(30f, "uinston2/miner/butcher_corpse/1" ),
}
, HunterPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/hunter/start_attack/1", "uinston2/hunter/start_attack/2" ),
}
, AttackerPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/attacker/start_attack/1" ), PhrasesRunAway = new(30f, "uinston2/attacker/run_away/1", "uinston2/attacker/run_away/2", "uinston2/attacker/run_away/3" ), PhrasesNotVisibleTarget = new(30f, "uinston2/attacker/not_visible/1", "uinston2/attacker/not_visible/2", "uinston2/attacker/not_visible/3" ),
}
, ResearcherPhrases = new() {
PhrasesBeforeMove = new(30f, "uinston2/researcher/before_move/1" ), PhrasesAfterMove = new(30f, "uinston2/researcher/after_move/1" ),
}
, FullState = new(30f, "uinston2/full_state/1", "uinston2/full_state/2" ), MedicalState = new(30f, "uinston2/medical_state/1", "uinston2/medical_state/2", "uinston2/medical_state/3" ),
}
}
, ["alfred_hunter"] = new(0, 300f, 50f) {
Enable = true, Name = "Alfred", Corpse = DeadCorpse.PlayerCorpse, Personality = PersonalityBot.Defensive, deathItemsBlacklist = new List<ItemSetup>() {
new ItemSetup("shotgun.spas12", 0), new ItemSetup("knife.skinning", 0)
}
, MaxHealth = 100f, Controller = new(0.1f, 0.5f) {
RadiusFindEntity = 30f, RateDamageWater = 1f, AccuracyOfFire = 5, ScaleDamageToNPC = 2f, ScaleDamageToAnimal = 2f, ScaleDamageToPlayers = 0.8f, ScaleDamageFromNPC = 0.2f, ScaleDamageFromAnimal = 0.2f, ScaleDamageFromPlayers = 0.8f
}
, ResearcherState = new SetupResearcher() {
BlockListPrefabsMonuments = new List<string>() {
"assets/bundled/prefabs/autospawn/monument/lighthouse/lighthouse.prefab"
}
}
, Wear = new() {
CanLock = true, items = new() {
new("hazmatsuit.frontier", 0),
}
}
, MinerState = new() {
CanMiningWood = false, CanFuelUseFromChainsaw = false, CanMiningOre = false, CanMiningBarrel = false, CanMiningRoadSign = false, CanPickupCollectibleItems = false, CanLootedContainer = false, CanPickupDroppedItems = true, CanLootedCorpse = false, CanButcherCorpse = true, PrefabsCorpseToButcher = new() {
"assets/rust.ai/agents/boar/boar.corpse.prefab", "polarbear.corpse", "bear.corpse", "stag.corpse", "wolf.corpse", "crocodile.corpse", "panther.corpse", "tiger.corpse", "chicken.corpse"
}
, BlockListPrefabMining = new() {
"assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree03.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtreeprefab.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree02.prefab"
}
, LootAmountLimitations = new() {
["wood"]
= 10000, ["stones"] = 5000, ["metal.ore"] = 5000, ["sulfur.ore"] = 5000,
}
}
, HunterState = new() {
CanHunt = true, PriorityMelee = false, _radiusWeaponAttacked = 25f, _radiusMeleeAttacked = 2f,
}
, BattleState = new() {
_radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 1f,
}
, FullState = new() {
Stash = new(true, true, 10, 3600f), Box = new(true, true, 0, 5, 3600f),
}
, ItemsOnSpawn = new List<LootItemSetup>() {
new LootItemSetup() {
Item = new ItemSetup("wood", 0), Amount = 1000
}
}
, ItemsMiningOre = new() {
Items = new() {
new(false, false, new("jackhammer", 0)), new(false, false, new("lumberjack.pickaxe", 0)), new(false, false, new("diverpickaxe", 0)), new(true, true, new("pickaxe", 0)), new(false, false, new("stone.pickaxe", 0)), new(false, false, new("rock", 0)),
}
,
}
, ItemsMiningTree = new() {
Items = new() {
new(false, false, new("chainsaw", 0)), new(false, false, new("lumberjack.hatchet", 0)), new(false, false, new("frontier_hatchet", 0)), new(true, true, new("hatchet", 0)), new(false, false, new("stonehatchet", 0)), new(false, false, new("rock", 0)),
}
}
, ItemsWeapon = new() {
CanUseAmmo = false, AmountAmmo = 300, Items = new() {
new(false, true, new("shotgun.spas12", 0)), new(true, false, new("bow.hunting", 0)), new(true, false, new("1965232394", 0)), new(true, false, new("salvaged.cleaver", 0)),
}
}
, ItemsMedical = new() {
Items = new() {
new(false, true, 5, new("syringe.medical", 0)), new(true, false, 1, new("bandage", 0)),
}
}
, ItemsButcher = new() {
Items = new() {
new(true, false, new("knife.skinning", 0)),
}
}
, Phrases = new() {
MinerPhrases = new() {
PhrasesPickupCollectable = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesPickupItem = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesLooting = new(30f, "uinston2/miner/looting/1" ), PhrasesBreaking = new(30f, "uinston2/miner/breaking/1" ), PhrasesMiningOre = new(30f, "uinston2/miner/mining_ore/1" ), PhrasesMiningTree = new(30f, "uinston2/miner/mining_tree/1" ), PhrasesLootingCorpse = new(30f, "uinston2/miner/looting/1" ), PhrasesButcherCorpse = new(30f, "uinston2/miner/butcher_corpse/1" ),
}
, HunterPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/hunter/start_attack/1", "uinston2/hunter/start_attack/2" ),
}
, AttackerPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/attacker/start_attack/1" ), PhrasesRunAway = new(30f, "uinston2/attacker/run_away/1", "uinston2/attacker/run_away/2", "uinston2/attacker/run_away/3" ), PhrasesNotVisibleTarget = new(30f, "uinston2/attacker/not_visible/1", "uinston2/attacker/not_visible/2", "uinston2/attacker/not_visible/3" ),
}
, ResearcherPhrases = new() {
PhrasesBeforeMove = new(30f, "uinston2/researcher/before_move/1" ), PhrasesAfterMove = new(30f, "uinston2/researcher/after_move/1" ),
}
, FullState = new(30f, "uinston2/full_state/1", "uinston2/full_state/2" ), MedicalState = new(30f, "uinston2/medical_state/1", "uinston2/medical_state/2", "uinston2/medical_state/3" ),
}
}
, ["austin_fighter"] = new(0, 300f, 0f) {
Enable = true, Name = "Austin", Corpse = DeadCorpse.PlayerCorpse, Personality = PersonalityBot.Aggressive, deathItemsBlacklist = new List<ItemSetup>() {
new ItemSetup("krieg.shotgun", 0), new ItemSetup("krieg.chainsword", 0), new ItemSetup("knife.skinning", 0)
}
, MaxHealth = 120f, Controller = new(0.1f, 0.5f) {
RadiusFindEntity = 30f, RateDamageWater = 0f, AccuracyOfFire = 3, ScaleDamageToNPC = 2f, ScaleDamageToAnimal = 2f, ScaleDamageToPlayers = 0.8f, ScaleDamageFromNPC = 0.2f, ScaleDamageFromAnimal = 0.2f, ScaleDamageFromPlayers = 0.8f
}
, ResearcherState = new SetupResearcher() {
BlockListPrefabsMonuments = new List<string>() {
"assets/bundled/prefabs/autospawn/monument/lighthouse/lighthouse.prefab"
}
}
, Wear = new() {
CanLock = true, items = new() {
new("hazmat.krieg", 0),
}
}
, MinerState = new() {
CanMiningWood = false, CanFuelUseFromChainsaw = false, CanMiningOre = false, CanMiningBarrel = true, CanMiningRoadSign = false, CanPickupCollectibleItems = false, CanLootedContainer = true, CanPickupDroppedItems = true, CanLootedCorpse = true, CanButcherCorpse = false, PrefabsCorpseToButcher = new() {
"assets/rust.ai/agents/boar/boar.corpse.prefab", "polarbear.corpse", "bear.corpse", "stag.corpse", "wolf.corpse", "crocodile.corpse", "panther.corpse", "tiger.corpse", "chicken.corpse"
}
, BlockListPrefabMining = new() {
"assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree03.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtreeprefab.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree02.prefab"
}
, LootAmountLimitations = new() {
["wood"]
= 10000, ["stones"] = 5000, ["metal.ore"] = 5000, ["sulfur.ore"] = 5000,
}
}
, HunterState = new() {
CanHunt = false, PriorityMelee = false, _radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 2f,
}
, BattleState = new() {
_radiusWeaponAttacked = 30f, _radiusMeleeAttacked = 1f,
}
, FullState = new() {
Stash = new(true, true, 10, 3600f), Box = new(true, true, 0, 5, 3600f),
}
, ItemsOnSpawn = new List<LootItemSetup>() {
new LootItemSetup() {
Item = new ItemSetup("wood", 0), Amount = 1000
}
}
, ItemsMiningOre = new() {
Items = new() {
new(false, false, new("jackhammer", 0)), new(false, false, new("lumberjack.pickaxe", 0)), new(false, false, new("diverpickaxe", 0)), new(true, true, new("pickaxe", 0)), new(false, false, new("stone.pickaxe", 0)), new(false, false, new("rock", 0)),
}
,
}
, ItemsMiningTree = new() {
Items = new() {
new(false, false, new("chainsaw", 0)), new(false, false, new("lumberjack.hatchet", 0)), new(false, false, new("frontier_hatchet", 0)), new(true, true, new("hatchet", 0)), new(false, false, new("stonehatchet", 0)), new(false, false, new("rock", 0)),
}
}
, ItemsWeapon = new() {
CanUseAmmo = false, AmountAmmo = 300, Items = new() {
new(false, true, new("krieg.shotgun", 0)), new(true, false, new("krieg.chainsword", 0)),
}
}
, ItemsMedical = new() {
Items = new() {
new(true, false, 5, new("syringe.medical", 0)),
}
}
, ItemsButcher = new() {
Items = new() {
new(true, false, new("knife.skinning", 0)),
}
}
, Phrases = new() {
MinerPhrases = new() {
PhrasesPickupCollectable = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesPickupItem = new(30f, "uinston2/miner/pickup_collectable/1" ), PhrasesLooting = new(30f, "uinston2/miner/looting/1" ), PhrasesBreaking = new(30f, "uinston2/miner/breaking/1" ), PhrasesMiningOre = new(30f, "uinston2/miner/mining_ore/1" ), PhrasesMiningTree = new(30f, "uinston2/miner/mining_tree/1" ), PhrasesLootingCorpse = new(30f, "uinston2/miner/looting/1" ), PhrasesButcherCorpse = new(30f, "uinston2/miner/butcher_corpse/1" ),
}
, HunterPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/hunter/start_attack/1", "uinston2/hunter/start_attack/2" ),
}
, AttackerPhrases = new() {
PhrasesStartAttack = new(30f, "uinston2/attacker/start_attack/1" ), PhrasesRunAway = new(30f, "uinston2/attacker/run_away/1", "uinston2/attacker/run_away/2", "uinston2/attacker/run_away/3" ), PhrasesNotVisibleTarget = new(30f, "uinston2/attacker/not_visible/1", "uinston2/attacker/not_visible/2", "uinston2/attacker/not_visible/3" ),
}
, ResearcherPhrases = new() {
PhrasesBeforeMove = new(30f, "uinston2/researcher/before_move/1" ), PhrasesAfterMove = new(30f, "uinston2/researcher/after_move/1" ),
}
, FullState = new(30f, "uinston2/full_state/1", "uinston2/full_state/2" ), MedicalState = new(30f, "uinston2/medical_state/1", "uinston2/medical_state/2", "uinston2/medical_state/3" ),
}
}
,
#if DebugLog && DefaultConfig
["Test"]
= new(100000004, 3f, 50f) {
Enable = false, Name = "Max39ru", Corpse = DeadCorpse.Backpack, Personality = PersonalityBot.Defensive, CanRandomPointRespawn = true, MaxHealth = 150f, Controller = new(0.1f, 1f, 0f) {
RadiusFindEntity = 30f, RateDamageWater = 0f, AccuracyOfFire = 5, ScaleDamageToNPC = 3f, ScaleDamageToAnimal = 2f, ScaleDamageToPlayers = 1f, ScaleDamageFromNPC = 0.1f, ScaleDamageFromAnimal = 0.1f, ScaleDamageFromPlayers = 0.05f
}
, Wear = new() {
CanLock = true, items = new() {
new("hazmatsuit.lumberjack", 0),
}
}
, MinerState = new() {
CanMiningWood = false, CanFuelUseFromChainsaw = false, CanMiningOre = true, CanMiningBarrel = true, CanMiningRoadSign = false, CanPickupCollectibleItems = true, CanLootedContainer = true, CanPickupDroppedItems = true, CanLootedCorpse = true, CanButcherCorpse = true, PrefabsCorpseToButcher = new() {
"assets/rust.ai/agents/boar/boar.corpse.prefab", "polarbear.corpse", "bear.corpse", "stag.corpse", "wolf.corpse", "crocodile.corpse", "panther.corpse", "tiger.corpse", "chicken.corpse"
}
, BlockListPrefabMining = new() {
"assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree03.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtreeprefab.prefab", "assets/bundled/prefabs/autospawn/resource/vine_swinging/vineswingingtree02.prefab"
}
, LootAmountLimitations = new() {
["wood"]
= 10000, ["stones"] = 5000, ["metal.ore"] = 5000, ["sulfur.ore"] = 5000,
}
}
, HunterState = new() {
PriorityMelee = false, RadiusWeaponAttacked = 30f, RadiusMeleeAttacked = 2f,
}
, BattleState = new() {
RadiusWeaponAttacked = 30f, RadiusMeleeAttacked = 1f,
}
, FullState = new() {
Stash = new(true, true, 10, 3600f), Box = new(true, true, 0, 5, 3600f),
}
, ItemsMiningOre = new() {
Items = new() {
new(false, false, new("jackhammer", 0)), new(false, false, new("lumberjack.pickaxe", 0)), new(false, false, new("diverpickaxe", 0)), new(true, true, new("pickaxe", 0)), new(false, false, new("stone.pickaxe", 0)), new(false, true, new("rock", 0)),
}
,
}
, ItemsMiningTree = new() {
Items = new() {
new(false, false, new("chainsaw", 0)), new(false, false, new("lumberjack.hatchet", 0)), new(false, false, new("frontier_hatchet", 0)), new(true, true, new("hatchet", 0)), new(false, false, new("stonehatchet", 0)), new(false, true, new("rock", 0)),
}
}
, ItemsWeapon = new() {
CanUseAmmo = false, AmountAmmo = 300, AmmoInMagazine = new (5, 20), Items = new() {
// new(false, true, new("shotgun.spas12", 0)),
// new(true, false, new("bow.hunting", 0)),
new(true, false, new("minicrossbow", 0)), // new(true, false, new("bow.compound", 0)),
// new(true, false, new("1965232394", 0)),
new(true, false, new("salvaged.cleaver", 0)),
}
}
, ItemsMedical = new() {
Items = new() {
new(false, true, 5, new("syringe.medical", 0)), new(true, false, 1, new("bandage", 0)),
}
}
, ItemsButcher = new() {
Items = new() {
new(true, false, new("knife.skinning", 0)),
}
}
, Phrases = new() {
MinerPhrases = new() {
PhrasesPickupCollectable = new(70f, "uinston2/miner/pickup_collectable/1" ), PhrasesPickupItem = new(70f, "uinston2/miner/pickup_collectable/1" ), PhrasesLooting = new(70f, "uinston2/miner/looting/1" ), PhrasesBreaking = new(70f, "uinston2/miner/breaking/1" ), PhrasesMiningOre = new(30f, "uinston2/miner/mining_ore/1" ), PhrasesMiningTree = new(70f, "uinston2/miner/mining_tree/1" ), PhrasesLootingCorpse = new(70f, "uinston2/miner/looting/1" ), PhrasesButcherCorpse = new(70f, "uinston2/miner/butcher_corpse/1" ),
}
, HunterPhrases = new() {
PhrasesStartAttack = new(70f, "uinston2/hunter/start_attack/1", "uinston2/hunter/start_attack/2" ),
}
, AttackerPhrases = new() {
PhrasesStartAttack = new(70f, "uinston2/attacker/start_attack/1" ), PhrasesRunAway = new(70f, "uinston2/attacker/run_away/1", "uinston2/attacker/run_away/2", "uinston2/attacker/run_away/3" ), PhrasesNotVisibleTarget = new(70f, "uinston2/attacker/not_visible/1", "uinston2/attacker/not_visible/2", "uinston2/attacker/not_visible/3" ),
}
, ResearcherPhrases = new() {
PhrasesBeforeMove = new(70f, "uinston2/researcher/before_move/1" ), PhrasesAfterMove = new(70f, "uinston2/researcher/after_move/1" ),
}
, FullState = new(70f, "uinston2/full_state/1", "uinston2/full_state/2" ), MedicalState = new(70f, "uinston2/medical_state/1", "uinston2/medical_state/2", "uinston2/medical_state/3" ),
}
}
,
#endif
}
}
;
}
}
public class BotSetup {
[JsonProperty(RU ? "Активировать бота?" : "Enable bot?")]
public bool Enable = true;
[JsonProperty(RU ? "Какое количество этих ботов может быть заспавнено?" : "How many of these bots can be spawned?")]
public int Amount = 1;
[JsonProperty(RU ? "Внешность бота (работает если кол-во ботов 1, используйте id в диапазоне указанного количества знаков для генератора ID или оставьте 0, для случайной внешности)" : "Bot appearance (used if bot's amount - 1, use the id in the range of the specified number of digits for the bot ID generator or leave 0 for random appearance)")]
private ulong id = 0;
[JsonProperty(RU ? "Имя бота (оставьте пустым для случайного выбора)" : "Bot name (leave empty for random)")]
public string Name = "Dennis";
[JsonProperty(RU ? "Использовать свои рандомные имена из дата файла? (/data/RoamingNPCs/RandomNicknames, или рандомные имена из Rust будут использованы)" : "Use random names from data file? (/data/RoamingNPCs/RandomNicknames, or Rust's random names will be used)")]
public bool UseRandomNamesData = false;
[JsonProperty(RU ? "Разрешить нахождение в состоянии ранения?" : "Allow wounded state?")]
public bool allowWounded = true;
[JsonProperty(RU ? "Таймер возрождения (мин. 3 сек)" : "Respawn timer (min 3 seconds)")]
private float timerRespawn = 3f;
[JsonProperty(RU ? "Включить периодическую реинициализацию бота? (может улучшить производительность)" : "Enable periodic bot reinitialization? (can improve performance)")]
public bool EnablePeriodicRespawn = false;
[JsonProperty(RU ? "Какой режим возрождения использовать? (RandomPoint, RoadPoint, SpawnPoint, SpawnsDatabase)" : "What respawn mode to use? (RandomPoint, RoadPoint, SpawnPoint, SpawnsDatabase)")]
public SpawnMode spawnMode = 0;
[JsonProperty(RU ? "Какие дороги использовать для спавна? (DefaultRoads, MainRoads, SideRoads, TrailRoads, Rails)" : "What roads use to spawn? (DefaultRoads, MainRoads, SideRoads, TrailRoads, Rails)")]
public RoadSpawnMode roadSpawnMode = 0;
[JsonProperty(RU ? "Название файла с точками спавна (для респавна через SpawnsDatabase)" : "Spawn points filename (for SpawnsDatabase respawn mode)")]
public string spawnsDatabaseFileName = "";
[JsonProperty(RU ? "Максимальное здоровье" : "Maximum health")]
public float MaxHealth = 150f;
[JsonProperty(RU ? "Что появляется на месте смерти (PlayerCorpse, NpcCorpse, Backpack)" : "What spawns on death (PlayerCorpse, NpcCorpse, Backpack)")]
public DeadCorpse Corpse = new();
[JsonProperty(RU ? "Оставлять одежду при смерти на NpcCorpse?" : "Keep clothes on NpcCorpse?")]
public bool KeepClothesNPCCorpse = true;
[JsonProperty(RU ? "Процент уничтожения предметов при смерти, если выбран Backpack. (0 - 100%)" : "How many items will be destroyed when Backpack is selected (0 - 100%)")]
private float destroyPercent = 0f;
[JsonProperty(RU ? "Список предметов которые не будут выпадать при смерти" : "List of items that won't drop on death")]
public List<ItemSetup> deathItemsBlacklist = new List<ItemSetup>();
[JsonProperty(RU ? "Характер бота - агрессивный, мирный или оборонительный? (Aggressive, Friendly, Defensive)" : "Bot behaviour - Aggressive, Friendly, Defensive")]
public PersonalityBot Personality = PersonalityBot.Friendly;
[JsonProperty(RU ? "Включить рандомный характер бота?" : "Enable random bot behaviour?")]
public bool EnableRandomPersonality = false;
[JsonProperty(RU ? "Настройка контроллера" : "Controller setup")]
public ControllerSetup Controller = new();
[JsonProperty(RU ? "Предметы одежды (при возрождении)" : "Wear items (on respawn)")]
public WearSetup Wear = new();
[JsonProperty(RU ? "Разрешить скидывать предметы на поясе при смерти?" : "Allow dropping items on belt when dead?")]
public bool CanDropBeltInventory = false;
[JsonProperty(RU ? "Настройка сбора ресурсов" : "Resource collection")]
public SetupMining MinerState = new();
[JsonProperty(RU ? "Настройка боя с НПС и игроками" : "Fights with NPCs and players")]
public SetupBattle BattleState = new();
[JsonProperty(RU ? "Настройка охоты на животных" : "Animal hunting")]
public SetupHunting HunterState = new();
[JsonProperty(RU ? "Настройка переполнение инвентаря" : "Inventory overflow")]
public SetupFullInventory FullState = new();
[JsonProperty(RU ? "Настройка посещения рт" : "Monuments visit setup")]
public SetupResearcher ResearcherState = new();
[JsonProperty(RU ? "Лут при спавне" : "Loot on spawn")]
public List<LootItemSetup> ItemsOnSpawn = new();
[JsonProperty(RU ? "Предметы для добычи руды" : "Items for ore mining")]
public ItemsList<ItemBot> ItemsMiningOre = new();
[JsonProperty(RU ? "Предметы для добычи дерева" : "Items for tree gathering")]
public ItemsList<ItemBot> ItemsMiningTree = new();
[JsonProperty(RU ? "Предметы для боя" : "Items for fights")]
public ListWeapons ItemsWeapon = new();
[JsonProperty(RU ? "Предметы для разделки животных" : "Items for harvesting animals")]
public ItemsList<ItemBot> ItemsButcher = new();
[JsonProperty(RU ? "Предметы для лечения" : "Items for healing")]
public ItemsList<AmountItemBot> ItemsMedical = new();
[JsonProperty(RU ? "Настройка голосовых фраз при различных действиях (вы можете скачать дефолтные фразы со страницы плагина)" : "Voice phrases for different actions (you can download default voice phraes from plugin page)")]
public SetupPhrase Phrases = new();
[JsonIgnore]
public List<ItemBot> itemsGiveBot = new();
// [JsonIgnore] public bool LockBelt => true;
public BotSetup() {
}
public BotSetup(ulong id, float timerRespawn, float destroyPercent = 0) {
this.id = id;
this.timerRespawn = timerRespawn;
this.destroyPercent = destroyPercent;
}
public void Init() {
FullState.Init();
ItemsWeapon.Init();
ItemsMiningOre.SetGiveItemsToList(itemsGiveBot);
ItemsMiningTree.SetGiveItemsToList(itemsGiveBot);
ItemsWeapon.SetGiveItemsToList(itemsGiveBot);
ItemsButcher.SetGiveItemsToList(itemsGiveBot);
ItemsMedical.SetGiveItemsToList(itemsGiveBot);
}
public bool InDeathBlackList(Item item) => item != null && deathItemsBlacklist?.Exists(x => x.GetItemDefinition() == item.info && x.SkinID == item.skin) == true;
public int GetAmount() => Mathf.Max(1, Amount);
public float GetTimerRespawn() => Mathf.Max(3f, timerRespawn);
public float GetPeriodicRespawnInterval() => 900f;
public float GetPeriodicRespawnPlayerCheckRadius() => 100f;
public float DestroyPercent() => Mathf.Clamp(destroyPercent, 0f, 100f) / 100f;
public ulong GetId() {
if (id == 0) return 0;
int digits = instance.config.GetDigits();
if (id.ToString().Length == digits) return id;
return BotIdGenerator.CheckAndConvert(id.ToString(), digits);
}
public IEnumerable<(ItemDefinition, ulong, bool)> GetToolItems(CustomPet.SlotItemTools typeItem, bool revers = false) {
List<ItemBot> items = typeItem switch {
CustomPet.SlotItemTools.Pickaxe => ItemsMiningOre.GetItemsList(), CustomPet.SlotItemTools.Hatchet => ItemsMiningTree.GetItemsList(), _ => null
}
;
if (items == null) {
switch (typeItem) {
case CustomPet.SlotItemTools.Hummer : yield return (ItemManager.FindItemDefinition(200773292), 0, true);
yield break;
case CustomPet.SlotItemTools.Planner : yield return (ItemManager.FindItemDefinition(1525520776), 0, true);
yield break;
default : yield break;
}
}
for (int i = 0; i < items.Count; i++) {
int index = revers ? items.Count - i - 1 : i;
ItemBot item = items[index];
if (it
// ... [Code preview truncated due to length. Full source in attached file] ...