Jump to content

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


Recommended Posts

Да в том то и дело, что не такой высокий уровень моих знаний, который требуется для этого инвентаря :(

Ну а так учусь по-немножку, начиная с простых скриптов и вот сейчас как два часа пытаюсь разобраться что такое ооп:)

Если уж и разбираться в ООП, то определенно не в Lua.

Да и нужно ли, лесть в ООП с начальными знаниями?

Да вот 4 потраченных часа... толку 0... вроде бы суть понял, а в то же время и не понял... уйму мануалов перечитал.

Ну а так вообще как посоветовали заюзать его в системе одной.

Link to comment

Два простых вопроса:

1)На странице вики по функции crateVehicle https://wiki.multitheftauto.com/wiki/CreateVehicle, есть заметка:

Note: Vehicles (and other elements) created client-side are only seen by the client that created them, aren't synced and players cannot enter them. They are essentially for display only.

Т.е. когда я создаю на клиенте например просто элемент (createElement) или маркер (createMarker), то он существует только на этом клиенте и виден только ему? и на сервере его не найти?

2)чем отличаются переменные

local count = 0 

и

count2 = 0 

если я их задаю в корне скрипта?

Link to comment

Ключевое слово local делает переменную локальной, т.е она видна только в блоке do end

Примеры

  
local x = 1; 
  
do 
 local y = 2; 
 do 
  x = x + 2; -- Прибавляем 2 
  print( x ); -- 3, переменная x видна в блоке 
 end 
end 
  
print( x ); -- 3, переменная x видна в блоке  
print( y + 1 ); -- attempt to perform arithmetic on global 'y' (a nil value), т.к переменная находится в другом блоке и не видна тут 
  

Также если объявить локальную переменную просто в скрипте, то она не будет видна в других скриптах, так что можно считать, что каждый скрипт имеет свой блок do ... end.

Пример

script1.lua

  
local x = 1; 
  

script2.lua

print( x ) -- nil 

P.S Объяснил на пальцах, а вообще читайте документацию по Lua, там всё это есть.

P.S2 Примеры можно тестить в lua demo.

http://www.lua.org/cgi-bin/demo

Link to comment

Спасибо, а если я объявляю глобальную переменную (без local), то она будет существовать и в других скриптах, получается, тогда в каких: во всех ресурсах, или только в данном?

Link to comment
1)На странице вики по функции crateVehicle https://wiki.multitheftauto.com/wiki/CreateVehicle, есть заметка:
Note: Vehicles (and other elements) created client-side are only seen by the client that created them, aren't synced and players cannot enter them. They are essentially for display only.

Т.е. когда я создаю на клиенте например просто элемент (createElement) или маркер (createMarker), то он существует только на этом клиенте и виден только ему? и на сервере его не найти?

Да. Все что создано на клиенте остается только там.

Многие, кто пришел с SA-MP не понимают разницы между клиентскими скриптами и серверными, ибо в SA-MP есть только вторые. Так вот, клиентские скрипты - это скрипты, которые скачивает клиент при входе и работает с ними пока вы не покинете сервер. Т.е. сервер не контролирует действия происходящие в клиентских скриптах.

Для примера, возьмем функцию setElementModel. Если на сервере игроку установить скин под номером 1, а после на клиенте сменить скин на 2, то сервер не будет знать об этом и будет думать, что скин все еще под номером 1. И если вы попробуете сменить скин на стороне сервера обратно на 1, то ничего не произойдет. Потому что функция не устанавливает новый скин, когда он равен старому, независимо от того, что вы видите скин под номером 2.

Спасибо, а если я объявляю глобальную переменную (без local), то она будет существовать и в других скриптах, получается, тогда в каких: во всех ресурсах, или только в данном?

Только в данном ресурсе.

Link to comment

Спасибо за помощь и разъяснения! Только последнее:

А как же elementData? Принцип тот же? Допустим, создан элемент на сервере, присвоена ему дата. Через некоторое время на одном из клиентов я меняю эту дату, тогда на сервере и на других клиентах она останется неизменна(первоначальная)?

Link to comment
Спасибо за помощь и разъяснения! Только последнее:

А как же elementData? Принцип тот же? Допустим, создан элемент на сервере, присвоена ему дата. Через некоторое время на одном из клиентов я меняю эту дату, тогда на сервере и на других клиентах она останется неизменна(первоначальная)?

У setElementData последний аргумент:

synchronize: Determines whether or not the data will be synchronized with the server (client-side variation) and remote clients (both variations).

