Jump to content

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


Recommended Posts

код ниже - это анти флуд.

мне надо сделать чтобы в чат можно было писать раз в минуту...

где, и что изменить?)

подскажите пожалуйста.

  
  
local gPlayerTickCount = { } 
local gPlayerSpams = { } 
local gPlayerMessage = { } 
local gPlayerMsgNum = { } 
local gPlayerMuteTimer = { } 
  
local gSettings = { } 
  
addEventHandler( "onPlayerChat", getRootElement( ), 
    function( message ) 
        if not gPlayerSpams[ source ] then 
            gPlayerSpams[ source ] = true 
            gPlayerTickCount[ source ] = getTickCount( ) 
            gPlayerMessage[ source ] = message 
        else 
            if getTickCount( ) - gPlayerTickCount[ source ] > gSettings.delay then 
                gPlayerMsgNum[ source ] = 0 
                gPlayerMessage[ source ] = nil; 
                gPlayerTickCount[ source ] = getTickCount( ) 
                return 
            else 
                if gPlayerMsgNum[ source ] >= gSettings.msgNum then 
                    gPlayerTickCount[ source ] = getTickCount( ) 
                    cancelEvent( ) 
                    if gSettings.mutePlayers then 
                        mutePlayer( source ); 
                    end 
                elseif message == gPlayerMessage[ source ] then 
                    cancelEvent( ) 
                    outputChatBox( "Don't repeat yourself!!!", source, 255, 0, 0 ) 
                end 
                gPlayerMsgNum[ source ] = gPlayerMsgNum[ source ] + 1 
            end 
        end 
        gPlayerMessage[ source ] = message 
    end 
) 
  
function mutePlayer( player ) 
    setPlayerMuted( player, true ); 
    gPlayerMuteTimer[ player ] = setTimer( unmutePlayer, gSettings.muteTime * 1000, 1, player ); 
    outputChatBox( "Don't flood the chat!!! You are now muted for " .. gSettings.muteTime .." seconds.", player, 255, 0, 0 ) 
end 
  
function unmutePlayer( player ) 
    setPlayerMuted( player, false ); 
    outputChatBox( "You can talk again. Remeber, do NOT spam!", player, 255, 0, 0 ); 
end 
  
addEventHandler( "onPlayerJoin", getRootElement( ), 
    function( ) 
        gPlayerMsgNum[ source ] = 0 
    end 
) 
  
addEventHandler( "onResourceStart", getResourceRootElement( getThisResource() ), 
    function( ) 
        gSettings.delay = get( "@differenceBetweenMessages_ms" ) 
        gSettings.msgNum = get( "@messagesNumber" ) 
        gSettings.mutePlayers = ( get( "@mutePlayers" ) == "true" ) and true or false; 
        gSettings.muteTime = get( "@muteTime" ); 
        for _, plr in pairs( getElementsByType( "player" ) ) do 
            gPlayerMsgNum[ plr ] = 0 
        end 
    end 
) 
  
addEventHandler( "onResourceStop", getResourceRootElement(), 
    function( ) 
        local players = getElementsByType( "player" ); 
        for i, plr in pairs( players ) do 
            if isPlayerMuted( plr ) then 
                setPlayerMuted( plr, false ); 
            end 
        end 
    end 
) 
  
  
  

Link to comment

1.

gSettings.muteTime = get( "@muteTime" ); 

ищи это в Мете(meta.xml)

2.

getAccountName 
isObjectInACLGroup 
aclGetGroup 

Ну и как пример

local accName =  getAccountName ( getPlayerAccount ( source ) ) 
if isObjectInACLGroup ( "user." .. tostring( accName ), aclGetGroup( "Admin" ) ) then 
    --Чё то делать или не делать 
end 

source - в данном случае игрок в евенте onPlayerChat

не забывай что у людей может не быть аккаунта

думай сам как это совместить, если не получится помогу дальше

Link to comment
эмм... ну в этом я вообще не шарю. как и что совмещать.

а так ясно, спасибо.

понял что просто так никто не поможет.

ничего, обойдусь тогда без анти-флуда.. что уж поделать.

пфф на столько ленивый народ пошёл что даже не могут попробовать, и учиться не хотят.

Заметь тут топик Помощь по скриптингу

А не топик Сделай за меня

Link to comment

Вроде за время между отправкой сообщений в данном ресурсе отвечает настройка "@differenceBetweenMessages_ms".

Попробуй изменить ее в meta.xml.Вроде за время между отправкой сообщений в данном ресурсе отвечает настройка

Вот код отключения AntiFlood для админов: (Замени код эвента onPlayerChat)

