• 注册后才能下载/购买插件!快来注册吧,注册即可免费下载 精翻插件 !【点我注册
  • RustSB.COM向广大野生Rust插件作者发出入驻邀请!详情请见[原创作者条约]
【SuperMail·邮件系统】

原创 【SuperMail·邮件系统】 1.1.3

C#:
using System;
using System.Collections.Generic;
using Oxide.Core.Plugins;

namespace Oxide.Plugins
{
    [Info("SuperMail API示例", "熊猫君www.rustsb.com", "1.0.0")]
    class SuperMailAPIExample : RustPlugin
    {
        [PluginReference]
        Plugin SuperMail;

        /*
         * SuperMail API 功能说明:
         *
         * 1. SendMail - 发送基础邮件
         * 2. SendMailWithItem - 发送带单个物品的邮件(支持皮肤)
         * 3. SendMailWithItems - 发送带多个物品的邮件
         * 4. SendMailToMultiplePlayers - 批量发送邮件
         * 5. GetUnreadMailCount - 获取未读邮件数量
         *
         * 数据清理机制:
         * - 玩家删除邮件时会自动清理对应的存档数据
         * - API发送的邮件会被自动清理,官方邮件除外
         * - 支持智能物品名称显示(重命名优先,然后中文,最后英文)
         */

        // 示例1: 基础邮件发送
        void SendBasicMail(BasePlayer player)
        {
            bool success = (bool)SuperMail?.Call("SendMail",
                player.UserIDString,
                "欢迎消息",
                "欢迎来到我们的服务器!"
            );

            if (success)
            {
                Puts($"成功发送邮件给 {player.displayName}");
            }
            else
            {
                Puts($"发送邮件失败给 {player.displayName}");
            }
        }

        // 示例2: 发送带物品的邮件
        void SendItemMail(BasePlayer player)
        {
            bool success = (bool)SuperMail?.Call("SendMailWithItem",
                player.UserIDString,
                "新手礼包",
                "这是您的新手礼包,请查收!",
                "wood",     // 木头
                1000,       // 数量
                0UL         // 皮肤ID
            );

            if (success)
            {
                player.ChatMessage("新手礼包已发送到您的邮件!");
            }
        }

        // 示例3: 背包满时发送物品到邮件
        void GiveItemOrSendMail(BasePlayer player, string itemShortname, int amount)
        {
            // 尝试直接给予物品
            var item = ItemManager.CreateByName(itemShortname, amount);
            if (item != null)
            {
                string itemDisplayName = item.GetDisplayName(); // 使用RUSTSB方法获取物品名称

                if (player.inventory.GiveItem(item))
                {
                    player.ChatMessage($"获得了 {amount}x {itemDisplayName}");
                }
                else
                {
                    // 背包满了,发送到邮件
                    item.Remove();

                    bool success = (bool)SuperMail?.Call("SendMailWithItem",
                        player.UserIDString,
                        "背包已满-物品补发",
                        $"由于您的背包已满,{itemDisplayName} x{amount} 已发送到邮件中!",
                        itemShortname,
                        amount
                    );

                    if (success)
                    {
                        player.ChatMessage("背包已满,物品已发送到邮件中!");
                    }
                }
            }
        }

        // 示例4: 批量发送活动奖励
        void SendEventRewards(List<BasePlayer> participants)
        {
            foreach (var player in participants)
            {
                SuperMail?.Call("SendMailWithItem",
                    player.UserIDString,
                    "活动奖励",
                    "感谢参与本次活动!这是您的奖励。",
                    "scrap",
                    500
                );
            }

            Puts($"已向 {participants.Count} 名玩家发送活动奖励");
        }

        // 示例5: 检查玩家邮件数量
        void CheckPlayerMails(BasePlayer player)
        {
            int unreadCount = (int)SuperMail?.Call("GetUnreadMailCount", player.UserIDString);
      
            if (unreadCount > 0)
            {
                player.ChatMessage($"您有 {unreadCount} 封未读邮件,输入 /mail 查看");
            }
            else if (unreadCount == 0)
            {
                player.ChatMessage("您没有未读邮件");
            }
            else
            {
                Puts("获取邮件数量失败");
            }
        }

        // 示例6: 服务器重启前发送补偿
        void OnServerShutdown()
        {
            var allPlayers = BasePlayer.activePlayerList;
            string[] playerIds = new string[allPlayers.Count];
      
            for (int i = 0; i < allPlayers.Count; i++)
            {
                playerIds[i] = allPlayers[i].UserIDString;
            }

            int successCount = (int)SuperMail?.Call("SendMailToMultiplePlayers",
                playerIds,
                "服务器维护补偿",
                "感谢您的耐心等待,这是维护期间的补偿物品。"
            );

            Puts($"已向 {successCount} 名玩家发送维护补偿邮件");
        }

        // 示例7: 玩家连接时检查邮件
        void OnPlayerConnected(BasePlayer player)
        {
            timer.Once(5f, () => {
                if (player != null && player.IsConnected)
                {
                    CheckPlayerMails(player);
                }
            });
        }

        // 示例8: 发送多个物品的邮件
        void SendMultipleItems(BasePlayer player)
        {
            // 创建物品数组
            var items = new List<Item>();
            items.Add(ItemManager.CreateByName("wood", 1000));
            items.Add(ItemManager.CreateByName("stone", 1000));
            items.Add(ItemManager.CreateByName("metal.ore", 500));

            bool success = (bool)SuperMail?.Call("SendMailWithItems",
                player.UserIDString,
                "资源包",
                "这是您的资源包奖励!",
                items.ToArray()
            );

            if (success)
            {
                player.ChatMessage("资源包已发送到您的邮件!");
            }

            // 清理临时物品(注意:API会自动复制物品数据,所以需要手动清理)
            foreach (var item in items)
            {
                item?.Remove();
            }
        }

        // 示例9: 发送带皮肤的物品
        void SendSkinItem(BasePlayer player)
        {
            bool success = (bool)SuperMail?.Call("SendMailWithItem",
                player.UserIDString,
                "特殊奖励",
                "这是一把特殊皮肤的AK47!",
                "rifle.ak",     // AK47
                1,              // 数量
                2681116170UL    // 皮肤ID (示例皮肤ID)
            );

            if (success)
            {
                player.ChatMessage("特殊皮肤武器已发送到您的邮件!");
            }
        }

        // 示例10: 错误处理示例
        void SendMailWithErrorHandling(BasePlayer player)
        {
            // 检查SuperMail插件是否加载
            if (SuperMail == null)
            {
                Puts("SuperMail插件未加载!");
                return;
            }

            // 发送邮件并处理返回值
            var result = SuperMail?.Call("SendMail",
                player.UserIDString,
                "测试邮件",
                "这是一封测试邮件"
            );

            if (result is bool success)
            {
                if (success)
                {
                    Puts($"成功发送邮件给 {player.displayName}");
                    player.ChatMessage("邮件发送成功!");
                }
                else
                {
                    Puts($"发送邮件失败给 {player.displayName}");
                    player.ChatMessage("邮件发送失败,请联系管理员");
                }
            }
            else
            {
                Puts("SuperMail API调用返回了意外的结果");
            }
        }
    }
}