Jump to content

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


Recommended Posts

Спс!

ни пашит

  
gate = createObject ( 980, 272, 2509.7, 17.95, 0, 0, 90 ) 
markerforgate = createMarker ( 272, 2509, 16, "cylinder", 9, 0, 0, 0, 0 ) 
  
function moveGate( hitPlayer, matchingDimension,playerSource) 
local swat = getTeamFromName ( "S.W.A.T" ) 
local playerTeam = getPlayerTeam ( hitPlayer )  
local ss = getTeamName ( playerTeam )   
if ss=="S.W.A.T" then 
        moveObject(gate, 2000, 272, 2509.7, 9.5) 
        setTimer(moveBack, 2500, 1) 
else 
outputDebugString("ss") 
    end 
end 
addEventHandler("onMarkerHit", markerforgate, moveGate) 
  
  

Link to comment
gate = createObject ( 980, 272, 2509.7, 17.95, 0, 0, 90 ) 
markerforgate = createMarker ( 272, 2509, 16, "cylinder", 9, 0, 0, 0, 0 ) 
  
function moveGate( hitPlayer, matchingDimension ) 
local playerTeam = getPlayerTeam ( hitPlayer )  
local ss = getTeamName ( playerTeam )   
    if ss=="S.W.A.T" then 
     moveObject(gate, 2000, 272, 2509.7, 9.5) 
     setTimer(moveBack, 2500, 1) 
    else 
     outputDebugString("ss") 
    end 
end 
addEventHandler("onMarkerHit", markerforgate, moveGate) 

Должно работать. Убедись что название команды правильно проверяешь и не пропустил там точку или еще что.

Link to comment

Буду очень признателен и благодарен. :)

debug: attempt to concatenate 'CPc' ( nil value )
local CPc = cols[CP] 

local :/

Благодарю. Но теперь, либо я не могу понять логику и делаю не так, либо я точно делаю не так, может и поможете, кто поопытнее меня. Дэбаг молчит.

  
local prisoners = {} -- Создаю таблицу 
  