addEventHandler( "onPlayerChat", getRootElement( ), 
    function( message ) 
        if ( isObjectInACLGroup ( "user." ..getAccountName ( getPlayerAccount ( source ) ), aclGetGroup( "Admin" ) ) ) then 
            if not gPlayerSpams[ source ] then 
                gPlayerSpams[ source ] = true 
                gPlayerTickCount[ source ] = getTickCount( ) 
                gPlayerMessage[ source ] = message 
            else 
                if getTickCount( ) - gPlayerTickCount[ source ] > gSettings.delay then 
                    gPlayerMsgNum[ source ] = 0 
                    gPlayerMessage[ source ] = nil; 
                    gPlayerTickCount[ source ] = getTickCount( ) 
                    return 
                else 
                    if gPlayerMsgNum[ source ] >= gSettings.msgNum then 
                        gPlayerTickCount[ source ] = getTickCount( ) 
                        cancelEvent( ) 
                        if gSettings.mutePlayers then 
                            mutePlayer( source ); 
                        end 
                    elseif message == gPlayerMessage[ source ] then 
                        cancelEvent( ) 
                        outputChatBox( "Don't repeat yourself!!!", source, 255, 0, 0 ) 
                    end 
                    gPlayerMsgNum[ source ] = gPlayerMsgNum[ source ] + 1 
                end 
            end 
            gPlayerMessage[ source ] = message 
        end 
    end 
) 

Link to comment
эмм... ну в этом я вообще не шарю. как и что совмещать.

а так ясно, спасибо.

понял что просто так никто не поможет.

ничего, обойдусь тогда без анти-флуда.. что уж поделать.

пфф на столько ленивый народ пошёл что даже не могут попробовать, и учиться не хотят.

у меня турнир в воскресенье, и учиться некогда, ок.

Заметь тут топик Помощь по скриптингу

А не топик Сделай за меня

эта тема где пользователи задают вопросы, на которые хотят получить ответы.

и я не написал "сделайте мне это!". я просто задал вопрос. а если бы уж так написал, то конечно же предложил бы какую-нить сумму для выполнения моей проблеммы (работы).

и если ты до&^%я умный, то оставь это при себе пожалуйста.

мне кстати скоро надо будет написать мод под заказ, где я и напиашу "Сделай за меня", а я заплачу за это соответствующую цену.

а так, Flaker, спасибо большое за помощь, позже попробую это сделать :):)

Link to comment
у меня турнир в воскресенье, и учиться некогда, ок.

Держите нас в курсе.

эта тема где пользователи задают вопросы, на которые хотят получить ответы.

Да, а не готовые решения.

и я не написал "сделайте мне это!". я просто задал вопрос.
мне надо сделать чтобы в чат можно было писать раз в минуту...

где, и что изменить?)

TwiX дал ответ где и что изменить

эмм... ну в этом я вообще не шарю. как и что совмещать.
понял что просто так никто не поможет.

TwiX уже помог, дав ответ на поставленный вопрос

и если ты до&^%я умный, то оставь это при себе пожалуйста.

Если вы до&^%я глупый, то надо учиться.

Кстати, год назад этот человек (Nanotech.ua) писал следующее:

Поясните мне нубу, пожалуйста! Что я не так делаю?) Я, какбы сказать, только 2-й день занимаюсь скриптингом в МТА, так что прошу не орать на меня в данной теме)

А потом мне в ПМ доказывал, что будет открывать свой сайт с полезными уроками для новичков.

Ну что же, за год никаких знаний не прибавилось, о чем тут говорить :lol:

Link to comment

Привет всем, не могу что то разобраться с getCursorPosition. Я сделал вот такой вот код для создания взрыва на месте клика

: 
bindKey ( "mouse1", "down", function ()  
        no1, no2, cursX, cursY, cursZ = getCursorPosition ( )  
        outputChatBox ( cursX ) 
        outputChatBox ( cursY ) 
        outputChatBox ( cursZ ) 
        createExplosion ( cursX, cursY,cursZ, 2 ) 
    end ) 
  

Но cursZ - это вообще непонятно что, он возвращает мне не высоту места клика, а какое то рандомное значение. Может кто нибуть мне подсказать как сделать, чтоб создавался взрыв в месте клика?

Link to comment
Ну я слукавил немного, но выдает он значения высоты в районе -200

А сделайте скриншот с курсором, интересно посмотреть на место, на которое вы кликаете.

Link to comment

Если не изменяет память, то где-то на вики было написано, что нормальные значения возвращаются только если место, по которому вы кликаете, находится в радиусе стримера (300 метров). А все, что выходит за пределы - будет возвращать невесть что.

Link to comment

