GE Lua Documentation

Press F to search!

unpackMod

Definition


-- @/lua/ge/extensions/core/modmanager.lua:1008

local function unpackMod(modname)
  if not mods[modname] then
    guihooks.trigger('modmanagerError', 'Error extracting file:  not existing:' .. tostring(modname))
    return
  end

  local filename = mods[modname].fullpath
  if FS:isMounted(filename) then
    FS:unmount(filename)
  end

  local dir, basefilename, ext = path.splitWithoutExt(filename)
  local targetPathOrg = '/mods/unpacked/' .. basefilename
  local targetPath = targetPathOrg

  local zipOldCopy = deepcopy(mods[filename])
  -- auto-corrects the mount point
  if mods[modname].mountPoint then
    targetPath = targetPath .. '/' .. mods[modname].mountPoint
    mods[modname].mountPoint = nil
  end
  --print("targetPath: " .. targetPath)

  local zip = ZipArchive()
  if not zip:openArchiveName(filename, 'r') then
    guihooks.trigger('modmanagerError', 'Error unpacking mod[ '..modname.. ' ]. ZIP file is not valid')
    return
  end
  local files = zip:getFileList()

  log('D', 'unpackMod', 'Unpacking : ' .. tostring(filename))
  Engine.Platform.taskbarSetProgress(0.0)
  Engine.Platform.taskbarSetProgressState(2)
  --dump(files)
  local extractionRes = true
  for i,v in ipairs(files) do
    --print('extractFile: ' .. tostring(v) .. ' -> ' .. tostring(targetPath) .. v)
    Engine.Platform.taskbarSetProgress(i / #files)
    log('D', 'unpackMod', 'zip-extractfile: ' .. tostring(v) .. ' > ' .. tostring(targetPath .. v))
    if not zip:extractFile(v, targetPath .. v) then
      extractionRes = false
      guihooks.trigger('modmanagerError', 'Error extracting file: ' .. tostring(v))
      log('E', 'unpackMod', 'error extracting file: ' .. tostring(v))
      Engine.Platform.taskbarSetProgressState(4)
    end
  end
  zip:close()

  if not extractionRes then
    safeDeleteFolder(targetPath)
    mods[modname] = zipOldCopy
    guihooks.trigger('modmanagerError', 'Error extracting file: ' .. tostring(v))
    Engine.Platform.taskbarSetProgressState(0)
    return
  end

  if not safeDelete(filename) then
    Engine.Platform.taskbarSetProgressState(4)
    guihooks.trigger('modmanagerError', 'Error : could not safe delete: ' .. dumps(filename))
    log('E', 'unpackMod', 'Error : could not safe delete: ' .. dumps(filename))
    messageBox("BeamNG - Modmager",
    "The zip file could not be deleted properlly.\nThis happens when it's open by another software.\nYou need to close that software and manually delete the file bellow :\n"..dumps(filename), 0, 0)
  end
  Engine.Platform.taskbarSetProgressState(0)

  FS:mount(targetPathOrg)
  mods[modname].dirname, mods[modname].filename = path.split(targetPathOrg)

  mods[modname].orgZipFilename = filename
  mods[modname].unpackedPath = targetPathOrg
  mods[modname].fullpath = targetPathOrg
  mods[modname].stat = FS:stat(targetPathOrg)

  stateChanged()
end

Callers

@/ui/modules/repository/repository.js
      if (vm.localData.packed) {
        bngApi.engineLua('core_modmanager.unpackMod("' + vm.localData.modname + '")')
      } else {
@/ui/modules/modmanager/modmanager.js
        if ($scope.mod.packed) {
          bngApi.engineLua('core_modmanager.unpackMod("' + $scope.mod.modname + '")')
        } else {
@/ui/modules/automation/automation.js
      if (vm.localData.packed) {
        bngApi.engineLua('core_modmanager.unpackMod("' + vm.localData.modname + '")')
      } else {