function sitPr ( thePlayer, cmd, Psource, toTime ) 
    for _, aclGr in ipairs ( { 'Security',  'FBI' } ) do 
        if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( thePlayer )), aclGetGroup ( aclGr ) ) == true ) then 
        if ( isElementWithinColShape ( thePlayer, fP ) ) then 
            local occup = getPedOccupiedVehicle ( thePlayer ) 
            if ( occup ) then 
            if ( toTime ) then 
                local toTime = tonumber(toTime) 
                local Psource = getPlayerFromName ( Psource ) 
                if ( pC[ getElementModel( getPedOccupiedVehicle ( thePlayer ) ) ] ) then 
                        if ( toTime < 30 ) then 
                            local rnd = math.random ( 1, #habz ) 
                                if ( getVehicleOccupant ( occup, 2 ) ) then 
                                    local account = getPlayerAccount ( Psource ) 
                                    local oldskin = setAccountData ( account, 'oldskin', tostring (getElementModel ( Psource )) ) 
                                    local oldfgt = setAccountData ( account, 'oldfgt', tostring (getPedFightingStyle ( Psource )) ) 
                                    takePlayerMoney ( Psource, 15000 ) 
                                    givePlayerMoney ( thePlayer, 15000 ) 
                                    setTimer (fadeCamera, 2000, 1, Psource, true) 
                                    setTimer (function() 
                                        spawnPlayer ( Psource, habz[rnd][1], habz[rnd][2], 1004, 90, 299, 3, 0 ) 
                                        setCameraTarget ( Psource ) 
                                    end, 2000, 1 ) 
                                    prisoners[#prisoners+1] = {toTime, Psource} -- Получаю длину таблицы и добавляю новый элемент в виде {Время, имя игрока}. 
                                    setTimer ( function() 
                                    for _, i in pairs (prisoners) do -- получаю таблицу того же вида. 
                                        Psource = i[2] -- 'говорю', что имя игрока это данные всех таблиц под номером 2. 
                                        toTimeTo = i[1] -- 'говорю', что время до выхода игрока это данные всех таблиц под номером 1. 
                                            if toTimeTo == toTime then -- если время равно времени выхода через toTime, когда таймер истекает, назначенный заранее, чтобы посадить человека. Иными словами, если срок истекает, то... 
                                            elseif toTimeTo < toTime then -- Или, если вдруг получилось, что время выхода игрока < времени назначенного заранее командой для посаженного Psource, тогда мы его выпускаем. (5 < 30) (Здесь логика моя отключилась, ибо такого быть не должно) 
                                                local account = getPlayerAccount ( Psource ) 
                                                local lodskin = getAccountData ( account, 'oldskin' ) 
                                                local ofgt = getAccountData ( account, 'oldfgt' ) 
                                                setPedFightingStyle ( Psource, tostring (ofgt) ) 
                                                setCameraTarget ( Psource ) 
                                                spawnPlayer ( Psource, 2290.19995, 2430.5, 10.8, 180, tostring (lodskin), 0, 0 ) 
                                                prisoners[Psource] = nil -- table.remove (  ) - замена, но как она используется? 
                                            elseif toTimeTo > toTime then -- или, если время до выхода больше, чем время, указанное для другого заключенного, тогда получаем таймер у первого 
                                                if isTimer(toTimeTo) then -- если он существует, то 
                                                    toTime = toTimeTo -- ставим время для него 
                                                    setTimer (function() 
                                                        local account = getPlayerAccount ( Psource ) 
                                                        local lodskin = getAccountData ( account, 'oldskin' ) 
                                                        local ofgt = getAccountData ( account, 'oldfgt' ) 
                                                        setPedFightingStyle ( Psource, tostring (ofgt) ) 
                                                        setCameraTarget ( Psource ) 
                                                        spawnPlayer ( Psource, 2290.19995, 2430.5, 10.8, 180, tostring (lodskin), 0, 0 ) 
                                                        prisoners[Psource] = nil -- table.remove (  ) 
                                                    end, toTime*60000, 1 ) -- Теперь через некоторое время его выпустят 
                                                else 
                                                    outputChatBox ( 'No1.' ) 
                                                end 
                                            else 
                                                outputChatBox ( 'No2.' ) 
                                            end 
                                    end 
                                    end, toTime*60000, 1) 
  
                                    elseif ( getVehicleOccupant ( occup, 3 ) ) then 
... 
                                    end 
                        end 
                end 
            end 
            end 
        end 
        end 
    end 
end 
addCommandHandler ( 'sPr', sitPr ) 
  

Что будет в сл. циклах я боюсь представить. :cry:

Link to comment
Спс..

Дебаг ругается,но работает.

http://s33-temporary-files.radikal.ru/5 ... 693455.png

Дебаг будет ругаться когда в маркер будет въезжать например машина. И у машины как бы тоже не может быть принадлежности к команде. Дело в том что в твоем коде аргумент 'hitPlayer' на самом деле является не игроком, а элементом. Поэтому еще стоит сделать проверку на тип элемента. И само название переменной лучше бы сделать hitElement, чтоб не путаться.

Link to comment

Как сделать неуязвимого бота(ped)><?

Ещё вопрос:

  
local money={ 
[1]={math.random(150,400)}, 
[2]={math.random(400,600)}, 
[3]={math.random(600,800)}, 
[4]={math.random(800,1000)}, 
[5]={math.random(800,1000)}, 
[6]={math.random(800,1000)}, 
} 

Есть таблица с некими числами,как их сделать в такой функции,что-то вроде этого:

  
  
givePlayerMoney(thePlayer,money[1]) 

____

У меня что-то с википедией,кароч..(

Link to comment
Как сделать неуязвимого бота(ped)><?

При атаке педа отменять действие.

function cancelPedDamage ( attacker ) 
    cancelEvent() -- cancel any damage done to peds 
end 
addEventHandler ( "onClientPedDamage", getRootElement(), cancelPedDamage ) 

Есть таблица с некими числами,как их сделать в такой функции,что-то вроде этого:
givePlayerMoney(thePlayer,money[1][1][1]) 

Link to comment

Спасибо,амарант.

Просто делаю что-то вроде простенькой системы полиции.Осталось сделать только GUI,обязательно добавлю Вас в "кредиты",как и товарища "Castillo".

Link to comment
Как сделать неуязвимого бота(ped)><?

При атаке педа отменять действие.

function cancelPedDamage ( attacker ) 
    cancelEvent() -- cancel any damage done to peds 
end 
addEventHandler ( "onClientPedDamage", getRootElement(), cancelPedDamage ) 

Только не забудьте вместо root указать конкретного педа, т.к будет отменять аттаку по всем педам, а возможно вам нужен будет конкретный.

addEventHandler ( "onClientPedDamage", pPed--[[ Тут ваш пед ]], cancelPedDamage ) 

Link to comment

Господа, нужна функция для проверки повёрнут ли игрок лицом к элементу(с погрешностью пусть 30 градусов). Я имею ввиду не камеру, не голову, а сам скин. Дано:

1)Позиция игрока

2)Поворот игрока

3)Позиция элемента

