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
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
|
|
|