SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.2 KiB

require "filesystem"
require "util"
require "localization"
local ffi = require "ffi"
local lni = require 'lni-c'
local path = fs.ydwe_path() / 'plugin' / 'w3x2lni' / 'script' / 'prebuilt' / 'default'
local default = {}
local function get_default(type)
if not default[type] then
default[type] = lni(io.load(path / (type .. '.ini')))
end
return default[type]
end
local object = {}
local object_type = {
[0] = 'unit',
[1] = 'item',
[2] = 'destructable',
[3] = 'doodad',
[4] = 'ability',
[5] = 'buff',
[6] = 'upgrade',
}
function object:original_has (this_, id_string_)
local this_ptr_ = ffi.cast('uint32_t*', this_)
local ptr = this_ptr_[7] + 4
local size = this_ptr_[6]
for i = 0, size-2 do
local id = ffi.cast('uint32_t*', ptr)[0]
if string.from_objectid(id) == id_string_ then
return true
end
ptr = ptr + 24
end
return false
end
function object:custom_has (type_, id_string_)
if not object_type[type_] then
return false
end
if not get_default(object_type[type_])[id_string_] then
return false
end
return true
end
-- 在新建物体的时候调用,本函数根据用户的操作决定新ID值
-- object_type - 整数类型,物体的类型
-- default_id - 整数类型,系统生成的ID
-- 返回值:新建物体的最终ID,必须是整数类型
function event.EVENT_NEW_OBJECT_ID(event_data)
log.debug("**************** on new object id start ****************")
local object_type = event_data.object_type
local default_id = event_data.default_id
-- 刷新配置数据
global_config_reload()
-- 如果没有选择手动输入则直接返回
if tonumber(global_config["FeatureToggle"]["EnableManualNewId"]) == 0 then
log.trace("Disable.")
return default_id
end
-- 获取当前窗口
local foregroundWindow = gui.get_foreground_window()
-- 循环直到输入合法或者放弃
while true do
-- 打开对话框让用户输入
local ok, id_string = gui.prompt_for_input(
foregroundWindow, -- 父窗口句柄
_("New Object Id"), -- 标题栏
_("Please input new object ID, or cancel to use the default one."), -- 提示语句
string.from_objectid(default_id), -- 文本编辑区初始文字
_("OK"), -- “确定”按钮文本
_("Cancel") -- “取消"按钮文本
)
-- 用户点了确定,验证输入是否合法。如果点了取消,使用系统默认
if not ok then
log.trace("User cancel.")
return default_id
end
-- 检查输入是否合法(字符串长度是否为4)
if #id_string ~= 4 then
log.trace("User input error(" .. tostring(id_string) .. ").")
-- 提示错误
gui.error_message(foregroundWindow, _("You have entered an invalid ID. The ID must contain just 4 letters or digits. It cannot contain chars other than those in ASCII."))
elseif object:custom_has(object_type, id_string) or object:original_has(event_data.class, id_string) then
log.trace("User input error(" .. tostring(id_string) .. ").")
-- 提示错误
gui.error_message(foregroundWindow, _("You have entered an invalid ID. This ID already exists."))
else
-- 合法,转换为整数返回
log.trace("Result " .. tostring(id_string))
return string.to_objectid(id_string)
end
end
return 0
end