Я думаю кто-то да затрагивал этот вопрос.

Вроде бы простая задачка из школьного курса информатики.

В Пэинте я нарисовал наглядно, как это должно выглядеть. Последнюю систему я записал логическим выражением, но оно не работает. Возможно я где-то ошибся, а может уже есть готовая функция.

Картинка

Ваши мысли, господа?

P.S.: При вычислении тангенса я НЕ забыл перевести всё в радианы. Также дельта альфа пусть равно 30 градусам. Под ElementRotation'ом я подразумеваю поворот относительно оси Z(я знаю, что функция возвращает три значения(x,y,z)).

Link to comment
isElementOnScreen 

и никаких велосипедов

Да видел я такую функцию. Даже специально написал:

Я имею ввиду не камеру, не голову, а сам скин

Да, я знаю, придётся танцевать с бубнами.

Link to comment

Предположу, что так. Код не тестировал.

function isPedRotationToPoint( el, px, py, pz, accuracy ) -- назовите функцию сами 
    if type( el ) == 'userdata' and isElement( el ) and type( px ) == 'number' and type( py ) == 'number' and type( pz ) == 'number' then 
        local x, y, z, = getElementPosition ( el ) 
        local rotalion = ( 360 - math.deg ( math.atan2 ( ( x - px ), ( y - py ) ) ) ) % 360 
        local _, _, currentRotation = getElementRotation( el ) 
        return math.abs( currentRotation - rotation ) < accuracy and true or false 
    end 
    return false 
end 

Link to comment
  
return math.abs( currentRotation - rotation ) < accuracy and true or false 
end 

Если так, но функция возвращает true когда игрок наоборот отвёрнут от точки. Я поменял знак. Работает но не так как надо. Дело в том, что значению true соответствует огромный(!) угол, в то время когда false - совсем малый угол, т.е. когда игрок смотрит в сторону точно противоположную стороне точке(а должно быть наоборот, значению true - меньший угол(переменная accuracy)).

Но мы приблизились к цели.

Link to comment

Я знал что проблема в знаках углах\позиций, стал перебирать, пробовать разные варианты. Знак больше\меньше оставил как и был сначала. А вот строчку

local rotation = ( 360 - math.deg ( math.atan2 ( ( x - px ), ( y - py ) ) ) ) % 360 

заменил на

local rotation = ( 360 - math.deg ( math.atan2 ( ( px - x ), ( py - y ) ) ) ) % 360 

И всё работает как надо!

В итоге готовая функция:

function isPedRotationToPoint( el, px, py, pz, accuracy ) -- назовите функцию сами 
    if type( el ) == 'userdata' and isElement( el ) and type( px ) == 'number' and type( py ) == 'number' and type( pz ) == 'number' then 
        local x, y, z = getElementPosition(el) 
        local rotation = ( 360 - math.deg ( math.atan2 ( ( px - x ), ( py - y ) ) ) ) % 360 
        local _, _, currentRotation = getElementRotation( el ) 
        return math.abs( currentRotation - rotation ) < accuracy and true or false 
    end 
    return false 
end 

Спасибо за помощь, TheNormalnij.

Link to comment

Хорошо бы ещё ошибку выводить в дебаг при не правильном вводе аргументов, иначе при опечатке вы долго будете искать проблему

function IsPedRotationInPoint( pPed, fX, fY, fZ, fAccuracy ) 
    if not isElement( pPed ) then error( "type mismatch in argument #1", 2 ); end -- 2 - это уровень, т.е. ошибка будет там где вызвали функцию 
    if type( fX ) ~= "number" then error( "type mismatch in argument #2", 2 ); end 
    if type( fY ) ~= "number" then error( "type mismatch in argument #3", 2 ); end 
    if type( fZ ) ~= "number" then error( "type mismatch in argument #4", 2 ); end 
    if type( fAccuracy ) ~= "number" then error( "type mismatch in argument #5", 2 ); end 
     
    local fPedX, fPedY = getElementPosition( pPed ); 
     
    local fAngle = ( 360 - math.deg( math.atan2( ( fX - fPedX ), ( fY - fPedY ) ) ) ) % 360; 
     
    local fRotX, fRotY, fRotZ = getElementRotation( pPed ); 
     
    return math.abs( fRotZ - fAngle ) < fAccuracy; 
end 
  

Link to comment

Спасибо!

1)Можно ли скриптом удалить все объекты определенной модели с сервера, а на их место поставить другой объект определенной модели(не замененной, а стандартной)?

