require 'lib.moonloader'
local sampev = require 'lib.samp.events'
local inicfg = require 'inicfg'
script_name("VirtualWorld")
script_author("Noname")
script_version("1.0")
script_description("Пример использования MoonLoader для создания виртуального мира с меткой и телепортацией")
local color_white = 0xFFFFFF -- Белый цвет
local color_green = 0x00FF00 -- Зеленый цвет
local color_blue = 0x0000FF -- Синий цвет
local script_initialized = false
local config = {
virtualWorldActive = false,
virtualWorldCoords = {0, 0, 0},
realWorldCoords = {0, 0, 0},
teleportMarker = {0, 0, 0}
}
local config_file = getWorkingDirectory() .. "\\virtual_world.ini"
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
-- Загрузка конфигурации
if doesFileExist(config_file) then
config = inicfg.load(config, config_file)
else
inicfg.save(config, config_file)
end
-- Ждем, пока SAMP полностью загрузится
while not isSampAvailable() do wait(100) end
-- Вывод информации о скрипте только один раз при запуске
if not script_initialized then
sampAddChatMessage("Активация виртуального мира", color_blue)
sampAddChatMessage(script.this.name .. ' V' .. script.this.version, color_green)
script_initialized = true
end
-- Регистрация команд для управления виртуальным миром
sampRegisterChatCommand("vw", handleVirtualWorldCommand)
sampRegisterChatCommand("teleport", handleTeleportCommand)
sampRegisterChatCommand("marker", handleShowMarkerCommand)
while true do
wait(0)
if config.virtualWorldActive and isKeyJustPressed(VK_Z) then
handleSetMarkerCommand()
end
end
end
function handleVirtualWorldCommand(params)
if params:lower() == "on" then
if config.virtualWorldActive then
sampAddChatMessage("Виртуальный мир уже активен.", color_white)
return
end
-- Активация виртуального мира
config.virtualWorldActive = true
config.realWorldCoords = {getCharCoordinates(PLAYER_PED)}
config.virtualWorldCoords = {getCharCoordinates(PLAYER_PED)}
inicfg.save(config, config_file)
sampAddChatMessage("Виртуальный мир активирован.", color_green)
elseif params:lower() == "off" then
if not config.virtualWorldActive then
sampAddChatMessage("Виртуальный мир не активен.", color_white)
return
end
-- Деактивация виртуального мира
config.virtualWorldActive = false
setCharCoordinates(PLAYER_PED, unpack(config.realWorldCoords))
inicfg.save(config, config_file)
sampAddChatMessage("Виртуальный мир деактивирован.", color_green)
else
sampAddChatMessage("Использование: /vw on/off", color_white)
end
end
function handleSetMarkerCommand()
if not config.virtualWorldActive then
sampAddChatMessage("Установка метки доступна только в виртуальном мире.", color_white)
return
end
-- Получаем координаты курсора на карте
local cursorX, cursorY = getCursorPos()
local worldX, worldY, worldZ = convertScreenCoordsToWorld3D(cursorX, cursorY, 1000)
if worldX and worldY and worldZ then
config.teleportMarker = {worldX, worldY, worldZ}
inicfg.save(config, config_file)
sampAddChatMessage("Метка установлена автоматически.", color_green)
else
sampAddChatMessage("Не удалось получить координаты метки.", color_white)
end
end
function handleTeleportCommand()
if not config.virtualWorldActive then
sampAddChatMessage("Телепортация доступна только в виртуальном мире.", color_white)
return
end
if config.teleportMarker[1] == 0 and config.teleportMarker[2] == 0 and config.teleportMarker[3] == 0 then
sampAddChatMessage("Метка не установлена.", color_white)
return
end
-- Телепортация к метке
setCharCoordinates(PLAYER_PED, unpack(config.teleportMarker))
config.virtualWorldCoords = {unpack(config.teleportMarker)}
sampAddChatMessage(string.format("Вы телепортированы на координаты X:%.2f, Y:%.2f, Z:%.2f", unpack(config.teleportMarker)), color_green)
end
function handleShowMarkerCommand()
if not config.virtualWorldActive then
sampAddChatMessage("Просмотр метки доступен только в виртуальном мире.", color_white)
return
end
if config.teleportMarker[1] == 0 and config.teleportMarker[2] == 0 and config.teleportMarker[3] == 0 then
sampAddChatMessage("Метка не установлена.", color_white)
else
sampAddChatMessage(string.format("Метка установлена на координатах X:%.2f, Y:%.2f, Z:%.2f", unpack(config.teleportMarker)), color_blue)
end
end
function updateVirtualWorld()
-- Обновляем координаты в виртуальном мире
local currentCoords = {getCharCoordinates(PLAYER_PED)}
local velocity = {getCharVelocity(PLAYER_PED)}
config.virtualWorldCoords[1] = config.virtualWorldCoords[1] + velocity[1]
config.virtualWorldCoords[2] = config.virtualWorldCoords[2] + velocity[2]
config.virtualWorldCoords[3] = config.virtualWorldCoords[3] + velocity[3]
setCharCoordinates(PLAYER_PED, unpack(config.virtualWorldCoords))
end
function sampev.onSendPlayerSync(data)
if config.virtualWorldActive then
-- Сервер думает, что вы находитесь в реальном мире
data.position = {unpack(config.realWorldCoords)}
end
end
function doesFileExist(file)
local f = io.open(file, "r")
if f then
io.close(f)
return true
else
return false
end
end