По умолчанию, он установлен в true, это значит, что если клиент или сервер поменяет data элемента, то data изменится везде. Если false, то только на одной стороне,клиент или сервер, в зависимости от того, где сработала setElementData

Link to comment
    function funcInput( player, x, y, z ) 
        local x, y, z = getElementPosition ( player ) 
        if ( x and y and z ) then 
        colSpM1 = createColSphere ( x, y+4, z, 1 ) 
        pM1 = createPickup ( x, y-2, z+0.2, 3, 1241, 1800000 ) 
        end 
    end 
  
    function hitCol1() 
        local players = getElementsByType ( "player" ) 
        for theKey, thePlayer in ipairs(players) do 
        local veh = getPedOccupiedVehicle ( thePlayer ) 
            if isElementWithinColShape ( thePlayer, colSpM1 ) then 
                setVehicleHandling ( veh, "tractionMultiplier", 1 ) 
                destroyElement ( colSpM1 ) 
                destroyElement ( pM1 ) 
            end 
        end 
    end 
    addEventHandler ( "onColShapeHit", root, hitCol1 ) 

Каким образом можно вытащить из функции ColSpher'у для обработки эвентом?

Link to comment

Нужна помощь, я собрал детали разных скриптов

Server

theVehicle = createVehicle(600, 2530.413, -1710.22, 13.323, 0, 0, 0, "SpawN") 
setElementData(theVehicle,"rocket",true) 
zenit = createObject(3884, 2530.621, -1715.385, 12.489) 
attachElements(zenit, theVehicle, 0,-1.8,-0.5) 
  
function bindKeyStartFire() 
bindKey(source,"1","down",startfireRocket) 
end 
addEventHandler("onPlayerJoin", getRootElement(),bindKeyStartFire) 
  
function startfireRocket(source) 
 if isPedInVehicle(source) then 
  local vehicle = getPedOccupiedVehicle(source) 
  if getElementData(vehicle,"rocket") == true then 
   if getVehicleController(vehicle) == source then 
    local x,y,z = getElementPosition(vehicle) 
    local rx,ry,rz = getVehicleRotation(vehicle)     
     if getElementData(vehicle,"rocket_Progress") == 100 then 
      triggerClientEvent("fireRocket", getRootElement(), source, x, y, z, rz,vehicle) 
     else 
      playSoundFrontEnd(source,5)    
      outputChatBox("#CC0033[СЕРВЕР]: #339933 Прогресс востоновления зенитной установки не завершон! Осталось "..tostring(100 - getElementData(vehicle,"rocket_Progress"))..".", source, 0, 0, 0,true) 
     end 
   end   
  end  
 end 
end 
  
function explodeZUvehicle() 
 if getVehicleOccupant(source) then 
 local player = getVehicleOccupant(source) 
  if (getElementData(source,"rocket") == true) then 
   triggerClientEvent(player, "destroiGui", getRootElement(),player) 
  end 
 end  
end 
addEventHandler("onVehicleExplode", getRootElement(), explodeZUvehicle) 
--[[Поворот ракетницы по напровлению камеры 
function moveZenit(Rz) 
setElementAttachedOffsets(zenit, 0,-1.8,-0.5, 0,0,Rz) 
end 
addEvent("moveZenit", true) 
addEventHandler("moveZenit", getRootElement(), moveZenit) 
  

Client

local function getCameraRotation() 
        local px, py, pz, lx, ly, lz = getCameraMatrix() 
        local rotz = 6.2831853071796 - math.atan2 ( ( lx - px ), ( ly - py ) ) % 6.2831853071796 
        local rotx = math.atan2 ( lz - pz, getDistanceBetweenPoints2D ( lx, ly, px, py ) ) 
        return rotx, 180, rotz 
end 
  
function getPlayerCameraRot() 
x,y,z = getCameraRotation() 
triggerServerEvent("moveZenit", getRootElement(), z) 
end 
  
function setRenderCR() 
if not getCRot  then 
getCRot = true 
addEventHandler("onClientRender", getRootElement(), getPlayerCameraRot) 
else 
getCRot = false 
removeEventHandler("onClientRender", getRootElement(), getPlayerCameraRot) 
end 
end 
addCommandHandler("start",setRenderCR) ]] 
  
--//Запуск рокеты... 
function fireRocket(source,x, y, z, rz,vehicle) 
if source == getLocalPlayer() then 
 createProjectile(source, 19, x, y, z+3, 900, nil, 0,-15,-(rz+180),0,0,0) 
 theVehicle = vehicle 
 guiSetText(textProgress,"0%") 
 guiProgressBarSetProgress(ProgressBar,0) 
 setElementData(theVehicle,"rocket_Progress",0) 
 addEventHandler("onClientRender", getRootElement(), progresBarZU) 