2)Почему эвенты "onVehicleExit", "onPlayerVehicleExit" не срабатывают, когда игрок помирает в машине? Как с этим бороться? Что интересно, на эвенте "onPlayerWasted" игрок уже как бы не в машине, т.е. isPedInVehicle даёт false.

Link to comment

Проблема связана с MySQL.

local mysqlhost = "localhost" 
local mysqluser = "root" 
local mysqlpasword = "" 
local mysqldatebase = "house" 
  
function connect() 
   [u] [b]datebase = mysql_connect(mysqlhost, mysqluser, mysqlpasword, mysqldatebase)[/b][/u] 
end 
addEventHandler ( "onResourceStart", resourceRoot, connect ) 
  
addEventHandler("onResourceStart", getResourceRootElement(), function() 
  [u]  [b]handler = dbConnect("mysql", "dbname="..mysqldatebase..";host="..mysqlhost, mysqluser, mysqlpassword, "autoreconnect=1")[/b][/u] 
end) 

На код не обращайте внимание, суть: в первой попытке подключится (datebase) ошибка, ну как бы "nill value".

Со второй (handler) все хорошо, объясните как подключатся правильно через "mysql_connect" или скиньте норм туториал, и какая вообще между ними разница в коде, заранее спасибо.

Link to comment
  • Other Languages Moderators
Проблема связана с MySQL.

local mysqlhost = "localhost" 
local mysqluser = "root" 
local mysqlpasword = "" 
local mysqldatebase = "house" 
  
function connect() 
   [u] [b]datebase = mysql_connect(mysqlhost, mysqluser, mysqlpasword, mysqldatebase)[/b][/u] 
end 
addEventHandler ( "onResourceStart", resourceRoot, connect ) 
  
addEventHandler("onResourceStart", getResourceRootElement(), function() 
  [u]  [b]handler = dbConnect("mysql", "dbname="..mysqldatebase..";host="..mysqlhost, mysqluser, mysqlpassword, "autoreconnect=1")[/b][/u] 
end) 

На код не обращайте внимание, суть: в первой попытке подключится (datebase) ошибка, ну как бы "nill value".

Со второй (handler) все хорошо, объясните как подключатся правильно через "mysql_connect" или скиньте норм туториал, и какая вообще между ними разница в коде, заранее спасибо.

"nil value" - вероятно вы не скачали модуль mysql ибо mysql_connect работает только с модулем.

P.S для кода используйте тег [lua]

Link to comment
Проблема связана с MySQL.

local mysqlhost = "localhost" 
local mysqluser = "root" 
local mysqlpasword = "" 
local mysqldatebase = "house" 
  
function connect() 
   [u] [b]datebase = mysql_connect(mysqlhost, mysqluser, mysqlpasword, mysqldatebase)[/b][/u] 
end 
addEventHandler ( "onResourceStart", resourceRoot, connect ) 
  
addEventHandler("onResourceStart", getResourceRootElement(), function() 
  [u]  [b]handler = dbConnect("mysql", "dbname="..mysqldatebase..";host="..mysqlhost, mysqluser, mysqlpassword, "autoreconnect=1")[/b][/u] 
end) 

На код не обращайте внимание, суть: в первой попытке подключится (datebase) ошибка, ну как бы "nill value".

Со второй (handler) все хорошо, объясните как подключатся правильно через "mysql_connect" или скиньте норм туториал, и какая вообще между ними разница в коде, заранее спасибо.

"nil value" - вероятно вы не скачали модуль mysql ибо mysql_connect работает только с модулем.

P.S для кода используйте тег [lua]

А можно по подробней об этом модуле mysql?

Link to comment

А можно по подробней об этом модуле mysql?

Подробнее тут:

https://wiki.multitheftauto.com/wiki/Mysql

Огромное спасибо, не видел этот раздел.

P.S.: УРААА, все заработало, огромное спасибо, надо было просто закинуть в папку один файлик и всее..

Link to comment

Вопрос. Когда я использую

guiGridListRemoveRow 

сдвигаются ли остальные строчки?

Основная задача: реализация списка элементов определенного типа, добавление и удаление нужного элемента, и вытаскивание элемента из списка при нажатии кнопки. Я использовал массив в клиенте, где номер массива - guiGridListRow, а значение - элемент. НО у меня не получается синхронно сопоставить guiGridListRow и элемент. Что я сейчас могу сделать: при удалении \ добавления элемента в список, очищать весь список и заново добавлять нужные элементы. Есть другие варианты?

ps: возможно проблема в table.remove(table1, i) \ table1 = nil, хотя я и так и так пробовал.

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