Вот сейчас проверил. Заспавнился в ЛС, где дом сиджея. Кликнул под под своим персонажем. Слева - то, что выдает getCursorPosition, справа - панель фрироама:

3bcd38e1df0392614ef9b48dbb03b8d6

Так что вряд ли тут проблемы с радиусом работы стримера.

onClientClick работает как часы, спасибо за подсказку, буду тогда его использовать :)

Link to comment
local text = "1234567890"

как взять текст начиная с 6 символа "67890"

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

Возвращает подстроку строки s, которая начинается с символа с индексом i и продолжается до символа с индексом j; i и j могут быть отрицательными. Если j не указан, то считается, что он равен -1 (то же самое, что длина строки). В частности, вызов string.sub(s,1,j) возвращает начальную часть строки с длиной j, а string.sub(s, -i) возвращает конец строки s длиной i.

Link to comment

у меня опять проблема с неработающим кодом, хотя все, на мой взгялд правильно написанно:

  
    local i = 1 
    local x = -2681.2114 
    local y = 1524.8448 
    local z = 61 
    zomb={} 
    while i < 51 do 
        local xcoord = 0 
        local ycoord = 0 
        local xdirection = math.random(1,2) 
        if xdirection == 1 then 
            xcoord = math.random(0,20) 
        else 
            xcoord = math.random(-20,0) 
        end 
        local ydirection = math.random(1,2) 
        if ydirection == 1 then 
            ycoord = math.random(0,20) 
        else 
            ycoord = math.random(-20,0) 
        end 
        local zcoord = getGroundPosition (  x+xcoord, y+ycoord, z ) 
        zomb[totalZomb] = createPed ( math.random (50,100), x+xcoord, y+ycoord, zcoord+1.5, math.random ( 0,360 ) ) 
        setElementHealth ( zomb[totalZomb], 10 ) 
        if not isElementInWater ( zomb[totalZomb] ) then 
            totalZomb = totalZomb+1 
            outputChatBox ( totalZomb ) 
        else 
            destroyElement ( zomb[totalZomb] ) 
        end 
        i=i+1 
    end 
    b = 1 
    local x = -2681.5593 
    local y = 1581.4780 
    local z = 64 
    while b < 51 do 
        local xcoord = 0 
        local ycoord = 0 
        local xdirection = math.random(1,2) 
        if xdirection == 1 then 
            xcoord = math.random(0,20) 
        else 
            xcoord = math.random(-20,0) 
        end 
        local ydirection = math.random(1,2) 
        if ydirection == 1 then 
            ycoord = math.random(0,20) 
        else 
            ycoord = math.random(-20,0) 
        end 
        local zcoord = getGroundPosition (  x+xcoord, y+ycoord, z ) 
        zomb[totalZomb] = createPed ( math.random (50,100), x+xcoord, y+ycoord, zcoord+1.5, math.random(0,360) ) 
        if isPedOnGround ( zomb[totalZomb] ) then 
            totalZomb = totalZomb+1 
            outputChatBox ( totalZomb ) 
        else 
            destroyElement ( zomb[totalZomb] ) 
        end 
        b=b+1 
    end 
  

Этот код спавнит нпц в случайно сгенерированных позициях вокруг двух точек.

Тот while, который с i выполняется хорошо, а вот следующий - не создает нпц. При том, если убрать zomb[totalZomb] = от createPed во втором случае, то нпц из второго while появляются нормально (но, соотвесна, не работает isPedOnGround и т.д.). Может кто знает в чем проблема?

Link to comment
у меня опять проблема с неработающим кодом, хотя все, на мой взгялд правильно написанно:
  
    local i = 1 
    local x = -2681.2114 
    local y = 1524.8448 
    local z = 61 
    zomb={} 
    while i < 51 do 
        local xcoord = 0 
        local ycoord = 0 
        local xdirection = math.random(1,2) 
        if xdirection == 1 then 
            xcoord = math.random(0,20) 
        else 
            xcoord = math.random(-20,0) 
        end 
        local ydirection = math.random(1,2) 
        if ydirection == 1 then 
            ycoord = math.random(0,20) 
        else 
            ycoord = math.random(-20,0) 
        end 
        local zcoord = getGroundPosition (  x+xcoord, y+ycoord, z ) 
        zomb[totalZomb] = createPed ( math.random (50,100), x+xcoord, y+ycoord, zcoord+1.5, math.random ( 0,360 ) ) 
        setElementHealth ( zomb[totalZomb], 10 ) 
        if not isElementInWater ( zomb[totalZomb] ) then 
            totalZomb = totalZomb+1 
            outputChatBox ( totalZomb ) 
        else 
            destroyElement ( zomb[totalZomb] ) 
        end 
        i=i+1 
    end 
    b = 1 
    local x = -2681.5593 
    local y = 1581.4780 
    local z = 64 
    while b < 51 do 
        local xcoord = 0 
        local ycoord = 0 
        local xdirection = math.random(1,2) 
        if xdirection == 1 then 
            xcoord = math.random(0,20) 
        else 
            xcoord = math.random(-20,0) 
        end 
        local ydirection = math.random(1,2) 
        if ydirection == 1 then 
            ycoord = math.random(0,20) 
        else 
            ycoord = math.random(-20,0) 
        end 
        local zcoord = getGroundPosition (  x+xcoord, y+ycoord, z ) 
        zomb[totalZomb] = createPed ( math.random (50,100), x+xcoord, y+ycoord, zcoord+1.5, math.random(0,360) ) 
        if isPedOnGround ( zomb[totalZomb] ) then 
            totalZomb = totalZomb+1 
            outputChatBox ( totalZomb ) 
        else 
            destroyElement ( zomb[totalZomb] ) 
        end 
        b=b+1 
    end 
  

