Jump to content

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


Recommended Posts

function onDeath() 
  -- запоминаем, какой скин был у игрока 
  local currSkin = getElementModel( source ) 
  setElementData( source, "s_skin", currSkin, false ) 
end 
  
function onSpawn() 
  -- выдаем сохраненный скин игроку (если таковой имелся до того) 
  local savedSkin = getElementData( source, "s_skin" ) 
  if not savedSkin then 
    savedSkin = getElementModel( source ) 
  end 
  setElementModel( source, savedSkin ) 
end 
  
addEventHandler( "onPlayerWasted", root, onDeath ) 
addEventHandler( "onPlayerSpawn", root, onSpawn ) 

Link to comment

Функция setElementData позволяет присвоить элементу данные, используя уникальный ключ (почитайте на вики). В данном случае я назвал его "s_skin". Можете назвать ключ как хотите.

Link to comment

Попробуйте вот так:

function onDeath() 
  -- запоминаем, какой скин был у игрока 
  local currSkin = getElementModel( source ) 
  setElementData( source, "s_skin", currSkin, false ) 
end 
  
function onSpawn() 
  -- выдаем сохраненный скин игроку (если таковой имелся до того) 
  local savedSkin = getElementData( source, "s_skin" ) 
  if not savedSkin then 
    savedSkin = getElementModel( source ) 
  end 
   
  -- небольшая задержка сразу после спавна не повредит 
  setTimer( applySavedSkin, 75, 1, source, savedSkin ) 
end 
  
function applySavedSkin( player, skin ) 
  if isElement( player ) then 
    setElementModel( player, skin ) 
  end 
end 
  
addEventHandler( "onPlayerWasted", root, onDeath ) 
addEventHandler( "onPlayerSpawn", root, onSpawn ) 

Link to comment

Работает.Спасибо,сейчас буду рассматривать этот "код" и понимать.

А что означает "skin"

  
function onSpawn() 
  -- выдаем сохраненный скин игроку (если таковой имелся до того) 
  local savedSkin = getElementData( source, "s_skin" ) 
  if not savedSkin then 
    savedSkin = getElementModel( source ) 
  end 
  
  -- небольшая задержка сразу после спавна не повредит 
  setTimer( applySavedSkin, 75, 1, source, savedSkin ) -- "savedSkin" - доп.аргумент.Но что такое "skin"???Откуда он взялся... 
end 
setElementModel( player, skin ) -- Как Я понял - это ID скина,только где он задан выше? 
  

Link to comment

Вызываем функцию applySavedSkin внутри setTimer, передавая при этом два параметра: элемент игрока и его сохраненный скин. Функция applySavedSkin принимает два параметра, я их обозвал player и skin. Вам бы основы Lua почитать, что ли, или программирования как такового, даже не знаю (передача параметров в функции, вызов функции и тому подобное).

Link to comment

Client:

  
local MoneyMarker =createMarker (2491, -1664, 12.5, "cylinder", 4, 255, 155, 144, 170 ) 
  
function Check (hitElement) 
if ( localPlayer == hitElement ) then 
What = setTimer ( GetMoney, 1000, 0 ) 
end 
end 
function GetMoney(hitElement) 
if isElementWithinMarker(localPlayer, MoneyMarker) then 
  triggerServerEvent ( "GetMoneyS", localPlayer)  
end 
end 
addEventHandler( "onClientMarkerHit", MoneyMarker, Check ) 
  

Server:

  
function GetMoneyS(thePlayer) 
givePlayerMoney(thePlayer,1) 
end 
addEventHandler ( "GetMoneyS", getRootElement(), GetMoneyS ) 
addEvent ( "onSpecialEvent", true ) 
  

Деньги не даются..

Edited by Guest
Link to comment
Хорошо,почитаю.
  
local MoneyMarker = createMarker(2490,-1665,12.5, "cylinder", 5, 255, 177, 133,177) 
  
function Check(thePlayer) 
if isElementWithinMarker(thePlayer, MoneyMarker) then 
outputChatBox("WTF1") 
timer = setTimer ( getMoney, 1000, 0) 
end 
end 
addEventHandler("onMarkerHit",MoneyMarker,Check) 
  
function getMoney(thePlayer) 
  
