Jump to content

Search the Community

Showing results for tags 'oop'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Multi Theft Auto: San Andreas 1.x
    • Support for MTA:SA 1.x
    • User Guides
    • Open Source Contributors
    • Suggestions
    • Ban appeals
  • General MTA
    • News
    • Media
    • Site/Forum/Discord/Mantis/Wiki related
    • MTA Chat
    • Other languages
  • MTA Community
    • Scripting
    • Maps
    • Resources
    • Other Creations & GTA modding
    • Competitive gameplay
    • Servers
  • Other
    • General
    • Multi Theft Auto 0.5r2
    • Third party GTA mods
  • Archive
    • Archived Items
    • Trash

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Gang


Location


Occupation


Interests

Found 9 results

  1. السلام عليكم ورحمة الله وبركاتة كيف حال الشباب عساكم طيبين الجواب من اصحاب الخبرة والاحتراف ( القصة مو سهلة على ما اعتقد )ا اليوم كنت اشتغل على برمجة بالدي اكس @t3wz وصادفت انو لازمني 2 جريد ليست وانا بستخدم جريد ليست حقت وانا مشغل نظام الكوائن بملف الميتا <oop>true</oop> بس المصيبة كانت انو ما اقدر اختار غير من جريد ليست واحده فقط وهي اخر واحده انا سويتها اكواد الجريد ليست dxGrid = { items = {} }; local cursorOn; local NATIVE_RESOLUTION = { nil } -- put your screen resolution here to fit the gridlists to all resolutions (ex: { 1366, 768 } ) if ( table.maxn ( NATIVE_RESOLUTION ) == 2 ) then FIT_MODE = true RES = { guiGetScreenSize() }; X,Y = RES[1] / NATIVE_RESOLUTION[1], RES[2] / NATIVE_RESOLUTION[2]; SCALE = ( 1 / NATIVE_RESOLUTION[1] ) * RES[1]; end --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - functions function dxGrid:Create ( x, y, width, height, postGUI ) -- table dxGrid:Create ( int x, int y, int width, int height[, bool postGUI ] ) if __checkParams ( "Create", "nnnn", x, y, width, height ) then local data = { x = FIT_MODE and ( x * X ) or x; -- X position y = FIT_MODE and ( y * Y ) or y; -- Y position w = FIT_MODE and ( width * X ) or width; -- Width h = FIT_MODE and ( height * Y ) or height; -- Height pg = postGUI or false; -- PostGUI i = {}; -- Items mi = __calcMaxItems ( FIT_MODE and ( height * Y ) or height ); -- Max items s = 1; -- Scroll Level r = -1; -- Row count se = -1; -- Selected item mo = nil; -- Mouse-on item vis = true -- Visible }; setmetatable ( data, { __index = dxGrid } ); table.insert ( dxGrid.items, data ); return data; end end function dxGrid:Destroy () -- bool dxGrid:Destroy () for k, v in pairs ( dxGrid.items ) do if v == self then dxGrid.items[k] = nil; return true; end end return false; end function dxGrid:SetVisible ( visible ) -- bool Gridlist:SetVisible ( bool state ) if __checkParams ( "SetVisible", "b", visible ) then self.vis = visible return true else return false end end function dxGrid:IsVisible ( ) -- bool Gridlist:IsVisible() return self.vis end function dxGrid:AddColumn ( title, width ) -- int Gridlist:AddColumn ( string title, int width ) if __checkParams ( "AddColumn", "sn", title, width ) then local data = { info = { title = title, width = FIT_MODE and ( width * X ) or width } }; table.insert ( self.i, data ); return #self.i; end end function dxGrid:RemoveColumn ( columnIndex ) -- bool Gridlist:RemoveColumn ( int columnIndex ) if __checkParams ( "RemoveColumn", "n", columnIndex ) then self.i[columnIndex] = nil; -- Recalculate the highest item count local highest = -1; for _, v in ipairs ( self.i ) do if #v > highest then highest = ( #v - 1 ); end end self.r = highest; -- Recalculate the scroll level (if necessary) if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then self.s = ( self.r - self.mi ) + 1; end return true end return false end function dxGrid:GetColumnCount () -- int Gridlist:GetColumnCount() return #self.i end function dxGrid:AddItem ( columnIndex, text, data, r, g, b ) -- int Gridlist:AddItem ( int columnIndex, string title[, mixed data, int r, int g, int b ] ) if __checkParams ( "AddItem", "ns", columnIndex, text ) then if self.i[columnIndex] then local tColor = __checkRGB ( r, g, b ) and { r, g, b } or { 255, 255, 255 }; table.insert ( self.i[columnIndex], { id = #self.i[columnIndex] + 1, text = tostring( text ), data = data, color = tColor } ); if #self.i[columnIndex] > self.r then self.r = #self.i[columnIndex]; end return #self.i[columnIndex]; end return false; end end function dxGrid:RemoveItem ( column, itemID ) -- bool Gridlist:RemoveItem ( int columnIndex, int itemIndex ) if __checkParams ( "RemoveItem", "nn", column, itemID ) then if self.i[column] and self.i[column][itemID] then -- Recalculate the highest item count if self.r == #self.i[column] then local highest = -1; for _, v in ipairs ( self.i ) do if #v > highest then highest = ( #v - 1 ); end end self.r = highest; end -- Recalculate the scroll level (if necessary) if ( ( ( self.s + self.mi ) - 2 ) == self.r ) then self.s = ( self.r - self.mi ) + 1; end -- Reset the selected item if necessary² if itemID == self.se then local newItem = self.se - 1 if newItem <= self.r then self.se = math.max ( 0, newItem ); else self.se = -1 end end table.remove ( self.i[column], itemID ); return true; end return false end end function dxGrid:GetItemCount ( columnID ) -- int Gridlist:GetItemCount ( int columnIndex ) if __checkParams ( "GetItemCount", "n", columnID ) then if self.i[columnID] then return #self.i[columnID] end return false end end function dxGrid:Clear () -- bool Gridlist:Clear() for k, v in ipairs ( self.i ) do self.i[k] = { info = v.info } end self.r = -1 self.se = nil -- Recalculate the scroll level self.s = 1; return true end function dxGrid:GetSelectedItem ( ) -- int Gridlist:GetSelectedItem () return self.se; end function dxGrid:SetSelectedItem ( itemID ) -- bool Gridlist:SetSelectedItem ( int itemIndex ) if __checkParams ( "SetSelectedItem", "n", itemID ) then if itemID <= self.r then self.se = itemID; return self.se == itemID; end return false; end end function dxGrid:GetItemDetails ( column, itemID ) -- string, mixed Gridlist:GetItemDetails ( int columnIndex, int itemIndex ) if __checkParams ( "GetItemDetails", "nn", columnID, itemID ) then if self.i[column] then if self.i[column][itemID] then return self.i[column][itemID].text, self.i[column][itemID].data end end return false end end --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Core - render/move addEventHandler ( "onClientRender", root, function ( ) -- Is there any gridlist to render? if #dxGrid.items > 0 then -- Loop through all grid lists for index, data in ipairs ( dxGrid.items ) do -- Is the gridlist visible? if data.vis then -- Draw the 'gridlist' itself dxDrawRectangle ( data.x, data.y, data.w, data.h, tocolor ( 0, 0, 0, 200 ), data.pg ); -- Draw the column bar dxDrawRectangle ( data.x, data.y, data.w, 30 % data.h, tocolor ( 0, 0, 0, 220 ), data.pg ); -- Set cursorOn variable to the current gridlist, if it's selected cursorOn = nil if __isMouseInPosition ( data.x, data.y, data.w, data.h ) then cursorOn = index; end -- Check if there's any selected item local seeFrom = data.s; local seeTo = ( data.s + data.mi ) - 1; if data.se and data.se <= data.r and data.se >= seeFrom and data.se <= seeTo then local index = data.se - ( data.s - 1 ); local y2 = data.y + ( ( index - 1 ) * 25 ); -- Draw a rectangle to make it looks like selected dxDrawRectangle ( data.x, ( 30 % data.h ) + y2, data.w, 20, tocolor ( 100, 100, 100, 100 ), data.pg ); end -- Is there any column? if #data.i > 0 then local cWidth = 0 -- Loop through all columns for cIndex, cData in ipairs ( data.i ) do -- we'll go beyond the gridlist width with this column ? if ( ( cWidth + cData.info.width ) <= data.w ) then local x = data.x + cWidth; -- Draw the column title dxDrawText ( cData.info.title, x, data.y, cData.info.width + x, ( 30 % data.h ) + data.y, tocolor ( 255, 255, 255 ), FIT_MODE and ( 1 * SCALE ) or 1, "default-bold", "center", "center", true, true, data.pg, false, true ); -- Reset the selected item cData.info.selected = -1; -- Is there any item ? if #cData > 0 then local seeFrom = data.s; local seeTo = ( data.s + data.mi ) - 1; -- Loop the items for iIndex = seeFrom, seeTo do -- There's a row with this index in the current column? if cData[iIndex] then local index = iIndex - ( data.s - 1 ); local y = data.y + ( index * 25 ); local y2 = data.y + ( ( index - 1 ) * 25 ); -- Check if cursor is on item position if __isMouseInPosition ( data.x, ( 30 % data.h ) + y2, data.w, 20 ) then -- Define the mouse-on variable data.mo = iIndex; end -- Draw the item text dxDrawText ( cData[iIndex]["text"], x, y, cData.info.width + x, ( 30 % data.h ) + y, tocolor ( unpack ( cData[iIndex]["color"] ) ), FIT_MODE and ( 1 * SCALE ) or 1, "default-bold", "center", "center", true, true, data.pg, false, true ); end end end -- Increase cWidth variable (to draw the columns correctly) cWidth = cWidth + cData.info.width; end end end end end end end , true, "low-5") -- addEventHandler ( "onClientKey", root, function ( button, press ) -- Is cursor showing? if isCursorShowing () then -- Is there any gridlist? if #dxGrid.items > 0 then -- Is there any selected gridlist? if cursorOn then -- We pressed the scroll? if press and #button > 6 then -- Does the gridlist requires scroll? if dxGrid.items[cursorOn].r > dxGrid.items[cursorOn].mi then -- Define some variables local index = cursorOn; local currentValue = dxGrid.items[index].s; local newValue = math.max ( 1, button == "mouse_wheel_down" and currentValue + 2 or currentValue -1 ); -- Check if we have spent the row's limit with the new value if ( ( newValue + dxGrid.items[index].mi ) > dxGrid.items[index].r ) then newValue = ( dxGrid.items[index].r - dxGrid.items[index].mi ) + 1; end -- Set the new scroll level dxGrid.items[index].s = newValue; end elseif press and button == "mouse1" and dxGrid.items[cursorOn].mo then dxGrid.items[cursorOn].se = dxGrid.items[cursorOn].mo; end end end end end ) --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Useful function __calcMaxItems ( height ) for i = 0, 9999 do if ( ( ( i + 1 ) * 25 ) >= math.floor ( height ) ) then return ( ( ( i + 1 ) * 25 ) > math.floor ( height ) and ( i - 1 ) or i ); end end return false; end function __checkParams ( methodName, pattern, ... ) local cTable = { ["string"] = "s"; ["number"] = "n"; ["boolean"] = "b"; ["s"] = "string"; ["n"] = "number"; ["b"] = "boolean" }; if #pattern > table.maxn ( { ... } ) then local index = table.maxn ( { ... } ) == 0 and 1 or table.maxn ( { ... } ) + 1 return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( index, index ) ].." at argument "..index..", got none]" ) end for k, v in pairs ( { ... } ) do if cTable[ type ( v ) ] ~= pattern:sub ( k, k ) then return false, error ( "Bad Argument @ '"..methodName.."' [Expected "..cTable[ pattern:sub ( k, k ) ].." at argument "..k..", got "..( type ( v ) or "none" ).."]" ) end end return true; end function __checkRGB ( r, g, b ) -- Check if all parameters were passed if ( not r ) or ( not g ) or ( not b ) then return false; end for _, v in ipairs ( { r, g, b } ) do if ( type ( v ) ~= "number" ) or ( v < 0 ) or ( v > 255 ) then return false; end end return true; end function __isMouseInPosition ( x, y, w, h ) if not isCursorShowing() then return false end local res = { guiGetScreenSize() }; local cpos = { getCursorPosition() }; local fpos = { res[1] * cpos[1], res[2] * cpos[2] }; return ( fpos[1] >= x and fpos[1] <= x + w ) and ( fpos[2] >= y and fpos[2] <= y + h ) end وبارك الله في الي يقدر يساعد وجمعة مباركة تنعاد علينا وعليكم بصحة والسلامة
  2. Hi there! I'm trying to spawn player on some location when they spawn, but I don't know why doesn't work. function onJoin() outputChatBox(tostring(source)) source:spawn(-2404.00000, -598.00000, 132.64844) source:fadeCamera(true) source:setCameraTarget(source) end addEventHandler("onPlayerJoin", root, onJoin) In console i get : ERROR: [ResourceName]\[ScriptName].lua:[lineNumber]: attemp to index global 'source' ( a userdata value ) When i connect to server in chat i get : userdata: 00000097 Any ideas ?
  3. Hello MTA SA Community i started this thread so someone who knows how the OOP works can explain it to me aswell because i have some questions and couldn't understand some of the wiki. I've seen some people using OOP in their resources instead of calling exported functions if i saw correctly. Can i use OOP to replace some exported functions? for example if i have to call a notification resource to show notifications can i use OOP to call that function who will post notifications on the player screen? And second what is the main point to use OOP at all?
  4. registro = {} registro.__index = registro function registro.new(nome,senha) local dados = {} setmetatable(dados,registro) dados.nome = nome dados.senha = senha return dados end function registro:name() outputDebugString(tostring(self.nome)) end function registro:pw() outputDebugString(tostring(self.senha)) end user1 = registro.new("gw8","1234") user2 = registro.new("gw9","789654") user1:name() user2:name() por exemplo neste código que eu criei aqui rapidinho, como eu devo fazer o inverso, tipo neste eu crio o objeto e pego as informações através dele, como eu faria para localizar o objeto através de uma determinada propriedade, tipo localizar o objeto user1 pelo nome dele que no caso eo "gw8".
  5. Hello, I'm using vectors and im wondering if there is a better way of changing a vector into a table? This is what I'm currently doing because i want to use the unpack() function. pos = localPlayer.position T = {pos.x,pos.y,pos.z}
  6. Hi guys, I'm working on my Spiderman script and was wondering if anyone knew how to rotate an object to always look at a position. Been trying to make the player lean with the web but no luck at all.
  7. When you are a wannabe spiderman.
  8. Сразу оговорюсь, данный урок требует основных знаний о таблицах Lua На самом деле в просторах сети полно учебников по данной теме, поэтому решил я написать этот учебник просто потому что его тут нет (естественно копировать всё из других учебников я не стану, а постараюсь рассказать своими словами) Зачем это нужно В целом, всё это, позволяет нам изменить поведение Lua в определённых ситуациях 1. Возможность реализации ООП в Lua 2. Перегрузка операторов (это так же может быть необходимым для П.1) Что это такое Метатаблица - это обычная таблица в которой описываются определённые события (например сложение, вычитание, сравнивание и т.д.) В качестве названия события выступает индекс таблицы, а её значение - обработчик события (метод) Как использовать Для использования достаточно просто обозначить таблице нашу мета-таблицу MyTable = {}; MyTableMeta = { __index = MyTable }; setmetatable( MyTable, MyTableMeta ); Методы нашей мета-таблицы можно определить в любое время, в силу для таблицы они вступают сразу после определения. Ниже список всех доступных событий и их описание __index( self, key ) чтение по ключу __newindex( self, key, value ) запись по ключу __call( self, ... ) вызов как функции __add( self, arg ) сложение __sub( self, arg ) вычитание __mul( self, arg ) умножение __div( self, arg ) деление __mod( self, arg ) остаток от деления __pow( self, arg ) возведение в степень __unm( self ) унарный минус __concat( self, arg ) конкатенация строк __len( self ) длина __eq( self, arg ) оператор "равно" __lt( self, arg ) оператор "меньше" __le( self, arg ) оператор "меньше или равно" __tostring( self ) Вызывается при попытке перевести объект в строковое представление (например с помощью функции tostring) __gc Вызывается для userdata-объектов при сборке мусора __metatable Если задать это поле в метатаблице, то getmetatable будет просто возвращать его значение, а setmetatable вернет ошибку. Пример Рассмотрим работу метатаблиц на примере события __call. Допустим мы хотим чтобы таблицу Vector3 можно было использовать как функцию. local Vector3 = {}; local Vector3_meta = { -- Добавляем наше событие __call = function( self, fX, fY, fZ ) -- self это указатель на нашу таблицу Vector3 return { X = fX, Y = fY, Z = fZ }; end; }; setmetatable( Vector3, Vector3_meta ); -- Устанавливаем метатаблицу для Vector3 Готово! Теперь если вызвать Vector3( 1, 2, 3 ) то нам вернётся новый объект - таблица с полями X, Y и Z. Теперь немного усложним задачу, дадим нашему объекту свою метатаблицу Vector3_meta_object = -- Это будет метатаблица для всех новых объектов { -- Добавляем событие сложения __add = function( vec1, vec2 ) -- vec1 - таблица слева, vec2 - таблица справа return Vector3( vec1.X + vec2.X, vec1.Y + vec2.Y, vec1.Z + vec2.Z ); -- Создаём новый объект end; }; Vector3 = {}; Vector3_meta = { __call = function( self, fX, fY, fZ ) local vecObject = { X = fX, Y = fY, Z = fZ }; setmetatable( vecObject, Vector3_meta_object ); -- Тут мы указываем метатаблицу нашему новому объекту return vecObject; end; }; setmetatable( Vector3, Vector3_meta ); -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3.X, vec3.Y, vec3.Z ); -- 90 124 68 В итоге при сложении двух векторов (двух таблиц с этой метатаблицей), у нас получится новый объект с новыми X Y Z. print( vec3.X, vec3.Y, vec3.Z ); - На мой взгляд это немного не удобно, намного удобнее было бы просто передать вектор в функцию print, давайте исправим, для этого нам понадобится событие __tostring function Vector3_meta_object.__tostring( self ) return "( " .. self.X .. ", " .. self.Y .. ", " .. self.Z .. " )"; end -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3 ); -- ( 90, 124, 68 ); Заключение Как видно на примерах, в этом нет ничего сложного. Как и говорилось выше, с помощью данного функционала можно реализовать полноценные классы. Есть пару библиотек которые автоматизируют этот процесс, одна из них идёт в комплекте с Lua (require "classlib"), а вторая валяется где-то тут. Задавайте свои вопросы, постараюсь на них ответить Материал написан специально для mtasa.com. Копирование запрещено
×
×
  • Create New...