using Oxide.Core.Plugins; using System.Collections.Generic; namespace Oxide.Plugins { [Info("Drop Backpack In Dynamic PVP Zone", "WhiteThunder", "1.1.0")] [Description("Forces player backpacks to drop when they are killed in a DynamicPVP zone.")] internal class DropBackpackInDynamicPVPZone : CovalencePlugin { #region Fields private const string PermissionKeepOnDeath = "dropbackpackindynamicpvpzone.keepondeath"; [PluginReference] private readonly Plugin Backpacks, DynamicPVP, ZoneManager; #endregion #region Hooks private void Init() { permission.RegisterPermission(PermissionKeepOnDeath, this); } // Handle player death by normal means. private void OnEntityDeath(BasePlayer player, HitInfo info) { OnEntityKill(player); } // Handle player death while sleeping in a safe zone. private void OnEntityKill(BasePlayer player) { if (player.IsNpc || !IsPlayerInPvpZone(player) || permission.UserHasPermission(player.UserIDString, PermissionKeepOnDeath)) return; var droppedItemContainer = Backpacks?.Call("API_DropBackpack", player); if (droppedItemContainer != null) { ChatMessage(player, LangEntry.BackpackDropped); } } #endregion #region Helpers private bool IsPlayerInPvpZone(BasePlayer player) { var inPvpDelay = DynamicPVP?.Call("IsPlayerInPVPDelay", player.userID); if (inPvpDelay is bool && (bool)inPvpDelay) { // Player recently exited a PVP zone and can still be killed. return true; } var zoneIdList = ZoneManager?.Call("GetPlayerZoneIDs", player) as string[]; if (zoneIdList == null) { // Player is not in a zone, or Zone Manager is not loaded. return false; } foreach (var zoneId in zoneIdList) { var isPvpZone = DynamicPVP?.Call("IsDynamicPVPZone", zoneId); if (isPvpZone is bool && (bool)isPvpZone) { // Player is in a dynamic PVP zone. return true; } } return false; } #endregion #region Localization private class LangEntry { public static readonly List AllLangEntries = new List(); public static readonly LangEntry BackpackDropped = new LangEntry("BackpackDropped", "Your backpack contents were dropped because you were killed during PvP."); public string Name; public string English; public LangEntry(string name, string english) { Name = name; English = english; AllLangEntries.Add(this); } } private string GetMessage(string playerId, LangEntry langEntry) => lang.GetMessage(langEntry.Name, this, playerId); private void ChatMessage(BasePlayer player, LangEntry langEntry) => player.ChatMessage(GetMessage(player.UserIDString, langEntry)); protected override void LoadDefaultMessages() { var englishLangKeys = new Dictionary(); foreach (var langEntry in LangEntry.AllLangEntries) { englishLangKeys[langEntry.Name] = langEntry.English; } lang.RegisterMessages(englishLangKeys, this, "en"); } #endregion } }