200字
UI抽奖机(lua)
2025-11-24
2025-11-24

自己改一下ui的元件id。

-- 奖品池(概率要保证总和为1)
local awards = {
    {uiid="7545420593511473091-24919_47", awardid=4167, awardnum=1, Probability=0.15},
    {uiid="7545420593511473091-24919_49", awardid=4103, awardnum=1, Probability=0.20},
    {uiid="7545420593511473091-24919_57", awardid=4153, awardnum=1, Probability=0.10},
    {uiid="7545420593511473091-24919_59", awardid=4169, awardnum=2, Probability=0.10},
    {uiid="7545420593511473091-24919_62", awardid=4168, awardnum=1, Probability=0.12},
    {uiid="7545420593511473091-24919_67", awardid=4169, awardnum=1, Probability=0.20},
    {uiid="7545420593511473091-24919_70", awardid=4132, awardnum=1, Probability=0.03},
    {uiid="7545420593511473091-24919_72", awardid=4166, awardnum=1, Probability=0.10},
}

-- 从奖品池中随机抽取一个
local function random_award()
    local r = math.random()
    local sum = 0
    for _, v in ipairs(awards) do
        sum = sum + v.Probability
        if r <= sum then
            return v
        end
    end
    return awards[#awards] -- 兜底,避免浮点误差
end

-- 发放奖励
local function Get_rewards(event, award)
    local result, name = Item:getItemName(award.awardid)
    Player:gainItems(event.eventobjid, award.awardid, award.awardnum, 1) -- 1代表快捷栏
    Player:notifyGameInfo2Self(event.eventobjid, "#G你抽到了 " .. (name or "未知物品"))
end

-- 扣除抽奖券(优先扣快捷栏,再扣背包)
local function remove_ticket(objid, num)
    num = num or 1
    local _, num1, _ = Backpack:getItemNumByBackpackBar(objid, 1, 4166) -- 快捷栏
    local _, num2, _ = Backpack:getItemNumByBackpackBar(objid, 2, 4166) -- 背包栏
    if num1 + num2 < num then
        return false
    end
    -- 循环扣除 num 张券
    local left = num
    if num1 > 0 then
        local take = math.min(num1, left)
        Backpack:removeGridItemByItemID(objid,4166, take)
        left = left - take
    end
    if left > 0 then
        Backpack:removeGridItemByItemID(objid,4166, left)
    end
    return true
end

-- 单抽动画并发奖
local function single_draw(e)
    local award = random_award()
    Buff:addBuff(e.eventobjid, 50000002,1, 10)
    -- 动画效果(逐个闪烁)
    for loop = 1, 5 do
        for i = 1, #awards do
            local ui = awards[i].uiid
            Customui:setAlpha(e.eventobjid, "7545420593511473091-24919", ui, 50)
            threadpool:wait(0.1)
            Customui:setAlpha(e.eventobjid, "7545420593511473091-24919", ui, 100)
        end
    end
    -- 最终高亮中奖格子
    Customui:setAlpha(e.eventobjid, "7545420593511473091-24919", award.uiid, 50)
    -- 发放奖励
    Get_rewards(e, award)
    threadpool:wait(0.5)
    Customui:showElement(e.eventobjid, "7545420593511473091-24919", "7545420593511473091-24919_43")
end

-- 十连抽逻辑
local function ten_draw(e)
    Buff:addBuff(e.eventobjid, 50000002,1, 10)
    -- 随机抽10个奖励
    local results = {}
    for i = 1, 10 do
        local award = random_award()
        table.insert(results, award)
        Player:gainItems(e.eventobjid, award.awardid, award.awardnum, 1)
    end
    -- 汇总提示
    local msg = "#G十连抽结果:"
    for _, v in ipairs(results) do
        local _, name = Item:getItemName(v.awardid)
        msg = msg .. (name or "未知物品") .. "x" .. v.awardnum .. " "
    end
    Player:notifyGameInfo2Self(e.eventobjid, msg)
end

-- 点击按钮开始抽奖
local function start(e)
    Player:playMusic(e.eventobjid,10946,100,1,false)
    if e.uielement == "7545420593511473091-24919_43" then -- 单抽按钮
        local _, num1, _ = Backpack:getItemNumByBackpackBar(e.eventobjid, 1, 4166)
        local _, num2, _ = Backpack:getItemNumByBackpackBar(e.eventobjid, 2, 4166)
        if num1 + num2 >= 1 then
            if remove_ticket(e.eventobjid, 1) then
                Customui:hideElement(e.eventobjid, "7545420593511473091-24919", "7545420593511473091-24919_43")
                single_draw(e)
            else
                Player:notifyGameInfo2Self(e.eventobjid, "#R扣除抽奖券失败")
            end
        else
            Player:notifyGameInfo2Self(e.eventobjid, "#R您的抽奖券不足")
        end
    elseif e.uielement == "7545420593511473091-24919_39" then -- 十连抽按钮
        local _, num1, _ = Backpack:getItemNumByBackpackBar(e.eventobjid, 1, 4166)
        local _, num2, _ = Backpack:getItemNumByBackpackBar(e.eventobjid, 2, 4166)
        if num1 + num2 >= 10 then
            if remove_ticket(e.eventobjid, 10) then
                ten_draw(e)
            else
                Player:notifyGameInfo2Self(e.eventobjid, "#R扣除抽奖券失败")
            end
        else
            Player:notifyGameInfo2Self(e.eventobjid, "#R您的抽奖券不足,至少需要10张")
        end
    end
end

-- 注册事件
ScriptSupportEvent:registerEvent([=[UI.Button.Click]=], start)

懒得放演示图了,有bug评论区留言!🤓👇

UI抽奖机(lua)
作者
站长
发表于
2025-11-24

评论