Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

Кто может подправить ресурс на ночь(она просто ахрененно тёмная)

local maxDarkness = 0.10 -- [1] = lightest || [0] = darkest 
local speed = 0.001 
  
-- Default variables you shouldn't alter. 
local b = 1 
local shaderList = {} 
local fading = false 
  
-- Feel free to add more removables. 
local removables = { 
    'tx*', 
    'coronastar', 
    'shad_exp*', 
    'radar*', 
    '*icon', 
    'font*', 
    'lampost_16clr', 
    'headlight', 
    'vehiclegeneric256' 
} 
  
function night_init() 
    if getVersion ().sortable < '1.1.0' then 
        outputChatBox('Night shader is not compatible with this client.') 
        return false 
    end 
  
    local testShader, tec = dxCreateShader('night.fx') 
    if not testShader then 
        outputChatBox('Could not create night shader. Please use debugscript 3') 
    else 
        for c=65,96 do 
            local clone = dxCreateShader('night.fx') 
            engineApplyShaderToWorldTexture(clone, string.format('%c*', c + 32)) 
            for i,v in pairs(removables) do 
                engineRemoveShaderFromWorldTexture(clone, v) 
            end 
            table.insert(shaderList, clone) 
        end 
    end 
  
    addEventHandler('onClientHUDRender', root, night_render) 
    nightTimer = setTimer(night_check, 1000, 0) 
end 
  
function night_check() 
    local hours, minutes = getTime() 
    if hours >= 5 and hours < 12 then 
        fading = false 
    elseif hours >= 12 and hours < 15 then 
        fading = false 
    elseif hours >= 15 and hours < 21 then 
        fading = false 
    elseif hours >= 21 and hours < 5 then 
        fading = false 
    else 
        fading = true 
    end 
end 
  
function night_render() 
    local int, dim = getElementInterior(localPlayer), getElementDimension(localPlayer) 
    if fading then 
        if b > maxDarkness then 
            b = b - speed 
        elseif b <= maxDarkness then 
            b = maxDarkness 
        end 
    else 
        if b < 1.0 then 
            b = b + speed 
        elseif b >= 1.0 then 
            b = 1.0 
        end 
    end 
    for _,shader in ipairs(shaderList) do 
        if int == 0 and dim == 0 then 
            dxSetShaderValue(shader, 'NIGHT', b, b, b) 
        else 
            dxSetShaderValue(shader, 'NIGHT', 1.0, 1.0, 1.0) 
        end 
    end 
end 
  
night_init() 

подправьте пожалуйста а то ночь как будто вечная получается

Link to comment

Такой вопрос, можно ли проверить стоит игрок под навесом или объектом или нет, т.е. нужно определить при дожде попадает ли дождь на него.

Link to comment
Такой вопрос, можно ли проверить стоит игрок под навесом или объектом или нет, т.е. нужно определить при дожде попадает ли дождь на него.

На стороне клиента используй:

processLineOfSight 

. Вверх от игрока на единиц 200, а потом проверяй попал ли в этот промежуток какой-либо объект.

Link to comment

ERROR: Aborting; infinite running script in !Kript 

Это как я понимаю из-за того, что в моем коде очень большой цикл.

Но что делать, если мне его реально 1 853 440 раз надо выполнить :evil:

Link to comment
Но что делать, если мне его реально 1 853 440 раз надо выполнить :evil:

Ого, а не перебор? Все-таки есть какой-то лимит на циклы, точно его не знаю. Да и к тому же особо длинные циклы все равно зависят от железа и могут с трудом выполняться на слабых машинах.

Link to comment

эмм, я почти уверен что данный скрипт будет выполнятся на хороших машинах. Попробовал чтобы подавало данные пачками, вроде все ок.

+ это полезная штука, зашифровать некоторые файлы, чтобы отпугнуть потенцияльных воров

Link to comment

Есть в Lua такая штука, называется coroutines. С помощью нее в мап едиторе решили проблему вот этих вот бесконечных циклов. Идея в том, что цикл работает какое-то время, затем прерывается и делает перерыв. А затем опять запускается и так по кругу.

Link to comment

DakiLLa, я думаю это хорошая вещь, но, посмотрев на время выполнения, понял, что надо что-то менять. Шифровка/расшифровка всего файла 1.1 МБ по обычной маске XOR занимает примерно 4698.0000000005( я робот ) секунд. Примерно 240 байт в милисекунду. Буду кодировать только некоторые части файла, чтобы процесс занимал меньше чкм полсекунды времени и, конечно же, как можно развратне ломал файл.

Link to comment

Во всех файлах есть такая штука как header... То-есть, все файлы определенного типа содержат несколько одинаковых битов в самом начале... Зная эти биты, можно однозначно идентифицировать тип файла ( Для этого, собственно, и используются эти биты )... Соответственно, в твоем случае, эти несколько бит можно убрать, а затем подставлять обратно при необходимости.

P.S. Шаришь в булевой алгебре? Алгоритм у тебя завязан на ( byte1 xor byte 2 ) = byte3 => ( byte3 xor byte2 ) = byte1?

Как ты вообще это реализовать пытаешься?

Link to comment

это то обновление, которое прошло незамеченным.

header - в linux, как я помню, это называется "волшебные байты", именно их и есть смысл скрывать + возможное изменение имени файла.

Просто так убирать эти байты бессмысленно, т.к. мы не сможем их потом вставить ( имеется в виду то, что при записи мы не сможем их вставить, не убрав остальные. это как попробовать нажать insert в noterpade и начать печатать сначала файла ).

Тогда надо делать так - попросить у сервера маску :arrow: раскодировать :arrow: использовать :arrow: закодировать обратно :redhotevil:

