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调用返回了意外的结果");
}
}
}
}