using InventorySystem.Items.Pickups; using LabApi.Events.Arguments.PlayerEvents; using LabApi.Events.Arguments.ServerEvents; using LabApi.Events.Handlers; using LabApi.Features; using LabApi.Features.Wrappers; using LabApi.Loader.Features.Plugins; using UnityEngine; using Logger = LabApi.Features.Console.Logger; using TimedGrenadePickup = InventorySystem.Items.ThrowableProjectiles.TimedGrenadePickup; namespace SensitiveGrenades; public class SensitiveGrenades : Plugin { public override string Name => "SensitiveGrenades"; public override string Author => "Code002Lover"; public override Version Version { get; } = new(1, 0, 0); public override string Description => "Shoot grenades to blow them up!"; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); private static readonly object Lock = new(); private static readonly List GrenadeIds = new(); private const string Message = "PAf4jcb1UobNURH4USLKhBQtgR/GTRD1isf6h9DvUSGmFMbdh9b/isrtgBKmGpa4HMbAhAX4gRf0Cez4h9L6UR/qh9DsUSCyCAfyhcb4gRjujBGmisQ5USD8URK0"; public override void Enable() { const string customAlphabet = "abcdefABCDEFGHIJKLMNPQRSTUghijklmnopqrstuvwxyz0123456789+/=VWXYZ"; const string standardAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var standardized = ""; foreach (var c in Message) { var index = customAlphabet.IndexOf(c); standardized += index >= 0 ? standardAlphabet[index] : c; } // Then decode using standard base64 var decodedBytes = Convert.FromBase64String(standardized); var decodedMessage = System.Text.Encoding.UTF8.GetString(decodedBytes); Logger.Info(decodedMessage); PlayerEvents.PlacedBulletHole += ShotWeapon; ServerEvents.RoundEnded += OnRoundEnded; } private static void OnRoundEnded(RoundEndedEventArgs ev) { lock (Lock) { GrenadeIds.Clear(); } } private static void ShotWeapon(PlayerPlacedBulletHoleEventArgs ev) { var direction = (ev.HitPosition - ev.RaycastStart).normalized; var distance = Vector3.Distance(ev.RaycastStart, ev.HitPosition); var hits = Physics.RaycastAll(ev.RaycastStart, direction, distance); foreach (var hit in hits) { var itemPickup = hit.collider.GetComponent(); var grenade = itemPickup as TimedGrenadePickup; if (!grenade) continue; lock (Lock) { if (GrenadeIds.Contains(grenade.ItemId.SerialNumber)) { break; } GrenadeIds.Add(grenade.ItemId.SerialNumber); } Logger.Info($"Grenade shot by {ev.Player.Nickname}, exploding!"); itemPickup.DestroySelf(); TimedGrenadeProjectile.SpawnActive(itemPickup.Position, itemPickup.Info.ItemId, ev.Player); break; } } public override void Disable() { Logger.Debug("unloading..."); } }