bool EnableTemporaryDrop(string containerName, string itemName)
// 在其他插件中调用
[PluginReference]
private Plugin XMItemLibrary;
void SomeMethod()
{
// 启用"垃圾堆箱"容器的"超级强化石"临时掉落
bool success = (bool)XMItemLibrary?.Call("EnableTemporaryDrop", "垃圾堆箱", "超级强化石");
if (success)
{
Puts("临时掉落已成功启用");
}
else
{
Puts("临时掉落启用失败,请检查配置");
}
}
List<Dictionary<string, object>> API_GetContainerItems(string playerIdString, string containerName)
// 在其他插件中调用
[PluginReference]
private Plugin XMItemLibrary;
void GetPlayerItems(BasePlayer player)
{
// 获取"XMRewardPool_基础奖池"容器的物品列表
var libraryItems = XMItemLibrary?.Call("API_GetContainerItems", player.UserIDString, "XMRewardPool_基础奖池");
if (libraryItems != null && libraryItems is List<Dictionary<string, object>>)
{
var itemList = (List<Dictionary<string, object>>)libraryItems;
foreach (var itemData in itemList)
{
string status = itemData.ContainsKey("Status") ? itemData["Status"].ToString() : "locked";
// 只处理已解锁、临时掉落或研发完成的物品
if (status == "unlocked" || status == "temporary" || status == "research")
{
string itemName = itemData["ItemName"].ToString();
string itemShortname = itemData["ItemShortname"].ToString();
ulong itemSkin = Convert.ToUInt64(itemData["ItemSkin"]);
int minAmount = Convert.ToInt32(itemData["MinAmount"]);
int maxAmount = Convert.ToInt32(itemData["MaxAmount"]);
int probability = Convert.ToInt32(itemData["Probability"]);
// 使用物品数据...
Puts($"物品: {itemName}, 状态: {status}, 概率: {probability}%");
}
}
}
else
{
Puts("未找到容器或容器没有物品");
}
}
void API_NotifyItemObtained(string userid, string itemName, int amount, string containerName = "")
// 在其他插件中调用
[PluginReference]
private Plugin XMItemLibrary;
void GivePlayerItemFromLibrary(BasePlayer player, string itemName, int amount)
{
// 1. 先通过 API_GetContainerItems 获取物品信息
var libraryItems = XMItemLibrary?.Call("API_GetContainerItems", player.UserIDString, "XMRewardPool_基础奖池");
if (libraryItems != null && libraryItems is List<Dictionary<string, object>>)
{
var itemList = (List<Dictionary<string, object>>)libraryItems;
foreach (var itemData in itemList)
{
string status = itemData.ContainsKey("Status") ? itemData["Status"].ToString() : "locked";
string name = itemData["ItemName"].ToString();
if (status == "unlocked" && name == itemName)
{
// 2. 发放物品给玩家
string shortname = itemData["ItemShortname"].ToString();
ulong skin = Convert.ToUInt64(itemData["ItemSkin"]);
var item = ItemManager.CreateByName(shortname, amount, skin);
if (item != null)
{
item.name = itemName;
player.GiveItem(item);
// 3. 重要!调用通知API同步统计、通知和解锁进度
// 传入containerName参数后会自动增加解锁任务进度
XMItemLibrary?.Call("API_NotifyItemObtained", player.UserIDString, itemName, amount, containerName);
}
break;
}
}
}
}
// 如果不需要解锁进度功能,可以不传containerName参数
XMItemLibrary?.Call("API_NotifyItemObtained", player.UserIDString, itemName, amount);
**效果说明:**
1. 记录物品掉落统计 - 在编辑页面的"本档掉落数量"中显示
2. 记录玩家稀有度发现次数 - 在排行榜中显示
3. 显示个人通知UI - 根据物品配置的"显示个人UI"设置
4. 显示全服通知UI - 根据物品配置的"显示全服UI"设置
5. 播放特效 - 玩家获得物品时的视觉效果
6. **增加解锁进度** - 如果传入了 `containerName`,会自动增加对应容器的解锁任务进度 ✅
**注意事项:**
- **必须在发放物品后立即调用此API**,否则会缺失统计和通知功能
- 物品名称必须与物品库配置中的"物品名称"完全匹配
- 如果物品不存在于物品库配置中,API会自动忽略
// 监听所有解锁完成事件
void OnXMItemLibraryUnlockCompleted(BasePlayer player, string itemName, string containerName)
{
Puts($"玩家 {player.displayName} 解锁了 {containerName} 的 {itemName}");
// 可以在这里添加奖励、通知等逻辑
}
// 监听特定物品的解锁
void OnXMItemLibraryUnlockCompleted(BasePlayer player, string itemName, string containerName)
{
if (itemName == "传说武器")
{
// 给予额外奖励
player.ChatMessage("恭喜解锁传说武器!额外奖励已发放!");
}
}
// 监听所有物品发现事件
void OnXMItemLibraryItemDiscovered(BasePlayer player, string itemName, string containerName, int amount)
{
Puts($"玩家 {player.displayName} 从 {containerName} 发现了 {amount}个 {itemName}");
}
// 监听特定容器的物品发现
void OnXMItemLibraryItemDiscovered(BasePlayer player, string itemName, string containerName, int amount)
{
if (containerName == "传说宝箱")
{
// 记录日志或触发特殊事件
LogToFile("legendary_drops", $"{player.displayName} 获得 {itemName} x{amount}", this);
}
}
// 监听特定物品的发现
void OnXMItemLibraryItemDiscovered(BasePlayer player, string itemName, string containerName, int amount)
{
if (itemName == "神器碎片")
{
// 触发全服公告
Server.Broadcast($"玩家 {player.displayName} 发现了神器碎片!");
}
}
// 同时过滤容器和物品
void OnXMItemLibraryItemDiscovered(BasePlayer player, string itemName, string containerName, int amount)
{
if (containerName == "BOSS宝箱" && itemName == "终极武器")
{
// 特殊处理
player.ChatMessage("你发现了BOSS宝箱中的终极武器!");
}
}
// 监听所有研发完成事件
void OnXMItemLibraryResearchCompleted(string itemName, string containerName)
{
Puts($"全服研发完成: {itemName} 已加入 {containerName}");
// 可以触发全服庆祝活动
}
// 监听特定物品的研发完成
void OnXMItemLibraryResearchCompleted(string itemName, string containerName)
{
if (itemName == "时空武器")
{
// 触发特殊事件
Server.Broadcast("时空武器研发成功!全服玩家获得特殊BUFF!");
// 给所有在线玩家发放奖励
foreach (var player in BasePlayer.activePlayerList)
{
// 发放奖励逻辑
}
}