end  
end 
addEvent("fireRocket", true) 
addEventHandler("fireRocket", getRootElement(), fireRocket) 
  
function infoTextZU(element) 
if source == getLocalPlayer() then 
text = guiCreateLabel(633,218,118,12,"3EHuTHA9I yCTAHOBKA",false) 
guiLabelSetColor(text,0,0,0,100) 
guiSetFont(text,"default-small") 
  
text2fon = guiCreateLabel(633,218,118,12,"3EHuTHA9I yCTAHOBKA",false) 
guiLabelSetColor(text2fon,255,255,255) 
guiSetFont(text2fon,"default-small") 
  
ProgressBar = guiCreateProgressBar(624,230,133,19,false) 
guiProgressBarSetProgress(ProgressBar,100) 
  
textProgress = guiCreateLabel(679,231,50,13,"100%",false) 
guiLabelSetColor(textProgress,255,255,255) 
end 
end 
  
function progresBarZU() 
 if getElementData(theVehicle,"rocket_Progress") ~= 100 then 
  guiSetText(textProgress,tostring(getElementData(theVehicle,"rocket_Progress")+1).."%") 
  guiProgressBarSetProgress(ProgressBar,getElementData(theVehicle,"rocket_Progress")+1) 
  setElementData(theVehicle,"rocket_Progress",getElementData(theVehicle,"rocket_Progress")+1) 
 else 
  removeEventHandler("onClientRender", getRootElement(), progresBarZU) 
 end 
 if getElementData(theVehicle,"rocket_Progress") < 50 then 
  guiLabelSetColor(textProgress,0,0,0) 
 else 
  guiLabelSetColor(textProgress,255,255,255) 
 end 
end 
  
function addProgressBar(theVehicle, seat, jacked) 
if seat == 0 then 
 if getElementData(theVehicle,"rocket") == true then 
  if (not getElementData(theVehicle,"rocket_Progress")) then 
   setElementData(theVehicle,"rocket_Progress",100) 
  end 
 infoTextZU() 
 guiSetText(textProgress,tostring(getElementData(theVehicle,"rocket_Progress")).."%") 
 guiProgressBarSetProgress(ProgressBar,getElementData(theVehicle,"rocket_Progress")) 
 end 
end  
end 
addEventHandler("onClientPlayerVehicleEnter", getRootElement(), addProgressBar) 
  
function destroyProgressBar(theVehicle, seat, jacked ) 
if seat == 0 then 
 if getElementData(theVehicle,"rocket") == true then 
 destroyElement(textProgress) 
 destroyElement(ProgressBar)  
 destroyElement(text)  
 destroyElement(text2fon) 
 setElementData(theVehicle,"rocket_Progress",100) 
 removeEventHandler("onClientRender", getRootElement(), progresBarZU) 
 end 
end  
end 
addEventHandler("onClientPlayerVehicleExit", getRootElement(), destroyProgressBar) 
  
function destroiGui(source) 
if source == getLocalPlayer() then 
 if getElementData(theVehicle,"rocket") == true then 
 destroyElement(textProgress) 
 destroyElement(ProgressBar)  
 destroyElement(text)  
 destroyElement(text2fon) 
 removeEventHandler("onClientRender", getRootElement(), progresBarZU) 
 end 
end  
end 
addEvent("destroiGui", true) 
addEventHandler("destroiGui", getRootElement(), destroiGui) 

Create Weapon

function createMinigunWeapon() 
    local x, y, z = getElementPosition(getLocalPlayer()) 
    local weapon = createWeapon("minigun", x, y, z + 1) 
    setWeaponClipAmmo ( weapon,99999) 
    setWeaponState ( weapon,"firing") 
end 
addCommandHandler("createminigun", createMinigunWeapon) 

Прошу помощи, нужно соеденить все и чтоб получилось:

http://www.gtavicecity.ru/gta-san-andre ... yotom.html

Link to comment
Здесь немного разные логики. В первом ресурсе автор создает объект и "эмулирует" выстрелы ракетницы. Вы же хотите создать свое ружье.

Там в клео скрипте для гта есть некоторые понятные функции

