local CONST = require 'config.const' local Balance = require 'config.balance' local M = {} local spawn_points = {} local ITEM_POOL = { { key = CONST.ITEM_POISON, weight = 15 }, { key = CONST.ITEM_KNIFE, weight = 10 }, { key = CONST.ITEM_ARMOR, weight = 15 }, { key = CONST.ITEM_SMOKE, weight = 15 }, { key = CONST.ITEM_MASK, weight = 8 }, { key = CONST.ITEM_TRACKER, weight = 15 }, { key = CONST.ITEM_SILENCER, weight = 10 }, { key = CONST.ITEM_JAMMER, weight = 12 }, } -- --------------------------------------------------------- -- 初始化 -- --------------------------------------------------------- function M.init() local areas = clicli.area.get_circle_areas_by_tag('item_spawn') for _, area in ipairs(areas) do local sp = { area = area, current_item = nil, respawn_timer = nil, } M.spawn_item(sp) table.insert(spawn_points, sp) end clicli.game:subscribe_event('单位-获得物品', function(trg, data) local unit = data.unit if unit and unit:has_tag('player_controlled') then local Suspicion = require 'systems.suspicion' Suspicion.add(unit, 3) M.on_item_picked_by_unit(data.item) end end) end -- --------------------------------------------------------- -- 在刷新点生成物品 -- --------------------------------------------------------- function M.spawn_item(sp) local item_key = M.roll_item() local pos = sp.area:get_center_point() local item = clicli.item.create_item(pos, item_key) sp.current_item = item end -- --------------------------------------------------------- -- 物品权重随机 -- --------------------------------------------------------- function M.roll_item() local total = 0 for _, e in ipairs(ITEM_POOL) do total = total + e.weight end local r = math.random(total) local acc = 0 for _, e in ipairs(ITEM_POOL) do acc = acc + e.weight if r <= acc then return e.key end end return ITEM_POOL[1].key end -- --------------------------------------------------------- -- 被拾取后,找到对应刷新点并开始刷新倒计时 -- --------------------------------------------------------- function M.on_item_picked_by_unit(item) for _, sp in ipairs(spawn_points) do if sp.current_item == item then M.on_item_picked(sp) break end end end function M.on_item_picked(sp) sp.current_item = nil local delay = Balance.ITEM_RESPAWN_TIME local GameMgr = require 'core.game_manager' if GameMgr.get_state() == 'overtime' then delay = delay * 0.5 end sp.respawn_timer = clicli.timer.wait(delay, function() M.spawn_item(sp) end) end return M