if isElementWithinMarker(source, MoneyMarker) then 
givePlayerMoney(source,1) 
else 
killTimer(timer) 
end 
  

Какой ставить аргумент здесь?

В setPlayerMoney и "isElement..."

...

"@Bad Argument"

_____

Нужна проверка,находится ли человек в маркере,если да,то дать ему 1$,если нет,уничтожить таймер.

Не могу понять зачем вы так закручиваете простой скрипт? Не проще ли сделать так:

local MoneyMarker = createMarker(2490,-1665,12.5, "cylinder", 5, 255, 177, 133,177) 
  
function Check(thePlayer) 
     if isElementWithinMarker(thePlayer, MoneyMarker) then 
          outputChatBox("WTF1",getRootElement()) 
          timer = setTimer ( function() givePlayerMoney(thePlayer,1) end 
          , 1000, 1) ----/// 3 сет в вашем таймере был "0".То есть,этот скрипт повторяется вечно.Зачем? 
     end 
end 
addEventHandler("onMarkerHit",MoneyMarker,Check) 
  

Link to comment

Я обновил код.

Бесконечно повторяется для того,чтобы чувак стоял в маркере и получал деньги.

...

Спасибо.

Немножко переделал код.

  
local MoneyMarker = createMarker(2490,-1665,12.5, "cylinder", 5, 255, 177, 133,177) 
  
function Check(thePlayer) 
     if isElementWithinMarker(thePlayer, MoneyMarker) then 
          timer = setTimer ( function() givePlayerMoney(thePlayer,1) end 
          , 1000, 0)  
     end 
end 
addEventHandler("onMarkerHit",MoneyMarker,Check) 
  
function Stop(thePlayer) 
killTimer(timer) 
end 
addEventHandler("onMarkerLeave",MoneyMarker,Stop) 

Link to comment

и не будут.

addEventHandler ( "GetMoneyS", getRootElement(), GetMoneyS ) 
addEvent ( "onSpecialEvent", true )  

,а надо:

addEvent ( "GetMoneyS", true ) 
addEventHandler ( "GetMoneyS", getRootElement(), GetMoneyS )  

triggerServerEvent ( "GetMoneyS", localPlayer,hitElement)  

if ( localPlayer == hitElement ) then ---/// к чему эта проверка? МБ просто if hitElement then?  

Link to comment

Полагаю, что при окончании таймера выпускаются из тюрьмы все. Как это локализовать для каждого игрока? Думал с таблицами.

Добавляем игрока:

{таймер, игрок }, {таймер, игрок}, ...

Но как это извлечь и т.д. мало опыта.

Какие предложения? Хотя бы подсказку, если лениво расписывать.

function cmd ( 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 ) 
                                    setTimer ( function() 
                                        local account = getPlayerAccount ( Psource ) 
                                        local lodskin = getAccountData ( account, 'oldskin' ) 
                                        local ofgt = getAccountData ( account, 'oldfgt' ) 
                                        spawnPlayer ( Psource, 2290.19995, 2430.5, 10.8, 180, tostring (lodskin), 0, 0 ) 
                                        setPedFightingStyle ( Psource, tostring (ofgt) ) 
                                        setCameraTarget ( Psource ) 
                                    end, toTime*60000, 1) 
                                    elseif ( getVehicleOccupant ( occup, 3 ) ) then 
                                    local account = getPlayerAccount ( Psource ) 
                                    local oldskin = setAccountData ( account, 'oldskin', getElementModel ( Psource ) ) 
                                    local oldfgt = setAccountData ( account, 'oldfgt', 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 ) 
                                    setTimer ( function() 
                                        local account = getPlayerAccount ( Psource ) 
                                        local lodskin = getAccountData ( account, 'oldskin' ) 
                                        local ofgt = getAccountData ( account, 'oldfgt' ) 
                                        spawnPlayer ( Psource, 2290.19995, 2430.5, 10.8, 180, tostring (lodskin), 0, 0 ) 
                                        setPedFightingStyle ( Psource, tostring (ofgt) ) 
                                        setCameraTarget ( Psource ) 
                                    end, toTime*60000, 1) -- Данный таймер. 
                                    end 
                        end 
                end 
            end 
            end 
        end 
        end 
    end 
