C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
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;
namespace Oxide.Plugins
{
[Info("Payback", "1928Tommygun/Kira", "1.9.9")]
[Description("Special Admin Commands To Mess With Cheaters")]
public class Payback : RustPlugin
{
#pragma warning disable CS0649
[PluginReference] private Plugin Payback2;
#pragma warning restore CS0649
private enum Card
{
Pacifism = 0, //zeros all outgoing damage from target player
Butterfingers = 1, //on dealing damage to any player, chance to drop current held weapon.InstantKarma = 4, //reflects damage back to the player
Dud = 5, //prevents damage to non-player entities
DogDoo = 6, //landmine under target player when the access stashes
BSOD = 7, //give target player fake BSOD
Sit = 8, //force player to sit
Naked = 9, //force player to drop everything they have in their inventory
Camomo = 10, //apply a combination of abilities Camomo has selected
HigherGround = 11, //target player is teleported 100m into the air
Thirsty = 12, //target player becomes thirsty very quickly
DrNo = 13, // target player no longer receives health from healing items
Dana = 14, // steal target player's inventory and place it in your own
Pinyata = 15, // target player's inventory explodes out of them when they die
Rocketman, // strap target player to a rocket and launch them!
NoRest, // No Rest For The Wicked! Force the player to respawn!
ChickenChaser, // Spawns a horde of chickens with super speed that only attack target player!
ViewLoot, // View target entities loot
Burn, // Gives a player a flamethrower that will make his foes scream and burn
Hammer, // hammer - gives target player a hammer that will destroy all the entities owned by the hammer's target
Bag, // Bag - Print all players that have bagged target player in, and print all players that have been bagged.Include "discord" after the command to log the results to discord
Shocker, // Shocker - Shock target player to death.Affects nearby players so be careful.Make sure to disable it after use.//Cowboy, // Cowboy - Ride target player like a wild hog -> couldn't get this to work
Masochist, // Masochist - Stop player from F1 killing themselves
Emote, // Emote - options:
Shark, // Jaws - shark comes to eat the cheater
}
private Dictionary<Card, string> descriptions = new Dictionary<Card, string>()
{
{Card.Butterfingers, "% chance for target player to drop their weapon when damaging an enemy"},
{Card.Dud, "target player deals no damage to NON-PLAYER entities.Also prevents farming / tool use"},
{
Card.InstantKarma,
"target player deals no damage to enemies and 35% of the damage is reflected back to them"
},
{
Card.Pacifism,
"target player deals no player damage to non-teammates; add 'silent' to not send a message about it to other players."
},
{Card.DogDoo, "landmine under target player when the access stashes"},
{Card.BSOD, "target player receives a fake blue-screen-of-death"},
{
Card.Sit,
"spawns a chair in front of you and forces the cheater to sit.Doesn't let them get up and will place them back in if they die."
},
{Card.Naked, "force player to drop everything they have in their inventory"},
{Card.Camomo, "apply a combination of abilities Camomo has selected [pf,bf,in,dog,dud,dr]"},
{Card.HigherGround, "target player is teleported 100m into the air"},
{Card.Thirsty, "target player becomes thirsty very quickly"},
{Card.DrNo, "target player can no longer heal"},
{Card.Dana, "steal target player's inventory and place it in your own"},
{Card.Pinyata, "target player's inventory explodes out of them when they die"},
{Card.Rocketman, "strap target player to a rocket and launch them!"},
{Card.NoRest, "No Rest For The Wicked! Force the player to respawn when they die!"},
{
Card.ChickenChaser,
"Spawns a horde of chickens with super speed that only attack target player! add 'wolf' 'stag' 'bear' or 'boar' after the command to change the animal"
},
{Card.ViewLoot, "View target player's loot"},
{Card.Burn, "Gives a player a flamethrower that will make his foes scream and burn"},
{
Card.Hammer,
"Gives admin a hammer that will destroy all the entities owned by the hammer's target.Add -noloot to also delete the loot"
},
{
Card.Bag,
"Print all players that have bagged target player in, and print all players that have been bagged.Include \"discord\" after the command to log the results to discord"
},
{
Card.Shocker,
"Shock target player to death.Affects nearby players so be careful.Make sure to disable it after use."
},
//{Card.Cowboy, "Cowboy - Ride target player like a wild hog" },
{Card.Masochist, "Masochist - Stop player from F1 killing themselves"},
{Card.Emote, "Emote - force player to do an emote."},
{Card.Shark, "shark comes to eat the cheater"},
};
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},
};
private 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);
var player = BasePlayer.FindByID(userID);
if (player == null) return;
switch (card)
{
case Card.BSOD:
{
var playPublic = args.Contains("public");
DoBSOD(player, playPublic);
break;
}
case Card.Sit:
DoSitCommand(player, admin);
break;
case Card.Naked:
DoNakedCommand(player);
break;
case Card.Camomo:
DoCamomoCommand(player);
break;
case Card.HigherGround:
DoHigherGround(player);
break;
case Card.Thirsty:
DoThirsty(player);
break;
case Card.Dana:
DoDana(player, admin);
break;
case Card.Pacifism:
{
silentPacifism = false;
if (args != null)
if (args.Contains("silent"))
silentPacifism = true;
break;
}
case Card.Rocketman:
RocketManTarget(player);
break;
case Card.NoRest:
{
if (player.IsDead()) player.Respawn();
break;
}
case Card.ChickenChaser:
AdminSpawnChickens(admin, player, args);
TakeCard(player, Card.ChickenChaser);
break;
case Card.ViewLoot:
ViewTargetPlayerInventory(player, admin);
TakeCard(player, Card.ViewLoot);
break;
case Card.Burn:
GivePlayerFlamethrower(player);
break;
case Card.Hammer:
{
GiveAdminHammer(player);
if (args.Contains("noloot"))
{
flag_kill_no_loot = true;
PrintToPlayer(admin, $"Hammer set to remove loot!");
}
else flag_kill_no_loot = false;
break;
}
case Card.Shocker:
DoShocker(player, args, admin);
break;
case Card.Emote:
DoEmote(player, args, admin);
break;
case Card.Shark:
DoShark(player, args, admin);
break;
}
}
private bool silentPacifism;
private void DoShark(BasePlayer player, string[] args, BasePlayer admin = null)
{
Worker.StaticStartCoroutine(SharkCo2(player, args, admin));
}
// ReSharper disable once UnusedParameter.Local
private IEnumerator SharkCo2(BasePlayer player, string[] args, BasePlayer admin = null)
{
TakeCard(player, Card.Shark);
SimpleShark shark;
const string sharkPrefab = "assets/rust.ai/agents/fish/simpleshark.prefab";
var position = player.transform.position;
var entity = GameManager.server.CreateEntity(sharkPrefab,
position + new Vector3(-100, -100, -100));
shark = entity as SimpleShark;
entity.Spawn();
shark.enabled = false;
var playerForward = player.eyes.HeadForward();
playerForward.y = 0;
playerForward.Normalize();
shark.transform.LookAt(position + Vector3.up * 100 + playerForward);
yield return Worker.StaticStartCoroutine(MoveSharkCo(shark, player));
}
private const string sfx_watersplash = "assets/bundled/prefabs/fx/explosions/water_bomb.prefab";
private IEnumerator MoveSharkCo(SimpleShark shark, BasePlayer player)
{
const float duration = 4f;
var ts = Time.realtimeSinceStartup;
var transform = player.transform;
var position = transform.position;
var sharkStartPos = position + Vector3.down * 30f;
var playerStartPosition = position;
var playerForward = player.eyes.HeadForward();
playerForward.y = 0;
playerForward.Normalize();
var didSit = false;
BaseEntity chair = null;
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.24)
{
var transform1 = player.transform;
var position1 = transform1.position;
playerStartPosition = position1 + Vector3.up * 10f;
shark.transform.LookAt(position1 + Vector3.up * 100 + playerForward);
}
else
{
if (!didSit)
{
var position1 = player.transform.position;
Effect.server.Run(shark.bloodCloud.resourcePath, position1 + Vector3.up, Vector3.forward);
Effect.server.Run(sfx_watersplash, position1 + Vector3.up, Vector3.forward);
timer.Once(0.2f, () =>
{
if (player == null) return;
PlayGesture(player, "friendly");
});
if (HasCard(player.userID, Card.Sit)) TakeCard(player.userID, Card.Sit);
var playerFacing = player.eyes.HeadForward();
playerFacing.y = 0;
playerFacing.Normalize();
chair = InvisibleSit(player);
chair.SetParent(shark, true, true);
chair.transform.LookAt(chair.transform.position + playerFacing);
didSit = true;
}
var transform1 = shark.transform;
var position2 = transform1.position;
var up = transform1.up;
chair.transform.position = position2 + transform1.forward * 0.88f + up * 0.19f;
chair.transform.LookAt(position2 + up * -1 + Vector3.up * 0.15f);
}
shark.transform.position = Vector3.Lerp(sharkStartPos, playerStartPosition, y);
Transform transform2;
(transform2 = shark.transform).LookAt(player.transform.position + Vector3.up * 100 + playerForward);
shark.transform.Rotate(transform2.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();
}
private void DoEmote(BasePlayer player, string[] args, BasePlayer admin = null)
{
if (player == null) return;
var gesture = "wave";
if (args.Length > 1)
{
gesture = args[1];
var g = player.gestureList.StringToGesture(gesture);
if (g == null)
{
var output =
player.gestureList.AllGestures.Aggregate("\n",
(current, gg) => current + (gg.convarName + "\n"));
PrintToPlayer(admin, $"Gesture not found: {gesture}\nAvailable Gestures:{output}");
}
}
else PrintToPlayer(admin, "to see all emotes use: /emote <target> list");
PlayGesture(player, gesture);
TakeCard(player, Card.Emote);
}
// ReSharper disable once UnusedMember.Local
// ReSharper disable once UnusedParameter.Local
private bool? CanUseGesture(BasePlayer player, GestureConfig gesture)
{
if (HasAnyCard(player.userID)) return true;
return null;
}
// ReSharper disable once UnusedMember.Local
// ReSharper disable once UnusedParameter.Local
private void ResolveConflictingCommands(BasePlayer player, BasePlayer admin = null)
{
if (HasCard(player.userID, Card.Sit)) TakeCard(player, Card.Sit);
if (player.isMounted)
{
var car = player.GetMountedVehicle();
if (car != null) car.Kill(BaseNetworkable.DestroyMode.Gib);
}
TakeCard(player, Card.Rocketman);
}
private Dictionary<ulong, BaseEntity> coilMap = new Dictionary<ulong, BaseEntity>();
// ReSharper disable once UnusedParameter.Local
private 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;
}
var coil = (TeslaCoil) GameManager.server.CreateEntity(
"assets/prefabs/deployable/playerioents/teslacoil/teslacoil.deployed.prefab");
var transform = coil.transform;
var position = player.transform.position;
position += Vector3.down * 1;
transform.position = position;
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();
else
{
if (Vector3.Distance(player.transform.position, coil.transform.position) < 5)
los.OnEntityEnter(player);
else los.OnEntityLeave(player);
}
});
}
private void DoBagSearch(ulong userID, string[] args, BasePlayer admin = null)
{
if (userID == 0) return;
TakeCard(userID, Card.Bag);
Worker.StaticStartCoroutine(args.Contains("discord")
? BagSearchCo(userID, true, admin)
: BagSearchCo(userID, false, admin));
}
private IEnumerator BagSearchCo(ulong userID, bool logToDiscord = false, BasePlayer admin = null)
{
yield return null;
var timestamp = Time.realtimeSinceStartup;
var maxTimeBetweenFrames = 1 / 20f;
var allBags = BaseNetworkable.serverEntities.OfType<SleepingBag>();
var useridsBaggedByTarget = new HashSet<ulong>();
var useridsWhoBaggedTarget = new HashSet<ulong>();
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;
if (ownerid == userID && bag.deployerUserID != userID) useridsBaggedByTarget.Add(bag.deployerUserID);
if (userID == bag.deployerUserID && ownerid != userID) useridsWhoBaggedTarget.Add(ownerid);
}
var messageData = new Dictionary<string, string>();
var targetInfo = $"{TryGetDisplayName(userID)}";
var baggedByString = "";
var output = $"Players bagged by {targetInfo}:";
foreach (var userid in useridsBaggedByTarget)
{
var displayname = TryGetDisplayName(userid);
output += $"\n{userid} : {displayname}";
baggedByString += $"{userid} : {displayname}\n";
}
messageData.Add($"Players bagged by {targetInfo}", baggedByString.Length > 0 ? baggedByString : "none");
output += $"\nSteamids who bagged in {targetInfo}:";
var baggedInString = "";
foreach (var userid in useridsWhoBaggedTarget)
{
var displayname = TryGetDisplayName(userid);
output += $"\n{userid} : {displayname}";
baggedInString += $"\n{userid} : {displayname}";
}
messageData.Add($"Players who bagged in {targetInfo}", baggedInString.Length > 0 ? baggedInString : "none");
PrintToPlayer(admin, $"{output}");
if (logToDiscord) SendToDiscordWebhook(messageData, $"Bag Search [{userID}]");
}
private bool flag_kill_no_loot;
private static void GiveAdminHammer(BasePlayer admin)
{
if (admin == null) return;
var item = ItemManager.CreateByName("hammer", 1, 2375073548);
if (item != null) GiveItemOrDrop(admin, item);
}
// ReSharper disable once UnusedMember.Local
private object OnStructureRepair(BaseCombatEntity entity, BasePlayer player)
{
if (HasCard(player.userID, Card.Hammer))
Worker.StaticStartCoroutine(DeleteByCo(entity.OwnerID, player.transform.position, player));
return null;
}
private IEnumerator DeleteByCo(ulong steamid, Vector3 position, BasePlayer admin = null)
{
yield return null;
if (steamid == 0UL) yield break;
const float maxTimeBetweenFrames = 1 / 60f;
const int maxEntitiesPerFrame = 1;
const float delayBetweenFrames = 1 / 20f;
var timestamp = Time.realtimeSinceStartup;
var entities = new List<BaseNetworkable>(BaseNetworkable.serverEntities);
var fxTimestamp = Time.realtimeSinceStartup;
const float fxCooldown = 0.75f;
var ownedEntities = new List<BaseEntity>();
foreach (var entity in entities.Select(x => x as BaseEntity))
{
if (!(entity == null) && entity.OwnerID == steamid) ownedEntities.Add(entity);
if (!(Time.realtimeSinceStartup - timestamp > maxTimeBetweenFrames)) continue;
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;
var i = 0;
var count = 0;
if (admin != null) PlaySound("assets/bundled/prefabs/fx/headshot.prefab", admin, false);
var lastPosition = Vector3.zero;
if (flag_kill_no_loot)
{
foreach (var storage in ownedEntities.OfType<StorageContainer>())
{
foreach (var item in new List<Item>(storage.inventory.itemList))
{
item.GetHeldEntity()?.KillMessage();
ItemManager.RemoveItem(item);
}
ItemManager.DoRemoves();
}
}
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)
{
if (Time.realtimeSinceStartup - fxTimestamp > fxCooldown)
{
PlaySound("assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab", admin);
fxTimestamp = Time.realtimeSinceStartup;
}
}
lastPosition = baseEntity.transform.position;
baseEntity.Kill(BaseNetworkable.DestroyMode.Gib);
count++;
}
i++;
}
if (admin != null)
{
PlaySound("assets/prefabs/locks/keypad/effects/lock.code.lock.prefab", admin);
timer.Once(0.75f, () =>
{
PlaySound("assets/prefabs/npc/autoturret/effects/targetacquired.prefab", admin);
if (flag_kill_no_loot) return;
var effect =
GameManager.server.CreateEntity("assets/prefabs/deployable/fireworks/mortarred.prefab",
lastPosition);
effect.Spawn();
var firework = effect as BaseFirework;
firework.fuseLength = 0;
firework.Ignite(firework.transform.position - Vector3.down);
});
}
yield return null;
}
private HashSet<ulong> currentlyScreamingPlayers = new HashSet<ulong>();
private const string sound_scream = "assets/bundled/prefabs/fx/player/beartrap_scream.prefab";
private const string effect_onfire = "assets/bundled/prefabs/fx/player/onfire.prefab";
private static void GivePlayerFlamethrower(BasePlayer player)
{
if (player == null) return;
GiveItemOrDrop(player, ItemManager.CreateByName("flamethrower"));
}
// ReSharper disable once UnusedMember.Global
public void Line(BasePlayer player, Vector3 from, Vector3 to, Color color, float duration)
{
player.SendConsoleCommand("ddraw.line", duration, color, from, to);
}
private void AdminSpawnChickens(BasePlayer player, BasePlayer target, string[] args)
{
if (player == null) return;
RaycastHit hit;
if (Physics.Raycast(player.eyes.HeadRay(), out hit)) SpawnChickens(target, hit.point, args);
}
private HashSet<BaseCombatEntity> chickens = new HashSet<BaseCombatEntity>();
private void SpawnChickens(BasePlayer player, Vector3 spawnposition, string[] args)
{
for (var i = 0; i < 10; i++) Worker.StaticStartCoroutine(AnimalAttackCo(player, spawnposition, args));
}
private IEnumerator AnimalAttackCo(BasePlayer player, Vector3 spawnposition, string[] args)
{
RaycastHit hit;
var 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)) yield break;
var 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";
var entity = GameManager.server.CreateEntity(aiPrefab, hit.point + Vector3.up * 0.2f);
var chicken = entity as BaseAnimalNPC;
entity.Spawn();
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;
var transform = player.transform;
chicken.ChaseTransform = transform;
chicken.Stats.AggressionRange = 100000;
chicken.Stats.DeaggroRange = 100000;
chicken.Stats.IsAfraidOf = new BaseNpc.AiStatistics.FamilyEnum[0];
chicken.Destination = transform.position;
chicken.Stats.VisionCone = -1;
yield return new WaitForSeconds(0.25f);
chicken.LegacyNavigation = true;
var 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)
{
var transform1 = player.transform;
chicken.ChaseTransform = transform1;
chicken.AttackTarget = player;
chicken.Destination = transform1.position;
chicken.TargetSpeed = chicken.Stats.Speed * 100;
}
}
}
else
{
if (chicken != null) chicken.Kill();
doLoop = false;
}
yield return null;
}
timer.Once(120, () =>
{
if (chicken != null) chicken.Kill();
});
timer.Once(130f, () => { chickens.RemoveWhere(x => x == null); });
}
// ReSharper disable once UnusedMember.Local
private void OnPlayerRespawned(BasePlayer player)
{
if (!HasCard(player.userID, Card.NoRest)) return;
player.EndSleeping();
player.SendNetworkUpdate();
}
// ReSharper disable once UnusedMember.Local
// ReSharper disable once UnusedParameter.Local
private void OnEntityKill(BaseNetworkable entity, HitInfo info)
{
if (entity == null) return;
if (!entitiesWatchingForKilledMounts.Contains(entity)) return;
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");
});
}
private HashSet<BaseNetworkable> entitiesWatchingForKilledMounts = new HashSet<BaseNetworkable>();
private void RocketManTarget(BasePlayer player)
{
var 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);
}
TakeCard(player, Card.Rocketman);
Subscribe("OnEntityKill");
var position = player.transform.position;
player.Teleport(position + Vector3.up * 2f);
var rocket = GameManager.server.CreateEntity("assets/prefabs/ammo/rocket/rocket_hv.prefab",
position + Vector3.up * 2f);
rocket.creatorEntity = player;
var projectile = rocket.GetComponent<ServerProjectile>();
projectile.InitializeVelocity(Vector3.up * 1f);
rocket.Spawn();
rocket.transform.LookAt(Vector3.up + rocket.transform.position);
entitiesWatchingForKilledMounts.Add(rocket);
var collider = rocket.gameObject.GetComponent<Collider>();
if (collider != null) collider.enabled = false;
var chair = InvisibleSit(player);
chair.SetParent(rocket, true);
Transform transform;
(transform = chair.transform).LookAt(chair.transform.position + Vector3.up);
var position1 = transform.position;
var up = transform.up;
position1 += up * -0.35f;
position1 += transform.forward * 0.7f;
transform.position = position1;
chair.transform.LookAt(position1 + Vector3.up + up * -1f);
rocket.transform.position = player.transform.position;
if (hasSit) rocket.transform.position += Vector3.up * 1;
Worker.StaticStartCoroutine(AccelerateRocketOverTime(projectile));
}
private static IEnumerator AccelerateRocketOverTime(ServerProjectile projectile)
{
const float duration = 5f;
var startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < duration)
{
var p = (Time.realtimeSinceStartup - startTime) / duration;
if (projectile != null) projectile.InitializeVelocity(Vector3.up * 20f * p);
yield return new WaitForFixedUpdate();
}
}
private const string invisibleChairPrefab = "assets/bundled/prefabs/static/chair.invisible.static.prefab";
private HashSet<BaseMountable> chairsPreventingDismount = new HashSet<BaseMountable>();
private BaseEntity InvisibleSit(BasePlayer targetPlayer)
{
var chair = GameManager.server.CreateEntity(invisibleChairPrefab, targetPlayer.transform.position);
var mount = chair as BaseMountable;
chair.Spawn();
chairsPreventingDismount.Add(mount);
UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());
if (targetPlayer.isMounted) targetPlayer.GetMounted().DismountPlayer(targetPlayer, true);
Timer t = null;
t = timer.Every(0.25f, () =>
{
if (chair == null || chair.IsDestroyed)
{
t.Destroy();
return;
}
if (targetPlayer != null)
{
if (targetPlayer.isMounted) return;
targetPlayer.Teleport(chair.transform.position);
mount.MountPlayer(targetPlayer);
chair.SendNetworkUpdateImmediate();
}
else
{
chair.Kill();
t.Destroy();
}
});
return chair;
}
private List<string> sounds_kill_quad = new List<string>()
{
"assets/prefabs/weapons/python/effects/close_cylinder.prefab",
"assets/prefabs/weapons/mace/effects/hit.prefab",
"assets/prefabs/misc/halloween/lootbag/effects/gold_open.prefab",
};
private void DoPinyataEffect(BasePlayer player)
{
var baseMagnitude = 1.35f;
var baseForceUp = 0.1f;
var randomForceUp = 8f * baseMagnitude;
var forceHorz = 10f * baseMagnitude;
var q = Quaternion.Euler(new Vector3(360 * Random(), 360 * Random(), 360 * Random()));
var seedVelocity = Vector3.up * baseForceUp + q * Vector3.forward;
var itemCount = player.inventory.AllItems().Length;
var items = new List<Item>(player.inventory.AllItems());
if (items == null) throw new ArgumentNullException(nameof(items));
var literalShit = new List<Item>();
const int targetItems = 20;
if (itemCount < targetItems)
{
for (var count = 0; count < (targetItems - itemCount); count++)
{
var item = ItemManager.CreateByName("horsedung");
GiveItemOrDrop(player, item);
literalShit.Add(item);
items.Add(item);
}
}
var angleIncrement = 360f / Mathf.Max(itemCount, targetItems);
PlaySound(sounds_kill_quad, player, false);
float mag = 0;
var i = 0;
foreach (var unused in player.inventory.AllItems())
{
var velocity = Quaternion.Euler(0, angleIncrement * i, 0) * seedVelocity;
var randomUp = Vector3.up * Mathf.Max(0.5f, Random()) * randomForceUp;
mag += velocity.magnitude;
velocity.y = 0;
velocity *= Mathf.Max(0.55f, Random()) * forceHorz;
velocity += randomUp;
var horz = velocity;
horz.y = 0;
i++;
}
timer.Once(10f, () =>
{
literalShit.ForEach(x =>
{
x?.RemoveFromContainer();
x?.Remove();
});
});
}
private void DoDana(BasePlayer player, BasePlayer admin)
{
if (player != null && admin != null)
{
foreach (var item in new List<Item>(player.inventory.containerBelt.itemList))
GiveItemOrDrop(admin, item);
foreach (var item in new List<Item>(player.inventory.AllItems())) GiveItemOrDrop(admin, item);
}
TakeCard(player, Card.Dana);
}
private static void GiveItemOrDrop(BasePlayer player, Item item, bool stack = false)
{
var success = item.MoveToContainer(player.inventory.containerBelt, -1, stack);
if (!success) success = item.MoveToContainer(player.inventory.containerMain, -1, stack);
if (!success) success = item.MoveToContainer(player.inventory.containerWear, -1, stack);
if (!success) item.Drop(player.transform.position + Vector3.up, Vector3.zero);
}
private HashSet<ulong> thirstyPlayers = new HashSet<ulong>();
private Dictionary<ulong, BasePlayer> basePlayerMap = new Dictionary<ulong, BasePlayer>();
private Coroutine thirstyCoroutine;
private void DoThirsty(BasePlayer player)
{
thirstyPlayers.Add(player.userID);
if (thirstyCoroutine == null) thirstyCoroutine = Worker.StaticStartCoroutine(DoThirstyCo());
}
private IEnumerator DoThirstyCo()
{
while (thirstyPlayers.Count > 0)
{
foreach (var userID in new HashSet<ulong>(thirstyPlayers))
{
if (HasCard(userID, Card.Thirsty))
{
BasePlayer player;
if (!basePlayerMap.TryGetValue(userID, out player)) player = BasePlayer.FindByID(userID);
if (player != null)
{
player.metabolism.hydration.MoveTowards(0, 10f);
player.SendNetworkUpdateImmediate();
}
else thirstyPlayers.Remove(userID);
}
else thirstyPlayers.Remove(userID);
}
yield return new WaitForSeconds(0.25f);
}
thirstyCoroutine = null;
}
private void DoHigherGround(BasePlayer player)
{
player.Teleport(player.transform.position + Vector3.up * 100);
TakeCard(player, Card.HigherGround);
}
private void DoCamomoCommand(BasePlayer player)
{
var camomoCards = new List<Card>
{
Card.Pacifism,
Card.Butterfingers,
Card.InstantKarma,
Card.DogDoo,
Card.Dud,
Card.DrNo,
};
foreach (var card in camomoCards) GiveCard(player.userID, card, Array.Empty<string>());
TakeCard(player.userID, Card.Camomo);
}
private void DoNakedCommand(BasePlayer targetPlayer)
{
Worker.StaticStartCoroutine(NakedOverTime(targetPlayer));
TakeCard(targetPlayer.userID, Card.Naked);
}
private IEnumerator NakedOverTime(BasePlayer targetPlayer)
{
yield return new WaitForSeconds(2);
foreach (var item in targetPlayer.inventory.AllItems())
{
if (item == null) continue;
var droppedEntity = item.Drop(targetPlayer.eyes.HeadRay().origin,
targetPlayer.eyes.HeadRay().direction * 5 + Vector3.up * 5 +
new Vector3(UnityEngine.Random.Range(-1f, 1f), 0, UnityEngine.Random.Range(-1f, 1f)));
droppedEntity.transform.LookAt(targetPlayer.eyes.HeadRay().origin +
Quaternion.Euler(0, UnityEngine.Random.Range(-90, 90),
UnityEngine.Random.Range(-90, 90)) *
targetPlayer.eyes.HeadRay().direction * 2);
var body = droppedEntity.GetComponentInChildren<Rigidbody>();
if (body != null)
{
const float power = 1;
body.AddForceAtPosition(targetPlayer.eyes.HeadRay().direction * power,
droppedEntity.transform.position + Vector3.up * 10f);
}
droppedEntity.SendNetworkUpdate();
yield return null;
}
float startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < 15)
{
//targetPlayer.SendConsoleCommand("gesture wave");
yield return new WaitForSeconds(0.5f);
}
}
private const string chairPrefab = "assets/prefabs/deployable/secretlab chair/secretlabchair.deployed.prefab";
private Dictionary<ulong, BaseEntity> sitChairMap = new Dictionary<ulong, BaseEntity>();
private void DoSitCommand(BasePlayer targetPlayer, BasePlayer adminPlayer)
{
if (targetPlayer == null) return;
if (HasCard(targetPlayer.userID, Card.Sit))
{
if (adminPlayer == null) return;
if (targetPlayer.isMounted)
{
targetPlayer.GetMounted().DismountPlayer(targetPlayer, true);
var car = targetPlayer.GetMountedVehicle();
if (car != null) car.Kill(BaseNetworkable.DestroyMode.Gib);
BaseEntity chair;
if (sitChairMap.TryGetValue(targetPlayer.userID, out chair)) chair.Kill();
}
RaycastHit hitinfo;
if (Physics.Raycast(adminPlayer.eyes.HeadRay(), out hitinfo, 50))
{
var chair = GameManager.server.CreateEntity(chairPrefab, hitinfo.point);
var mount = chair as BaseMountable;
chair.Spawn();
sitChairMap[targetPlayer.userID] = chair;
//targetPlayer.Teleport(chair.transform.position + chair.transform.forward * 0.5f);
targetPlayer.EndSleeping();
UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<DestroyOnGroundMissing>());
UnityEngine.Object.DestroyImmediate(chair.GetComponentInChildren<GroundWatch>());
var lookAtPosition = adminPlayer.transform.position;
lookAtPosition.y = mount.transform.position.y;
timer.Once(0.25f, () =>
{
if (targetPlayer != null)
{
mount.MountPlayer(targetPlayer);
chair.transform.LookAt(lookAtPosition);
chair.SendNetworkUpdateImmediate();
Worker.StaticStartCoroutine(SitCo(targetPlayer));
}
else chair.Kill();
});
}
}
else
{
BaseEntity chair;
if (!sitChairMap.TryGetValue(targetPlayer.userID, out chair)) return;
if (chair != null) chair.Kill();
}
}
private IEnumerator SitCo(BasePlayer player)
{
yield return new WaitForSeconds(0.25f);
BaseEntity chair;
sitChairMap.TryGetValue(player.userID, out chair);
var mount = chair as BaseMountable;
while (player != null && chair != null && HasCard(player.userID, Card.Sit))
{
if (player != null)
{
if (player.IsSleeping())
{
player.EndSleeping();
}
if (player.isMounted)
{
var playerMount = player.GetMounted();
if (playerMount != mount) player.GetMounted().DismountPlayer(player, true);
}
var dist = Vector3.Distance(chair.transform.position, player.transform.position);
if (dist > 2)
{
var transform = chair.transform;
player.Teleport(transform.position + transform.forward * 0.5f);
}
if (!player.isMounted && dist < 2) player.MountObject(mount);
}
else chair.Kill();
yield return new WaitForSeconds(0.25f);
}
if (chair != null) chair.Kill();
}
// ReSharper disable once UnusedMember.Local
private object CanDismountEntity(BasePlayer player, BaseMountable entity)
{
if (cardMap.Count == 0 && chairsPreventingDismount.Count == 0) return null;
if (HasCard(player.userID, Card.Sit)) return false;
foreach (var chair in new HashSet<BaseMountable>(chairsPreventingDismount).Where(chair =>
chair == null || chair.IsDestroyed)) chairsPreventingDismount.Remove(chair);
if (chairsPreventingDismount.Contains(entity)) return false;
return null;
}
private const string guid_BSOD = "guid_BSOD";
private const string url_bsod = "https://i.imgur.com/36oaKDW.png";
private void DoBSOD(BasePlayer player, bool playPublic)
{
if (player.net.connection == null) return;
UI2.guids.Add(guid_BSOD);
var elements = new CuiElementContainer();
UI2.CreatePanel(elements, "Overlay", guid_BSOD, "1 1 1 1", UI2.vectorFullscreen, url_bsod, true);
UI2.CreatePanel(elements, guid_BSOD, "blackpreloader", "0 0 0 1", UI2.vectorFullscreen, null, true);
if (IsAdmin(player))
UI2.CreateButton(elements, guid_BSOD, "exitbutton", "0 0 0 0", "", 12, UI2.v
// ... [Code preview truncated due to length. Full source in attached file] ...