{$CLEO} 
0A95: enable_thread_saving 
014B: 9@ = init_parked_car_generator 601 1 1 0 alarm 0 door_lock 0 1 40000 at -1968.4062 100.8711 27.6875 angle 90.0 
014C: set_parked_car_generator 9@ cars_to_generate_to 101 
while true 
    wait 0 
    if 
        player.Defined($player_char) 
    then 
        if 
            856E:   not car 30@ defined 
        then 
            if 
                03CA:   object 31@ exists 
            then 
                object.Destroy(31@) 
            end 
            if 
                00EC:   actor $PLAYER_ACTOR 0 near_point -1968.4062 100.8711 radius 200.0 200.0 
            then 
                073E: get_car_in_sphere -1968.4062 100.8711 26.6875 radius 10.0 model 601 handle_as 30@ 
            end     
        else 
            if 
                83CA:   not object 31@ exists 
            then 
                model.Load(362) 
                repeat 
                    wait 0 
                until model.Available(362) 
                object.Create(31@ 362 0.0 0.0 -100.0) 
                model.Destroy(362) 
                if and 
                    056E: car 30@ defined 
                    03CA:   object 31@ exists 
                then 
                    0681: attach_object 31@ to_car 30@ with_offset 0.3 0.0 2.0 rotation 0.0 30.0 94.0 
                    car.SetImmunities(30@ 1 1 1 1 1) 
                    053F: set_car 30@ tires_vulnerability 0  
                end             
            else 
                if 
                    056E: car 30@ defined 
                then 
                    if 
                        actor.InCar($PLAYER_ACTOR 30@) 
                    then 
                        if 
                            0AB0:  key_pressed 219 // [ button - lock doors 
                        then 
                            020A: set_car 30@ door_status_to 2 
                        end 
                        if 
                            82BF:   not car 30@ sunk 
                        then      
                            068D: get_camera_position_to 0@ 1@ 2@  
                            068E: get_camera_target_point_to 3@ 4@ 5@ 
                            0174: 17@ = car 30@ Z_angle 
                            //-----------------------------------------------------------вычисляем угол по X 
                            050A: 6@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 3@ 4@ 5@ 
                            0087: 10@ = 5@ // (float)   
                            0063: 10@ -= 2@ // (float) 
                            0073: 10@ /= 6@ // (float) = sin 
                            0087: 7@ = 10@ // (float) 
                            0087: 8@ = 10@ // (float) 
                            006B: 10@ *= 7@ // (float)  
                            006B: 10@ *= 7@ // (float)  
                            10@ /= 6.0 
                            005B: 8@ += 10@ // (float) 
                            10@ *= 6.0 
                            006B: 10@ *= 7@ // (float)  
                            006B: 10@ *= 7@ // (float)  
                            10@ *= 0.075 
                            005B: 8@ += 10@ // (float) 
                            10@ /= 0.075 
                            006B: 10@ *= 7@ // (float)  
                            006B: 10@ *= 7@ // (float) 
                            10@ *= 0.0446  
                            005B: 8@ += 10@ // (float)  arcsinX = X + (X^3)/6 + (X^5)*3/40 + (X^7)*15/336 
                            8@ *= -57.296 // переводим радианы в градусы 
                            8@ += 360.0 
                            //-----------------------------------------------------------вычисляем угол по Z 
                            0063: 3@ -= 0@ // (float) 
                            0063: 4@ -= 1@ // (float) 
                            0604: get_Z_angle_for_point 3@ 4@ store_to 2@  // 1 параметр - x2-x1   2 параметр - y2-y1                
                            //-----------------------------------------------------------вычисляем смещения по осям X и Y 
                            0063: 2@ -= 17@ // (float)  
                            2@ += 270.0   // пусть миниган будет располагаться справа от водяной пушки 
                            02F6: 3@ = cosine 2@ // (float) синус 
                            02F7: 4@ = sine 2@ // (float) косинус 
                            3@ *= -0.3 
                            4@ *= 0.3 
                            //-----------------------------------------------------------прикрепляем миниган 
                            2@ -= 176.0  // 94 градуса - поправка на расположение опорной точки минигана 
                            if 
                                8@ < 320.0 
                            then 
                                8@ = 320.0 
                            end 
                            if 
                                8@ > 395.0 
                            then 
                                8@ = 395.0 
                            end 
                            if and 
                                056E: car 30@ defined 
                                03CA:   object 31@ exists 
                            then 
                                0681: attach_object 31@ to_car 30@ with_offset 3@ 4@ 2.0 rotation 0.0 8@ 2@ 
                                if 
                                    0AB0: key_pressed 2 // ПКМ - огонь 
                                then            
                                    0400: store_coords_to 11@ 12@ 13@ from_object 31@ with_offset 1.17 0.0 0.42 
                                    0400: store_coords_to 14@ 15@ 16@ from_object 31@ with_offset 1150.0 -100.0 550.0 
                                    06BC: create_M4_shoot_from 11@ 12@ 13@ target 14@ 15@ 16@ energy 1000 
                                    066E: create_particle "GUNFLASH" attached_to_object 31@ with_offset 1.17 0.0 0.42 rotation  0.866024961519 0 0.500000766025 flag 1 handle_as 18@  
                                    064C: make_particle 18@ visible  
                                    064F: remove_references_to_particle 18@ 
                                end 
                            end 
                        end // not car sunk 
                    else 
                        020A: set_car 30@ door_status_to 0 // door unlock 
                        if or 
                            8202:   not actor $PLAYER_ACTOR near_car 30@ radius 200.0 200.0 flag 0 
                            02BF:   car 30@ sunk   
                        then 
                            car.RemoveReferences(30@) 
                        end 
                    end  // actor in car          
                end  // car defined 
            end  // object 31@ exists   
        end     
    end 
