diff --git a/Applications.txt b/Applications.txt
index 512b5dad..07c62142 100644
--- a/Applications.txt
+++ b/Applications.txt
@@ -491,6 +491,12 @@
["type"]="Script",
["version"]=1.0,
},
+ {
+ ["name"]="MineOS/System/InfoPanel/Приват",
+ ["url"]="IgorTimofeev/OpenComputers/master/Applications/InfoPanel/Claims.txt",
+ ["type"]="Script",
+ ["version"]=1.0,
+ },
----------------------------------------------------- Приложения с ресурсами --------------------------------------------------------------------------
diff --git a/Applications/InfoPanel/About.txt b/Applications/InfoPanel/About.txt
new file mode 100644
index 00000000..b82f7960
--- /dev/null
+++ b/Applications/InfoPanel/About.txt
@@ -0,0 +1 @@
+Эта программа предназначена для визуального отображения информации для пользователей компьютера, она идеально впишется в ваш спавн, дом или милитаризированный бункер. Файлы с информацией хранятся в папке MineOS/System/InfoPanel, вы можете изменить их в любое время.
\ No newline at end of file
diff --git a/Applications/InfoPanel/Claims.txt b/Applications/InfoPanel/Claims.txt
new file mode 100644
index 00000000..24da2372
--- /dev/null
+++ b/Applications/InfoPanel/Claims.txt
@@ -0,0 +1,27 @@
+ Приват
+
+Для привата и защиты от гриферства используется плагин 0xFFAA00GriefPrevention0xFFFFFF.
+В отличие от других плагинов, он крайне удобен в использовании и имеет
+хорошую защиту от хитрецов. Сам приват осуществляется 0xFFAA00золотой лопатой0xFFFFFF, а
+проверка территории на наличие приватных зон - 0xFFAA00деревянной палкой0xFFFFFF. При
+выделении территории ее размер считается только в одной плоскости,
+автоматически расширяясь до предела вверх и вниз.
+
+Основная фишка в том, что на старте вам дается 0xFFAA001500 блоков0xFFFFFF для привата,
+что вполне достаточно для дома средних размеров. За каждый час игры на
+сервере вам начисляется дополнительно 0xFFAA0050 блоков0xFFFFFF, то есть чем дольше вы
+играете, тем больших размеров территорию вы способны заприватить. Ниже
+приведены основные команды, которые помогут вам в будущем.
+
+● 0xFFAA00/abandomclaim0xFFFFFF - удалить существующий приват. Для удаления встаньте в
+ его границы.
+● 0xFFAA00/trust [Никнейм]0xFFFFFF - дать указанному игроку строить и взаимодействовать
+ с блоками в вашем привате.
+● 0xFFAA00/permissiontrust [Никнейм]0xFFFFFF - дать указанному игру полные права на
+ модификацию вашего привата, т.е. указанный индивид сможет добавлять
+ новых людей в ваш приват, а также удалять сам приват.
+● 0xFFAA00/untrust [Никнейм]0xFFFFFF - удалить все права на ваш приват у указанного
+ игрока.
+
+
+0xFFFFFF
\ No newline at end of file
diff --git a/Applications/Motd/motd.lua b/Applications/Motd/motd.lua
index d2287128..7ed1b3cf 100644
--- a/Applications/Motd/motd.lua
+++ b/Applications/Motd/motd.lua
@@ -9,11 +9,13 @@ if not component.isAvailable("gpu") then
return
end
+ecs.prepareToExit()
+
local gpu = component.gpu
-local lines = {_OSVERSION .. ", " .. math.floor(computer.totalMemory() / 1024) .. "KB RAM"}
+local lines = { "OpenOS (customized by ECS), " .. math.floor(computer.totalMemory() / 1024) .. "KB RAM"}
local maxWidth = unicode.len(lines[1])
-local f = io.open("/usr/misc/greetings/".._OSLANGUAGE..".txt")
+local f = io.open("/usr/misc/greetings/" .. _G.OSSettings.language .. ".txt")
if f then
local greetings = {}
pcall(function()
diff --git a/Applications/init.lua b/Applications/init.lua
index 653b18ef..3b833c70 100644
--- a/Applications/init.lua
+++ b/Applications/init.lua
@@ -181,16 +181,16 @@ do
end
--Загружаем необходимые библиотеки, дабы избежать потерь памяти
-_G._OSLANGUAGE = require("MineOS/System/OS/Language")
_G.computer = require("computer")
_G.ecs = require("ECSAPI")
_G.component = require("component")
_G.gpu = _G.component.gpu
---Oткрываем порт для беспороводных MineOS-соединений
-if component.isAvailable("modem") then component.modem.open(512) end
+--Загружаем параметры ОС
+ecs.loadOSSettings()
+_G._OSLANGUAGE = _G.OSSettings.language
---Масштаб
+--Выставляем адекватный масштаб монитора
ecs.setScale(1)
--Сообщаем системе, что все прогружено и готово к работе
diff --git a/MineOS/OS.lua b/MineOS/OS.lua
index e6707a62..f25ca22a 100644
--- a/MineOS/OS.lua
+++ b/MineOS/OS.lua
@@ -36,7 +36,7 @@ for comp in pairs(components) do if not _G[comp] then _G[comp] = _G.component[co
libraries, components = nil, nil
-- Загрузка языкового пакета
-local lang = config.readAll("MineOS/System/OS/Languages/".._G._OSLANGUAGE..".lang")
+local lang = config.readAll("MineOS/System/OS/Languages/" .. _G.OSSettings.language .. ".lang")
---------------------------------------------- Переменные ------------------------------------------------------------------------
diff --git a/lib/ECSAPI.lua b/lib/ECSAPI.lua
index 7b4f88bd..ebdc0b38 100644
--- a/lib/ECSAPI.lua
+++ b/lib/ECSAPI.lua
@@ -10,7 +10,7 @@ local libraries = {
["keyboard"] = "keyboard",
["computer"] = "computer",
["serialization"] = "serialization",
- --["internet"] = "internet",
+ ["internet"] = "internet",
--["image"] = "image",
}
@@ -216,7 +216,6 @@ end
--Загрузка файла с инета
function ECSAPI.getFileFromUrl(url, path)
- if not _G.internet then _G.internet = require("internet") end
local sContent = ""
local result, response = pcall(internet.request, url)
if not result then
@@ -917,21 +916,41 @@ function ECSAPI.emptyWindow(x,y,width,height,title)
end
--Функция по переносу слов на новую строку в зависимости от ограничения по ширине
-function ECSAPI.stringWrap(text, limit)
- --Получаем длину текста
- local sText = unicode.len(text)
- --Считаем количество строк, которое будет после парсинга
- local repeats = math.ceil(sText / limit)
- --Создаем массив этих строк
+function ECSAPI.stringWrap(strings, limit)
local massiv = {}
- local counter
- --Парсим строки
- for i = 1, repeats do
- counter = i * limit - limit + 1
- table.insert(massiv, unicode.sub(text, counter, counter + limit - 1))
- end
- --Возвращаем массив строк
- return massiv
+
+ --Перебираем все указанные строки
+ for i = 1, #strings do
+
+ --Создаем массив слов данной строки
+ local words = {}
+ for match in string.gmatch(strings[i], "[^%s]+") do table.insert(words, match) end
+
+ --Если длина слов не превышает лимита
+ if unicode.len(strings[i]) <= limit then
+ table.insert(massiv, table.concat(words, " "))
+ else
+ --Перебираем все слова данной строки с 1 до конца
+ local from = 1
+ local to = 1
+ while to <= #words do
+ --Если длина соединенных слов превышает лимит, то
+ if unicode.len(table.concat(words, " ", from, to)) > limit then
+ --Вставить в новый массив строк
+ table.insert(massiv, table.concat(words, " ", from, to - 1))
+ from = to
+ else
+ if to == #words then
+ table.insert(massiv, table.concat(words, " ", from, to))
+ end
+ end
+
+ to = to + 1
+ end
+ end
+ end
+
+ return massiv
end
--Моя любимая функция ошибки C:
@@ -1338,7 +1357,7 @@ end
--Получение верного имени языка. Просто для безопасности. (для операционки)
function ECSAPI.getCorrectLangName(pathToLangs)
- local language = _OSLANGUAGE .. ".lang"
+ local language = _G.OSSettings.language .. ".lang"
if not fs.exists(pathToLangs .. "/" .. language) then
language = "English.lang"
end
@@ -1358,22 +1377,6 @@ end
-------------------------ВСЕ ДЛЯ ОСКИ-------------------------------------------------------------------------------
---Список файлов, не требующих отрисовки
-local systemFiles = {
- "bin/",
- "lib/",
- "OS.lua",
- "autorun.lua",
- "init.lua",
- "tmp/",
- "usr/",
- "mnt/",
- "etc/",
- "boot/",
- "Finder.app/"
- --"MineOS/System/",
-}
-
function ECSAPI.sortFiles(path, fileList, sortingMethod, showHiddenFiles)
local sortedFileList = {}
if sortingMethod == "type" then
@@ -1423,65 +1426,45 @@ function ECSAPI.sortFiles(path, fileList, sortingMethod, showHiddenFiles)
return sortedFileList
end
--- local fileList1 = ECSAPI.getFileList("MineOS/System/OS/")
+--Сохранить файл конфигурации ОС
+function ECSAPI.saveOSSettings()
+ local pathToOSSettings = "MineOS/System/OS/OSSettings.cfg"
+ if not _G.OSSettings then error("Массив настроек ОС отсутствует в памяти!") end
+ fs.makeDirectory(fs.path(pathToOSSettings))
+ local file = io.open(pathToOSSettings, "w")
+ file:write(serialization.serialize(_G.OSSettings))
+ file:close()
+end
--- local fileList2 = ECSAPI.sortFiles("MineOS/System/OS/", fileList1, "date", true)
+--Загрузить файл конфигурации ОС, а если его не существует, то создать
+function ECSAPI.loadOSSettings()
+ local pathToOSSettings = "MineOS/System/OS/OSSettings.cfg"
+ if fs.exists(pathToOSSettings) then
+ local file = io.open(pathToOSSettings, "r")
+ _G.OSSettings = serialization.unserialize(file:read("*a"))
+ file:close()
+ else
+ _G.OSSettings = { showHelpOnApplicationStart = true, language = "Russian" }
+ ECSAPI.saveOSSettings()
+ end
+end
--- for i = 1, #fileList1 do
--- print(tostring(fileList1[i]) .. " -> "..tostring(fileList2[i]))
--- end
+--Отобразить окно с содержимым файла информации о приложении
+function ECSAPI.applicationHelp(pathToApplication)
+ local pathToAboutFile = pathToApplication .. "/resources/About.txt"
+ if fs.exists(pathToAboutFile) and _G.OSSettings and _G.OSSettings.showHelpOnApplicationStart then
+ local applicationName = fs.name(pathToApplication)
+ local file = io.open(pathToAboutFile, "r")
+ local text = ""
+ for line in file:lines() do text = text .. line .. " " end
+ file:close()
---Перехуяривалка файлового порядка для операционки. Говнокод, переделать!
-function ECSAPI.reorganizeFilesAndFolders(massivSudaPihay, showHiddenFiles, showSystemFiles)
-
- local massiv = {}
- local workPath = fs.path(massivSudaPihay[1] or "/") or ""
-
- for i = 1, #massivSudaPihay do
- if ECSAPI.isFileHidden(massivSudaPihay[i]) and showHiddenFiles then
- table.insert(massiv, massivSudaPihay[i])
+ local data = ECSAPI.universalWindow("auto", "auto", 52, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x262626, "О приложении " .. applicationName}, {"EmptyLine"}, {"TextField", 14, 0xffffff, 0x262626, 0xcccccc, 0x3366CC, text}, {"EmptyLine"}, {"Switch", 0x3366CC, 0xffffff, 0x262626, "Показывать информацию о приложениях", true}, {"EmptyLine"}, {"Button", {ECSAPI.colors.green, 0xffffff, "OK"}})
+ if data[1] == false then
+ _G.OSSettings.showHelpOnApplicationStart = false
+ ECSAPI.saveOSSettings()
end
end
-
- for i = 1, #massivSudaPihay do
- local cyka = massivSudaPihay[i]
- if fs.isDirectory(cyka) and not ECSAPI.isFileHidden(cyka) and ECSAPI.getFileFormat(cyka) ~= ".app" then
- table.insert(massiv, cyka)
- end
- cyka = nil
- end
-
- for i = 1, #massivSudaPihay do
- local cyka = massivSudaPihay[i]
- if (not fs.isDirectory(cyka) and not ECSAPI.isFileHidden(cyka)) or (fs.isDirectory(cyka) and not ECSAPI.isFileHidden(cyka) and ECSAPI.getFileFormat(cyka) == ".app") then
- table.insert(massiv, cyka)
- end
- cyka = nil
- end
-
-
- if not showSystemFiles then
- if workPath == "" or workPath == "/" then
- --ECSAPI.error("Сработало!")
- local i = 1
- while i <= #massiv do
- for j = 1, #systemFiles do
- --ECSAPI.error("massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
- if massiv[i] == systemFiles[j] then
- --ECSAPI.error("Удалено! massiv[i] = " .. massiv[i] .. ", systemFiles[j] = "..systemFiles[j])
- table.remove(massiv, i)
- i = i - 1
- break
- end
-
- end
-
- i = i + 1
- end
- end
- end
-
- return massiv
end
--Создать ярлык для конкретной проги (для операционки)
@@ -1650,6 +1633,7 @@ function ECSAPI.launchIcon(path, arguments)
local isDirectory = fs.isDirectory(path)
--Если это приложение
if fileFormat == ".app" then
+ ECSAPI.applicationHelp(path)
local cyka = path .. "/" .. ECSAPI.hideFileFormat(fs.name(path)) .. ".lua"
local success, reason = shell.execute(cyka)
if not success then ECSAPI.displayCompileMessage(1, reason, true) end
@@ -1708,10 +1692,6 @@ end
-
-
-
-
---------------------------------------------ОКОШЕЧКИ------------------------------------------------------------
@@ -1786,7 +1766,7 @@ function ECSAPI.universalWindow(x, y, width, background, closeWindowAfter, ...)
height = height + objects[i][2]
elseif objectType == "wrappedtext" then
--Заранее парсим текст перенесенный
- objects[i].wrapped = ECSAPI.stringWrap(objects[i][3], width - 4)
+ objects[i].wrapped = ECSAPI.stringWrap({objects[i][3]}, width - 4)
objects[i].height = #objects[i].wrapped
height = height + objects[i].height
else
@@ -1991,9 +1971,9 @@ function ECSAPI.universalWindow(x, y, width, background, closeWindowAfter, ...)
elseif objectType == "textfield" then
newObj("TextFields", number, x + 1, objects[number].y, x + width - 2, objects[number].y + objects[number][2] - 1)
- if not objects[number].strings then objects[number].strings = ECSAPI.stringWrap(objects[number][7], width - 5) end
+ if not objects[number].strings then objects[number].strings = ECSAPI.stringWrap({objects[number][7]}, width - 7) end
objects[number].displayFrom = objects[number].displayFrom or 1
- ECSAPI.textField(x + 1, objects[number].y, width - 2, objects[number][2], objects[number].strings, objects[number].displayFrom, objects[number][3], objects[number][4], objects[number][5], objects[number][6])
+ ECSAPI.textField(x + 2, objects[number].y, width - 4, objects[number][2], objects[number].strings, objects[number].displayFrom, objects[number][3], objects[number][4], objects[number][5], objects[number][6])
elseif objectType == "wrappedtext" then
gpu.setBackground(background)
@@ -2029,18 +2009,18 @@ function ECSAPI.universalWindow(x, y, width, background, closeWindowAfter, ...)
local xPos, yPos = x + 2, objects[number].y
local activeColor, passiveColor, textColor, text, state = objects[number][2], objects[number][3], objects[number][4], objects[number][5], objects[number][6]
- local switchWidth = 10
+ local switchWidth = 8
ECSAPI.colorTextWithBack(xPos, yPos, textColor, background, text)
xPos = x + width - switchWidth - 2
if state then
ECSAPI.square(xPos, yPos, switchWidth, 1, activeColor)
ECSAPI.square(xPos + switchWidth - 2, yPos, 2, 1, passiveColor)
- ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, activeColor, "ON")
+ --ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, activeColor, "ON")
else
ECSAPI.square(xPos, yPos, switchWidth, 1, passiveColor - 0x444444)
ECSAPI.square(xPos, yPos, 2, 1, passiveColor)
- ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, passiveColor - 0x444444, "OFF")
+ --ECSAPI.colorTextWithBack(xPos + 4, yPos, passiveColor, passiveColor - 0x444444, "OFF")
end
newObj("Switches", number, xPos, yPos, xPos + switchWidth - 1, yPos)
end
@@ -2343,6 +2323,8 @@ end
----------------------------------------------------------------------------------------------------
+ECSAPI.applicationHelp("MineOS/Applications/InfoPanel.app")
+
return ECSAPI