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.

232 lines
7.4 KiB

require "compile.inject_code"
require "compile.native"
local stormlib = require 'ffi.stormlib'
-- 版本信息
ydwe_version = sys.version {}
war3_version = sys.war3_version {}
local function initialize_reg()
local reg = registry.open [[HKEY_CURRENT_USER\Software\Blizzard Entertainment\WorldEdit]]
-- 不弹用户协议
--reg["Has Been Run"] = { registry.REG_DWORD, 1 }
if not reg["Visible UI Elements"] then
-- 关掉刷子表
reg["Visible UI Elements"] = { registry.REG_DWORD, 0x2B }
end
if not reg["New Map On Startup"] then
-- 启动时不创建新地图
reg["New Map On Startup"] = { registry.REG_DWORD, 0 }
end
-- 某些UI的颜色
local reg = registry.open [[HKEY_CURRENT_USER\Software\Blizzard Entertainment\WorldEdit\Trigger Display Colors]]
reg["TC_YDHIDE"] = { registry.REG_DWORD, 0xffff0000 }
reg["TC_COMMENT"] = { registry.REG_DWORD, 0xff008000 }
end
-- 检查魔兽目录下是否有可能引起冲突的文件夹
local function check_conflicting_ui()
log.trace("check_conflicting_ui")
local file_list = {"ui/WarcraftIIIFTLogo.blp", "ui/miscdata.txt", "ui/triggerdata.txt", "ui/triggerstrings.txt", "ui/worldeditdata.txt", "ui/worldeditstrings.txt"}
local found = false
for index, file in ipairs(file_list) do
if fs.exists(fs.war3_path() / file) then
found = true
break
end
end
if found then
if gui.yesno_message(nil, string.format(_("YDWE has detected that there is a directory named \"%s\" located in Warcraft 3 installation directory. It may prevent YDWE from working. Do you want to delete it?"), 'UI'), _("YDWE")) then
for index, file in ipairs(file_list) do
log.debug("remove file " .. (fs.war3_path() / file):string())
pcall(fs.remove_all, fs.war3_path() / file)
end
end
end
end
local function check_conflicting_units()
log.trace("check_conflicting_units")
local units_dir = fs.war3_path() / 'Units'
local found = false
for file in units_dir:list_directory() do
if not fs.is_directory(file) then
found = true
break
end
end
if found then
if gui.yesno_message(nil, _("YDWE has detected that there is a directory named \"%s\" located in Warcraft 3 installation directory. It may prevent YDWE from working. Do you want to delete it?"), 'Units') then
for file in units_dir:list_directory() do
if not fs.is_directory(file) then
log.debug("remove file " .. file:string())
pcall(fs.remove_all, file)
end
end
end
end
end
-- 清除可能引起冲突的文件
local function clear_potential_conflicting()
log.trace("clear_potential_conflicting")
-- 需要清理的文件列表
local file_list = {"MiscData.txt", "TriggerData.txt", "TriggerStrings.txt", "WorldEditData.txt", "WorldEditLayout.txt", "WorldEditStrings.txt", "war3map.j", "blizzard.j", "Scripts/blizzard.j", "common.j", "Scripts/common.j"}
for index, file in ipairs(file_list) do
if fs.exists(fs.war3_path() / file) then
log.debug("remove file " .. (fs.war3_path() / file):string())
pcall(fs.remove, fs.war3_path() / file)
end
end
end
-- 从魔兽中得到是否是1.24。通过搜索common.j有没有导出StringHash
-- 返回值:两个,魔兽版本,错误信息。如果没有错误,错误信息为nil
local function get_war3_version_from_script()
local err = "Cannot extract file from warcraft"
local common_j_path = fs.ydwe_path() / "logs" / "common.j"
local mpq = stormlib.open(fs.war3_path() / 'War3Patch.mpq', true)
if mpq then
if mpq:has_file("common.j") then
mpq:extract("common.j", common_j_path)
elseif mpq:has_file("scripts\\common.j") then
mpq:extract("scripts\\common.j", common_j_path)
else
return war3_version, err
end
mpq:close()
local s, e = io.load(common_j_path)
if not s then
return war3_version, e
end
if s:find("StringHash") then
return war3_version:new(), nil
else
return war3_version:old(), nil
end
end
return war3_version, err
end
-- 检测魔兽的版本
local function check_war3_version()
log.trace("check_war3_version")
-- 检查“版本转换器”等造成的game.dll和war3patch.mpq不一致的问题
if tonumber(global_config["MapSave"]["Option"]) == 0 then
-- 检测魔兽中包含的脚本文件所代表的版本
local script_war3_version, e = get_war3_version_from_script()
if e then
log.warn("Cannot get warcraft 3 version from script: " .. e)
else
-- 二者如果不一致,则提示
if war3_version:is_new() ~= script_war3_version:is_new() then
gui.error_message(nil, _("YDWE has detected that your game.dll and war3patch.mpq mismatch. It may be caused by the so called \"Warcraft Version Converter\". This situation will cause a failure on saving and testing maps. It is strongly recommended to use the offical patched provided by Blizzard."))
end
end
end
end
-- 显示制作者和感谢信息
function show_credit()
we.message_show(" ----------------------------------------------")
we.message_show(" Welcome to WorldEdit ")
we.message_show(" ----------------------------------------------")
we.message_show(" Official website: http://rpg.dz.163.com/")
we.message_show(" ")
we.message_show(" *** THANKS ***")
we.message_show(" YDWE Team")
we.message_show(" JassNewGenPack for ideas at www.wc3c.net")
we.message_show(" Vexorian for his jasshelper compiler")
we.message_show(" ADOLF and VD for their cjass compiler & TESH")
we.message_show(" ...")
we.message_show(" And all users & supporters, including")
we.message_show(" YOU")
end
-- 本函数在编辑器启动时调用,可以在本函数中载入一些插件
-- event_data - 事件参数
-- 暂无内容
-- 返回值:返回非负数表示成功,负数表示失败
function event.EVENT_WE_START(event_data)
log.debug("********************* on startup start *********************")
-- 读取版本
ydwe_version = sys.version { file = fs.ydwe_path() / "ydwe.exe" }
war3_version = sys.war3_version { file = fs.war3_path() / "game.dll" }
log.debug("ydwe version " .. tostring(ydwe_version))
log.debug("war3 version " .. tostring(war3_version))
-- 刷新配置数据
global_config_reload()
-- 检测UI和Units目录
check_conflicting_ui()
check_conflicting_units()
-- 检查魔兽目录下是否有可能引起冲突的文件夹
clear_potential_conflicting()
-- 检测魔兽的版本
check_war3_version()
-- 载入Patch MPQ
mpq_util:load_mpq("units", 14)
mpq_util:load_mpq("war3", 14)
-- 加载插件
plugin:load_all()
-- 初始化UI加载器
uiloader:initialize()
-- 载入注入代码配置
inject_code:initialize()
native:initialize()
initialize_reg()
-- 显示感谢信息
show_credit()
log.debug("********************* on startup end *********************")
return 0
end
-- 本函数在编辑器关闭时调用,可以在本函数中作一些清理工作
-- event_data - 事件参数。table类型,暂时没有内容。
-- 返回值:一定要返回0
function event.EVENT_WE_EXIT(event_data)
log.debug("********************* on exit start *********************")
plugin:unload_all()
log.debug("********************* on exit end *********************")
return 0
end
-- 在WE载入MSS引擎解码器时调用,过滤载入的dll
-- event_data - 事件参数,table,包含以下值
-- library_name - 解码器路径,字符串
-- 返回非负数表示允许载入,负数表示不允许。无特殊情况一般返回0
function event.EVENT_MSS_LOAD(event_data)
log.debug("Loading provider " .. event_data.library_name)
-- 全部放行
return 0
end