GameProject-xianxia-neidan

本文介绍了一个游戏中的内丹系统,详细解析了系统的核心结构和功能实现,包括属性配置、角色属性初始化、升级处理等关键流程。
--[[
--brief: 内丹系统
--date:  2017-06-20
--author: syl
--modified:
--]]

--[[
-- Conf结构
-- neidanConf =
-- {
--  item =
--  {
--      {
--          add = 100,
--          id = 52003,
--          type = 1
--      }
--      ... 7
--  }
--  level =
--  {
--      {
--          {
--              type = 1,
--              limit = 200
--          }
--          ... 3 - 7
--      }
--      ... 50
--  }
--  totalAttrType = 7 属性种类总数
-- }
--]]

--[[
-- ast结构
-- neidanSys =
-- {
--      attr =
--      {
--         
--          {
--              value = 0
--          },
--          ... 7
--      },
--      level = 1
--      upLevel = false
-- }
--]]

module("systems.neidan.neidan", package.seeall)
require("neidan.neidanconf")

local logger        = Logger.GetLogger("NeidanSystem")
local sysId         = siNeidan
local neidanConf    = neidanConf

local function AddAttr(actor, type, value) -- 添加属性
    LActor.luaAttrInit(actor, LuaAttrDef.NeidanAttr)
    LActor.luaAttrClear(actor, LuaAttrDef.NeidanAttr)
    LActor.luaAttrAdd(actor, LuaAttrDef.NeidanAttr, type, value)
    LActor.refreshActor(actor)
end

local function InitActor(actor)
    local ast = LActor.getStaticVar(actor)

    if not ast.neidanSys then
        ast.neidanSys =
        {
            level = 1,
            upLevel = false
        }
    end
    local neidan = ast.neidanSys
    local levelTotalCount = #neidanConf.level[neidan.level] -- 当前等级的属性种类总数
    if neidan.attr then 
        --print("当前等级[" .. neidan.level .. "]角色属性种类总数" .. #neidan.attr)
        --print("当前等级[" .. neidan.level .. "]配置属性种类总数" .. levelTotalCount)
    end

    if not neidan.attr then
        neidan.attr = {}

        for i = 1, levelTotalCount do
            neidan.attr[i] = { value = 0 }
        end
        return neidan

    elseif #neidan.attr < levelTotalCount then -- 配置文件属性增减处理

        for i = 1, levelTotalCount do

            if not neidan.attr[i] then -- 缺哪个补哪个,配置减少不处理配置的时候赋空值即可
                neidan.attr[i] = { value = 0 }
            end
        end
    end

    return neidan
end

local function OnOneKeyHandler(actor, index)
    --print("----------------OnOneKeyHandler----------------")
    local neidan = InitActor(actor)
    local attrAst = neidan.attr
    local level = neidan.level

    local totalConf = neidanConf.totalAttrType
    local levelConf = neidanConf.level
    local attrConf = levelConf[level]
    --print("index:" .. index)
    if index == 0 then

        for i = 1, #attrConf do
            local limit = attrConf[i].limit
            local type = attrConf[i].type
            local item = neidanConf.item[type]
            local add = item.add
            local id = item.id

            local value = attrAst[i].value
            local surplus = limit - value
            --print("value" .. i .. "数量:" .. value)
            --print("level" .. i .. "数量:" .. level)
            --print("limit" .. i .. "数量:" .. limit)
            --print("surplus" .. i .. "数量:" .. surplus)
            --print("add" .. i .. "数量:" .. add)
            local needNeiDanCount = surplus / add
            local haveNeiDanCount = LActor.getItemCount(actor, id, -1, -1, -1)
            --print("拥有的内丹" .. i .. "数量:" .. haveNeiDanCount)
            --print("需要的内丹" .. i .. "数量:" .. needNeiDanCount)
            if haveNeiDanCount ~= 0 then
                local del = 0

                if haveNeiDanCount > needNeiDanCount then
                    del = needNeiDanCount
                    neidan.upLevel = true
                else
                    del = haveNeiDanCount
                    neidan.upLevel = false
                end
                attrAst[i].value = attrAst[i].value + del * add
                --print("添      加" .. i .. "属性:" .. del * add)
                AddAttr(actor, attrConf[i].type, del * add)
                --print("移除的内丹" .. i .. "数量:" .. del)
                LActor.removeItem(actor, id, del, -1, -1, -1, "neidan_remove")
            else
                neidan.upLevel = false
                SendTipMsg(actor, TipMsgId.tpLua10)
            end
        end
        NetSendInfo(actor)
    end

    if index == -1 then
        --print("突破")
        if neidan.upLevel and neidan.level<= 50 then
            neidan.upLevel = false
            neidan.level = neidan.level + 1
            --print("LevelUp:" .. neidan.level)
            NetSendInfo(actor)
        end
    end
end

----------------Net----------------
function NetSendInfo(actor)
    if not LActor.isActorSystemOpen(actor, sysId) then return end
    --print("NetSendInfo")
    local neidan = InitActor(actor)
    local pack = DataPack.allocPacket(actor, 179, 25)

    DataPack.writeChar(pack, #neidan.attr)
    DataPack.writeInt(pack, neidan.level)

    for i = 1, #neidan.attr do
        DataPack.writeInt(pack, neidan.attr[i].value)
    end
    DataPack.flush(pack)
end

function NetRequInfo(actor, pack) -- 全部 和 一个
    if not LActor.isActorSystemOpen(actor, sysId) then return end
    local index = DataPack.readChar(pack)

    OnOneKeyHandler(actor, index)
end

----------------Gm----------------
local function GmClear(actor, args)
    local neidan = InitActor(actor)
    local level = neidan.level

    local levelConf = neidanConf.level
    local attrConf = levelConf[level]


    for i = 1, #attrConf do
        neidan.attr[i].value = 0
    end
end

local function GmPrint(actor, args)
    local neidan = InitActor(actor)
    local level = neidan.level

    local levelConf = neidanConf.level
    local attrConf = levelConf[level]

    for i = 1, #attrConf do
        print("value[" .. i .. "]:" .. neidan.attr[i].value)
    end
end

local function GmOpen(actor)
    logger:Info("NeiDanSystemOpen")
    OnOpenSystem(actor, {sysId})
end

local function GmAdd(actor, args)
    AddAttr(actor, args[1], args[2])
end
----------------Sys----------------
function OnOpenSystem(actor, args)
    InitActor(actor)
    NetSendInfo(actor)
end

function OnLogin(actor)
    -- RefreshAttr(actor)
end

local function OnInit()
    ActorRegisterNetHandler(179, 25, NetRequInfo)

    GmEventFuncList.register("neidan.clear", GmClear, 1)
    GmEventFuncList.register("neidan.print", GmPrint, 1)
    GmEventFuncList.register("neidan.open", GmOpen, 1)
    GmEventFuncList.register("neidan.add", GmAdd, 1)

    RegisterSystem(siNeidan, _M)
end

table.insert(InitFnTable, OnInit) -- @proto 179 25 0
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值