C#:
using Oxide.Core;
using System.Collections.Generic;
using UnityEngine;
using System.Collections;
using Oxide.Core.Configuration;
using Oxide.Game.Rust.Cui;
using System;
using System.Linq;
using Oxide.Core.Plugins;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
using Rust;
using Rust.Ai;
using Network;
namespace Oxide.Plugins {
[Info("Payback", "Skuli Dropek", "1.9.7")]
[Description("Специальные команды администратора для борьбы с читерами")]
class Payback : RustPlugin {
//| ==============================================================
//| Definitions
//| ==============================================================
public enum Card {
Pacifism = 0, //обнуляет весь исходящий урон от целевого игрока
Butterfingers = 1, //при нанесении урона любому игроку, шанс бросить текущее оружие.InstantKarma = 4,//отражает урон обратно игроку
Dud = 5, //предотвращает повреждение неигровых объектов
DogDoo = 6, //мина под игроком-мишенью, когда тот получает доступ к тайникам
BSOD = 7, //дать целевому игроку поддельное сообщение о критическом сбое в ОС
Sit = 8, //заставить игрока сесть
Naked = 9, //заставить игрока бросить все, что у него есть в инвентаре
Camomo = 10, //применить комбинацию способностей, которую выбрал Камомо
HigherGround = 11, //целевой игрок телепортируется на 100 м в воздух
Thirsty = 12, //целевой игрок очень быстро испытывает жажду
DrNo = 13, // целевой игрок больше не получает здоровье от исцеляющих предметов
Dana = 14, // украсть инвентарь целевого игрока и поместить его в свой
Pinyata = 15, // инвентарь целевого игрока вылетает из него, когда он умирает
Rocketman, // привяжите целевого игрока к ракете и запустите его!
NoRest, // Нет мира для нечестивых! Заставьте игрока переродиться!
ChickenChaser, // Порождает орду цыплят с суперскоростью, которые атакуют только целевого игрока!
ViewLoot, // Просмотреть добычу целевых объектов
Burn, // Дает игроку огнемет, который заставит его врагов кричать и гореть.Hammer, // молот - дает целевому игроку молот, который уничтожает все сущности, принадлежащие цели молота
Bag, // Мешок — вывести всех игроков, в которых попал целевой игрок, и всех игроков, которые попали в мешки.Включите «discord» после команды для записи результатов в discord.Shocker, // Шокер - поразить игрока до смерти.Затрагивает игроков поблизости, поэтому будьте осторожны.Обязательно отключите его после использования.//Cowboy, // Ковбой - оседлайте целевого игрока как дикую свинью -> не удалось заставить это работать
Masochist, // Мазохист - остановить игрока от самоубийства в F1
Emote, // Эмоция - варианты:
Shark, // Челюсти - акула приходит, чтобы съесть мошенника
}
Dictionary<Card, string> descriptions = new Dictionary<Card, string>() {
{
Card.Butterfingers, "% шанс для целевого игрока бросить оружие при нанесении урона противнику"
}
, {
Card.Dud, "целевой игрок не наносит урона существам НЕ-ИГРОКАМ.Также предотвращает фермерство / tool use"
}
, {
Card.InstantKarma, "целевой игрок не наносит врагам никакого урона, а 35% урона отражается обратно к нему"
}
, {
Card.Pacifism, "целевой игрок не наносит игрового урона товарищам по команде; добавьте 'silent', чтобы не посылать сообщение об этом другим игрокам."
}
, {
Card.DogDoo, "мина под целевым игроком, когда он получает доступ к тайнику"
}
, {
Card.BSOD, "целевой игрок получает фальшивый синий экран смерти"
}
, {
Card.Sit, "Порождает стул перед вами и заставляет читера сесть.Не позволяет ему встать и усаживает его обратно, если он умирает."
}
, {
Card.Naked, "заставить игрока бросить все, что у него есть в инвентаре"
}
, {
Card.Camomo, "применять комбинацию способностей, выбранных Камомо [pf,bf,in,dog,dud,dr]"
}
, {
Card.HigherGround, "целевой игрок телепортируется на 100 м в воздух"
}
, {
Card.Thirsty, "целевой игрок очень быстро испытывает жажду"
}
, {
Card.DrNo, "целевой игрок больше не может лечиться"
}
, {
Card.Dana, "украсть инвентарь целевого игрока и поместить его в свой"
}
, {
Card.Pinyata, "инвентарь целевого игрока вылетает из него, когда он умирает"
}
, {
Card.Rocketman, "привяжите целевого игрока к ракете и запустите его!"
}
, {
Card.NoRest, "Нет покоя злым! Заставьте игрока возрождаться после смерти!"
}
, {
Card.ChickenChaser, "Порождает орду цыплят с супер скоростью, которые атакуют только целевого игрока! добавить «волк» «олень» «медведь» или «кабан» после команды смены животного"
}
, {
Card.ViewLoot, "Просмотр добычи целевого игрока"
}
, {
Card.Burn, "Дает игроку огнемет, который заставит его врагов кричать и гореть."
}
, {
Card.Hammer, "Дает администратору молот, который уничтожит все объекты, принадлежащие цели молота.Добавьте -noloot, чтобы также удалить добычу"
}
, {
Card.Bag, "Выведите всех игроков, которые забили целевого игрока, и выведите всех игроков, которые попали в мешки.Включите \"discord\" после команды, чтобы записать результаты в дискорд"
}
, {
Card.Shocker, "Поразить игрока до смерти.Поражает игроков, находящихся поблизости, поэтому будьте осторожны.Обязательно отключите его после использования."
}
, //{Card.Cowboy, "Ковбой - ездить на целевом игроке, как на дикой свинье" },
{
Card.Masochist, "Мазохист - остановить игрока из F1 убить себя"
}
, {
Card.Emote, "Эмоция - заставить игрока использовать эмоцию."
}
, {
Card.Shark, "акула приходит съесть мошенника"
}
,
}
;
Dictionary<string, Card> cardAliases = new Dictionary<string, Card>() {
{
"bf", Card.Butterfingers
}
, {
"dud", Card.Dud
}
, {
"in", Card.InstantKarma
}
, {
"pf", Card.Pacifism
}
, {
"dog", Card.DogDoo
}
, {
"bs", Card.BSOD
}
, {
"nk", Card.Naked
}
, {
"cumnum", Card.Camomo
}
, {
"hg", Card.HigherGround
}
, {
"th", Card.Thirsty
}
, {
"dr", Card.DrNo
}
, {
"dana", Card.Dana
}
, {
"steal", Card.Dana
}
, {
"pin", Card.Pinyata
}
, {
"rm", Card.Rocketman
}
, {
"nr", Card.NoRest
}
, {
"res", Card.NoRest
}
, {
"ch", Card.ChickenChaser
}
, {
"loot", Card.ViewLoot
}
, {
"bu", Card.Burn
}
, {
"ham", Card.Hammer
}
, {
"bg", Card.Bag
}
, {
"sh", Card.Shocker
}
, //{ "cow", Card.Cowboy},
{
"ms", Card.Masochist
}
, {
"em", Card.Emote
}
, {
"jaws", Card.Shark
}
,
}
;
//| ==============================================================
//| Giving
//| ==============================================================
public void GiveCard(ulong userID, Card card, string[] args = null, BasePlayer admin = null) {
HashSet<Card> cards;
if (!cardMap.TryGetValue(userID, out cards)) {
cards = new HashSet<Card>();
cardMap[userID] = cards;
}
cards.Add(card);
//Puts($"Payback card {card} given to {userID}");
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) {
if (card == Card.BSOD) {
bool playPublic = args.Contains("public");
DoBSOD(player, playPublic);
}
else if (card == Card.Sit) {
DoSitCommand(player, admin);
}
else if (card == Card.Naked) {
DoNakedCommand(player);
}
else if (card == Card.Camomo) {
DoCamomoCommand(player);
}
else if (card == Card.HigherGround) {
DoHigherGround(player);
}
else if (card == Card.Thirsty) {
DoThirsty(player);
}
else if (card == Card.Dana) {
DoDana(player, admin);
}
else if (card == Card.Pacifism) {
silentPacifism = false;
if (args != null) {
if (args.Contains("silent")) {
silentPacifism = true;
}
}
}
else if (card == Card.Rocketman) {
RocketManTarget(player);
}
else if (card == Card.NoRest) {
if (player.IsDead()) {
player.Respawn();
}
}
else if (card == Card.ChickenChaser) {
AdminSpawnChickens(admin, player, args);
TakeCard(player, Card.ChickenChaser);
}
else if (card == Card.ViewLoot) {
ViewTargetPlayerInventory(player, admin);
TakeCard(player, Card.ViewLoot);
}
else if (card == Card.Burn) {
GivePlayerFlamethrower(player);
}
else if (card == Card.Hammer) {
GiveAdminHammer(player);
if (args.Contains("noloot")) {
flag_kill_no_loot = true;
PrintToPlayer(admin, $"Молоток для удаления добычи!");
}
else {
flag_kill_no_loot = false;
}
}
else if (card == Card.Shocker) {
DoShocker(player, args, admin);
}
else if (card == Card.Emote) {
DoEmote(player, args, admin);
}
else if (card == Card.Shark) {
DoShark(player, args, admin);
}
//if (card == Card.Cowboy)
//{
// DoCowboy(player, args, admin);
//}
}
}
bool silentPacifism = false;
//| ==============================================================
//| COMMAND Implementation
//| ==============================================================
void DoShark(BasePlayer player, string[] args, BasePlayer admin = null) {
Worker.StaticStartCoroutine(SharkCo2(player, args, admin));
}
IEnumerator SharkCo2(BasePlayer player, string[] args, BasePlayer admin = null) {
TakeCard(player, Card.Shark);
////| KILL ALL EXISTING SHARKS FOR DEBUGGING
//SimpleShark[] sharks = GameObject.FindObjectsOfType<SimpleShark>();
//foreach (var s in sharks)
//{
// s.Kill();
//}
//| SPAWN THE SHARK
SimpleShark shark;
string sharkPrefab = "assets/rust.ai/agents/fish/simpleshark.prefab";
BaseEntity entity = GameManager.server.CreateEntity(sharkPrefab, player.transform.position + new Vector3(-100, -100, -100));
shark = entity as SimpleShark;
entity.Spawn();
shark.enabled = false;
Vector3 playerForward = player.eyes.HeadForward();
playerForward.y = 0;
playerForward.Normalize();
shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
yield return Worker.StaticStartCoroutine(MoveSharkCo(shark, player));
}
string sfx_bloodHit = "assets/bundled/prefabs/fx/impacts/stab/flesh/fleshbloodimpact.prefab";
string sfx_watersplash = "assets/bundled/prefabs/fx/explosions/water_bomb.prefab";
IEnumerator MoveSharkCo(SimpleShark shark, BasePlayer player) {
float duration = 4f;
//float duration = 20f;
float ts = Time.realtimeSinceStartup;
Vector3 sharkStartPos = player.transform.position + Vector3.down * 30f;
Vector3 playerStartPosition = player.transform.position;
Vector3 playerForward = player.eyes.HeadForward();
playerForward.y = 0;
playerForward.Normalize();
bool didSit = false;
BaseEntity chair = null;
//bool didEmote = false;
float p;
float y;
while (Time.realtimeSinceStartup - ts < duration && player != null && shark != null) {
p = (Time.realtimeSinceStartup - ts) / duration;
y = Mathf.Sin(p * Mathf.PI);
//if (p < 0.34)
if (p < 0.24) {
//playerStartPosition = player.transform.position + Vector3.up * 4f;//|V2
playerStartPosition = player.transform.position + Vector3.up * 10f;
shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
}
else {
if (!didSit) {
//| PLAY SFX
//PlaySound(sfx_bloodHit, player, false, player.transform.position + Vector3.up);
//PlaySound(sfx_watersplash, player, false, player.transform.position);
global : : Effect.server.Run(shark.bloodCloud.resourcePath, player.transform.position + Vector3.up, Vector3.forward, null, false);
global : : Effect.server.Run(sfx_watersplash, player.transform.position + Vector3.up, Vector3.forward, null, false);
timer.Once(0.2f, () => {
if (player == null) return;
PlayGesture(player, "friendly");
}
);
//| Dismount the player if mounted
if (HasCard(player.userID, Card.Sit)) {
TakeCard(player.userID, Card.Sit);
}
Vector3 playerFacing = player.eyes.HeadForward();
playerFacing.y = 0;
playerFacing.Normalize();
//| Sit the player
chair = InvisibleSit(player);
chair.SetParent(shark, true, true);
//| V2
chair.transform.LookAt(chair.transform.position + playerFacing);
didSit = true;
}
//chair.transform.position = shark.transform.position + shark.transform.forward * 0.88f + shark.transform.up * 0.15f;
chair.transform.position = shark.transform.position + shark.transform.forward * 0.88f + shark.transform.up * 0.19f;
//chair.transform.LookAt(shark.transform.up * -1 + shark.transform.position + Vector3.up * 0.25f);
chair.transform.LookAt(shark.transform.position + shark.transform.up * -1 + Vector3.up * 0.15f);
}
shark.transform.position = Vector3.Lerp(sharkStartPos, playerStartPosition, y);
shark.transform.LookAt(player.transform.position + Vector3.up * 100 + playerForward);
shark.transform.Rotate(shark.transform.right, -15f);
yield return new WaitForFixedUpdate();
}
shark.transform.position += Vector3.down * 100000;
shark.SendNetworkUpdate();
yield return null;
player?.GetMounted()?.DismountPlayer(player, true);
chair?.Kill();
player?.Die();
shark?.Kill();
}
void DoEmote(BasePlayer player, string[] args, BasePlayer admin = null) {
if (player == null) return;
string gesture = "wave";
if (args.Length > 1) {
gesture = args[1];
var g = player.gestureList.StringToGesture(gesture);
if (g == null) {
string output = "\n";
foreach (var gg in player.gestureList.AllGestures) {
output += gg.convarName + "\n";
}
PrintToPlayer(admin, $"Жест не найден: {gesture}\nДоступные жесты:{output}");
}
}
else {
PrintToPlayer(admin, $"чтобы увидеть, как используются все эмоции: /emote <target> список");
}
PlayGesture(player, gesture);
TakeCard(player, Card.Emote);
}
bool? CanUseGesture(BasePlayer player, GestureConfig gesture) {
if (HasAnyCard(player.userID)) return true;
return null;
}
void ResolveConflictingCommands(BasePlayer player, BasePlayer admin = null) {
bool hasSit = false;
if (HasCard(player.userID, Card.Sit)) {
hasSit = true;
TakeCard(player, Card.Sit);
}
if (player.isMounted) {
var car = player.GetMountedVehicle();
if (car != null) {
car.Kill(BaseNetworkable.DestroyMode.Gib);
}
}
TakeCard(player, Card.Rocketman);
}
//object CanNetworkTo(BaseNetworkable entity, BasePlayer target)
//{
// if (cowboynetworkables.ContainsKey(target.userID) && cowboynetworkables[target.userID].Contains(entity))
// {
// PrintToChat($"CanNetworkTo: {entity.ShortPrefabName} {target.displayName}");
// return true;
// }
// return null;
//}
//Dictionary<ulong, List<BaseNetworkable>> cowboynetworkables = new Dictionary<ulong, List<BaseNetworkable>>();
//void DoCowboy(BasePlayer player, string[] args, BasePlayer admin = null) {
// //disabled for testing
// if (player == null) return;
// if (HasCard(admin.userID, Card.Cowboy))
// {
// List<BaseNetworkable> existing;
// if (cowboynetworkables.TryGetValue(admin.userID, out existing))
// {
// if (existing != null)
// {
// existing.ForEach(x => x.Kill());
// existing.Clear();
// }
// cowboynetworkables.Remove(admin.userID);
// }
// }
// //down target player
// //disabled for testing
// player.BecomeWounded();
// player.ProlongWounding(100000000000);
// ResolveConflictingCommands(player, admin);
// //|====================================================
// //| create the chair for the person to ride
// //string innertube = "assets/prefabs/misc/summer_dlc/inner_tube/innertube.deployed.prefab";
// var chair = GameManager.server.CreateEntity(invisibleChairPrefab, player.transform.position + Vector3.up * 0.5f);
// //var chair = GameManager.server.CreateEntity(chairPrefab, player.transform.position + Vector3.up * 0.5f);
// //var chair = GameManager.server.CreateEntity(innertube, player.transform.position + Vector3.up * 0.75f);
// var mount = chair as BaseMountable;
// chair.Spawn();
// GameObject.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
// GameObject.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());
// chair.GetComponentInChildren<Collider>().enabled = false;
// //|====================================================
// //| create something for the chair to parent to
// Item muzzle = ItemManager.CreateByPartialName("muzzlebrake");
// var dropped = muzzle.Drop(player.transform.position, Vector2.zero);
// DroppedItem droppedItem = dropped as DroppedItem;
// droppedItem.allowPickup = false;
// droppedItem.GetComponent<Rigidbody>().collisionDetectionMode = CollisionDetectionMode.ContinuousSpeculative;
// droppedItem.GetComponent<Rigidbody>().isKinematic = true;
// droppedItem.GetComponent<Rigidbody>().useGravity = false;
// SetDespawnDuration(droppedItem, 60 * 15);
// //|====================================================
// //| Do the parenting
// dropped.transform.position += Vector3.up * 0.5f;
// //chair.SetParent(dropped, true, true);
// //now we can either parent to the player, or we need to run a coroutine to bind the chair to the player
// //may need to replace this with something to track a downed player instead of rocket
// //Worker.StaticStartCoroutine(AccelerateRocketOverTime(projectile));
// //dropped.SetParent(player, true, true);
// //chair.SetParent(player, true, true);
// //timer.Once (3f, () => {
// // //chair.limitNetworking = true;
// //});
// //timer.Once(0.25f, () => {
// // if (chair != null && admin != null)
// // {
// // PrintToChat("on");
// // chair.net.SwitchGroup(Net.sv.visibility.Get(13371));
// // admin.net.SwitchGroup(Net.sv.visibility.Get(13371));
// // //admin.net.AddVisibleFromNear(Net.sv.visibility.GetGroup(admin.transform.position), new List<Network.Visibility.Group>());
// // admin.net.subscriber.Subscribe(Net.sv.visibility.GetGroup(player.transform.position));
// // }
// //});
// //timer.Once(15f, () => {
// // if (chair != null && admin != null)
// // {
// // //chair.limitNetworking = true;
// // PrintToChat("off");
// // chair.net.SwitchGroup(Net.sv.visibility.GetGroup(admin.transform.position));
// // admin.net.SwitchGroup(Net.sv.visibility.GetGroup(admin.transform.position));
// // }
// //});
// //chair._limitedNetworking = true;
// Worker.StaticStartCoroutine(MoveCowboyOverTime(player, chair));
// //mount.MountPlayer(admin);
// cowboynetworkables[admin.userID] = new List<BaseNetworkable>() { chair };
//}
//IEnumerator MoveCowboyOverTime(BasePlayer player, BaseEntity entity)
//{
// Vector3 offset = entity.transform.position - player.transform.position;
// ulong userid = player.userID;
// while (HasCard(player.userID, Card.Cowboy))
// {
// if (player != null && player.net.connection != null)
// {
// //entity.transform.position += Vector3.forward * 0.01f;
// entity.transform.position = player.transform.position + offset;
// var forward = player.eyes.HeadForward();
// forward.y = 0;
// entity.transform.LookAt(entity.transform.position + forward);
// entity.SendNetworkUpdateImmediate();
// yield return new WaitForFixedUpdate();
// } else
// {
// break;
// }
// }
// if (entity != null)
// {
// entity?.Kill();
// }
// TakeCard(userid, Card.Cowboy);
//}
Dictionary<ulong, BaseEntity> coilMap = new Dictionary<ulong, BaseEntity>();
void DoShocker(BasePlayer player, string[] args, BasePlayer admin = null) {
if (player == null) return;
BaseEntity coilEnt;
if (coilMap.TryGetValue(player.userID, out coilEnt)) {
if (coilEnt != null) {
coilEnt.Kill();
}
coilMap.Remove(player.userID);
return;
}
TeslaCoil coil = GameManager.server.CreateEntity("assets/prefabs/deployable/playerioents/teslacoil/teslacoil.deployed.prefab", player.transform.position) as TeslaCoil;
coil.transform.position += Vector3.down * 1;
coil.Spawn();
coil.SetFlag(BaseEntity.Flags.Reserved8, true);
coil.UpdateFromInput(7, 0);
coilMap.Add(player.userID, coil);
coil.SetParent(player, true, true);
coil.SendNetworkUpdateImmediate();
var los = coil.GetComponentInChildren<TargetTrigger>();
los.losEyes = null;
los.OnEntityEnter(player);
DestroyGroundCheck(coil);
Timer t = null;
t = timer.Every(0.2f, () => {
if (coil == null || player == null) {
t.Destroy();
return;
}
else {
if (Vector3.Distance(player.transform.position, coil.transform.position) < 5) {
los.OnEntityEnter(player);
}
else {
los.OnEntityLeave(player);
}
}
}
);
}
void DoBagSearch(ulong userID, string[] args, BasePlayer admin = null) {
if (userID == 0) return;
TakeCard(userID, Card.Bag);
if (args.Contains("discord")) {
Worker.StaticStartCoroutine(BagSearchCo(userID, true, admin));
}
else {
Worker.StaticStartCoroutine(BagSearchCo(userID, false, admin));
}
}
IEnumerator BagSearchCo(ulong userID, bool logToDiscord = false, BasePlayer admin = null) {
yield return null;
float timestamp = Time.realtimeSinceStartup;
float maxTimeBetweenFrames = 1 / 20f;
//| Get bags owned by player
var allBags = BaseNetworkable.serverEntities.OfType<SleepingBag>();
//var deployedByTargetBags = new List<SleepingBag>();
var useridsBaggedByTarget = new HashSet<ulong>();
var useridsWhoBaggedTarget = new HashSet<ulong>();
//find the bags that target placed
foreach (var bag in allBags) {
//| ==============================================================
if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames) {
yield return null;
timestamp = Time.realtimeSinceStartup;
}
//| ==============================================================
ulong ownerid = 0;
var creator = bag.creatorEntity;
if (creator != null) {
var player = creator as BasePlayer;
if (player != null) {
ownerid = player.userID;
}
}
else {
ownerid = bag.OwnerID;
}
//target bagged someone else
if (ownerid == userID && bag.deployerUserID != userID) {
//deployedByTargetBags.Add(bag);
useridsBaggedByTarget.Add(bag.deployerUserID);
}
//someone bagged in target
if (userID == bag.deployerUserID && ownerid != userID) {
useridsWhoBaggedTarget.Add(ownerid);
}
}
var messageData = new Dictionary<string, string>();
string targetInfo = $"{TryGetDisplayName(userID)}";
string baggedByString = "";
string output = $"Players bagged by {targetInfo}:";
foreach (var userid in useridsBaggedByTarget) {
var displayname = TryGetDisplayName(userid);
output += $"\n{userid} : {displayname}";
baggedByString += $"{userid} : {displayname}\n";
}
if (baggedByString.Length > 0) {
messageData.Add($"Players bagged by {targetInfo}", baggedByString);
}
else {
messageData.Add($"Players bagged by {targetInfo}", "none");
}
output += $"\nSteamids who bagged in {targetInfo}:";
string baggedInString = "";
foreach (var userid in useridsWhoBaggedTarget) {
var displayname = TryGetDisplayName(userid);
output += $"\n{userid} : {displayname}";
baggedInString += $"\n{userid} : {displayname}";
}
if (baggedInString.Length > 0) {
messageData.Add($"Players who bagged in {targetInfo}", baggedInString);
}
else {
messageData.Add($"Players who bagged in {targetInfo}", "none");
}
PrintToPlayer(admin, $"{output}");
if (logToDiscord) {
SendToDiscordWebhook(messageData, $"Bag Search [{userID}]");
}
}
bool flag_kill_no_loot = false;
void GiveAdminHammer(BasePlayer admin) {
if (admin == null) return;
var item = ItemManager.CreateByName("hammer", 1, 2375073548);
if (item != null) {
GiveItemOrDrop(admin, item, false);
}
}
object OnStructureRepair(BaseCombatEntity entity, BasePlayer player) {
if (HasCard(player.userID, Card.Hammer)) {
Worker.StaticStartCoroutine(DeleteByCo(entity.OwnerID, player.transform.position, player));
}
return null;
}
IEnumerator DeleteByCo(ulong steamid, Vector3 position, BasePlayer admin = null) {
yield return null;
if (steamid == 0UL) {
yield break;
}
float maxTimeBetweenFrames = 1 / 60f;
int maxEntitiesPerFrame = 1;
float delayBetweenFrames = 1 / 20f;
float timestamp = Time.realtimeSinceStartup;
var entities = new List<BaseNetworkable>(BaseNetworkable.serverEntities);
float fxTimestamp = Time.realtimeSinceStartup;
float fxCooldown = 0.75f;
//float fxCooldown = 0.2f;
var ownedEntities = new List<BaseEntity>();
foreach (var x in entities) {
var entity = x as BaseEntity;
if (!(entity == null) && entity.OwnerID == steamid) {
ownedEntities.Add(entity);
}
if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames) {
yield return null;
timestamp = Time.realtimeSinceStartup;
}
}
ownedEntities.Sort((x, y) => Vector3.Distance(x.transform.position, position).CompareTo(Vector3.Distance(y.transform.position, position)));
timestamp = Time.realtimeSinceStartup;
int i = 0;
int count = 0;
bool playSound = true;
if (admin != null) PlaySound("assets/bundled/prefabs/fx/headshot.prefab", admin, false);
Vector3 lastPosition = Vector3.zero;
//| LOOT REMOVAL PASS
if (flag_kill_no_loot) {
foreach (var baseEntity in ownedEntities) {
var storage = baseEntity as StorageContainer;
if (storage != null) {
foreach (var item in new List<Item>(storage.inventory.itemList)) {
//PrintToPlayer(admin, $"Removing: {item.info.displayName.english}");
item.GetHeldEntity()?.KillMessage();
//item.DoRemove();
//item.Remove();
ItemManager.RemoveItem(item);
}
ItemManager.DoRemoves();
//storage.inventory.Clear();
}
}
}
while (i < ownedEntities.Count) {
if (Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames || count >= maxEntitiesPerFrame) {
yield return new WaitForSeconds(delayBetweenFrames);
timestamp = Time.realtimeSinceStartup;
count = 0;
}
var baseEntity = ownedEntities[i];
if (!(baseEntity == null) && baseEntity.OwnerID == steamid) {
if (admin != null && playSound) {
if (Time.realtimeSinceStartup - fxTimestamp > fxCooldown) {
//var effect = GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab", baseEntity.transform.position);
//effect.Spawn();
//var firework = effect as BaseFirework;
//firework.fuseLength = 0;
//firework.Ignite();
//var effect = GameManager.server.CreateEntity("assets/prefabs/ammo/rocket/rocket_basic.prefab", baseEntity.transform.position);
//effect.Spawn();
//var explosive = effect as TimedExplosive;
//explosive.Explode();
PlaySound("assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", admin, true);
fxTimestamp = Time.realtimeSinceStartup;
//"assets/bundled/prefabs/fx/impacts/blunt/glass/glass1.prefab"
////PlaySound(new List<string>() { "assets/bundled/prefabs/fx/survey_explosion.prefab" }, admin, admin.transform.position - baseEntity.transform.position, false);
//PlaySound(new List<string>() { "assets/bundled/prefabs/fx/survey_explosion.prefab" }, admin, baseEntity.transform.position, false);
//PlaySound(new List<string>() { "assets/bundled/prefabs/fx/impacts/bullet/glass/glass1.prefab" }, admin, baseEntity.transform.position, false);
//PlaySound(new List<string>() { "assets/content/effects/weather/pfx_lightning_strong.prefab" }, admin, baseEntity.transform.position + Vector3.back * 300, false);
//PlaySound(new List<string>() { "assets/content/effects/weather/pfx_lightningstorm_looptest.prefab" }, admin, baseEntity.transform.position + Vector3.back * 300, false);
//PlaySound(new List<string>() { "assets/bundled/prefabs/fx/impacts/blunt/glass/glass1.prefab" }, admin, baseEntity.transform.position, false);
///sound assets/content/effects/weather/pfx_lightning_strong.prefab
}
}
//baseEntity.Invoke(new Action(baseEntity.KillMessage), 0);
lastPosition = baseEntity.transform.position;
baseEntity.Kill(BaseNetworkable.DestroyMode.Gib);
count++;
//assets/bundled/prefabs/fx/building/stone_gib.prefab
}
i++;
}
if (admin != null) {
PlaySound("assets/prefabs/locks/keypad/effects/lock.code.lock.prefab", admin, true);
timer.Once(0.75f, () => {
PlaySound("assets/prefabs/npc/autoturret/effects/targetacquired.prefab", admin, true);
if (!flag_kill_no_loot) {
var effect = GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab", lastPosition);
effect.Spawn();
var firework = effect as BaseFirework;
firework.fuseLength = 0;
firework.Ignite(new Vector3());
}
}
);
}
yield return null;
}
HashSet<ulong> currentlyScreamingPlayers = new HashSet<ulong>();
public const string sound_scream = "assets/bundled/prefabs/fx/player/beartrap_scream.prefab";
public const string effect_onfire = "assets/bundled/prefabs/fx/player/onfire.prefab";
void GivePlayerFlamethrower(BasePlayer player) {
if (player == null) return;
GiveItemOrDrop(player, ItemManager.CreateByName("flamethrower", 1, 0), false);
}
public void Line(BasePlayer player, Vector3 from, Vector3 to, Color color, float duration) {
player.SendConsoleCommand("ddraw.line", duration, color, from, to);
}
void AdminSpawnChickens(BasePlayer player, BasePlayer target, string[] args) {
if (player == null) return;
RaycastHit hit;
if (Physics.Raycast(player.eyes.HeadRay(), out hit)) {
//Line(player, hit.point, hit.point + Vector3.up * 10, Color.white, 5);
SpawnChickens(target, hit.point, args);
}
}
HashSet<BaseCombatEntity> chickens = new HashSet<BaseCombatEntity>();
void SpawnChickens(BasePlayer player, Vector3 spawnposition, string[] args) {
//if (!IsAdmin(player)) return;
for (int i = 0; i < 10; i++) {
Worker.StaticStartCoroutine(AnimalAttackCo(player, spawnposition, args));
}
}
IEnumerator AnimalAttackCo(BasePlayer player, Vector3 spawnposition, string[] args) {
RaycastHit hit;
Ray ray = new Ray(UnityEngine.Random.Range(-5f, 5f) * Vector3.forward + UnityEngine.Random.Range(-5f, 5f) * Vector3.left + spawnposition + Vector3.up * 20, Vector3.down);
if (Physics.Raycast(ray, out hit)) {
string aiPrefab = "assets/rust.ai/agents/chicken/chicken.prefab";
if (args.Contains("bear")) {
aiPrefab = "assets/rust.ai/agents/bear/bear.prefab";
}
else if (args.Contains("boar")) {
aiPrefab = "assets/rust.ai/agents/boar/boar.prefab";
}
else if (args.Contains("wolf")) {
aiPrefab = "assets/rust.ai/agents/wolf/wolf.prefab";
}
else if (args.Contains("stag")) {
aiPrefab = "assets/rust.ai/agents/stag/stag.prefab";
}
//assets/rust.ai/agents/wolf/wolf.prefab
var entity = GameManager.server.CreateEntity(aiPrefab, hit.point + Vector3.up * 0.2f);
//var entity = GameManager.server.CreateEntity("assets/rust.ai/agents/wolf/wolf.prefab", hit.point + Vector3.up * 0.2f);
//var entity = GameManager.server.CreateEntity("assets/rust.ai/agents/bear/bear.prefab", hit.point + Vector3.up * 0.2f);
BaseAnimalNPC chicken = entity as BaseAnimalNPC;
entity.Spawn();
//chicken.Stats.Speed = 20;
chicken.Stats.Speed = 200;
chicken.Stats.TurnSpeed = 100;
chicken.Stats.Acceleration = 50;
chicken.AttackRange = 3;
chicken.AttackDamage *= 2;
chicken.Stats.VisionRange = 300;
chickens.Add(chicken);
chicken.AttackTarget = player;
chicken.ChaseTransform = player.transform;
chicken.Stats.AggressionRange = 100000;
chicken.Stats.DeaggroRange = 100000;
chicken.Stats.IsAfraidOf = new BaseNpc.AiStatistics.FamilyEnum[0];
chicken.Destination = player.transform.position;
chicken.Stats.VisionCone = -1;
yield return new WaitForSeconds(0.25f);
//chicken.LegacyNavigation = true;
//chicken.Stats.DistanceVisibility = AnimationCurve.Linear(0, 0, 1, 1);
chicken.LegacyNavigation = true;
bool doLoop = true;
while (doLoop) {
if (chicken != null && player != null) {
if (player.IsDead()) {
if (chicken != null) {
chicken.Kill();
}
doLoop = false;
}
else {
if (chicken.NavAgent != null && chicken.NavAgent.isOnNavMesh) {
chicken.ChaseTransform = player.transform;
chicken.AttackTarget = player;
chicken.Destination = player.transform.position;
chicken.TargetSpeed = chicken.Stats.Speed * 100;
//if (chicken.AiContext == null)
//{
// chicken.AiContext = new BaseContext(chicken);
//}
//if (chicken.AiContext != null)
//{
// chicken.AiContext.EnemyPlayer = player;
// chicken.AiContext.LastEnemyPlayerScore = float.MaxValue;
// chicken.AiContext.AIAgent.AttackTarget = player;
// chicken.SetFact(BaseNpc.Facts.HasEnemy, 1, true, true);
//}
//chicken.SetFact(BaseNpc.Facts.EnemyRange, (byte)enemyRangeEnum, true, true);
//chicken.SetFact(BaseNpc.Facts.AfraidRange, (byte)value, true, true);
//chicken.SetFact(BaseNpc.Facts.IsAggro, 0, true, false);
//chicken.SetFact(BaseNpc.Facts.HasEnemy, 0, true, false);
//chicken.SetFact(BaseNpc.Facts.IsAfraid, 0, true, false);
//chicken.Attack(player);
//chicken.CurrentBehaviour = BaseNpc.Behaviour.Attack;
//chicken.TargetSpeed = chicken.Stats.Speed;
//Puts($"TSpeed: {chicken.TargetSpeed} s: {chicken.NavAgent.speed} statspeed: {chicken.Stats.Speed}");
}
}
//Puts($"Attack target: {chicken.AttackTarget} Chase: {chicken.ChaseTransform} ARate: {chicken.AttackRate} CombatTarget: {chicken.CombatTarget}");
//chicken.TickNavigation();
}
else {
if (chicken != null) {
chicken.Kill();
}
doLoop = false;
}
yield return null;
//yield return new WaitForSeconds(0.25f);
}
timer.Once(120, () => {
if (chicken != null) {
chicken.Kill();
}
}
);
timer.Once(130f, () => {
chickens.RemoveWhere(x => x == null);
}
);
}
}
void OnPlayerRespawned(BasePlayer player) {
if (HasCard(player.userID, Card.NoRest)) {
player.EndSleeping();
player.SendNetworkUpdate();
}
}
void OnEntityKill(BaseNetworkable entity, HitInfo info) {
if (entity == null) return;
if (entitiesWatchingForKilledMounts.Contains(entity)) {
var chair = entity.GetComponentInChildren<BaseMountable>();
if (chair.IsMounted()) {
var player = chair.GetMounted();
player.GetMounted().DismountPlayer(player, true);
player.Teleport(chair.transform.position);
player.Die();
}
entitiesWatchingForKilledMounts.Remove(entity);
timer.Once(0.5f, () => {
if (entitiesWatchingForKilledMounts.Count == 0) Unsubscribe($"OnEntityKill");
}
);
}
}
HashSet<BaseNetworkable> entitiesWatchingForKilledMounts = new HashSet<BaseNetworkable>();
void RocketManTarget(BasePlayer player) {
bool hasSit = false;
if (HasCard(player.userID, Card.Sit)) {
hasSit = true;
TakeCard(player, Card.Sit);
}
if (player.isMounted) {
var mount = player.GetMounted();
mount.DismountPlayer(player, true);
//var car = player.GetMountedVehicle();
//if (car != null)
//{
// car.Kill(BaseNetworkable.DestroyMode.Gib);
//}
}
TakeCard(player, Card.Rocketman);
Subscribe("OnEntityKill");
player.Teleport(p
// ... [Code preview truncated due to length. Full source in attached file] ...