список файлов для кодирования ставить для клиента в корневой папке ресурса ... хватит подробностей, это надо делать, а не тупо по клаве стучать.

UPD: Fail, что-то он не хочет писать вместо существующего.

UPD2: Аха-ха-ха исправил

Link to comment

Нет-нет, про функцию XOR, введенную в MTA недавно, я знаю. Зачем вставлять байты в существующий файл, просто создаешь новый файл, в котором уже сначала идет header, а дальше необходимые байты.

По поводу алгоритма шифрования ты так и не ответил.

И как ты, используя MTA, работаешь с байтами в файле?

Link to comment
Нет-нет, про функцию XOR, введенную в MTA недавно, я знаю. Зачем вставлять байты в существующий файл, просто создаешь новый файл, в котором уже сначала идет header, а дальше необходимые байты.

1. Размер необходимый для совершения операции.

2. Скорость ( может быть спорным )

3. Юзабилити. Надо, чтобы админ произвел как можно меньше телодвижений, чтобы все заработало. Т.е если у человека сотня файлов, то надо сделать так, чтобы их не надо было переименовывать в ресурсе. Да и чтобы не своровали.

И как ты, используя MTA, работаешь с байтами в файле?

string.byte (s [, i [, j]])

Возвращает числовые коды символов s, s[i+1], ···, s[j]. По умолчанию значение для i равно 1; по умолчанию значение для j равно i.

string.char (···)

Принимает 0 или более целых чисел. Возвращает строку, длина которой равна количеству параметров, и каждый элемент строки установлен равным соответствующему параметру.

Признаюсь, на последнем требуется хорошая фантазия, чтобы понять что том написано.

string.char (···)

Принимает 0 или более целых чисел ( ну да, это всем понятно ) и возвращает строку в котором каждый символ имеет числовой код, соответствующий числу.

В ASCII каждый символ кодируется одним байтом. Если мы раскодируем строку "Ј" то ( на win ) получим числа <32 одно 71.

Можно радоваться, основа работает, надо подкрутить юзабилити.

UPD: огромное скриптерское НЯ

Link to comment

в скрипте будет таблица такого вида.

local cars = {{579,60000 },{400,60000},{404,28000},{489,65000},{505,65000},{479,45000},{442,45000} } 

Создаешь в этих массивах третий параметр.

local cars = {{579,60000, 'Тачка' },{400,60000, 'колеса' },{404,28000, 'еще кое че'},{489,65000},{505,65000},{479,45000},{442,45000} } 

Ищешь цикл, в котором этим элементам, будут соответствовать имена в списке. В моем случае это было

for i,v in ipairs (cars) do 
    local carName = getVehicleNameFromModel (v[1]) 
    local row = guiGridListAddRow (carGridList) 
    guiGridListSetItemText (carGridList, row, 1, carName, false, true) 
    guiGridListSetItemText (carGridList, row, 2, tostring(v[2]), false, true) 
end 

Меняешь вторую строку здесь на строку.

local carName = v[3] or getVehicleNameFromModel (v[1]) -- если не будет имени в таблице, то ищется стандартное 

далее делаем так

local _getVehicleModelFromName = getVehicleModelFromName 
  
function getVehicleModelFromName( name ) 
    for i, carInfo in ipairs( cars ) do 
        if carInfo[3] and carInfo[3] == name then 
            return carInfo[1] 
        end 
    end 
    return _getVehicleModelFromName( name ) 
end 

Link to comment
в скрипте будет таблица такого вида.
local cars = {{579,60000 },{400,60000},{404,28000},{489,65000},{505,65000},{479,45000},{442,45000} } 

Создаешь в этих массивах третий параметр.

local cars = {{579,60000, 'Тачка' },{400,60000, 'колеса' },{404,28000, 'еще кое че'},{489,65000},{505,65000},{479,45000},{442,45000} } 

Ищешь цикл, в котором этим элементам, будут соответствовать имена в списке. В моем случае это было

for i,v in ipairs (cars) do 
    local carName = getVehicleNameFromModel (v[1]) 
    local row = guiGridListAddRow (carGridList) 
    guiGridListSetItemText (carGridList, row, 1, carName, false, true) 
    guiGridListSetItemText (carGridList, row, 2, tostring(v[2]), false, true) 
end 

Меняешь вторую строку здесь на строку.

local carName = v[3] or getVehicleNameFromModel (v[1]) -- если не будет имени в таблице, то ищется стандартное 

далее делаем так

local _getVehicleModelFromName = getVehicleModelFromName 
  
function getVehicleModelFromName( name ) 
    for i, carInfo in ipairs( cars ) do 
        if carInfo[3] and carInfo[3] == name then 
            return carInfo[1] 
        end 
    end 
    return _getVehicleModelFromName( name ) 
end 

Вот и именно что нету там такого (((

Link to comment

У меня тут есть кое что мне нужно сделать магазин на сервер допустим у меня имеется маркер как к нему привязать GUI окошко и так что бы его можно было открыт вставая на маркер и нажать на определённую кнопочку + как мне пополнить список покупок окна у меня имеются вот одно из них

GUIEditor_Window = {} 
GUIEditor_Button = {} 
GUIEditor_Grid = {} 
  
GUIEditor_Window[1] = guiCreateWindow(729,400,755,559,"Оружие",false) 
GUIEditor_Button[1] = guiCreateButton(562,491,159,44,"Закрыть",false,GUIEditor_Window[1]) 
GUIEditor_Grid[1] = guiCreateGridList(14,27,727,437,false,GUIEditor_Window[1]) 
guiGridListSetSelectionMode(GUIEditor_Grid[1],2) 

Буду очень признателен

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...