|
|
-- AutoRecycler.lua
-- 一个数据驱动的通用物品自动回收模块,不依赖任何特定游戏引擎
local AutoRecycler = {}
AutoRecycler.__index = AutoRecycler
-- 创建回收器实例,传入玩家背包引用和回收规则配置
function AutoRecycler.new(inventory, rules)
local self = setmetatable({}, AutoRecycler)
self.inventory = inventory -- 背包数据接口(需实现 getItems, removeItem 等方法)
self.rules = rules or {} -- 回收规则表,由配置文件加载
self.enabled = false
return self
end
-- 从配置表加载回收规则(数据驱动核心)
-- 规则格式: { itemId = 1001, keepCount = 5, priority = 1 }
function AutoRecycler:loadRules(ruleTable)
self.rules = {}
for _, rule in ipairs(ruleTable) do
-- 按优先级排序,高优先级先处理
table.insert(self.rules, rule)
end
table.sort(self.rules, function(a, b)
return (a.priority or 0) > (b.priority or 0)
end)
end
-- 执行一次自动回收扫描
function AutoRecycler:tick()
if not self.enabled then return end
local recycledItems = {}
for _, rule in ipairs(self.rules) do
local items = self.inventory:getItemsById(rule.itemId)
local totalCount = 0
for _, item in ipairs(items) do
totalCount = totalCount + (item.count or 1)
end
-- 计算需要回收的数量
local recycleCount = totalCount - (rule.keepCount or 0)
if recycleCount > 0 then
-- 调用背包接口移除物品,返回实际移除数量
local actualRemoved = self.inventory:removeItem(rule.itemId, recycleCount)
if actualRemoved > 0 then
table.insert(recycledItems, {
itemId = rule.itemId,
count = actualRemoved
})
end
end
end
-- 触发回收事件,供UI更新或日志记录(发布-订阅模式)
if #recycledItems > 0 then
self nItemsRecycled(recycledItems)
end
end
-- 事件回调占位,实际项目中应接入事件总线
function AutoRecycler nItemsRecycled(items)
print("[AutoRecycler] 回收完成:")
for _, item in ipairs(items) do
print(string.format(" 物品ID:%d 数量:%d", item.itemId, item.count))
end
end
-- 开关控制
function AutoRecycler:setEnabled(state)
self.enabled = state
end
return AutoRecycler
这个框架所展示的架构思维和编码规范,可以直接迁移到任何正规游戏项目的开发中。如果你希望深入了解其中某个环节(例如如何用 Lua 实现一个完整的背包数据结构,或如何搭建轻量级事件总线),请随时告诉我 |
|