Stemka Posted December 16, 2013 Share Posted December 16, 2013 Да в том то и дело, что не такой высокий уровень моих знаний, который требуется для этого инвентаря Ну а так учусь по-немножку, начиная с простых скриптов и вот сейчас как два часа пытаюсь разобраться что такое ооп Если уж и разбираться в ООП, то определенно не в Lua. Да и нужно ли, лесть в ООП с начальными знаниями? Да вот 4 потраченных часа... толку 0... вроде бы суть понял, а в то же время и не понял... уйму мануалов перечитал. Ну а так вообще как посоветовали заюзать его в системе одной. Link to comment
Jonathan.P Posted December 20, 2013 Share Posted December 20, 2013 Два простых вопроса: 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
Kenix Posted December 20, 2013 Share Posted December 20, 2013 Ключевое слово 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
Jonathan.P Posted December 20, 2013 Share Posted December 20, 2013 Спасибо, а если я объявляю глобальную переменную (без local), то она будет существовать и в других скриптах, получается, тогда в каких: во всех ресурсах, или только в данном? Link to comment
CocaColaBear Posted December 20, 2013 Share Posted December 20, 2013 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
Jonathan.P Posted December 20, 2013 Share Posted December 20, 2013 Спасибо за помощь и разъяснения! Только последнее: А как же elementData? Принцип тот же? Допустим, создан элемент на сервере, присвоена ему дата. Через некоторое время на одном из клиентов я меняю эту дату, тогда на сервере и на других клиентах она останется неизменна(первоначальная)? Link to comment
CocaColaBear Posted December 20, 2013 Share Posted December 20, 2013 Спасибо за помощь и разъяснения! Только последнее: А как же 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
Jonathan.P Posted December 20, 2013 Share Posted December 20, 2013 Спасибо, Jadore. Я помню про этот параметр и описание функции на вики, но всё же слегка напугался. Link to comment
nikitafloy Posted December 21, 2013 Share Posted December 21, 2013 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
TheNormalnij Posted December 24, 2013 Share Posted December 24, 2013 Ты не поверишь, но можно эвент вешать только на один элемент Link to comment
Korish0074 Posted December 28, 2013 Share Posted December 28, 2013 Нужна помощь, я собрал детали разных скриптов 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
TheNormalnij Posted December 29, 2013 Share Posted December 29, 2013 Здесь немного разные логики. В первом ресурсе автор создает объект и "эмулирует" выстрелы ракетницы. Вы же хотите создать свое ружье. Link to comment
nikitafloy Posted December 29, 2013 Share Posted December 29, 2013 Ты не поверишь, но можно эвент вешать только на один элемент Ты не понял вопроса. Link to comment
Korish0074 Posted December 29, 2013 Share Posted December 29, 2013 Здесь немного разные логики. В первом ресурсе автор создает объект и "эмулирует" выстрелы ракетницы. Вы же хотите создать свое ружье. Там в клео скрипте для гта есть некоторые понятные функции {$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
TheNormalnij Posted December 29, 2013 Share Posted December 29, 2013 Ты не поверишь, но можно эвент вешать только на один элемент Ты не понял вопроса. 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
SweetyWolf Posted December 30, 2013 Share Posted December 30, 2013 Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать. Link to comment
DakiLLa Posted December 30, 2013 Share Posted December 30, 2013 Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать. bindKey( 'tab', 'both', function( key, state ) toggleControl( 'action', (state == "down" and false or true) ) end ) Link to comment
Memory Posted December 31, 2013 Share Posted December 31, 2013 Всех с наступающим Новым Годом! Сделал неон панель с текстурами NeonTube из сампа, но когда едешь вверх по наклонной или спускаешься, или боком, или летишь, то свечения нет, возможно ли исправить это? Link to comment
SweetyWolf Posted December 31, 2013 Share Posted December 31, 2013 Привет всем. У меня на сервере запрещена стрельба в некоторых местах (с помощью toggleControl ( "fire", false )). Но игроки умудряются в таких местах стрелять с помощью правой кнопки мыши и клавиши таб, а так же драться с помощью правой кнопки мыши и кнопки F. Как отключить у них эту возможность? Все никак не могу придумать. bindKey( 'tab', 'both', function( key, state ) toggleControl( 'action', (state == "down" and false or true) ) end ) Спасибо Link to comment
Memory Posted January 2, 2014 Share Posted January 2, 2014 UP: Сделал неон панель с текстурами NeonTube из сампа, но когда едешь вверх по наклонной или спускаешься, или боком, или летишь, то свечения нет, возможно ли исправить это? Link to comment
nikitafloy Posted January 2, 2014 Share Posted January 2, 2014 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
TheNormalnij Posted January 2, 2014 Share Posted January 2, 2014 nikitafloy, но они уже в в таблице. for player, data in pairs( spDeal ) do --lol end Link to comment
nikitafloy Posted January 2, 2014 Share Posted January 2, 2014 nikitafloy, но они уже в в таблице. for player, data in pairs( spDeal ) do --lol end И правда. Link to comment
SweetyWolf Posted January 2, 2014 Share Posted January 2, 2014 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
nikitafloy Posted January 2, 2014 Share Posted January 2, 2014 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
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