end 
addCommandHandler ( 'anyCmd', cmd ) 

Link to comment
 -- Client 
local moneyMarker = createMarker (2491, -1664, 12.5, "cylinder", 4, 255, 155, 144, 170 ) 
  
addEventHandler( "onClientMarkerHit", moneyMarker, function( hitPlayer, dim ) 
  if localPlayer == hitPlayer and dim then 
    setTimer( triggerServerEvent, 1000, 1, 'onPlayerGiveMoney', localPlayer, 1500 ) 
  end 
end ) 
  

 -- Server 
addEvent( 'onPlayerGiveMoney', true ) 
addEventHandler( 'onPlayerGiveMoney', root, function( money ) 
  givePlayerMoney (source, money ) 
end ) 
  

Link to comment

nikitafloy, кратко по таблицам.

  
local badMans = {} -- создали таблицу 
  
badMans[player] = time -- добавили туда игрока 
local time = badMans[player] -- получили время игрока 
badMans[player] = nil  -- удалили игрока 
  
for player, time in pairs( badMans ) do 
  -- работаем со всеми в цикле 
end 
  

Link to comment
nikitafloy, кратко по таблицам.
  
local badMans = {} -- создали таблицу 
  
badMans[player] = time -- добавили туда игрока 
local time = badMans[player] -- получили время игрока 
badMans[player] = nil  -- удалили игрока 
  
for player, time in pairs( badMans ) do 
  -- работаем со всеми в цикле 
end 
  

Применяю для извлечения колшейпов:

local cols = {} 
  
function freezP( attacker, weapon, bodypart, loss ) 
... 
            local x, y, z = getElementPosition ( source ) 
            CP = createColSphere(x, y, z, 4) 
            cols[CP] = CPc 
... 
end 
addEventHandler ( "onPlayerDamage", root, freezP ) 
  
function inCar ( thePlayer, cmd, Psource ) 
... 
        local CPc = cols[CP] 
        if ( isElementWithinColShape ( thePlayer, CPc ) ) then 
... 
        end 
end 
addCommandHandler ( 'tPr', inCar ) 

debug: attempt to concatenate 'CPc' ( nil value )

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
Подкиньте, пожалуйста, несколько скриптов, с которых можно или даже стоит взять пример. Буду очень благодарен Вам за это :)

Взять пример чего?

Оформления кода, стиля программирования.

Link to comment

Server:

  
local team =createTeam("Criminals",255,0,0) 
function main() 
local playerTeam = getPlayerTeam ( source )           
    if not ( playerTeam ) then     
setPlayerTeam(source,team) 
end 
end 
addEventHandler("onPlayerLogin",root,main) 
  

_____________

  
function moveGate( hitPlayer, matchingDimension,playerSource) 
local swat = getTeamFromName ( "S.W.A.T" ) 
 if (swat) then 
        moveObject(gate, 2000, 272, 2509.7, 9.5) 
        setTimer(moveBack, 2500, 1) 
else 
outputChatBox("ss") 
    end 
end 
addEventHandler("onMarkerHit", markerforgate, moveGate) 
  
  

Проверка на команды не работает,открывает на всех.

Link to comment

Так конечно, что это за проверка такая. Ты просто проверяешь наличие такой команды как "S.W.A.T.". Ты же не проверяешь принадлежность к этой команде игрока который вошел в маркер.

Link to comment

Спс.

  
function moveGate( hitPlayer, matchingDimension,playerSource) 
local swat = getTeamFromName ( "S.W.A.T" ) 
local playerTeam = getPlayerTeam ( source )  
local ss = getTeamName ( playerTeam )   
 if ss == swat then 
        moveObject(gate, 2000, 272, 2509.7, 9.5) 
        setTimer(moveBack, 2500, 1) 
else 
outputDebugString("ss") 
    end 
end 
addEventHandler("onMarkerHit", markerforgate, moveGate) 
  

@Bad Player Point(getPlayerTeam)

@Bad Argument(GetTeamName)

...

Link to comment

Ты пытаешься определить команду маркера, а не игрока. А маркеры не могут быть в какой-то команде. Почитай внимательно что представляет собой 'source' в функции onMarkerHit.

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