Этот код спавнит нпц в случайно сгенерированных позициях вокруг двух точек.

Тот while, который с i выполняется хорошо, а вот следующий - не создает нпц. При том, если убрать zomb[totalZomb] = от createPed во втором случае, то нпц из второго while появляются нормально (но, соотвесна, не работает isPedOnGround и т.д.). Может кто знает в чем проблема?

Ужасный код... Очень тяжело понять, что либо в нем! У меня нет желания твой код штрудировать, в попытках найти ошибку алгоритма, так что я тебе более, имхо, оптимальный вариант написал:

function spawnZombiesAroundCoords(x,y,z) --Функция Спавна зомбей 
    math.randomseed (getTickCount()) 
    local zombList = {} 
    for i = 1, 50 do 
        local posX, posY, posZ = getRandomCoordsNearPoint(x, y, z) 
        local curnpc = createPed ( math.random (50,100), posX, posY, posZ, math.random ( 0,360 ) ) 
        table.insert(zombList, curnpc) 
    end 
    return zombList 
end 
  
function getRandomCoordsNearPoint(x, y, z) --Получение рандомных координат 
    local rndX = x + math.random(-20, 20) 
    local rndY = y + math.random(-20, 20) 
    return rndX, rndY, z 
end 
  
function deleteZombiesFromTable(zmbTable) --Удаление зомби из таблицы 
    for _,zombi in ipairs(zmbTable) do 
        if (isElement(zombi)) then 
            destroyElement( zombi ) 
        end 
    end 
end 

Link to comment

totalZomb в первой итерации будет nil, мб в этом проблема.

Код конечно суров :) А если у тебя будет 100 спавнов? Будешь ручками делать 100 циклов?

Я бы сделал примерно так:

zomb = {} 
totalZomb = 0 
  
function initZombies(baseX, baseY, baseZ, count) 
    for i = 1, count do 
        local tempX, tempY = baseX+math.random(-20,20), baseY+math.random(-20,20) 
        local zcoord = getGroundPosition (tempX, tempY, baseZ) 
        local ped = createPed(math.random(50,100), tempX, tempY, zcoord+1.5, math.random(0,360)) 
        if ped then 
            setElementHealth(ped, 10) 
            if not isElementInWater (ped) then 
                totalZomb = totalZomb+1 
                outputChatBox(totalZomb) 
                zomb[totalZomb] = ped 
            else 
                destroyElement(ped) 
            end 
        end  
    end 
end 
  
initZombies(145.0, 64.0, 12, 51) 
initZombies(-2344.2, 342.0, 125.0, 51) 

Link to comment

Написал функцию для бессмертных машин. Но почему-то евент не отменяется.

Server Side

function MakeImmortal( thePlayer ) 
    theText = { [true] = "Поздравляем! Вы теперь бессмертны =)", [false] = "Вот так вот! Смерть теперь видет Вас =)" } 
    setElementData( thePlayer, "Immortal", not getElementData( thePlayer, "Immortal" ) ) 
    outputChatBox( theText[ getElementData( thePlayer, "Immortal" ) ], thePlayer ) 
end 
  
function ImmortalVehicle() 
    local theDriver = getVehicleController( source ) 
    if ( theDriver ~= false ) and ( getElementData( theDriver, "Immortal" ) == true ) then  
        cancelEvent() 
        outputChatBox( tostring( wasEventCancelled() ) ) 
    end 
end 
  
addCommandHandler( "baguvix", MakeImmortal ) 
addEventHandler( "onVehicleDamage", getRootElement(), ImmortalVehicle ) 

meta.xml

<meta> 
    <script src='assasin.lua' type='server' /> 
</meta> 

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...