Nanotech.ua Posted September 5, 2012 Share Posted September 5, 2012 код ниже - это анти флуд. мне надо сделать чтобы в чат можно было писать раз в минуту... где, и что изменить?) подскажите пожалуйста. 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
Nanotech.ua Posted September 5, 2012 Share Posted September 5, 2012 а и чтобы на админов это не действовало.. Link to comment
TwiX! Posted September 5, 2012 Share Posted September 5, 2012 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
Nanotech.ua Posted September 5, 2012 Share Posted September 5, 2012 эмм... ну в этом я вообще не шарю. как и что совмещать. а так ясно, спасибо. понял что просто так никто не поможет. ничего, обойдусь тогда без анти-флуда.. что уж поделать. Link to comment
TwiX! Posted September 6, 2012 Share Posted September 6, 2012 эмм... ну в этом я вообще не шарю. как и что совмещать.а так ясно, спасибо. понял что просто так никто не поможет. ничего, обойдусь тогда без анти-флуда.. что уж поделать. пфф на столько ленивый народ пошёл что даже не могут попробовать, и учиться не хотят. Заметь тут топик Помощь по скриптингу А не топик Сделай за меня Link to comment
Flaker Posted September 6, 2012 Share Posted September 6, 2012 Вроде за время между отправкой сообщений в данном ресурсе отвечает настройка "@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
Nanotech.ua Posted September 6, 2012 Share Posted September 6, 2012 эмм... ну в этом я вообще не шарю. как и что совмещать.а так ясно, спасибо. понял что просто так никто не поможет. ничего, обойдусь тогда без анти-флуда.. что уж поделать. пфф на столько ленивый народ пошёл что даже не могут попробовать, и учиться не хотят. у меня турнир в воскресенье, и учиться некогда, ок. Заметь тут топик Помощь по скриптингу А не топик Сделай за меня эта тема где пользователи задают вопросы, на которые хотят получить ответы. и я не написал "сделайте мне это!". я просто задал вопрос. а если бы уж так написал, то конечно же предложил бы какую-нить сумму для выполнения моей проблеммы (работы). и если ты до&^%я умный, то оставь это при себе пожалуйста. мне кстати скоро надо будет написать мод под заказ, где я и напиашу "Сделай за меня", а я заплачу за это соответствующую цену. а так, Flaker, спасибо большое за помощь, позже попробую это сделать Link to comment
_Dark_ Posted September 6, 2012 Share Posted September 6, 2012 у меня турнир в воскресенье, и учиться некогда, ок. Держите нас в курсе. эта тема где пользователи задают вопросы, на которые хотят получить ответы. Да, а не готовые решения. и я не написал "сделайте мне это!". я просто задал вопрос. мне надо сделать чтобы в чат можно было писать раз в минуту...где, и что изменить?) TwiX дал ответ где и что изменить эмм... ну в этом я вообще не шарю. как и что совмещать. понял что просто так никто не поможет. TwiX уже помог, дав ответ на поставленный вопрос и если ты до&^%я умный, то оставь это при себе пожалуйста. Если вы до&^%я глупый, то надо учиться. Кстати, год назад этот человек (Nanotech.ua) писал следующее: Поясните мне нубу, пожалуйста! Что я не так делаю?) Я, какбы сказать, только 2-й день занимаюсь скриптингом в МТА, так что прошу не орать на меня в данной теме) А потом мне в ПМ доказывал, что будет открывать свой сайт с полезными уроками для новичков. Ну что же, за год никаких знаний не прибавилось, о чем тут говорить Link to comment
Flaker Posted September 6, 2012 Share Posted September 6, 2012 Пожалуйста) мне кстати скоро надо будет написать мод под заказ Можешь сразу мне писать в скайп (flaker7), я как раз этим занимаюсь... Link to comment
TwiX! Posted September 7, 2012 Share Posted September 7, 2012 @Nanotech.ua Как же вы мне надоели идиоты люди такого типа @Flaker повторяюсь, не у всех игроков может быть аккаунт Link to comment
SweetyWolf Posted September 8, 2012 Share Posted September 8, 2012 Привет всем, не могу что то разобраться с 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
_Dark_ Posted September 8, 2012 Share Posted September 8, 2012 Но cursZ - это вообще непонятно что, он возвращает мне не высоту места клика, а какое то рандомное значение. Да быть такого не может. Link to comment
SweetyWolf Posted September 8, 2012 Share Posted September 8, 2012 Ну я слукавил немного, но выдает он значения высоты в районе -200 Link to comment
_Dark_ Posted September 8, 2012 Share Posted September 8, 2012 Ну я слукавил немного, но выдает он значения высоты в районе -200 А сделайте скриншот с курсором, интересно посмотреть на место, на которое вы кликаете. Link to comment
_Vincent_ Posted September 8, 2012 Share Posted September 8, 2012 Я не гуру гта, но разве вся карта строго выше 1/1/1? Заберись на гору Чилиад, попробуй там Link to comment
DakiLLa Posted September 8, 2012 Share Posted September 8, 2012 Если не изменяет память, то где-то на вики было написано, что нормальные значения возвращаются только если место, по которому вы кликаете, находится в радиусе стримера (300 метров). А все, что выходит за пределы - будет возвращать невесть что. Link to comment
Kenix Posted September 8, 2012 Share Posted September 8, 2012 Можно попробовать использовать это: https://wiki.multitheftauto.com/wiki/OnClientClick https://wiki.multitheftauto.com/wiki/OnPlayerClick Link to comment
SweetyWolf Posted September 9, 2012 Share Posted September 9, 2012 Вот сейчас проверил. Заспавнился в ЛС, где дом сиджея. Кликнул под под своим персонажем. Слева - то, что выдает getCursorPosition, справа - панель фрироама: Так что вряд ли тут проблемы с радиусом работы стримера. onClientClick работает как часы, спасибо за подсказку, буду тогда его использовать Link to comment
_Dark_ Posted September 9, 2012 Share Posted September 9, 2012 Напишите на багтрекер или в англоязычную секцию насчет этого. Link to comment
H1TM4N Posted September 9, 2012 Share Posted September 9, 2012 local text = "1234567890" как взять текст начиная с 6 символа "67890" Link to comment
Flaker Posted September 10, 2012 Share Posted September 10, 2012 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
SweetyWolf Posted September 10, 2012 Share Posted September 10, 2012 у меня опять проблема с неработающим кодом, хотя все, на мой взгялд правильно написанно: 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
Flaker Posted September 10, 2012 Share Posted September 10, 2012 у меня опять проблема с неработающим кодом, хотя все, на мой взгялд правильно написанно: 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
LoveFist Posted September 10, 2012 Share Posted September 10, 2012 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
lcd1232 Posted September 10, 2012 Share Posted September 10, 2012 Написал функцию для бессмертных машин. Но почему-то евент не отменяется. 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now