tdengine 0.1.2

game server for Rust
Documentation
-- propertyd.lua
-- Created by wugd
-- 负责物件模块

-- 声明模块名
PROPERTY_D = {}
setmetatable(PROPERTY_D, {__index = _G})
local _ENV = PROPERTY_D

local item_file = "data/txt/ItemInfo.txt"
local equip_file = "data/txt/EquipInfo.txt"
local item_table    = {}
local equip_table   = {}
local item_fields_list = {}
local equip_fields_list = {}

-- 相关模块注册回调
local property_callback = {}

-- 定义内部接口,按照字母顺序排序
local function load_item_table()
    item_table = IMPORT_D.readcsv_to_mapping(item_file) or {}

    local item_basic_ob
    local name
    for class_id, info in pairs(item_table) do

        assert(class_id ~= 0,"item表中有class_id为0的道具")
        info = dup(info)
        -- 创建道具基本对象
        if not info["ob_type"] then
            info["ob_type"] = OB_TYPE_ITEM
        end
        item_basic_ob = clone_object(ITEM_TDCLS, info)

        set_class_basic_object(class_id, item_basic_ob)
        name = info["name"]

        if name then
            set_name_basic_object(name, item_basic_ob)
        end

        -- 执行注册的回调函数
        for _, f in ipairs(property_callback) do
            f(info)
        end
        item_table[class_id] = set_table_read_only(info)
    end
end

local function load_equip_table()
    equip_table = IMPORT_D.readcsv_to_mapping(equip_file) or {}

    local equip_basic_ob
    local name
    for class_id, info in pairs(equip_table) do

        assert(class_id ~= 0,"equip表中有class_id为0的道具")
        info = dup(info)
        -- 创建装备基本对象
        if not info["ob_type"] then
            info["ob_type"] = OB_TYPE_EQUIP
        end
        equip_basic_ob = clone_object(EQUIP_TDCLS, info)
        equip_basic_ob:set("amount", 1)

        set_class_basic_object(class_id, equip_basic_ob)
        name = info["name"]

        if name then
            set_name_basic_object(name, equip_basic_ob)
        end

        -- 执行注册的回调函数
        for _, f in ipairs(property_callback) do
            f(info)
        end
        equip_table[class_id] = set_table_read_only(info)
    end
end


-- 定义公共接口,按照字母顺序排序

-- 克隆物件对象
function clone_object_from(class_id, property_info, from_db)
    local basic_object = find_basic_object_by_class_id(class_id)
    if not basic_object then
        -- 没有找到相应的基本对象,不能构造物件
        return
    end

    -- 保存原来信息
    local ori_property_info = dup(property_info)

    if not property_info["rid"] then
        -- 新道具,生成RID
        property_info["rid"] = NEW_RID()
    end

    -- 设置class_id
    property_info["class_id"] = class_id

    -- 设置默认数量
    if not property_info["amount"] then
        property_info["amount"] = 1
    end

    -- 根据不同类型的物件创建对象
    local ob_type = property_info["ob_type"]
    ob_type = ob_type or basic_object:query("ob_type")

    local property_ob
    if ob_type == OB_TYPE_ITEM then
        -- 创建道具对象
        property_ob = clone_object(ITEM_TDCLS, property_info)
    elseif ob_type == OB_TYPE_EQUIP then
        property_ob = clone_object(EQUIP_TDCLS, property_info)
        ori_property_info["amount"] = nil
        if not property_ob:query("lv") then
            property_ob:set("lv", 0)
        end
        if not property_ob:query("exp") then
            property_ob:set("exp", 0)
        end
    end

    if from_db ~= true then
        -- 物件不再数据库中,执行物件初始化脚本
        -- local init_script = property_ob:query("init_script")
        -- if (is_int(init_script) and init_script > 0) then
        --     INVOKE_SCRIPT(init_script, property_ob, property_ob:query("init_arg"), instance_id)
        -- end

        -- 表示该物件不在数据库中,记录标识,以便该物件加载到玩家身上后,
        -- 保存玩家数据时,使用 insert 操作而非 update 操作
        property_ob:set_temp("not_in_db", true)
    end

    -- 防止传入数据被初始化脚本覆盖
    property_ob:absorb_dbase(ori_property_info)

    return property_ob
end

function get_property_info(class_id)
    if equip_table[class_id] then
        return equip_table[class_id]
    elseif item_table[class_id] then
        return item_table[class_id]
    end
end

-- 取得指定 class_id 的物件信息
function get_item_dbase(class_id)
    if not class_id then
        return item_table
    else
        return item_table[class_id]
    end
end

function get_equip_table(class_id)
    if not class_id then
        return equip_table
    else
        return equip_table[class_id]
    end
end

function get_item_or_equip_info(class_id)
    assert(class_id and class_id > 0," class_id must > 0")
    if item_table[class_id] then
        return item_table[class_id]
    else
        return equip_table[class_id]
    end
end

-- 注册其他模块需要收集的道具信息
function register_property_callback(f)
    property_callback[#property_callback + 1] = f
end

local function init()
    -- 加载道具表
    load_item_table()
    load_equip_table()
end
 
-- 模块的入口执行
function create()
    register_post_init(init)
end

create()