end 

Link to comment
Ты не поверишь, но можно эвент вешать только на один элемент

Ты не понял вопроса.

  
function createHZ( player ) 
  local x, y, z = getElementPosition ( player ) 
  if not x then return false; end 
  local pickup = createPickup ( x, y-2, z+0.2, 3, 1241, 1800000 ) 
  local col = createColSphere ( x, y+4, z, 1 ) 
  setElementParent( pickup, col ) -- Делаем пикап зависимым от колшейпа 
  --[[ 
  local col = getElementColShape( pickup ) -- Можно и так 
  --]] 
  addEventHandler ( "onColShapeHit", col, onHit ) 
  return true 
end 
  
function onHit( element, matchingDimension ) 
  if getElementType( element ) ~= 'vehicle' or not matchingDimension then 
  -- Если это не авто или не тот Dimension, то не реагируем. 
     return false  
  end 
  setVehicleHandling ( element, "tractionMultiplier", 1 ) 
  destroyElement ( source ) -- Удаляем колшейп со всеми его детьми =) 
  return true 
end 

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

Link to comment

Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать.

Link to comment
Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать.
bindKey( 'tab', 'both', function( key, state ) 
  toggleControl( 'action', (state == "down" and false or true) ) 
end ) 

Link to comment

Всех с наступающим Новым Годом!

Сделал неон панель с текстурами NeonTube из сампа, но когда едешь вверх по наклонной или спускаешься, или боком, или летишь, то свечения нет, возможно ли исправить это?

Link to comment
Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать.
bindKey( 'tab', 'both', function( key, state ) 
  toggleControl( 'action', (state == "down" and false or true) ) 
end ) 

Спасибо

Link to comment

UP: Сделал неон панель с текстурами NeonTube из сампа, но когда едешь вверх по наклонной или спускаешься, или боком, или летишь, то свечения нет, возможно ли исправить это?

Link to comment
    function vDil ( source ) 
        local players = getElementsByType ( "player" ) 
        for theKey,thePlayer in ipairs(players) do 
            if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( thePlayer )), aclGetGroup ( "WeapDeal" ) ) ) then 
                spDeal[thePlayer]={} 
            end 
        end 
    end 
    addCommandHandler ( "vDil", vDil ) 

Как поместить всех отсоритрованных thePlayer в таблицу?

Link to comment
    function vDil ( source ) 
        local players = getElementsByType ( "player" ) 
        for theKey,thePlayer in ipairs(players) do 
            if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( thePlayer )), aclGetGroup ( "WeapDeal" ) ) ) then 
                spDeal[thePlayer]={} 
            end 
        end 
    end 
    addCommandHandler ( "vDil", vDil ) 

Как поместить всех отсоритрованных thePlayer в таблицу?

table.insert ( spDeal, thePlayer )

Link to comment
    function vDil ( source ) 
        local players = getElementsByType ( "player" ) 
        for theKey,thePlayer in ipairs(players) do 
            if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( thePlayer )), aclGetGroup ( "WeapDeal" ) ) ) then 
                spDeal[thePlayer]={} 
            end 
        end 
    end 
    addCommandHandler ( "vDil", vDil ) 

Как поместить всех отсоритрованных thePlayer в таблицу?

table.insert ( spDeal, thePlayer )

Благодарю.

_______________________________________________________________

Как аттаченному элементу установить смещение по Z?

            car = createVehicle ( 515, 92.5, -301.79998779297, 2.7000000476837 ) 
            markPT = createMarker ( 92.5, -300.70001220703, 6.1999998092651, "arrow", 1.5, 121, 0, 0, 255 ) 
            attachElements ( markPT, car ) 

setElementPosition делал, маркер всё равно остается зафиксиным.

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