1. Lord Henry

    Lord Henry

    Other Languages Moderators

    • Points


    • Content Count




    Scripting Moderators

    • Points


    • Content Count


  3. DNL291



    • Points


    • Content Count


  4. Tut


    Creative Moderators

    • Points


    • Content Count


Popular Content

Showing content with the highest reputation since 06/06/19 in Posts

  1. 39 points
    Multi Theft Auto: San Andreas 1.5.7 is released Today we are proud to announce the release of MTA:SA 1.5.7. You will receive an automatic update soon, but if you don't have MTA installed, you can get it from the home page. This is the final release to support Windows XP and Vista — if you still use Windows XP or Vista, upgrade Windows now. We are also looking for a web designer to help us create a new website! Statistics Multi Theft Auto: San Andreas turned 10 years old last week. Happy birthday! This is the 24th 1.x.x release 359 days since our last release 27 new functions 4 new events 117+ bug fixes and changes 540+ commits 30 contributors, of which 7 are new 64+ total contributors Download This release is backwards compatible with the older 1.5.x releases (1.5.6, 1.5.5, all the way to 1.5). However, if you would like to take advantage of all of these useful changes, you will need to go and download the update! Servers: binaries are available. Do not forget to update your default resources. Highlights This release includes many additions, improvements, and fixes: New drawing functions dxDrawPrimitive and dxDrawMaterialPrimitive Improved performance Fix swimming speed on higher FPS Skimmers can now lift off water at high FPS New events onClientWorldSound, onClientPedStep, onClientVehicleWeaponHit Surface property functions like engineSetSurfaceProperties and much more! Read the 1.5.7 release notes for a complete set of changes and more information about the improvements listed above. Watch or star our GitHub repository to keep on top of all the things we're working on. Important future script changes From 1.6 onwards we will be making at least the following changes: callRemote callbacks currently set the error code to nil when there is no error. In 1.6, to be consistent with fetchRemote, the error code reported will be 0. See GitHub #294. Since July 2016 if you provide an invalid string like "randomstring" when a function expects a number, the string will be treated as 0 and raise a script warning. In 1.6 this will be an error. You will still be able to provide strings containing numbers (e.g. "100" and "12.34"), this change only affects invalid strings. See GitHub #1043. When providing a width and height of (0, 0) to createBrowser or guiCreateBrowser you will encounter a script error instead of a warning. The warning was introduced Feb 2019. See GitHub #1069. Some functions expect only unsigned integers (positive numbers), and since Jan 2016 providing negative numbers would be a warning. This will now be an error. See GitHub #1070. Since Aug 2015, we replaced the custom mtalocal:// URL scheme with http://mta/resourceName/blah.html. This mtalocal:// URL scheme will now be removed. See GitHub #1071. This list is inconclusive and we may introduce more changes later. What's next? Multi Theft Auto depends on community input and contributions. To keep a project like MTA going we need LOTS of people. You can help in the following areas: Designing We are looking for a web designer to help us create a new website. Testing and bug reporting Whenever you encounter a bug or recognise a need for improvement, we can't fix it until you tell us your problem! We're continually working on new features and fixes for MTA, and this always needs testing. Join our Nightly release stream (Settings -> Advanced -> Update build type) and make sure you keep in touch with on Discord and report issues on GitHub. Programming If you know C++ you may be interested in helping improve Multi Theft Auto's client. Working on open-source software may seem scary, but the best way is to try! Read GitHub's open source guide, and then find an itch to scratch, or scratch your own! Documentation Documentation is important, but also time consuming. If you enjoy writing and have some knowledge of English, or you would like to translate the English version to your native language, you’re very welcome to do so. Just head over to our wiki, create an account, and start editing! Support Do you like people? Can you give calm and thought-out responses to users needing help? Then you can spend some time providing support to those who need it. Many answers can be found on our wiki, so make sure to take some time to read it. Then, either join our chat or forums (linked below), or simply help us sort out issues and answer questions on the GitHub repository. Translation Want to translate MTA to your own language? Awesome! Visit us on Pootle. As soon as your translation is approved, it will be pushed to our repository for use in future releases. Donations Keeping the MTA downloads, master server and websites alive costs money! If you want to help us sustain our financial expenses, please donate! Thank you! Thank you to the following community members for their donations this year: Arran, [RUS] Artem Smirnov, Atti, (SAUR)Castillo, CEKfile, .:CiBeR:., Dmi7ry, HACKER99, Malone, Nero, Nicolae Vlad, pentaflops, Platin, -ffs-Sniper, Tapleto-Hos Thank you very much to the following community members for their work towards this release: Addlibs, Arran, CrosRoad95, Dezash, Dutchman101, FileEx, forkerer, Haxardous, lex128, lopezloo, LopSided, Neproify, nonamenoname, ricksterhd123, samr46, StrixG, tederis, TheNormalnij, xerox8521, xLuxy and many others who contributed to our wiki and helped out with issues. (If your name is missing or you want to change your entry above, please let us know on Discord!) You could be on this list! We're always on the lookout for new contributors. Contribute on GitHub, and chat with us on Discord. We have channels for scripting, general support (bugs), mod development, and many more! Finally, please give a 👋 to our newest contributor @myonlake and our newest addition to the MTA team @botder! Hope you've had a great summer! — MTA Team
  2. 27 points
    Hello. 2019 is nearing to an end, so here is our traditional "A year in Recap" post for you. Below you can find the summary of what has happened this year - along with the current status of an entry (where applicable) and other things that might be interesting to you. 📰 2019 in Recap Late January, we have refreshed our Forum Rules - we gave them a new look and rephrased a bunch of paragraphs to make them more clear and easier to follow. In May, we have decided to drop support for Windows XP and Vista in our future releases. These operating systems are no longer supported by Microsoft and only a handful of our players still use them. We have advised our players to upgrade their PCs to newer Windows versions. While Windows 7 support will be soon ended by Microsoft as well, we still intend to support it in MTA:SA for a while. In July, we have opened an User Guides section on our forums, which aims to provide our users with quality guides and tutorials for various MTA-related topics. We are still looking into improving this concept. On 31st of August, we have released Multi Theft Auto: San Andreas 1.5.7. This release was focused on performance improvements, minor scripting additions and bugfixes. It is still the current release and, as mentioned above, is the last main release for Windows XP and Vista. On the same day, we have asked you guys to help us re-design our community website. The work on the new community is currently on hold however. Later in September, Rockstar Games has released GTA: San Andreas for free on their launcher app (for a limited time). We have added support for it in MTA:SA shortly after. 26th of October marked the 15th anniversary of Grand Theft Auto: San Andreas original release on PS2. While it was not the game we started with, it was the game that allowed us to make MTA the successful mod it is today. 📺 A bunch of interesting MTA:SA-related YouTube videos from this year MTA SA: SAPDFR Online Gameplay 171 (Flaming in the Cold) - server SAPDFR.org, video by Armor23OnPatrol [DM] NeiT ft. Gteatero ft. nX_ - Demons Skills 3 - video by GercszTV FBX replace per element feature - concept and video by CrosRoad95 [MTA SA] Let's play S.T.A.L.K.E.R. - server ex-zone.ru, video by TEDERIs MTA:SA - Legend Mercy Tactics - video by TheGam3r23 MTA:SA Hydra Stunts 2019 [SW]Supa Innovation - video by SupaHotFire 📈 Current player counts and version fragmentation statistics Type Amount of players Date / Time Recent peak number of concurrent unique players 31808 players 2019.12.15 (at 17.30 GMT) Highest recorded number of concurrent unique players 34653 players 2018.02.03 (at 17.30 GMT) Recent number of daily unique players 132450 players 2019.12.21 (Saturday) Highest recorded number of daily unique players 185818 players 2018.02.03 (Saturday) Recent number of monthly unique players 531728 players November, 2019 Highest recorded number of monthly unique players 805903 players January, 2018 Player counts were lower than the ones from last year, but they're still large. Again, it's great to see that so many players are still interested in GTA:SA even though it's over 15 years old now! MTA:SA Version or series Percentage of players using that version or series as of 22nd of December, 2019 1.6.0 (old-alpha) 0.1% 1.5.7 97.80% 1.5.6 1.20% 1.5.5 (and older) 0.70% 1.4.x 0.1% 1.3.x 0.1% The latest stable version is the most popular one - and that's good. 📟 Status updates Not much to say at the moment. Things have slowed down a bit, but we are working towards the next release. That's it for now. ☃️❄️Happy Holidays and best wishes to all of you in 2020! 🥂🎆 -- MTA Team
  3. 19 points
    Hey, i reworked mta community webpage. I apologize in advance for my bad english ❤️ Russia power!
  4. 17 points
    Introduction Modding is a term used when modifying components, files and what not, in this particular case modifying game installation files in order to achieve unique results not seen in the vanilla game. GTA:SA is 3D era, where modding the game requires special 3D packages. Older games such as GTA:II uses a 2D engine, which means that modding the game was commonly done with image editing applications. We will cover some aspects of modding game textures and models. This guide intends on introducing those inexperienced with modding and 3D as a whole, on how to obtain 3D software and their recommended tools. It also introduces ways to import and export models, basic workflows for 3ds Max, texturing and creating models. TOC 3D packages, helpful tools and how to obtain them Extracting game assets How each type of game model works Limitations - MTA vs GTA Working with 3ds Max Texturing a game-ready cube 3D packages, helpful tools and how to obtain them There are various applications being used for modding. Although some has more tools available, there really isn't one that tops the others. In this section there'll be lists of a few 3D packages and tools used for modding. 3ds Max, arguably the most used program with the greatest amount of third-party plugins and scripts for various games. For GTA:SA, this program is favored by many modders due to it having 3rd party scripts for dealing with animations, collisions, lighting, modeling etcetera. There isn't much that 3ds Max can't, that other programs can, when it comes to GTA:SA modding. Although this can be expensive to run on a longer term, there are education licenses available which last for 3 years. These do not allow commercial use, and is marked purely as "educational use only". View more. Kam's (vanilla) max scripts, the first official script package for modding GTA:SA with 3ds Max. After the release of his scripts, a lot of others has developed scripts of their own, some of which are more optimized and less prone to issues. Even despite Kam's scripts having overseen issues, it is still to this day widely used for tasks such as, but not limited to; IPL map generation and import, collisions, animations, characters, vehicles, environment modeling. View more. Kam's (2018) max scripts, a modified version of Kam's vanilla scripts for 3ds Max. Notable features that were added are; DK22pac's Normal map plugin support, reflection map support for environment models, 2dfx panel for lights such as aircraft lights or street lamps. View more. The Hero's RW importer/exporter, a modern plugin that works extremely well with vehicles and environment models. Due to its simplified layout it is very easy to get used to. It's far recommended to use for vehicle model import/export due to its quality handling and materials, which are based on RW formats (renderware, the engine GTA:SA runs off). With the plugin using different model material formats from Kam's, it comes with a maxscript to convert scene materials from GTA_MTL to RW_MTL and vice versa, if needed by the modeler. View more. Deniska's max scripts, a pack for various types of GTA:SA modding, some features are obsolete for MTA users due to IPL and IDE modification required. Although, the pack does come with a few tools that may be useful to MTA modders, such as prelight tools to set the vertex colors and illumination to fixed values. View more. DexX's 2dfx export script, a standalone 3ds Max script that exports Omni and Dummy informations to .sae file formats, to then be added to the .dff using RW analyzer. With this script it's possible to integrate lights and particles into custom models, e.g flashing aircraft lights, street lights, fire and smoke, etcetera. With the release of Kam's 2018 scripts, this script is used less as using Kam's may be less work for some cases. View more. Blender 3D, a freeware (yes, completely free, no paid watermarks or any limitations), not as favored by modders throughout the years until recently, where a developer has released his script 'DragonFF' on GTAforums. Although it is WIP, modders has already binned 3ds Max and moved permanently to Blender. Although Blender is free, it actually combines several programs into one, allowing a Blender user to sculpt, paint, do lighting, professional rendering and modeling in one. A recent update in 2019 changes the RMB selection to LMB and UI among other things, making for a potential alternative to 3ds Max. View more (Blender). View more (Blender GTA script) Zmodeler, not as commonly used as the aforementioned programs, although it is being used very frequently by modders in various games, most notably for GTA:games. It does not have support for skinned characters, although it is being commonly used for vehicles, and sometimes environment modeling as well. This is a fairly inexpensive solution, but lacks tools for more broad modding. View more. Sketchup, a 3D application that focuses on architecture. For modding, it is a rather uncommon, though has a free and paid version and can be used for seemingly OK modeling. It does not have access to any 3rd party scripts for GTA:SA, hence its only use is modeling and then exporting model files to then import into 3ds Max or Blender. View more. Photoshop, mainly used for graphic design, but can also produce 3D models, video, GIF and textures for assets. Photoshop is the most favored by modders in regards to working with textures e.g paintjobs and retexturing. Although there are alternative image editors in the market, Photoshop definitely hits the top in terms of usable scripts (user-customized scripts as well) and ease of workflow. View more. DFF Viewer, a 3D graphics engine that is used for visualising GTA:SA models and supports .DFF and .TGA formats. Only single dff's can be loaded at a time. Though this is rarely used by those who has access to 3ds Max and Blender, it is commonly used for troubleshooting/testing work that involves retexturing a model e.g changing the clothing textures of a character. This program is entirely free and available from various GTA modding sites. View more. TXD Workshop, a texture dictionary editor that has been around for years, only since recent years to be succeeded by Magic TXD. Though TXD Workshop may not be the best for setting up TXD files, it has a built-in IMG archive editor, allowing one to browse all of the contents of gta3.img. View more. MagicTXD, a new texture dictionary editor with features for mass exporting .TXD contents from folders into image subfolders, texture compression, mipmaps, resizing textures etcetera. This is broadly used for .txd files and almost took over TXD workshop when it comes to working with texture dictionaries. View more. RW Analyze, a multi-use program with notable features being; ability to lock/unlock game files, add data to game models e.g 2dfx and vertex colors information extracted from other DFF files. View more. Extracting game assets In order to start modding GTA, access to the files is required. The files in question are commonly found in parent files that require some sort of program to open. In this case, TXD Workshop or any IMG editor and optionally Magic TXD for later on will work just fine. The below steps shows one way to extract all models and their texture dictionaries. For IMG editors (e.g Alci's IMG Editor): Open the editor. Under File, select Open. Find gta3.IMG stored in GTA SA directory\models. Highlight the first file in the list, then scroll down to the very bottom and SHIFT+LMB click the file on the bottom. This highlights every file in GTA3.IMG. Right click the list of files and select Export. On the popup window, find and select, or create a new folder on desktop called GTA SA ASSETS. Click enter to proceed. ((For cases where specific files are wanted, use the search field to find the necessary files and export them individually)) For TXD Workshop users: Open TXD Workshop. In the toolbar it says Open IMG. Click this, then find and select gta3.IMG stored in GTA SA directory\models. Highlight the first file in the list, then scroll down to the very bottom and SHIFT+LMB click the file on the bottom. This highlights every file in GTA3.IMG. Right click the list of files, select Extract. On the window, find and select, or create a new folder on desktop called GTA SA ASSETS. Click enter to proceed. ((For cases where specific files are wanted, use the search field to find the necessary files)) Now the folder GTA SA ASSETS contains nearly every .dff, .col, .txd and so on used by the game. Assuming one would like having all of the textures in PNG, DDS, TGA or any other common image format, they may follow the below steps using Magic TXD. Inside GTA SA ASSETS create a new folder named IMAGES. Open any .txd file found in GTA SA ASSETS using Magic TXD. Navigate to the toolbar. On Tools, click Mass export. Export settings are as following. Game root = root folder containing TXD's Output root = folder where images goes Image format = self explanatory With texture names only = exports images directly to folder and duplicate named ones gets replaced by one another Pre-pended with TXD name = exports images with TXD prefix In separate folders = makes new folder(s) for every TXD's contents Hit export. This process may take some time. Note that this process is the same for other .IMG archives such as player.img. There are also .txd and .dff files elsewhere, such as \models\generic\generic.txd, which is the vehicle shared texture dictionary file. How each type of game model works Models used on GTA SA uses different rendering techniques and data hierarchy than others. This section will introduce the features that some models has that others don't. Vehicles: Vehicle model components utilises hierarchies, where each component is linked to a dummy (helper) and each dummy is linked to parent dummies e.g chassis_dummy, for them to be registered in the hierarchy. In order for vehicles to not look flat or cartoon, a few steps are made in the model; Diffuse material is given a grunge texture or AO map, this helps telling the depth of the vehicle as well as giving it a feel of realism, so it isn't just clean. A specular lighting image is applied to the vehicle surface material, giving it a fake shine when looking from certain angles. If the vehicle has hard edges (smoothing), this image can increase the visibility of the normals, retaining its original look rather than being flat without visible difference in geometry. An environment (ENV) map is applied to the vehicle surface material, producing a fake reflection that is animated horizontally as the vehicle travels. Vehicles also has a lot of hardcoded features such as headlights, brake lights, emissive lights, taxi/aircraft lights, rotatable components and dynamic collisions for special vehicles like Forklift. Vehicles are also the only dff models that uses baked collisions, which means they are stored in the .dff itself. Below is a detailed hierarchy used for cars, and special components used by a number of vehicles (click the spoiler). Skin characters: Ped skin characters uses bones (dummy objects) that are connected to each other and linked to the character model. These bones are not visible in-game. In order for the bones to know what part of the 3D model they're responsible for, the skin needs to be rigged. Character rigging for GTA:SA is done by applying weigh on vertices. Using heatmap display, colors go through blue-red, low-high respectively. Values go from 0 to 100. If the value is 0, it means that the vertex is not used for any bone. This can cause issues. If the value is < 100, it means that the vertex is used for multiple bones. This results in smooth animations ingame, as the 3D model transitions smoothly through each bone. If the value is 100, it means that the vertex is only responsible for one bone. Skin rigging is generally something that is being avoided by modelers and makes Skin modeling the most difficult on GTA. Bones are as shown: CJ character: Carl Johnson's 3D model is split into several pieces in order to be compatible with the clothing script used to let the player customize CJ. These models uses a function known as multiclump to support 3 meshes per dff; normal, ripped and fat. This is for CJ's health stats to physically show in-game. Other than multiclump and additional bones, modding CJ skin is essentially the same as any other ped skin. Map environment: World objects .dff contains only single models, though they do support omni and dummy objects for 2d effects. These types of models uses Vertex Colors/Face Colors. This requires the modeler to paint colors onto the model which is then stored in the vertex colors channel (daytime) and vertex illumination channel (nighttime). Although uncommonly used by R*, these models do support reflection maps like vehicles use. Goldfish's modified version of Kam's scripts is excellent for exporting with reflection maps. GTA SA utilises multiple collision archives (.col) for every IPL district, being responsible for all of the world objects' collisions. However, on MTA, collision archives are not supported, so custom collision files are single models per .col. Not every object uses collisions though, some merely has their bounding space. These objects can not be selected with MTA map editor, thus requires additional scripting or modding. Limitations - MTA vs GTA Speaking of native support, MTA currently is behind in several places. Notable features that aren't available on MTA, but on GTA are as following. Item Placement (IPL) - another type of mapping file, but contains a lot more functions such as zones for real-time reflections as seen in interiors. Item definition (IDE) - a file used to but not exclusively, define settings for models, enabling alpha flags, disabling backface cull, enable breakable effect and much more. Limit adjuster - a rework of the game that allows for adding more ID's and bypass common limits. This however is being developed by one of MTA's contributors. There are various limitations such as polys per model, max dimensions for models and collisions, (very) strict size limits for collisions and CPU usage that can easily cause issues for modders. Not to mention the majority of the game data files which most MTA servers likes to force original, else the player won't be able to connect. These limits all has potential solutions being developed as with the limit adjuster. Working with 3ds Max As described above, 3ds Max is without a doubt the most common program for GTA modding. It's also used by professionals within architecture and visualisation and film industry. What's amazing about this program is that whatever is created in 3ds Max can ultimately be added to the game. A modeler made a square - it can get added right away, no adjustments required. That's the charm of 3ds Max. There's no need for additional tools to process the model for it to be compatible with GTA. It is also the primary program that Rockstar's developers used for creating the environment in GTA:SA. At a first glance, the program may seem rather intimidating. The main functions of the program that a beginner should be aware of are listed below. Shows the default home screen with 4 viewports. Left, Top, Front and Perspective. The 3 side ones are Orthographic viewports while Perspective is in regular mode. It is also the most common one to use. Highlighting a viewport and pressing (left)ALT W will full screen the viewport. In order to rotate camera view, the user must click and drag the square in the upper right corner. Its face also tells which side the camera is viewing e.g Top. If one wishes to see viewport statistics such as polygons per model, vertex amount etc., clicking: [ + ] icon on the upper left side > Configure Viewport > Statistics > Total + Selection > Apply > Clicking 7 on keyboard shows the statistics. This feature is extremely useful for modelers who are limited in polygons per model, or simply wants to see how many polys a car is. Common keyboard shortcuts F1: Opens Autodesk help section in new browser tab F2: Displays blue overlay on models F3: Displays models in wireframe F4: Displays edges on models F10: Opens render setup 9: Shows viewport statistics Q: Select objects W: Select and move E: Rotate R: Select and (mode) scale U: Orthographic viewport mode P: Perspective viewport mode A: Toggle angle snap S: Enable snap D: Disable viewport G: Enable/disable grid J: Display bounding edges LALT X: Xray mode for model Ctrl Z: Undo action Ctrl Y: Redo action In a heavy program like 3ds Max, being able to change preferences to one's likings is important. Do so by going to Customize > Preferences. Performance, file settings and such can all be configured in there. For GTA:SA modding, knowing how to subdivide and add geometry to existing GTA models is very important. Below is a list with actions that may come in handy. No-brainer: Editable Mesh is inferior to Editable Poly. Use Poly, poly, poly, poly... Editable mesh modeling Vertex selection mode Edit Geometry section Attach: attaches another model in the scene to the selected mesh Chamfer: chamfer selection of vertices; creates additional geometry Weld: merges vertices together within a specified threshold Surface Properties section Edit Vertex Colors: sets the color and illumination of selected vertices Edge selection mode Edit Geometry section Divide: divides an edge, adding a new vertex where it was divided/split Extrude: create and pull a new face out from existing edges (keyboard shortcut: LSHIFT + LMB-drag) Face selection mode Edit Geometry section Divide: creates a new face Extrude: pulls the select face(s) outwards or inwards and creates new geometry off that Bevel: essentially an Extrude followed by scaling of the face Surface Properties section Flip: flips a face 180 degrees Smoothing groups: defines the smoothing of the model. Autosmooth is in many cases OK, but may not fulfil everyone's expectations Editable poly modeling Vertex selection mode Edit Vertices Connect: selecting 4 verts on a box side and using this function will triangulate the side. Edge selection mode Edit Edges Connect: creates an edge between the selected edges, as in a bridge between two cliff sides (use the 'Settings' to choose between multiple or one edge on creation) Polygon selection mode Edit Polygons Inset: places a new polygon inside the selected, allowing to be scaled Bridge: connects two opposing polygons by creating a bridge between them (can be used for walls and gaps) Edit Geometry Slice Plane: enables the user to create a perfect cut on the model, can be rotated by degrees Rendering scene Modelers working on projects for companies or friends might want to show what they've accomplished, but a regular screenshot may not suffice. Talking of a screenshot like this: Instead, the modeler might want to show the scene with textures. Perhaps more than just textures - lighting? reflections? transparency? - this is where 3D rendering comes into play, and can be done by simply pressing SHIFT + Q on the keyboard. This can also by default use alpha channel. However, the quality could improve. The quality of the render depends on the scene assets (models, materials, lights), the Renderer and its settings. By default, 3ds Max utilises Scanline Renderer. This is not a production quality render, but rather meant for test shots and demos. Though the quality isn't great, it's still possible to produce seemingly interesting renders. The following render took merely 8 seconds. Using 3ds Max allows modders to bring GTA:SA into modern graphics, easily comparable or even superior to ENB's. It also enables modelers to share visualizations of their models to help the customer understand how it could potentially look for their game. In the above render, a Skylight is used with Scanline Renderer. A very basic render, though interesting and contains lots of depth. In order to replicate this result, below are the steps to follow: On the Create panel, where one would normally find boxes and spheres, click the toolbar Lights. Where it says Photometric change that to Standard. Click the Skylight and place it in the 3ds Max scene. Settings for Skylight explained Multiplier: intensity of the light Sky color: the color of the light Cast shadows: enable to produce shadows, though this is more of an Ambient Occlusion than actual shadows Rays per sample: quality of the shadow, ideally keep at <5 for tests and 15-20 for final shots In the actual render above, a sample of 5 was used, creating grainy shadows but quick render. Backface culling was enabled to avoid slowing down the render time. Skylight is great light source and is generally used to illuminate an entire scene and not particular models. In the same Lights tab, one may find use of Omni or Free lights, which both works great. These are great point lights, which as opposed to skylight, are able to illuminate parts of the scene e.g acting as street lights. Modifiers When modeling, modifiers can come in use and save the modeler a lot of time. The following modifiers are highly suggested for beginners to know about. Bend: bends the model, effect depends on the differences in the geometry Mirror: copies the mesh and mirrors it on the other side, commonly used for vehicles using symmetrical geometry Smooth: generates and applies smoothing to the model, generally the lower values makes for higher file sizes Symmetry: essentially the same modifier as 'Mirror' Turbosmooth: Smoothens the mesh, adding geometry, uses iterations Unwrap UVW: advanced UV editing, commonly used for preparing textures for models like characters and game assets UVW map: basic UV editing, X/Y/Z projection mapping as well as spherical, box and planar mapping Vertexpaint: allows for painting colors onto vertices and faces, these colors are rendered during either ingame or night time Texturing a game-ready cube Modeling has to start somewhere. Using standard 3D primitives is a good place to start. For the purpose of this guide, a Cube will be created in 3ds Max and textured in Paint.net, a free image editing software. Video tutorial: To start off, navigate to 3ds Max's Create tab on the right hand side panel, as shown below. Shows the Create tab on the panel. For this guide, click on Box (Cube). Use LMB and click and drag the mouse in the viewport to create the cube. Now that the Cube primitive is spawned in the viewport, on the same panel that it was created from, go to Modify tab and set its dimension parameters to 5,0, 5,0, 5,0 and 1 segment for all 3. Convert the model to Editable Poly by right clicking it in the Viewport > Convert to > Editable Poly. Go into Polygon selection mode and scroll down until the following buttons are visible: With viewport selected, on the keyboard press `CTRL A` to select all faces on the cube. Now, where it says `Color`, click the bar and on `Value` set it to 100, then do the same for `Illumination` but value at 35. What this does is it sets the vertex colors so that the model won't be overexposed during day/night time. Exit polygon selection mode and on Modifier List, click that and find Unwrap UVW. This applies a modifier stacked on top of the Editable Poly mesh. Under Edit UVs click Open UV Editor. This allows the user to make changes to the UV coordinates which tells the model how textures are projected onto the model. On the editor, ensure that Polygon selection is enabled. While in the UV editor, press `CTRL A` to select all UV islands. On the top of the editor click Mapping, then Unfold Mapping.... Keep it as Walk to closest face and enable Normalize Clusters. Click OK. The result should remind the user of how a simple cardboard box in real life looks when it's yet to be folded into a box. With the model unwrapped, on the toolbar on the UV editor, click Tools > Render UVW Template. The export settings below are ideal for this particular task. If one wishes to know exact dimensions of each square, enable Seam Edges. After exporting, on the modifier stack, press Collapse to. This saves the new UV's. The width and height should be on a 1:1 ratio to avoid stretching issues. 1024x1024 is more than enough. On the rendered image window, click the Save button and find a location to save it in, name it Cube_unwrapped and use Alpha channel (optionally). Now open Paint.net and insert the image. Once happy with the result, export as cube_diffuse. Diffuse map generated with the help of a UVW template. In order to apply the texture on the model, simply drag and drop the image from file browser onto the model in the Viewport. Although the example above is not textured properly in regards to rotations, it shows what can be done by using UVW templates, and how easy it really is to produce textures for models made from scratch. The model can be directly exported as DFF. Materials are not required to be GTA or RW, they can be standard and still show ingame. Some exporters wants the model in Editable Mesh however, so converting it may be required. Thanks for reading this guide, we hope it helps and we wish you the best of luck with modelling! For questions on modding, please refer to MTA's modding FAQ or MTA discord #modelling channel.
  5. 15 points
    For long time i considered to do something with physics in mta. For now doing even simplest things such falling box, tree on flat area looks cartoonish. In my history of i saw few attempts of doing simple physics, mostly it was in closed area without bigger interactions with poor performance due you just can't calculate collision in other way than processLineOfSight, isLineOfSightClear or read directly .col file as Tederis did. I started with something to render things, thats how FBX https://github.com/multitheftauto/mtasa-blue/pull/1093 to bypass default rendering to handle future i'll introduce in future. That's how bullet physics project born, first idea how to use react physics, works simillar but is lighter and general smaller project but 0x416c69 suggested to use bullet. I'll use this topic also to prepare long list of features it contains for future copy paste to PR and wiki page The main assumption is to allow for create multiple world with completly independed simulations, get and set detailed information about current step of simulation, fully control how everything is simulated, quality of collision tests, speed and a lot more. i'm trying keep amount of functions low, because if that most stuff is packed into one function. Syntax and name of some function might change in future or along suggestions. Not all properties supports every physics element, some are only get, other set only, however most of them are set/get Current stage: I already implemented function such a: physics physicsCreateWorld() - responsible for creating new world for simulations, return element which will use later. physics-rigidbody physicsCreateRigidBody( shape-type, mixed arguments ) - creates rigid body which is use to simulation bahaviour of non-static shapes, collisions ( currently only few models in mta can do this in simple way ). physics-rigidbody physicsCreateRigidBodyFromModel( model ) - used to create rigid body directly from collision data taken from gta model. physics-static-collision physicsCreateStaticCollision( shape-type, mixed arguments ) - creates static collision which will not move at all ( it is still possible to move it by Lua script ) physics-shape physicsAddShape( shape-type, mixed arguments ) - if you create compound shape, this function let you add more shapes into static collision or rigid body bool physicsSetProperties( any physics element, physics-property, mixed arguments ) - main function to control physics, rigid bodies, static collisions, shapes. Works in simillar way as handling functions. mixed physicsGetProperties( any physics element, physics-property ) - same as above, but getting properties bool physicsDrawDebug( physics ) - use to visualization of world, must be used in render function bool physicsSetDebugMode( physics-debug-mode, enabled ) - use to turn off/on debugging features bool physicsBuildCollisionFromGTA( physics ) - used to create static collisions in specified world from original collisions, doesn't create whole world instantly, require to move player around world to load collision data. physics-constraint physicsCreateConstraint( physics, physics-rigid-body, physics-rigid-body, constraint-type, mixed arguments ) - use to connecting two or more rigid bodies into one entity bool physicsApplyForce( physics-rigid-body, vector from, vector to ) - pushing rigid body in particular point you choosed. bool physicsApplyCentralForce( physics-rigid-body, vector direction ) - apply force from central position of rigid, it's more like "accelereate", should be used more than once at the some period of time bool physicsApplyCentralImpulse( physics-rigid-body, vector direction ) - setting position from center of rigid bool physicsApplyDamping( physics-rigid-body, float force ) - i'm not sure, but it should slow down velocity and rotation of model by specified amount of units physicsApplyImpulse( physics-rigid-body, vector direction ) - i'm not sure how it works physicsApplyTorque( physics-rigid-body, vector rotation ) - same as physicsApplyCentralForce but for rotation physicsApplyTorqueImpulse( physics-rigid-body, vector rotation ) - setting rotation speed physics-properties: "mass", "position" ,"rotation", "sleepingthresholds", "restitution", "scale" "debugcolor", "filtermask", "filtergroup", "stiffness" `sleepingthresholds` means how slow rigid must move/rotate to sleep, it makes stops moving at all but still can be pushed by other rigids `restitution` bounciness, between 0-1 but accept any value above `stiffness` - for fixed constraint `filtermask` i still figuring out how it work, but should let you use 32 bit mask to set which rigid with which should collide Bullet documentation: https://github.com/bulletphysics/bullet3/blob/master/docs/Bullet_User_Manual.pdf page 13 contains useful information when which shape should be used physics-constraints: "pointtopoint", "hidge", "fixed", "slider" Physics-shapes: "box", "sphere", "capsule", "cone", "cylinder", "heightfieldterrain", "compound", "trianglemesh", "convexhull" `compound` is used for constructing rigid made of various shapes Plans for future: "heightfieldterrain" shape type accept black-white texture for faster creation Support for cloths, soft bodies Media: Videos are availiable at my youtube channel https://www.youtube.com/channel/UC95MpsQ1JppDNpMvl_7c1rg screenshots and gifs of current progress: Documentation i use: https://pybullet.org/Bullet/BulletFull I'm waiting for your suggestions Topic not finished
  6. 15 points
    Introduction Properly handling your user's credentials (username and password) is very important, this guide gives detailed information and code samples on how to (properly) implement an account "system". This guide assumes you are not using MTA's built in accounts. Disclaimer: Any code shown in this tutorial is purely for illustrative purposes, and is not finished code, you should use it as a guideline, not a solution. Content The following topics will be discussed in this tutorial: How to hash and salt passwords (register) How to validate a hashed password (login) How to add "remember-me" functionality How to offer password recovery How to migrate from an older hashing algorithm, to a newer one Using a password policy (Extra) How to handle database leaks (Extra) What even is hashing and salting? For the purpose of this tutorial we expect a database structure which is somewhat similar to this: How to hash and salt passwords When you have a user register on your service, that user expects of you to keep their password safe. Whilst it is generally bad practice to use the same password for multiple services there are many users that still do so. Because of this it's crucial that you save the user's passwords in a way that an attacker will be unable to find out the original password the user typed. This includes if they have full access to your database. In order to do this we do what is called "Password hashing" When a user registers, your server receives the user's intended username, (email) and password. Before you save that password to the database you have to hash and salt this, luckily MTA has a function that takes care of this. If you wish to know more about what exactly it does, there's more information at the end of this tutorial. In order to hash this password you use the passwordHash function. This function is relatively slow (by design), so it is highly recommended you pass a callback to this function, so your entire script doesn't wait for it to complete. https://wiki.multitheftauto.com/wiki/PasswordHash local mysqlHandle -- we're assuming this value is set somewhere else in code function register(username, email, password) local player = client passwordHash(password, "bcrypt", {}, function(hashedPassword) -- callback function for hashing the password local handle = dbQuery(function(handle) -- callback function for storing the user in the database if (handle) then triggerClientEvent(player, "registrationSuccess") -- inform the user that registration was successful else triggerClientEvent(player, "registrationFailed") end end,mysqlHandle, "INSERT INTO users (email, username, password) VALUES (?, ?, ?)", email, username, hashedPassword) end) end addEvent("passwordTutorial:register", true) addEventHandler("passwordTutorial:register", getRootElement(), register) How to validate a hashed password Once you've saved the hashed password to your database you need to do a little bit of additional work when authenticating the user. Luckily MTA offers a passwordVerify() function, which is the counterpart of the previously discussed passwordHash(). What this function does it basically hashes the password in the same way, resulting in the same output hash. https://wiki.multitheftauto.com/wiki/passwordVerify In order to get the account the user is trying to log in to you have to do a query for an account which has the user submitted username, and of which the password matches through passwordVerify. PasswordVerify is also a relatively slow function, thus you should use a callback. function login(username, password) local player = client dbQuery(function (handle) -- callback for the query selecting the user by username local results = dbPoll(handle, -1) if (#results == 0) then triggerClientEvent(player, "loginFailed") return end passwordVerify(password, results[1].password, {}, function(matches) -- callback function for the password verify if (matches) then -- Do anything you wish with the database result to log the player in with the rest of your scripts triggerClientEvent(player, "loginSuccess") else triggerClientEvent(player, "loginFailed") end end) end, mysqlHandle, "SELECT * FROM users WHERE username = ?", username) end addEvent("passwordTutorial:login", true) addEventHandler("passwordTutorial:login", getRootElement(), login) How to add "remember me" functionality When users on your server log in, they often do not want to have to enter their username and password every time they want to log in. In order to satisfy this need you can implement a "remember me" function. What I've seen happen in the past, is people would store the user's password (encrypted) on the client. This is NOT safe, and should never be done! In order to properly use remember me functionality what you would do is upon login in, generate a random string. The longer the better. This random string is what we call an access token. You would then allow the user to log in with such an access token, preferably only once generating a new access token each time one is used. To implement this you would generate that token every time the user logs in, whilst they have "remember me" enabled. You will have to save this token in your database alongside your user. For extra security you could also store the user's serial alongside the access token, you can then validate that the access token is being used from the same device. https://wiki.multitheftauto.com/wiki/Filepath function login(username, password) -- This code should be put in the callback to the dbQuery function, but to keep the example clean that's not shown here if (rememberMe) then local token = generateRandomToken() dbQuery(mysqlHandle, "INSERT INTO access_tokens (user_id, token) VALUES (?, ?)", results[1].id, token) triggerClientEvent(player, "loginSuccess", token) end end function rememberMeLogin(username, accessToken) -- this function handles a user's login attempt dbQuery(function(handle) local result = dbPoll(handle, -1) if (#result == 0) then triggerClientEvent(player, "loginFailed") else -- Do anything you wish with the database result to log the player in with the rest of your scripts triggerClientEvent(player, "loginSuccess") end end,mysqlHandle, "SELECT users.* FROM access_tokens JOIN users ON users.id = access_tokens.user_id WHERE users.username = ?", username) end addEvent("passwordTutorial:loginRememberMe", true) addEventHandler("passwordTutorial:loginRememberMe", getRootElement(), login) How to offer password recovery Offering password recovery requires a little bit more than just your MTA server. Generally password recovery is done with emails. So you would need access to an email server / service which you can use to send an email from an HTTP request. (Like you can do with fetchRemote()). When a user requests a password reset, have them enter the email you registered with. You then fetch a user from the database with this email address. You would then store a password recovery token for this user. This token, just like the remember me token, is a random string. Ideally, you would send the user a link with a password reset form that goes to a webpage where the user can reset their password. You could do this with an external service, like a webserver. Or you could use MTA's Resource web access for it, but if you do make sure you handle permissions properly for anything else that uses this. However another option would be to have the user copy paste the generated token from the email into you server's login window. Which of the two solutions you pick is up to you, my personal preference goes to the one with the link in the email. But in either case the server side logic is the same. When the user attempts to perform password recovery, verify that the token they give you belongs to a user, and then change the password to the newly requested password. Make sure you hash this password the same way you do in your login. function requestPasswordRecovery(email) dbQuery(function (handle)) local result = dbPoll(handle, -1) if (#result == 0) then triggerClientEvent(player, "passwordTutorial:passwordRecoveryRequestFailed") else local token = generateRandomToken() dbExec(mysqlHandle, "UPDATE user_data SET recovery_token = ?", token) -- mail the token to the user, mail implementation depends on the mail server/service you use triggerClientEvent(player, "passwordTutorial:passwordRecoveryRequestSuccess") end end, mysqlHandle, "SELECT * FROM users WHERE email = ?", email) end function recoverPassword(recoveryToken, password) dbQuery(function (handle) local result = dbPoll(handle, -1) if (#result == 0) then -- this is only valid if you have the user request password recovery from ingame triggerClientEvent(player, "passwordTutorial:passwordRecoveryFailed") else passwordHash(password, "bcrypt", {}, function(hashedPassword) -- callback function for hashing the password local handle = dbExec(function(handle) -- callback function for storing the new password in the database if (handle) then -- this is only valid if you have the user request password recovery from ingame triggerClientEvent(player, "passwordTutorial:passwordRecoverySuccess") -- inform the user that registration was successful else -- this is only valid if you have the user request password recovery from ingame triggerClientEvent(player, "passwordTutorial:passwordRecoveryFailed") end end,mysqlHandle, "UPDATE user_data SET password = ? WHERE recovery_token = ?", username, recoveryToken) end) end end, "SELECT * FROM users WHERE recovery_token = ?", recoveryToken) end Besides changing the password, it's important you also delete any access tokens that user might have if you're using remember me functionality. It is also good practice to make recovery tokens expiry after a certain amount of times, and not allow a recovery token to be created whilst one is already in progress. This prevents a user from sending a large number of emails from your service. How to migrate from an older hashing algorithm, to a newer one Maybe after reading this topic you realise that your password security is not what it should be. So you want to change your old password hashing / validation logic to the ones explained in this topic. And due to the nature that hashes can not be "unhashed", you can't simply migrate your passwords over. So in order to migrate the passwords what you have to do is when a user logs in, first validate their password with the old hashing algorithm. If this matches, then hash (and salt) it with your new hashing algorithm and save it in your database. Make sure to delete the old password otherwise your password security is not any better than before. Using a password policy Passwords policies are important to prevent your users from picking a password that is too easily cracked / brute forced. Many password policies come in the form of "Must have at least one capital letter, one digit and one number". But that discards that fact that the best way to make your password more difficult to crack, is making your password longer. So in the code snippet below is a function that measures the 'search space' of a password. The search space of a password is the amount of possible passwords there are with a certain combination of characters. In order to use this, you would have to set a minimum password search space when a user registers for an account. This minimum is up for you to set, but be reasonable, you shouldn't expect a user's password to be impossible to remember / create. I recommend playing with the function a bit to see what values you get out of it, and pick something you believe is sensible. function getPasswordSearchSpace(password) local lowerCase = password:find("%l") and 26 or 0 local upperCase = password:find("%u") and 26 or 0 local digits = password:find("%d") and 10 or 0 local symbols = password:find("%W") and 32 or 0 local length = password:len() return (lowerCase + upperCase + digits + symbols) ^ length end -- The below function calls are to indicate the difference in search space for a set of passwords print(getPasswordSearchSpace("a")) print(getPasswordSearchSpace("abc")) print(getPasswordSearchSpace("Abc")) print(getPasswordSearchSpace("Ab!")) print(getPasswordSearchSpace("Ab!0")) print(getPasswordSearchSpace("Mu#9A0h.")) print(getPasswordSearchSpace("This is a demonstration of how easy an incredibly strong password is to remember")) How to handle database leaks If you have reason to believe that your database has been leaked or otherwise compromised, it is important that your first course of action is removing any access tokens stored in your database. Once you have done that you have to inform your users. Whilst when properly hashed and salted it's extremely difficult / time consuming to find out a user's password it is still a possibility. So you should inform your users of the breach, tell them that their passwords were properly hashed, and they do not need to fear for their passwords immediately. However you should suggest to your users that they change their password either way, just in case. What even is hashing and salting? Hashing has been brought up several times in this tutorial, whilst you do not need to know what it is / does, you might be interested in knowing regardless. I won't be going too far in depth as I simply do not have the knowledge, but the basic idea of hashing is this: When you hash anything, you turn it into a string of characters (or other value) that has no relation to the original input, other than when you hash the original input again, it will always generate the same hash. For example, when you hash the string 'banana' using the sha512 hashing algorithm, it will always yield the output: "F8E3183D38E6C51889582CB260AB825252F395B4AC8FB0E6B13E9A71F7C10A80D5301E4A949F2783CB0C20205F1D850F87045F4420AD2271C8FD5F0CD8944BE3" Now hashing can not be reverted, you can not "unhash" a hash, so in order to verify someone's password you hash it again, and see if the two hashes are the exact same. Now this is great, passwords are safely stored. However there is still more to do, salting. Salting is adding some random data to your password prior to hashing it. This prevents when two users (on the same service, or on others) have the same password, that their hashes are also the same. Meaning if one password is compromised, the other password is not. It is important that a salt is random for every user in your application, not one salt for your entire application. Now you might think we didn't do any salting in the code / tutorial above. This is not true, we just didn't do it ourselves. MTA's passwordHash function actually hashes the passwords and salts it, this salt is then stored in the output hash it self, just before the actual password hash. In the case of bcrypt it actually stores a little bit more info in the resulting hash, but you need not worry about that.
  7. 12 points
    Draw distance v1.0.2 This resource improves the draw distance of all your resources that make use of map files. It makes your maps 10x more beautiful in my opinion! Greatly improves the draw distance of map objects Maxed out the draw-distance for peds and vehicles. (See MTA settings > video: Render vehicles always in high detail + Render peds always in high detail ) Multi-resources support (this effect is applied on every mapRoot element) Parallel loading method is used, but the loading speed is in that case reduced to improve performance. The effect is not only applied on resources that are starting, but also resources that are already running. Download here This resource is uncompiled! Repository: https://gitlab.com/IIYAMA12/draw-distance Video - Created by @Anx1ty Comparison Starting at 200 units distance 400 units distance (this is the distance where a lot of objects will be unloaded, but in this case switched with lowLOD objects) And even on 600 units distance, it is technically visible -> (while the fog is slowly eating it up... ) Download here Can all hardware run this? --> I have no idea... most likely 😷. Just give it a try.
  8. 11 points
    [TUT] Scaling DX The reason why I am creating this topic, is because there are a lot of people asking this question: And to be honest there is no best practice for. But here you have my recommendation as guidance for display them the ~s~a~m~e~ for all screen formats. There are two important factors while dealing with screen formats 1. Pixel density Indication: PPI(Pixels Per Inch) and some also use the term DPI(Dots Per Inch) They do not have to be the same while talking about printing stuff. This indication tells us about how many pixels are used per inch. Which more or less tells us how sharp/smooth things like text can be looking. PPI doesn't really play a big role, but to display something nicely you need enough pixels to display it. Else it will be either too small or too crispy. So be careful to not scale things (especially text) too small. 2. Display aspect ratio Wiki The difference between resolution X and resolution Y as a ratio. A list of common ratios: 4:3 5:4 3:2 16:10 16:9 So for example if we take: fHD: 1920x1080 Which has the ratio 16:9 that is calculated like this: 1920 / 16 = 120 120 * 9 = 1080 Scaling without ratio Before I am going to explain any of this, I am going to ask you an important question: Like this: (vertical) ▮ Or horizontal? ▅ I assume most people would agree to play MTA horizontal, else you are probably reading a book or document. p.s If you play MTA on a vertical screen, then we developers do not like you at all, sorry. So what does this tell us? You can assume that the X-resolution is never going to be smaller than the Y-resolution. Useful? You will figure it out. Doing the scaling Note: This part is ABOUT SCALING and not positioning. So what we are going to do is: Calculating a scale which can display the same DX on multiple screen formats > without messing with the ratio. Example: A computer runs MTA at a resolution of 1920 x 1080. Lets define that! local devScreenX = 1920 local devScreenY = 1080 If this code is used by a different pc, we also need to know on which resolution it is running: local screenX, screenY = guiGetScreenSize() For the next step we have to look at this screenshot: I have cut out of the wide-screen format a square. Squares have the ratio 1:1, which means that we have removed our ratio difference from this screen resolution. It is very easy to do, as our Y * Y resolution makes exactly that beautiful square! The next thing we have to do is creating our scaling value. This value is required for adjust our resolution values so that they match to every screen format. So to use our ratio 1:1, we use the Y resolution to achieve that: local scaleValue = screenY / devScreenY And as last we can create a rectangle shape that is displayed at the center of every screen format, perfectly! local devScreenX = 1920 local devScreenY = 1080 local screenX, screenY = guiGetScreenSize() local scaleValue = screenY / devScreenY addEventHandler("onClientRender", root, function () -- create a scaled size local sizeX = scaleValue * 300 -- 300px local sizeY = scaleValue * 50 -- 50px -- get the center of the screen local centerX = screenX / 2 local centerY = screenY / 2 -- calculate the starting point of the rectangle local startRectangleX = centerX - (sizeX / 2) local startRectangleY = centerY - (sizeY / 2) dxDrawRectangle ( startRectangleX, startRectangleY, sizeX, sizeY, tocolor ( 255, 255, 255, 255 ) ) end) Lower limit What if we have a resolution of 800x600? And the text is getting too small? Making sure that the pixel density is OK, is very important. So to counter that we have to make sure that the text is not getting too small. Our development Y resolution is 1080 pixels. And we are dealing with an Y resolution 600 pixels. The first thing we are going to look at, is what the scale is going to be at that point. 600 / 1080 = 0.55555555555555555555555555555556 It is not very nice to have your text scaled to 55.5% of the original size, when having low resolution already. But without scaling, the DX stuff might fill up the entire screen and that is just as bad. So what we now need is a limit, in this case a lower limit. scaleValue = math.max(scaleValue, 0.65) The math.max function returns the highest value of all the arguments you put in to it. In this case it contains the: scaleValue: 0.555 And the lower limit of: 0.65 This will make sure that the DX stuff is not getting smaller than 65%. This might make text read able for a 800x600 resolution.
  9. 11 points
    ServerIP: Our Discord: https://discord.gg/aR4kGxY OUR FORUM: https://forum.redcountyrp.net/ TEAMSPEAK: Sky Roleplay is made to create the ultimate roleplay experience. Sky Roleplay is a medium/heavy roleplay server, based in Red County. Sky Roleplay has many custom interiors, unique mappings, many unique scripts and last but not least, realistical roleplay experience. Features: Vehicle Sounds Mappings Interiors ETC.. ______________________________________________________________________________________________________________________________________________________________ We Also have host alot of different events for the players with rewards and try to spice up the player experience. Screenshots from the server: DMV: FD: Hospital: The Montgomery Park: The Town Hall:
  10. 11 points
    السلام عليكم ورحمة الله وبركاته اتهامات سرقة السكربتات بدون دليل ممنوعة, لاحظت في الفترة الأخيرة اتهامات بين أعضاء المنتدى بخصوص نشر سكربتات مسروقة وما شابه ولذلك اذا توفر لديك الدليل الكافي بأن السكربتات مسروقة وليست ملكاً للشخص الذي قام بنشرها قم بالتواصل معي على الخاص وسيتم التعامل مع الموضوع. * ملاحظة: ليست لدينا أي صلاحيات تجاه السيرفرات التي تستعمل سكربتات مسروقة, فقط السكربتات التي تم نشرها على هذا المنتدى. تحياتي لكم
  11. 10 points
    Hello MTA:SA community, i release now all my Selfmade Gamemodes and Scripts. INFO: You have a error, warning or otherwise? Then write me a DM(Direct Message) or add me on Discord (DorteY#3099) and write a DM there. Hud (Script): https://github.com/DorteY/mtasa-selfmadehud Cops 'n' Robbers (Gamemode): https://github.com/DorteY/mtasa-copsNrobbers (Updated: 10.12.2019) Zombie Apocalypse (Gamemode) https://github.com/DorteY/mtasa-Apocalypse (Updated: 12.12.2019) Lakeside Reallife (German) (Gamemode) https://github.com/DorteY/mtasa-LakesideGER (Updated: 25.12.2019)
  12. 10 points
    Lua tutorial for absolute beginners This tutorial aims to teach the Lua scripting language to those with 0 previous experience with programming / scripting. This guide will start with explaining some Lua concepts, and will later on move to explaining MTA:SA specific concepts. Table of contents: Lua Scripts Variables Data types Operators If statements Functions Return values scopes & locals For loops Tables Iterators (pairs/ipairs) Callbacks Anonymous functions MTA Server & Resources Server vs client MTA functions & wiki Elements (userdata) Command handlers Event handlers predefined globals server <-> client communication Now what? Lua This part of the tutorial discusses Lua itself. No MTA-specific concepts will be discussed here. Scripts The Lua scripting language is a language which is interpreted by a "Lua interpreter". MTA:SA's resources use such an interpreter to run Lua code. For the beginning of this tutorial you can use the online Lua interpreter available on https://www.Lua.org/demo.html. Any code in the Lua part of the tutorial can be run on this website. Lua is written in "plain text". This means it exists of regular characters like any other text you are writing. To edit Lua files you will require a text editor. You could use Notepad, but there are many far better alternatives. My personal favourite is Visual Studio Code, but there are many other good options, to name a few: Atom, sublime text, notepad++ Lua files are usually saved with the .Lua file extension Variables The first concept we're going to discuss is variables. Variables allow you to store a value in your code. For example: x = 10 print(x) print(x) will output the value of the x variable. We will get into what exactly print is later in the tutorial. Variables can have any name you want, as long as you follow some specific rules. variable names must start with a letter (lower or upper case), or an underscore (_) variable names may contain letters (lower and upper case), numbers and underscores. x = 10 y = 20 z = 30 print(x) print(y) print(z) The convention in Lua is to name your variables in "camelCase". This means if a variable exists of multiple words you start every word with a capital letter, except for the first one. camelCaseVariable = 5 Data types So far we've seen variables used to store numeric values, but there are many different types of data Lua can handle. These are: number Any numeric value string A piece of text, a string is surrounded by " or '. For example "Hello world" or 'Hello world' boolean A boolean is a data type that has only 2 options, true and false. nil nil is a value indicating nothing. It's the absence of a value. (Not the be confused with 0) table Tables will be discussed later in the tutorial userdata Userdata will be discussed later in the tutorial function Functions will be discussed later in the tutorial thread Threads are out of scope for this tutorial and won't be discussed So we can use these different data types, and store them in variables: numberVariable = 10 stringVariable = "Hello world" booleanVariable = true nilVariable = nil Operators Operators are symbols in Lua which can be used to do "things" with variables. Here's a list of operators and an example for each: + operator Adds two values together x = 10 + 10 print(x) y = 20 print(y) z = x + y print(z) - operator Subtracts a value from another value x = 10 - 10 print(x) * operator Multiplies two values x = 10 * 10 print(x) / operator Divides a value by another value x = 10 / 10 print(x) % operator This is the "modulo" operator. This will divide a value by another, and return the leftover. x = 10 % 4 print(x) The result of this is 2 and operator The and operator will return true if both variables are "truthy". Otherwise it returns false (A "truthy" value is anything except for false and nil) x = true and false print(x) y = true and true print(y) or operator The and operator will return true if one of the variables are "truthy". Otherwise it returns false x = true or false print(x) y = false or false print(y) == operator The == (equals) operator will return true if both of the variables are the same. Otherwise it returns false x = "hey there" == "hello there" print(x) y = 150 == 150 print(y) ~= operator The ~= (does not equal) operator will return true if both variables are not the same. Otherwise it returns false x = "hey there" ~= "hello there" print(x) y = 150 ~= 150 print(y) > operator The > (greater than) operator will return true if the first value is greater than the second value. Otherwise it returns false x = 10 > 5 print(x) y = 10 > 15 print(y) y = 10 > 10 print(y) >= operator The >= (greater than or equals) operator will return true if the first value is greater than, or equal to, the second value. Otherwise it returns false x = 10 > 5 print(x) y = 10 > 15 print(y) y = 10 > 10 print(y) < operator The < (less than) operator will return true if the first value is less than the second value. Otherwise it returns false x = 10 < 5 print(x) y = 10 < 15 print(y) y = 10 < 10 print(y) <= operator The <= (less than or equals) operator will return true if the first value is less than, or equal to, the second value. Otherwise it returns false x = 10 < 5 print(x) y = 10 < 15 print(y) y = 10 < 10 print(y) .. operator The .. (string concatanation) operator allows you to add two strings together. x = "Hello" z = "World!" combined = x .. " " .. z print(combined) If statements An if statement allows your code to decide to do something, or not. Depending on a value. Often times if statements are used in combination with some of the above operators. An if statement is written as : if <expression> then <code> end x = 10 if x > 5 then print("X is higher than 5") end Any code between then and end will only be executed when the expression is true. You might also have noticed that the code between the then and end is moved over a bit to the right. This is called "indentation". Whenever we open a new scope (scopes will be discussed later in the tutorial) we move our code to the right. This is usually done by either a tab or several spaces . Many code editors will convert a tab to spaces. Else Within an if statement, you can also add an else block. The code in such a block will be executed when the code in the if block is not executed. x = 10 if x > 5 then print("X is higher than 5") else print("X is not higher than 5") end Elseif If you want to do multiple if statements, you can use an elseif: x = 15 if x > 10 then print("X is higher than 10") end if x > 5 then print("X is higher than 5") end x = 15 if x > 10 then print("X is higher than 10") elseif x > 5 then print("X is higher than 5") end The difference between the first example and the second is that if x is higher than 10 in the first example both lines "X is higher than 10" and "X is higher than 5" will be output. Whilst in the second example only "X is higher than 10" will be output. And if statement must always start with an if, can contain multiple elseifs, and may only have one else. name = "NanoBob" if name == "NanoBob" then print("Hello world!") elseif name == "Brophy" then print("Black 123") elseif name == "Tombaa" then print("Stupid") else print("I have no idea") end Functions Functions allow you to write less code, by reusing pieces of code. The syntax to create a function is function <name>(<parameters>) <code> end function foo() print("Hello world #1") print("Hello world #2") end In order to execute code in the function, you "call" the function. You do this by writing the function name followed by (). function foo() print("Hello world #1") print("Hello world #2") end foo() foo() foo() Functions also allow you to send a variable to the function, for it to do something with. This is what's called a function parameter. Function parameters are defined in the brackets () after the function name. function foo(x) print(x) end foo(10) foo("50") You may notice that this looks a lot like the print() we have been using. This is because print is a built-in Lua function. Return values A function not only can execute code, it can also give something back to where it was called. This is called a return value. In order to return something from a function you use the return keyword. function foo() return 10 end x = foo() print(x) print(foo()) Just like in an if statement, all code within a function is indented. Now let's combine everything we have learnt so far: function foo(x) if x > 10 then return "X is higher than 10" elseif x > 5 then return "X is higher than 5" else return "X is not higher than 5" end end y = foo(15) print(y) print(foo(10)) print(foo(0)) Scopes & locals We quickly encountered scopes before, and said we indent our code whenever we enter a new scope. But scopes allow you to do more than that. Most importantly, "local" variables. A local variable is only available in the scope it was defined in (or scopes that were created from within that scope) You can create a new scope using a do block (functions and if statements also have their own scope). do local x = 5 print(x) end print(x) do local x = 5 do local y = 10 print(x) print(y) end print(y) end For loops (For) loops are ways in scripting / programming to have code executed multiple times, without having to write the same thing multiple times. An example of such a loop: for i = 1, 10 do print(i) end The first part : i = 1, 10 defines a variable called i. Which start at 1. This will be incremented by 1, until it reaches 10. The code within the loop then can use this variable. You can also increment with a different number than 1 (including negative numbers) using this construct. for i = 20, 0, -2 do print(i) end This code sample will start with i at 20, and keep adding -2 (thus subtracting 2), until it reaches 0 Tables Tables are a datatype in Lua which allows for lists of things. Here's an example: x = { [1] = 100, [2] = 200, [3] = 300 } print(x[1]) print(x[2]) print(x[3]) Tables consist of key/value pairs. In the example above the key 1, has the value 100, 2 has the value 200, and 3 has the value 300. You can get the value in a table, by putting the key in between square brackets []. Like in print(x[1]). x = { 100, 200, 300 } print(x[1]) print(x[2]) print(x[3]) You can choose to not include the keys in a table. Doing so will automatically add numbers as keys, starting at 1. So the above example would be the exact same as the first example. Table keys and values can be of any data type, including other tables. This allows you to create (very) complex table structures. t = { [1] = { 100, 200, 300 }, ["x"] = 100, [true] = "something" } print(t["x"]) print(t[true]) print(t[1][1]) print(t[1][2]) print(t[1][3]) When using a string as the key in a table, you can leave out the square brackets and the quotes. This goes for both when defining the table, and for indexing it (getting a value from it). For example t = { x = 100, y = 200, z = 300 } print(t.x) print(t.y) print(t.z) A table's values can be modified / set after creating the table as well. t = {} t[1] = 10 t[2] = 20 t[3] = 30 t["x"] = "banana" t[true] = false t.x = "banana" When using tables you will often want to add something to the "end" of a table. This is most common when you are using tables with numeric keys. In order to do this you can use a # to get the amount of items currently in the table. t = { 10, 20, 30 } t[#t + 1] = 40 This will store the value 40 on the key 4 , because #t is 3. Iterators (pairs/ipairs) Iterators are a mechanism that allow you to make a loop, which goes over a set of values. Writing your own iterators won't be discussed in this tutorial. But there are two functions which are often used to create an iterator to iterate over a table. These are pairs and ipairs. t = { 10, 20, 30, 40, 50 } for key, value in ipairs(t) do print(key, value) end The difference between pairs and ipairs is the order in which the key/value pairs are iterated over, and which of the key/value pairs are iterated over. Where ipairs will always use numeric keys, starting at 1, and going up by 1 every time, until there is no entry in the table. This also means it won't iterate over anything key that is not numeric. t = { ["x"] = 5, [1] = 10, [2] = 20, [3] = 30, [5] = 50, } for key, value in ipairs(t) do print(key, value) end A pairs loop will iterate over any value in a table, but the order is not guaranteed. Meaning that between different runs of the script the order could be different. t = { ["x"] = 5, [1] = 10, [2] = 20, [3] = 30, [5] = 50, } for key, value in pairs(t) do print(key, value) end Callbacks Callbacks are when you pass a function as an argument to another function. To have the function you passed be called later on. This is used often within MTA. An example of a Lua function which uses a callback is table.sort. table.sort will sort a tables values, by default these values are sorted numerically. But you can use a callback to change this behaviour. values = { 5, 4, 3, 6, 8, 1, 2, 9, 7 } function sortFunction(a, b) return b > a end function reverseSortFunction(a, b) return a > b end table.sort(values, sortFunction) print("Sorted: ") for _, v in ipairs(values) do print(v) end table.sort(values, reverseSortFunction) print("\nReverse sorted: ") for _, v in ipairs(values) do print(v) end In the first call to table.sort (table.sort(values, sortFunction)) you can see the sortFunction function is passed as second argument to the function. Note that we don't write sortFunction() here (notice the brackets difference) because that would call the sortFunction function, and pass its return value to table.sort. table.sort will then call this function when it compares two different values, this function should return true or false depending on whether its second argument (b in this case) is larger than it's first argument (a), in the context of sorting. Anonymous functions It is also possible to use an "anonymous function" when passing a callback to a function. values = { 5, 4, 3, 6, 8, 1, 2, 9, 7 } table.sort(values, function(a, b) return b > a end) print("Sorted: ") for _, v in ipairs(values) do print(v) end table.sort(values, function(a, b) return a > b end) print("\nReverse sorted: ") for _, v in ipairs(values) do print(v) end MTA This part of the tutorial discusses MTA specific constructs. Code in this part of the tutorial won't run in the online Lua interpreter. You will need to set up a (local) server for this. Server & Resources By default when installing MTA:SA a server is installed as well. This server is located in the "server" directory of your MTA directory. This is usually at C:\Program Files (x86)\MTA San Andreas 1.5\server. This directory contains an MTA server.exe file, running this file will start a server. Scripts on a server are grouped by resources, a single resource can consist of multiple script files and other assets such as images, sounds, fonts, mods and more. Resources are placed in your mods\deathmatch\resources folder in your server folder. A resource is always in its own directory. A resource must always have a single meta.xml file. This file tells the server (among others) what script files to load. A typical meta.xml file looks like this: <meta> <script src="vehicleSystem.Lua" type="server"/> <script src="vehicleMods.Lua" type="client"/> </meta> You will need an entry for every .Lua file you want to have executed on the server. You can start a resource by typing start <resource name> in the server console (the window that opened when you started MTA Server.exe). The resource name is the name of the directory your meta.xml is in. (This may not have spaces). Starting a resource will start running the Lua scripts, if you've changed your scripts you will need to restart the resource for the changes to take effect. (restart <resource name>). Server vs client Lua code can be executed in one of two places. The server, or the client. Server sided scripts are executed on the actual machine that is running the MTA server.exe process. Client sided scripts are executed on the computer of every player that connects to your server. Server sided and client sided scripts have a distinct difference in responsibility and possibility. Some functions for example are only available on the client, whilst others are available only on the server (and many on both). Note: Some of these functions which are available both server sided and client sided are different on server and client MTA functions & wiki In plain Lua there's not much you can do to affect a game engine like MTA:SA. This is why MTA:SA offers a (large) list of functions available for you to use in your scripts which interact with the actual GTA world. You can find a list of all of these, what they do and how to use them on the MTA wiki. Server sided functions Client sided functions shared functions An example of such a function is createObject(). This function will create a physical object in the game. The wiki page contains information on how to use it (what arguments it expects, and in what order). And often shows an example of how to use it. createObject(1337, 0, 0, 3) Elements (userdata) At the start of this tutorial we quickly mentioned userdata data types. These are data types configurable by the implementation of Lua. In this case, MTA. MTA uses userdata to represent "elements". Many things in MTA are elements, like objects, markers, peds, players, user interfaces, vehicles, etc. On the MTA wiki you will notice many functions either return elements, or require an element as arguments. A list of different types of elements can be found on the MTA wiki. Elements also have a hierarchical structure to them. Elements can have a "parent", and multiple "children". This will result in a tree of elements, the element at the top of this tree (and thus the grandparent of all elements) is called the root element. Command handlers Often times in MTA you want certain things to happen when a player enters a command. This is done using command handlers, command handlers use a callback, which we previously discussed. The wiki contains a page for the addCommandHandler() function. For this example we will be using the server side version. function handler(player, command, argument) outputChatBox("You entered " .. command) if argument ~= nil then outputChatBox("You used the argument " .. argument, player) end end addCommandHandler("banana", handler) This example also uses the outputChatBox() function, this will output a piece of text to the chat.(in this case, only for the player who executed the command) The callback function passed to addCommandHandler will be called every time a player uses the /banana command ingame. Event handlers Besides having your script do things when a user executes a command you likely want the game to respond to many different types of things that happen in the game. Like players taking damage, coming close to something, etc. These things are called events. Whenever an event is triggered you can run a piece of Lua code. You do this using event handlers. Event handlers are created using the addEventHandler(). The first argument to the addEventHandler() function is the string name of the event. These can be found on the MTA wiki as well. Server sided events Client sided events An event is always triggered for a specific element, for example "onPlayerWasted" is triggered on the player that was wasted (killed). You can attach an event handler to a single element to only have your callback function be called when the event is triggered on that specific element. But you could also use the root element here and your function will be called for every element the event is triggered on. function handlePlayerDeath() outputChatBox("You died!!", source) end addEventHandler("onPlayerWasted", getRootElement(), handlePlayerDeath) The getRootElement() function used in this example returns the root element discussed earlier. You can also see source is used in this code snippet, we'll talk about that some more in the next section. predefined globals MTA has some predifined global variables for you to use in your script. A list of them can be found on the wiki. Here's a couple notable ones and what they're used for root The root element, same as the return value of getRootElement()) source The element an event handler was called on. An event's wiki page always describes what the event source will be for the event. localPlayer The player element for the player whose client the script is running on. (Thus only available client sided) client Will be discussed in the next section server <-> client communication As stated earlier in this tutorial scripts can run either on the server, or one of the connected clients. However often times you would want to trigger something on the server from a client, or the other way around. An example of this would be when the user clicks the login button on a GUI (Graphical user interface) the server should try to log that person in, and send him back whether or not this was successful. This can be done using events. MTA allows you to create and trigger your own events, and these events can be triggered from server to client (and the other way around). You can do this using the addEvent() function. Once an event has been added (and marked as remotely triggerable by passing true as second argument to addEvent()) you can call it from server/client. You do this using [triggerClientEvent()]https://wiki.multitheftauto.com/wiki/TriggerClientEvent() and triggerServerEvent() respectively. Server sided: function handlePlayerLogin(username, password) outputChatBox("You tried to log in with the username " .. username, client) end addEvent("LuaTutorial.Login", true) addEventHandler("LuaTutorial.Login", root, handlePlayerLogin) Client sided: function pretendLogin() triggerServerEvent("LuaTutorial.Login", localPlayer, "username", "password") end pretendLogin() This example will trigger the "LuaTutorial.Login" event from the client sided script. And passes the "username" and "password" arguments to the event. The server then handles this event in the handlePlayerLogin() function, which in our case just outputs something to the chatbox. In this example you can see the previously mentioned client global variable. This variable is set to the player element corresponding to the client the event was triggered from. (And is thus only usable when used in an event handler which has been triggered from a client). Now what? With this information you should be able to start scripting, and making things in MTA! If you didn't understand it all in one go, or you have any more questions there is no shame in that! You can find myself and many others willing to help you with your scripting questions in the #scripting channel on the MTA discord. Another good source for programming / scripting related questions is stack overflow.
  13. 10 points
    If you're having issues with models or are looking for help on how to achieve certain results, feel free to ask in here. Note: Please check the Guide section before asking questions in here. Frequently Asked Questions on GTA modding the FAQ is on 3DS Max, though can be applied for various app's Lighting and Shading #1 Why can't I change the smoothing of my model? Your model contains duplicate vertices - this is a typical issue within GTA importers. They tend to break the vertices/split the edges on import, requiring to be welded. View the spoiler for a potential fix. #2 My map model is overexposed in day and night time. Your model lacks vertex color and illumination respectively. The GTA engine uses vertex color information to define lighting which is baked into the model. View spoiler for a potential fix. #3 Why is my Infernus model so bright? GTA engine calculates brightness of vehicles based on map objects collision brightness (that it's standing on) and the vehicle surface properties. View the spoiler for a potential fix. #4 My striped Bullet has different brightness for primary and secondary colors. GTA engine uses different lighting techniques for vehicles than map objects. Some of which are specular lighting, which in short brings a fake highlight onto the vehicle surface, illuminating it. View spoiler for a potential fix. Modeling #5 Certain polygons are not visible ingame, but looks fine on 3D editor. GTA engine among most other game engines uses backface culling, which kills the faces that are not facing/are blocked by ones facing the camera. This procedure is done to save memory. View the spoiler for a potential fix. #6 Can I make scissor doors for my vehicle without requiring scripts? It is possible to modify how vehicle doors appear in their open phase. It involves changing the rotations of dummies and their children objects, the doors. View the spoiler for a potential method. #7 How does vehicle reflections and chrome work? GTA vehicles uses 2 UV channels; first for diffuse, second for env and chrome mapping. If the secondary UV channel is not unwrapped properly, the env/chrome will either not work or flashes too often. View the spoiler for a potential method. #8 I can see through my vehicle chassis when looking at the police decals, why is that? Materials that are responsible for alpha needs to be last in the multimaterial list. If this is not done, textures like police decals will not render parts of the vehicle behind the alpha. View the spoiler for a potential fix. #9 How do I make a vehicle paintable? GTA SA requires models to have a certain colorcoded material applied to the surface of vehicles that needs to be paintable. It also needs (optionally if using textures) a texture that is not black. As anything that isn't black will be. If parts of the texture is grey, the color ingame will look sort of dirty or old. View the spoiler for a method. Miscellaneous #10 I have imported des_sherrifsgn1.dff into 3ds and extracted the textures into a folder, but they aren't displayed. It is not enough to extract the images, you'll have to tell the program where your textures are stored for it to apply them on the model. View the spoiler for a potential solution. #11 I want to remove Wuzimu's glasses and export it to my game. How do I do this? You're going to need a GTA formats importer. I prefer Kam's vanilla tools for skins due to its decent support for bones and skinned models. View the spoiler for a potential method. #12 What file types are worth to know about? GTA has many, many file types, and a lot of them are not natively available in MTA unless you modify your server's anti-cheat system to allow locally custom data files etcetera. So if we're going with MTA friendly files, there are a few. View the spoiler. #13 Where do I find shared vehicle textures, and what's each their use? You can locate the .txd for shared textures in GTA SA dir\models\generic\vehicle.txd. It stores textures which are used for SA vehicle lights, lighting and many more textures, which are used across hundreds of vehicles. As these textures are found in your local files, none of them are required to be added to custom vehicle .txd files, making for potentially very low file sizes. View the spoiler for a full list. #14 I have downscaled my model, but in-game it remains the same size as before. If your model's scale values says something like 76,144, 76,144, 76,144, it will reset to 100, 100, 100 on export. To correct this, go to Utilities panel, click Reset xForm, Reset selected, then right click the modifier and collapse to. Now your model will have its new scale applied. #15 I have converted a Counterstrike map and turned the main mesh into a collision which is 250kb. I am getting invisible walls, why is that? GTA has a very low polycount limit in regards to collision models. Not to be confused with collision primitive models, which are spheres or boxes, but the CM itself. If it is above or around 5000 (needs additional sources...) polygons, issues will occur, such as invisible walls or as if there's a large box blocking the entire model off. Another culprit for collision issues is the pivot point and position that the collision is exported at. You need to set the collisions to 0, 0, 0 and pivot point needs to resemble that of the main model, otherwise they will not line up properly. #16 My character movement is bugging on custom modeled stairs. GTA III, VC and SA do not have support for advanced staircase collisions, and so they require a different approach, which is a planar ramp or slope if you will. This may not look very good when the character steps on the stairs, however it is the most performance and bug-less method around. **Please feel free to contribute to the FAQ by leaving a comment here or through PM. It will be greatly appreciated.** little note for colors #B8E0B6 #4A4A4A
  14. 9 points
    About We hear you, “another role-play server? Guess it’s an edit again” – but that’s not the case. Advanced Gaming is, back again, getting things ready to provide our loyal players with what we do best: next level scripts with a nice balance between realism and fun in each and every script. With at least 10 years of experience on the MTA platform and countless sleepless nights, we present to you: A role-play script written from scratch! If you remember us from back in 2015, hi there! If you don’t, no worries. We’ve been here before and life got in the way, we took over a project (SAPD:FR) which required less of our attention and made it possible for us to get a few things straight as a community but also in our personal lives. Now that we're back we're more than ready to finally put full dedication into this project and bring you guys a brand new twist into the MTA:SA Roleplay scene with a brand new script with some never before seen features, so without further ado let's go on with what we have to offer! Features Since a role-play gamemode requires constant changes, new features and removal of features... we’re not going to list all of our features (we know, it’s a lot, we all hate reading). To give you a glance of what we got to offer, we would love to invite you to our server and just give it a shot (when it’s released), if you want to know what our deal is, here’s a glance of what we got to offer: Realistic Vehicle System: We've put countless hours into the details of our vehicle system which allowed us to implement numerous hidden features which we will not yet release to the public, they'll sure blow your mind when you find out about all of it. After hours and hours of study and at least 4 years of experience we've made a perfect balance between the game's engine and physics system to carefully recreate real-life vehicle models in-game regarding handlings which includes top speeds, accelerations, realistic fuel tank capacities and consumptions. FPS-friendly UI: We’ve written our very own custom GUI (graphical user interface) system to create windows, labels, images and what not with ease without frying your CPU and GPU. Balanced Economy: Our economy has been built in a way to promote player to player interaction. How so? Simple, you can forget about getting rich by doing the default jobs, if you want to get yourself some more cash then you're simply going to have to join one of many player ran companies or perhaps even go down the dark path and join a gang? That's up to you, we won't tell anyone and especially not the cops! Jobs and companies, how do they work?: Simple, the entire server will be running on companies instead of default jobs. The default jobs have been made useful for new players (deliveries from our very own storage units, a government funded bus or a taxi driver) but the real fun starts with real people, in real companies. Hurr Durr I’m a big guy on another server, can I..: let me stop you right there, we don’t care about your previous progress on other servers, your entire track list of bans and offenses. Everyone is fair and square as a new player on our server, no advantages and no labels. Items and products: From snacks to meals, from coca-cola cans to glasses of wine, property keys to theory certificates. We've got it all built in with effect, if any. Users are able to purchase some items, other items have to be earned. You'll get a theory certificate after completing your theory for a driving license, a receipt after purchasing something or an empty can after drinking your coca cola. Illegal activities / gameplay: It’s a tough scene, you want to start your own gang or clap your neighbors, we get it. Since the illegal role-play defines or breaks a server, we’re taking close care of the scene with constant monitoring with a team of people. Guns will be distributed passively, drugs will be taken care of (and tested before distribution…). In the trash(bin)! Attention to detail in every script, want to get rid of the annoying receipt you recieved from the store and don't even need it? Simply throw it into one of the many trash bins present around town and let the garbage collectors take care of your junk for you! Police & Criminals: Tired of officers having super cars, heavy duty weapons like AR-15 or server owner-run departments? So are we, which we why we've given the department normal vehicles with fitting handlings which decreases their advantage, increases the experience of both roleplaying as well as the thrill of being a criminal or officer. They're forced to think tactically and plan their actions, their equipment is distributed on a monitored basis to only the higher ranks in the department where we see fit. Giving the illegal roleplay scene space to grow and feel alive And much more!: You want more? We got more! Two number 9s, a number 9 large, a number 6... oh, you meant features? We have a tight schedule of daily bugfixes, weekly updates and weekly announcements regarding progress. Want to see what we're made of? Check us out.. when we've launched! (sorry, I know..) Screenshots Note: This is still Work in Progress, final product may look different! DMV System Trash Bin System Shopping Vehicle Plate System - more info here. Other Where to find us? Since we’re still getting things ready, you’re more than welcome to join us on our discord server. We’re working on the forums, lots of script changes and making sure that you’re getting something new and fun, rather than just another edit. Server IP: Still in development, release date on Friday, April 17 at 21:00 GMT+2 (20:00 for faction leaders) Website: mta.advanced-gaming.org Forums: forum.mta.advanced-gaming.org Discord: https://discord.gg/g3ytB7h Launch Date: Friday, April 17 at 21:00 GMT+2 (20:00 for faction leaders) Note: This thread was written using the Dark Theme, if you spot any issues on the default theme please let us know!
  15. 9 points
    As one of the developers behind SAES:RPG, the server in question appears to not use any leaked scripts from SAES:RPG (I did a brief check). And it's not like SAES has patented / has a trademark on the idea of our gamemode, so anyone is free to make a gamemode in the same general spirit / idea. With that said, I wish you guys the best of luck.
  16. 9 points
    السلام عليكمم ورحمةة الله وبرككاتههء كيف الححال؟؟ بما إن الحساب الاول مدري ما يبغي يفتح سويت واحد جديد المهم .. سويت مود جديد واخذ الفكرة من مود السوات الى عن طريق المؤشر يسحب ويقتل كذا بس بفكرة ثانية ,, هي ان تحدد علي اللاعب بالماوس وتضغط كليك يمين تسحب كل الرتب حقته وتعطيه رتبة اسمها Admin_Ex يمديك تغير اسم الرتبة من الكلينت وتضغط كليك يسار تفك مخالفته وتسحب منه رتبة الادمن اكس وطبعا فيه حماية من سحب رتب الكونسيل , خلينا نشوف صور طبعا المؤشر يظهر للي معه رتبة اسمها Acl_Ex ويفتح عن طريق الضغط علي حرف M نجي للـتحميل اضغط هنا لتحميل السكربت لازم تحط المود بقروب الأدمن علشان يسحب رتب ويعطي مخالفة * رأيكم يهمني.. إهداء لـ @!#NssoR_) @!#DesTroyeR_,) @N3xT @+Source|> @Mr.Solo @Kareem Amer @Abdul KariM ولكل الموجودين #-
  17. 9 points
    Introduction Vehicle indicators are mostly seen on other GTA modifications where the mod 'IVF - Improve Vehicle Features' is compatible. This mod allows for light modifications such as police flashlights, custom LED flashers, indicators and much more. These features are sought after by MTA roleplaying servers a lot. This guide aims to introduce 3D modelers to prepare models for customisable lights, which then requires coded shaders to work. Anything related to scripting is not included in this guide. The guide assumes that the modeler has basic understanding of importing and exporting models. Editing existing Huntley for indicator lights With Huntley imported into 3ds Max, isolate the mesh called 'chassis' as it is the only component that needs working lights. As seen the car has 4 lights; right tail light, left tail light, right headlight and left headlight. All 4 has their own material assigned for them to act each their own way. The material color codes are hardcoded in the game telling it when to show illuminated brake lights for when the car brakes and so on. For this custom vehicle however, any geometry meant for custom vehicle lighting needs white color code and a custom texture name for shadering to work. Before anything, it's required to get the custom lighting texture ready. For this guide, vehiclelights128 and its illuminated version works perfectly fine. These needs be renamed to customRRLightsOff and customRRLightsOn and so forth. The 'RR' is for 'right rear', where as 'LR' would be 'left rear'. This needs be done for front too, so in total 4 'off' images are needed while only one 'on' is needed, as it can simply be instanced when shadering. Below is a step-step process on editing Huntley's geometry and adding custom indicators. Add an 'Editable Poly' modifier to the model. Press '5' key on keyboard which enables 'Select by Element'. Select the two rear light meshes, ensure they are both highlighted. On 'Modify Panel' scroll down and find 'Slice Plane', click that. This creates a rectangle that has a line-preview for the cut. Align the plane to the lights and create two cuts for the indicator lights. Select one side of the geometry that was cut by using 'Select by Polygon'. On the modifier stack, click 'Collapse all', leaving only 'Editable mesh' on the stack. Press 'M' key for 'Material browser'. Create a new GTA material. In the texture slot, add in the 'customRRLightsOff'. On material browser, click 'Assign material to Selection'. Note that this needs be done for the left side too but with different material and texture. Apply a new modifier on the model called 'Unwrap UVW'. Press 'Open UV editor'. On the UV editor, enable 'Select by polygon'. Grab the UV island and drag it onto the orange section of the image, which is for indicator lights. On modifier stack, collapse all, to save the new UV's. Above: example of what can be achieved. Front lights section already has indicator lights, so all that needs doing is 2 new materials with each their own light texture, like done on rear side. The 4 new textures needs be added to the car's .txd file. Model is now ready for export. Now all that's needed is MTA scripting for the light shaders to work. Exact same process can be applied for creating custom emergency lights. Note that it is not necessary to have these 128x128 textures in the model. They can be downscaled to 4x4 in the .txd and then a MTA shader script can apply the originals, which greatly reduces the size of download. This means it'll download 4 images which are then instanced onto every custom model using the lights. To put it short, each .txd will have 4 placeholder-images of 4x4 resolution rather than 4 images of 128x128 resolution.
  18. 9 points
    I want to share this tool and method to optimize PNG files, which are used a lot in gamemodes. This topic will focus on a tool called ZopfliPNG (which I built from source and will provide a file download for) - refer to the bottom of this topic, step 2 for that. https://github.com/google/zopfli Because of the intensive usage of PNG in MTA, optimizing them will benefit total download size for players and performance. 1) use Paint.NET software (https://www.getpaint.net/) to resize your image's resolution (CTRL + R), for example half it with the power of 2, like 256 x 256 to 128 x 128. Depending on the type of image or how far whatever script zooms it, you can go beyond that and make it even lower. Use default settings for saving it, you don't have to worry about size optimization yet. Drawing a lot of high resolution images or textures will affect client performance, and cause lag on low-end PC's. So following this step is highly recommended. You can always gauge the quality outcome while you're saving it using a lower resolution. Note: you can skip this step, if you care more about file & DL size rather than client rendering/memory performance, or if the type or usage of your image(s) result in rapid deterioration in quality upon resizing. By not doing this, and sticking to the main subject of this guide, ZopfliPNG from step 2, you will keep the same quality but only get a file size reduction. After doing the initial optimization with Paint.NET, which is the part that matters to client (rendering) performance, you'd usually think that is the end of it, that the file size Paint.NET outputs (on the various saving profiles, like bit depths, you compare) is the best you can get. But you're wrong, since advanced software like ZopfliPNG can squeeze more out of it, notably most of all without any quality decrease. It's software that assembles PNG format compression from scratch, with all pixels matching 100%. So there's no reason not to do it, also if you didn't initially use step 1) about Paint.NET resizing/actual image tweaks. So, to get a lower size, it's not neccesary to compromise more of your image quality using editing, like resize even more in Paint.NET. So now to get to the point of this guide; 2) ZopfliPNG Download it from: LINK (click) Usage instructions are in the README.txt files in either 32-bit or 64-bit version folders. It's a command-line utility, you can use it in the simplest way by entering this into cmd from the binary's location (after copying your png files): This will optimize the file using default configuration, which guarantees 100% matching pixels (absolutely no worse quality) and usually a huge reduction in file size. As I mentioned in one of the notes, you will benefit also if you won't "pre-process" your PNG's using Paint.net, but only use ZopfliPNG, to not possibly impact your quality but still get a lower resources download size. As you can see here; I made sure to document its usage (README.txt) and included mass optimization (multiple files at once) .bat files, their usage also explained in README.txt. Unfortunately this is as close we can get to mass-optimizing files, because i built zopflipng.exe from original ZopfliPNG source code (https://github.com/google/zopfli) and it doesn't currently feature it in a more convenient way (without having to edit/specify ranges of file names to optimize). Here's some additional information on ZopfliPNG and why it is so groundbreaking over other compression tools: https://ariya.io/2016/06/using-zopfli-to-optimize-png-images https://blog.codinghorror.com/zopfli-optimization-literally-free-bandwidth/ No other tool can theoretically achieve this, let alone with 100% quality preservation. It's state-of-the-art technology. Edit (25th Dec 2019): updated ZopfliPNG binaries (re-built from latest official repository version)
  19. 9 points
    السلام عليكم ورحمة الله وبركاته تعديل من لوحة ادمنية اضغط على settings اكتب o هتطلع اسمAdminMsg مثلا AdminMsg [name] [text] ومنها انت تقدر تغير اي اسم ِ وفي هذه البرنامج قمت ببعض التعديلات مثل إضافة إظهارأو إخفاء كلمة السر وتذكرني و اختيار اللغة عربي او انجليزي وهنا في خانة send عند text تقدر تكتب اي نص ولو طويل جدا يمكنك ان تراه باكمله Options وهنا في هذه الصورة عند تحـريك المربع اللي باللون الازرق بأي اتجاه تريده وتكبير وتصغر المربع وكذلك تكبير وتصغير الخط للتحميل من هــــنــــا وشكرا ارجوا ان ينال رضاكم
  20. 8 points
    Project trains This resource creates multiple trains driving around the map and make them drive automatic. It makes San Andreas a little bit more alive. You can set-up how much trains are created, how fast they go, minimal/maximal amount of trainscarts they are pulling and some more. Versions Version 1.0.0 Serverside time synced trains for multiplayer Admin panel settings Version 2.0.0 Uncompiled Better optimised than previous versions. CPU (3,5-3,9 GHz) 4 trains +/- 1.22% usage 40 trains +/- 7.05% usage Overkill Cleaned up a lot of the old code (I wrote this in 2015.. , never the less it is still ugly :C) Added some custom train-cart designs. Fixed all known bugs. Trains won't stop, even in this version. But you can try to make that yourself... Improved bandwidth You can design your own traincarts in the map editor, see documentation after clicking on the lazy download link Bugs: GTA spawn bug: Incorrect train spawn, see documentation. Repository Lazy <you> transport Armed to the teeth Admin panel settings Building your own traincarts with the map editor Download here - project trains 2.0.0
  21. 8 points
    bengines provides custom engine sounds for vehicles. The resource is not focused to be ultra realistic, it is designed to use for casual servers. Not useful for me anymore so sharing with community. Used on old project. Sounds are copyrighted content not owned by me. Features: ready to use, chooses the best engine for vehicle depending on handling! easy to customize & expand for Lua programmers 30 soundpacks for vehicles (buses, bikes, sport cars etc.) stable code with quite high performance used on server with 600 players ALS effect (exhaust flames) Turbo (satisfying whistle and blow-off sounds) Videos: https://streamable.com/n7k40 https://streamable.com/lp14t https://streamable.com/q5e9g Download: Github: https://github.com/brzys/bengines (feel free to send pull requests) Community: to-do For programmers: --[[ Element datas used by resource [array] vehicle:engine - stores basic info about engine type, sound pack etc. (synced) [string] vehicle:type - used for engine calculation, useful for servers. Available: Bus, Truck, Sport, Casual, Muscle, Plane, Boat, Motorbike (synced) [string] vehicle:fuel_type - customized for each engine. Useful for servers. Available: "diesel", "petrol" (synced) You can use setElementData(vehicle, "vehicle:upgrades", {turbo=true, als=true}) to add turbo or ALS. --]] --[[ Exported functions --]] exports.bengines:getVehicleRPM(vehicle) -- returns RPM of given vehicle exports.bengines:getVehicleGear(vehicle) -- returns current gear of given vehicle exports.bengines:toggleEngines(bool) -- true / false, restore GTA engine sounds
  22. 8 points
    Eai pessoal tudo bom? Eu percebi que muitas das duvidas que o pessoal posta aqui no fórum e também na comunidade, são duvidas muito simples, principalmente com erros de logica, ou mau uso dos recursos da linguagem. Então decidi desenvolver um curso básico para auxiliar quem está começando, nesse curso básico vou abordar os seguintes assuntos: Lógica de Programação & Algoritmo; Condicionais & Variáveis (Básico); Sintaxe & Indentação; Boas Praticas de Programação; Como usar a Wiki; Funções(); Tabelas (Arrays); Scripts voltado ao MTA; Exercícios. Antes que venham falar "Quem é você para fazer um curso?", vou me apresentar: Eu me chamo Marcelo, trabalho com programação a cerca de 7 anos, já trabalhei com desenvolvimento, back-end e front-end. Atualmente eu trabalho na área de SI (Segurança da Informação) prestando serviço como pentester e consultor a uma empresa. Comecei a me envolver com Lua, por que joguei MTA por muito tempo, e percebi que a maioria dos servidores não atendia as minhas expectativas, então junto com um amigo, decidimos criar um novo servidor, o New Dream's Roleplay. Mas como o assunto aqui é o Tutorial, vou me ater apenas a ele, e deixo para falar do servidor outra hora. Lógica de Programação & Algoritmo Para deixar bem claro, vou usar as minhas definições das palavras durante o curso, porque acredito ser mais didática dessa forma. Antes de mais nada vamos deixar bem claro algumas coisas: Programação é lógica, a linguagem e etc, são apenas ferramentas para organizar e dar sentido a essa lógica. Portanto se você dominar a lógica de programação, poderá aplicar ela a qualquer linguagem. Tendo isso em mente, a aplicação da lógica podemos chamar de algoritmo. O Algoritmo por sua vez é uma sequencia de instruções, para a execução de uma tarefa. Claro que levando em consideração que o algoritmo conta com verificações, iterações e etc. Pois bem eu acredito que lógica só se aprenda fazendo, então vamos com alguns exemplos: Para facilitar a vida de alguns de vocês na compreensão, vou utilizar o Portugol como "linguagem" nesses exemplos, e recomendo que usem também nos exercícios. Para acessar o Portugol utilizem o link: http://lite.acad.univali.br/portugol/. Vamos começar pelo código mais repetido do mundo o "Olá Mundo" algoritmo OlaMundo; -- Aqui nos definimos o nome do Algoritmo inicio -- Aqui damos inicio ao mesmo imprima("Olá, Mundo!"); -- Aqui solicitamos que o Computador imprima a frase "Olá, Mundo!" fim -- Aqui encerramos Como podem reparar, toda a formação obedece uma lógica simples, você define, inicia, executa e encerra. Para termos um exemplo mais lúdico, vou usar linguagem padrão e descrever a seguinte situação: Acordar e sair para o trabalho. 01. Abrir os olhos; 02. Olhar o relógio; 03. Levantar da cama; 04. Ir ao banheiro; 05. Sair do quarto, e ir a cozinha; 06. Preparar o café da manha; 07. Sentar a mesa; 08. Comer o café da manha; 09. Lavar a louça do café da manha; 10. voltar ao quarto; 11. Vestir a roupa 12. Sair do Apartamento; 13. Descer o elevador; 14. Entrar no carro; 15. Ir ao trabalho. O exemplo acima é um algoritmo em linguagem padrão, quero que vocês percebam como ele utiliza uma sequencia lógica para executar uma tarefa. Agora, mais a frente iremos ver condicionais e verificações, mas já quero apresentar uma introdução sobre a mesma, nesse exemplo a cima, vamos adicionar uma verificação básica ali em cima na linha 02 01. Abrir os olhos; 02. Olhar o relógio CASO o relógio marque = 6:30 ENTÂO Faça a linha 03. CASO CONTRARIO espere até dar 06:30; 03. Levantar da cama; ... Nesse exemplo colocamos uma verificação simples, caso o horário seja o qual nos queremos, então vamos continuar com o algoritmo, isso é uma condição verdadeira ou falsa, e uma condição única, poderíamos adicionar outra condições por exemplo: 01. Abrir os olhos; 02. Olhar o relógio CASO o relógio marque = 6:30 && NÂO SEJA sabado OU domingo ENTÂO Faça a linha 03; 03. Levantar da cama; ... Aqui estamos adicionando outra verificação, e ambas precisam ser verdadeiras para que a sequencia se complete. Com esses exemplos em mente, vou deixar alguns exercícios para vocês, podem fazer tanto em linguagem padrão como em portugol (recomendo mais o portugol). 1. Acordar e ir ao trabalho; 2. Lavar o carro; 3. Um robô que pegue caixas; 4. Planejar uma viagem; 5. Jogar um jogo. Caso queiram, podem postar o código nesse tópico, e caso tenham alguma duvida, deixem logo a baixo. Só lembrando ao pessoal que já entende do assunto, ou pelo menos sabe o básico, vamos ajudar quem ta começando, todo mundo começou sem saber quase nada. Parte 02:
  23. 8 points
    بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاتة أخبار الشباب عساكم طيبين , اول مساهمة تقريبا وثالث موضوع لي المهم حبيت اطرح ماب الاستراحة لسيرفر كنق الطارة الماب محوله من 2018 وركبته بالسيرفر تقريبا سنه وشوي وقررت اطرحه للعموم وأحول شيء جديد المهم مالكم بالطويلة الماب من تصميمي والمجسم من تحويلي والتكستر من اختياري الماب جاهز ماعليك الا انك تركبة بالاستضافة وتشغله والتعديل مفتوح سواء عالصور او اضافات عالمجسم ورجاءا حفظ الحقوق صور للماب او المجسم مادري اذا الصور بتظهر زمان عالمنتديات طبعا المركبات الي بالصور مو من ضمن الماب ذي عشان تعطي موارد للصورة رابط تحميل الماب و المجسم لااله الا الله,محمد رسول اللة وسلامتكم فأمان الله ورعايته حسابي انستقرام :jn_i ip Server: ......
  24. 8 points
    Dear MTA community, I have been spending my last 8 weeks on mathematical problems. One of them is the 3D Frustum-Plane intersection that is used by GPUs to draw triangles onto your screen. If you want to learn more about this please consider reading this thread. Promotional Video: https://www.youtube.com/watch?v=RQy3Q4Xe110 Prerequisites This tutorial is aimed at people who are capable of scientific thinking and are willing to playfully learn with Lua code. To execute steps in this tutorial minimal knowledge of Linear Algebra and Lua is required. Required MTA Resource: https://github.com/quiret/mta_lua_3d_math Description of the math Imagine that we have got a frustum and a plane in a 3D room described by coordinates plus their boundaries. By intersecting both you obtain all coordinates on a screen along with their depth values. Now think about how your vision works. You see distant objects smaller than closer ones. You rotate your eyes to angles of vision. If we were to put this concept into terms of math we could say: the plane of vision is bigger in the distance than in close proximity. The frustum is a seamless row of vision planes starting from the pyramid tip to the bottom. How to use the MTA Resource Just download the GitHub repository into a folder of your MTA Resources, name it "math_3d_nonlin" and start it. You can execute the following commands for quick testing: send_bbuf: draws a simple depth test draw_model: draws the DFF file "gfriend.dff" Now we have got the basics out of the way. Time to start coding. Please create a new "_math_test.Lua" script file in the resource and include it server-side at the bottom of meta.xml. Tutorial: software rendering a plane on screen Open your _math_test.Lua and include the following code: local viewFrustum = createViewFrustum( createVector(0, 0, 0), -- position createVector(10, 0, 0), -- right createVector(0, 0, 10), -- up createVector(0, 20, 0) -- front ); local plane = createPlane( createVector(-3, 10, -3), createVector(6, 0, 0), createVector(0, 0, 6) ); local function task_draw_scene(thread) local bbuf = create_backbuffer(640, 480, 255, 255, 0, 50); local dbuf = createDepthBuffer(640, 480, 1); local time_start = getTickCount(); do local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, plane, true); if ( gotToDraw ) then outputDebugString( "drawn " .. numDrawn .. " pixels (skipped " .. numSkipped .. ")" ); end end local time_end = getTickCount(); local ms_diff = ( time_end - time_start ); outputDebugString( "render time: " .. ms_diff .. "ms" ); taskUpdate( 1, "creating backbuffer color composition string" ); local bbuf_width_ushort = num_to_ushort_bytes( bbuf.width ); local bbuf_height_ushort = num_to_ushort_bytes( bbuf.height ); local pixels_str = table.concat(bbuf.items); local bbuf_string = pixels_str .. ( bbuf_width_ushort .. bbuf_height_ushort ); taskUpdate( false, "sending backbuffer to clients (render time: " .. ms_diff .. "ms)" ); local players = getElementsByType("player"); for m,n in ipairs(players) do triggerClientEvent(n, "onServerTransmitImage", root, bbuf_string); end outputDebugString("sent backbuffer to clients"); end addCommandHandler( "testdraw", function(player) spawnTask(task_draw_scene); end ); Result: Try executing the "testdraw" command. At the top of file you see the definition of our frustum cone as well as a plane. By calling the function "draw_plane_on_bbuf" we put color information into bbuf for exactly the pixels that make up the rectangle. If you change the plane definition to... local plane = createPlane( createVector(-2, 10, -4), createVector(6, 0, 3), createVector(-2, 0, 6) ); you instead get this image: Try changing around the coordinates of frustum and plane to obtain different pictures! Tutorial: software rendering a triangle on screen Take the same code as in the tutorial above but change line 19 to: local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, plane, true, "tri"); This way we have changed the primitive type to triangle (rectangle is the default). Try executing the "testdraw" command again to inspect the new result! Tutorial: drawing a DFF file onto screen Instead of writing triangle definitions by hand we can take them from a DFF file instead. DFF files are storage of triangle and vertex information along with 3D rotation and translation information. By extacting the triangles from the DFF file we can put them into our algorithm to software-render them! Here is a related excerpt from math_server.Lua: local modelToDraw = false; do local modelFile = fileOpen("gfriend.dff"); if (modelFile) then modelToDraw = rwReadClump(modelFile); fileClose(modelFile); end end local function task_draw_model(thread) local bbuf = create_backbuffer(640, 480, 255, 255, 0, 50); local dbuf = createDepthBuffer(640, 480, 1); local time_start = getTickCount(); local num_triangles_drawn = 0; if (modelToDraw) then -- Setup the camera. local geom = modelToDraw.geomlist[1]; local mt = geom.morphTargets[1]; local centerSphere = mt.sphere; local camPos = viewFrustum.getPos(); camPos.setX(centerSphere.x); camPos.setY(centerSphere.y - 3.8); camPos.setZ(centerSphere.z); local camFront = viewFrustum.getFront(); camFront.setX(0); camFront.setY(5 + centerSphere.r * 2); camFront.setZ(0); local camRight = viewFrustum.getRight(); camRight.setX(centerSphere.r * 2); camRight.setY(0); camRight.getZ(0); local camUp = viewFrustum.getUp(); camUp.setX(0); camUp.setY(0); camUp.setZ(centerSphere.r * 2); local triPlane = createPlane( createVector(0, 0, 0), createVector(0, 0, 0), createVector(0, 0, 0) ); local vertices = modelToDraw.geomlist[1].morphTargets[1].vertices; local triangles = modelToDraw.geomlist[1].triangles; local tpos = triPlane.getPos(); local tu = triPlane.getU(); local tv = triPlane.getV(); for m,n in ipairs(triangles) do taskUpdate( m / #triangles, "drawing triangle #" .. m ); local vert1 = vertices[n.vertex1 + 1]; local vert2 = vertices[n.vertex2 + 1]; local vert3 = vertices[n.vertex3 + 1]; tpos.setX(vert1.x); tpos.setY(vert1.y); tpos.setZ(vert1.z); tu.setX(vert2.x - vert1.x); tu.setY(vert2.y - vert1.y); tu.setZ(vert2.z - vert1.z); tv.setX(vert3.x - vert1.x); tv.setY(vert3.y - vert1.y); tv.setZ(vert3.z - vert1.z); local gotToDraw, numDrawn, numSkipped = draw_plane_on_bbuf(viewFrustum, bbuf, dbuf, triPlane, false, "tri"); if (gotToDraw) and (numDrawn >= 1) then num_triangles_drawn = num_triangles_drawn + 1; end end end local time_end = getTickCount(); local ms_diff = ( time_end - time_start ); (...) end The code first loads a DFF file called "gfriend.dff" and stores it inside the "modelToDraw" variable. Once you execute the "draw_model" command the code looks up the first geometry in the DFF file and fetches all triangles associated with it. The rendering camera is set up to point at the middle of the model. Then all triangles are drawn one-by-one. https://twitter.com/rplgn/status/1230650912345067520 Try swapping the DFF file for another one, like biker.dff, and examine the results! Maybe extract a different DFF file from GTA:SA and replace gfriend.dff with that one. External references: math calculation on paper example: https://imgur.com/gallery/rLvln3X German thread on mta-sa.org: https://www.mta-sa.org/thread/38693-3d-frustum-ebene-schneidung-in-Lua/ Do you have any questions related to the math or the implementation? Do not shy away from asking! I want to provide you with as much insight as I can.
  25. 8 points
    السلامم عليكمم ورحمة الله وبرككاته سويت سكربت فكرته هي فيه مقر حق جيش يتم الانتقال اليه وسرقته طبعا الموضوع يختلف , كيف؟ يعني مثلا فيه فرق بين السرقة.. واحد ما معه رتبة VIP يجي يسرق المقر يوم يدخل المنطقة يظهر للي معه الرتبة انه دخل ويتجمد لمدة من 5 الى 20 ثانية علشان يقدر يدخل او يخرج من المقر وطبعا فيه مميزات للي معه الرتبة وهي: ء - يقدر يراقب المقر لمدة دقيقة عبر كتابة كلمة مراقبة بف8 - يقدر ينتقل بسهولة الى المقر عن طريق فتح لوحة عبر كتابة كلمة open بف8 - يقدر يدخل المقر ويخرج بدون ما يتجمد - يوم ينتقل الى المقر من اللوحة ياخذ سلاح ودم - يقدر يعرف من اللوحة مين دخل المقر ومين خرج وهل انسرق ام لا - يوم يسرق المقر ياخذ مبلغ بين 50,000 و 100,000 بينما الشخص العادي بياخذ بين 5,000 و 10,000 وفيه كمان مميزات يمديك تشوفها بنفسكك بس انا قلت اغير من فكرة سرقة البنك الى منشورة كثير يكون شيء جديد وله مميزات حلووهه ء الصور فيه مشاكل فى رفعها صراحة بس بحاول بعدين اعدل علي المنشور وبحط الصور كلمة فتح اللوحة للي معه الرتبة هي : open كلمة مراقبة المقر للي معه الرتبة هي : مراقبة الرتبة الى تحتاجها بفتح اللوحات وتجربة الخصائص هي : VIP حط السكربت بقروب الادمن علشان يشتغل كويس * رابط التحمييل : إضغط هنا لعيؤون @!#NssoR_) @N3xT @!#DesTroyeR_,) @+Source|> @AcTioN_PRO @Mr.Solo @Kareem Amer @Abdul KariM وكل المنتدي ..
  26. 8 points
    MTA-Communication-Enchantment This is an enchantment that allows you to communicate between clientside and serverside a bit easier. If you know how to work with events, then you probably do not need this, but it has some nice features which allows you to sit back and write less code + achieve some nice results. Note: It is important to keep in mind that this is an enchantment. Which means it is just an layer on top of the basic functionalities of MTA. And most enchantments come with a cost, in this case that is bit of performance. I will keep the information of topic to the minimal, as I have written most of the information already on the repository. You can find the repository here. Examples Syntax Installation What can you do with it? Calling from clientside to serverside Client callServer("hello") Server function hello () outputChatBox("Hello client!") end Calling from serverside to clientside Server addCommandHandler("callclient", function (player) -- An addCommandHandler is needed, because the client hasn't loaded it's scripts yet. callClient(player, "hello") end, false, false) Client function hello () outputChatBox("Hello server!") end Ok, ok, that was boring. The next one this is a bit nicer! Hello are you there? Just Call-me-back... I miss(ed) you too Callback Client callServer( "callbackMe", "argument", function (argument) -- < This is the callback function outputChatBox(argument) end ) Server function callbackMe (argument) return argument .. " < I looked at it :)" end Callback + internal arguments Sometimes you have arguments that you simply can't send over. > functions Or arguments that shouldn't be send over. > LARGE quantities of database data Internal arguments can be used to pass information to a callback without exposing it to the other side(client/server). Client callServer( "callbackMe", -------------------------------- -- arguments that are send over "argument", -- -------------------------------- function (internalArgument, argument) -- < This is the callback function. outputChatBox(internalArgument) outputChatBox(argument) end, -------------------------------- -- arguments that are not send over "internalArgument" -- < internal argument -- -------------------------------- ) Server function callbackMe (argument) return argument .. " < I looked at it :D" end Ha! Serverside what is that? No need for complicated things! Communicate between clients without writing a single line of serverside. Magic! Note: There is serverside used behind the scenes, you just don't have to write it. Client function smile (player) outputChatBox((isElement(player) and getPlayerName(player) or "[unknown]") .. " has send you a: :)") local x, y, z = getElementPosition(localPlayer) setElementPosition(localPlayer, x, y, z + 100) end addRemoteClientAccessPoint(smile) -- < This function allows other clients to call this function. --------------------------------------- -- -- function getPlayerFromPartialName(name) local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs(getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end -- Author: TAPL -- https://wiki.multitheftauto.com/wiki/GetPlayerFromPartialName -- -- --------------------------------------- addCommandHandler("smile", function (cmd, playerName) local player = getPlayerFromPartialName(playerName) if player then outputChatBox("Sending smile!") callRemoteClient(player, "smile", player) else outputChatBox("Can't find player!") end end) Turtle, I will wait for you to catch up. So don't worry, you are still cute. Await functions When a player has joined the server, he or she doesn't have download + loaded his scripts yet. This means that you can't deliver your love letter yet and all your work will be for nothing. But what if you don't have to worry about that? You can just wait now! Server addEventHandler("onPlayerJoin", root, function () callClientAwait(source, "testCallClientAwait") end) Client function testCallClientAwait () outputChatBox("Yes this works!") end Security Worried about security issues? Remote calls for C++/MTA functions have been blocked. There is a whitelist feature included, if enabled your code can only remote-call whitelisted functions. (this is disabled by default) Read the docs for that. Here and here
  27. 8 points
    سلام عليكم ورحمة الله آخخبااركم ان شاء الله طيبين ------------------------------------- في هذا الموضوع عندي مود متجر يشتغل بالنقاط يعني عندك نقاط تشتري بها اسلحه ودم ودرع الخخ لمعرفة كل شي عن المود في هذا الرابط / الفيديو وبالتـــوفييقء ~~  |~ الإهداءات ~| @!#DesTroyeR_,) @Kareem Amer @MrKAREEM @Mr.Falcon @DABL @KillerX @NX_CI @[AcM] - Major . @MR_Mahmoud @Ahmed Ly @MR.Mosa @N3xT @Abu-Solo @SuperX @#BrosS @iMr.WiFi..! @Mr.CnTroL @Abdul KariM @Hakan @!#NssoR_) @Simple. @Abdo Nour و جميع أعضاء المنتدى
  28. 8 points
    Introduction Particles and lights are found many places in the game. Cars has corona lights for their tail, brake and headlights, exhaust fumes and tire smoke. These are effects and can help boost the atmosphere. Adding these effects can be done with ease, however, those who wish to use specific tools may have to incorporate more tools to transfer the data between files. This guide aims to introduce GTA modders to 2d billboard effects (lights, splashes) and particles through use of 3ds Max and relevant tools. To get started, user must obtain a selection of programs and 3D scripts available from this topic: Kam's 2018 scripts, The Hero's RW importer/exporter (optional if using for object export; harder), Dexx's 2dfx export script, RWanalyze and tools for setting up texture files. Table of Contents Working with lights using Kam's 2018 script Working with lights and particles using RW script (and Kam's 2018 for data exporting) Common uses of 2dfx Working with lights using Kam's 2018 script The upgraded Kam's script has an in-built 2dfx tool for quickly adding lights to models. Below is presented a step-step guide on adding a blinking light to a cone ID 1238. Import trafficcone.dff from gta3.img using the Kam's 2018 script importer. Navigate to Create Panel > Lights > Standard > Omni Light. Spawn one at the top of the cone. Link the Omni to the model, so it is a child of the model. As seen on the image below, expand '2DFX' on the script GUI. With the Omni selected, click 'Get'. Now the light parameters can be set to the user's likings. Below is a detailed explanation of config. Once done, select model and the child light and click Export to DFF. Time to test! The following config and export settings are ideal but may be adjusted to individual user's preferences: Each setting explained: Presets: presets for easy setup of lights Set to selected lights: needs be clicked each time changes has been made to a light. Get: copies the selected light's information, allowing one to paste that onto other lights. Color: the color of the light. Corona size: the size of the physical corona light. Draw distance: distance in which the light can be seen from (in SA units). Light range: distance in which the light illuminates peds and vehicles. Corona name: light texture e.g traffic light, blood splatter, corona star. Show mode: enable for flashing and other effects. Reflection: gives the effect of the sun shining into a lens when looking at the light source. Shadow size: the size of the round transparent shadow. Shadow distance: the distance in which the shadow can be seen (e.g if object is 100 meters above surface, the shadow can be seen if set to 105 units) Shadow multiplier: intensity of the shadow. Shadow name: defines which texture is used for the shadow. Flags: defines light properties. Working with lights and particles using RW script (and Kam's 2018 for data exporting) Lights method The steps presented in Kams method needs be followed with export included. On 3ds Max with the RW version of the model (with Omni Light) ready, export the model with its child Omni Light using RW script. The RW version does not need any specific light data, it just needs a regular Omni Light as placeholder. The reason for having Kam's DFF version available is that it contains data that can be extracted from the Kam's file and imported into the RW file. With Kam's DFF and RW DFF in a folder, open RWanalyze. Open the Kam's DFF and spot the section named "2dfx [xxx bytes @ xxxxx] - [0x253F2F8]". To proceed, right click the highlighted section > Export Section Data (ctrl + e) > select project folder and name as 'cone'. Now, open the RW version and find the same section located approximately in same order in the hierarchy containing a Bin Mesh PLG. To proceed, right click the highlighted section > Add section > [0x253F2F8] 2dfx > Right click the new section > Import section data > Find and select 'cone' > save file. Particles method For adding particles to the model, Dexx's 2dfx tool is introduced to the user. This method is not tool specific and works with both KAM and RW exporters. In this case RW exporter is used. With the RW model in 3ds Max, go to Create Tab > Helpers > Dummy > create one at the top of the cone. Link it to the model so that it's the child of the model. Start Dexx tool. Click 'Add Particle Info (Dummy)'. Expand 'Setup / Edit Particles'. In 'Particle System' select 'Fire'. Click 'Apply to Dummy(s)'. Expand 'Export Effect Info'. Click 'Export Info' with only the dummy selected, not the model. Export to project folder and name file as 'fire'. Export the model with the dummy included. Now with RWanalyze, open the DFF that was exported and find the following section. To proceed, right click the highlighted section, click 'Add section' and find [0x253F2F8] 2dfx. Right click the newly generated section and click 'Import section data'. Find the file 'fire' and on RWanalyze click save. The model now contains a fire from the top of the cone. Common uses of 2dfx In GTA SA, lights and particles can be integrated into models regardless if they're world objects or vehicles. Thus it opens up a whole level and opportunities for modelers to improve visuals of their models. A few uses are compiled below. Street lamps Fireplaces Cars Sirens Fire simulations Structure lighting Aircraft blinking lights Traffic lights Fountains Cement mixers Farming utilities The possibilities are endless, although the rendering limits of corona images is 32. This explains why the Pyramid in Las Venturas has 8 lights on each 4 corners.
  29. 8 points
    السلام عليكم و رحمه الله و بركاته اليوم حبيت اسوي مود سهل و خفيف بيساعد المبرمجين في البرمجه بشكل كبير طبعا كنت معتزل و لي سنه ما نزلت شي جديد فحبيت اسوي خير شويه المود عباره عن نظام صلاحيات للحسابات وش فايدته .... ؟ مثلا عندك لوحه و تبي تخليها لكم لاعب فقط تقدر تستعمل السكربت عشان تخصص اللوحه لحسابتهم فقط او مثلا عندك لوحه و بها ازرار كتير و مثلا تبي زر يكون خاص للاعب بكل سهوله تقدر تستعمل السكربت السكربت هدفه توفير الوقت + طبعا عدم استخدام طرق التحققات الشائعه بين المبرمجين الي احيانا تسبب مشاكل للسيرفر --------------------------------------------------------------------------------------------------------- Export Functions / الوظائف الي تستطيع استدعائها Server Side : createPremission deletePremission addPremissionToAccount removePremissionFromAccount Client/Server ( Shared ) : getAllPremissions isAccountHasPremission getAccountsWithPremission getPremissionTable isPremissionExist Client Side : getClientAccount ------------------------------------------------------------------------------------- شرح الوظائف : createPremission تستخدم هذه الوظيفه لعمل صلاحيه جديده Usage : createPremission ( premissionName ) premissionName = اسم الصلاحيه الي تباها deletePremission تستخدم هذه الوظيفه في مسح صلاحيه موجوده من قبل Usage : deletePremission ( premissionName ) premissionName = اسم الصلاحيه addPremissionToAccount تستخدم هذه الوظيفه لاعطاء صلاحيه للحسابات .. Usage : addPremissionToAccount ( AccountName , Permission ) AccountName = اسم الحساب Permission = الصلاحيه removePremissionFromAccount تستخدم هذه الوظيفه في مسح صلاحيه من حساب Usage : removePremissionFromAccount ( Account , Permission ) Account = اسم الحساب Permission = الصلاحيه getAllPremissions تجيب لك الصلاحيات الموجوده Usage : getAllPremissions () الوظيفه ترجع لك جدول فيه الصلاحيات الي موجوده isAccountHasPremission تتحقق اذا كان الحساب عنده الخاصيه او لا Usage : isAccountHasPremission ( AccountName , Permission ) ترجع القيمه boolean getAccountsWithPremission تجيب لك الحسابات الي عندها صلاحيه محدده Usage : getAccountsWithPremission ( Permission ) Permission = اسم الصلاحيه ترجع لك جدول فيه اسماء الحسابات الي عندها الصلاحيه ذي getPremissionTable تجيب لك الجدول الكامل للصلاحيات الجدول كالتالي : Permissions = { PermissionName = { Accounts ...... }, etc........... } isPremissionExist تتحقق لك اذا كان في صلاحيه بالأسم الي انت مسويه من قبل او لا Usage : isPremissionExist ( PermissionName ) getClientAccount تجيب لك اسم حساب اللاعب في الكلينت سايد Usage : getClientAccount ( Player ) لو اللاعب مو مسجل بيرجع لك قيمه guest -------------------------------------------------------------------------------------------- طبعا المود يحفظ الصلاحيات لو وقف المود و اشتغل مره تانيه .. *NOTE : لسا ملاحظ اني كتبت كلمه Permission غلط معلش مخدتش بالي رابط التحميل : PERMISSIONS SYSTEM Ver: 1.0.0 المود مو مشفر للي حابب يتعلم كدا كدا المود مخصص للمبرمجين :- UPCOMING SCRIPT / السكربت القادم Resources Manager ( V3 )
  30. 8 points
    سلام عليكم ورحمة الله آخخبااركم ان شاء الله طيبين ------------------------------------- في هذا الموضوع عندي مود نظام البنك ~~` افكاره ليست جديده مره 😅😅😅 ولكن حاولت اجيب افكار عندك مثلا لما تودع فلوس او تسحب يشتغل صوت + يتحرك البيد اللي يشتتغل بالبنك هذا افضل وصف ض2 لمعرفة كل شي عن المود في هذا الرابط / الفيديو  وبالتـــوفييقء ~~  |~ الإهداءات ~| @!#DesTroyeR_,) @MrKAREEM @Mr.Falcon @DABL @KillerX @NX_CI @[AcM] - Major . @MR_Mahmoud @Ahmed Ly @MR.Mosa @N3xT @Abu-Solo @SuperX @#BrosS @iMr.WiFi..! @Mr.CnTroL @Abdul KariM @Hakan @!#NssoR_) @Simple. و جميع أعضاء المنتدى 
  31. 7 points
    I'm excited to show you my latest tool. This time it is something different than my previous tools. It is a bigger project which came to my mind over 2 years ago. I failed at first time because I had trouble with rotations (built in mta function doesn't work well so I had to use quaternions which caused problems as well). Moreover one of devs was working on new editor and he was going to add multi selection option but he cancelled the project. After 2 years I decided to finally write it and also add few additional features. Many hours spent on the tool, thousands lines of code but here is it. I hope you like it and find it useful. Personally I think it should speed up your mapping a lot. Few features might look complicated (actually they are easy to use) so I advice watching or reading tutorial carefully. Features Let's see what this tool is capable of! Create groups of elements using various selection tools and element filters a. edit their position and rotation around all axes b. change their properties - all popular element types are supported c. clone / delete options d. large group support enables you to move / edit whole parts or even maps Duplicate 2 groups Change pivot position Add groups to library a. browser with search and sort options b. loading big groups enables you to join many maps into 1 c. import option which adds all MSTU groups from a given map Cover groups a. create your own cover variations or object compositions b. default cover settings makes covering even faster Customize tool settings on your own needs Download More info and full tutorial you will find here: https://www.thecrewgaming.com/forum/showthread.php?tid=2467&pid=12255#pid12255 Support me If you want to support me leave feedback and also you can buy me a coffee so I won't starving. Thanks a lot! Buy Coffee Feel free to ask questions below or via PM/discord. I'm also opened for script requests. I will keep updating the tool in case you find some bugs. Discord: https://discordapp.com/invite/C4TRxr8
  32. 7 points
    السلام عليكم ورحمة الله تعالى وبركته ( اللهم صلي وسلم على سيدنا محمد عليه الصلاة و السلام ) [AMONG US IN MTA:SA] ( اللعبة الاصلية ( شرح و طريقة لعب هي لعبة مسلية ومليئة بالحركية والإثارة. انظم إلى طاقم قايدة سفينة بينما يتحركون عبر الفضاء... واكتشف أن هناك دخيلا تسلل إلى السفينة بهدف التخلص من طاقمها وتدميرها Among Us! تجري كل الأحداث في لعبة متن سفينة فضاء تتكون من وحدات مختلفة. ابدأ لعبة جديدة -إما على الإنترنت أو ضد الحاسوب- وستحصل إما على دور عضو الطاقم أو دور الدخيل، والذي سيبقى غير مكشوف بالنسبة للاعبين الآخرين. إذا حصلت على دور الدخيل، فإن هدفك سيكون هو التخلص من كافة الطاقم من خلال التسلل إلى السفينة والضغط على زر القتل. أما إذا حصلت على دور عضو في الطاقم، فإنه سينبغي عليك تجنب الدخيل ومحاولة اكتشاف من يكون... قبل فوات الأوان! لهذا الغرض، فإن غرفة محادثة تجمع كل اللاعبين ستظهر بعد الأحداث، وهناك سيكون بإمكانهم مناقشة شكوكهم حول الدخيل بناء على ما عاينوه خلال اللعبة، لينظموا بعد ذلك تصويتا حول الأمر. يمكن للاعبين كذلك التفاعل مع بعض الأشياء التي توجد في غرف السفينة أثناء اللعب. وعلى العموم، فإن لعبة Among Us هي لعبة لاعبين متعددين مذهلة، سواء ألعبتها مع أصدقائك أو مع لاعبين من مختلف أنحاء العالم. اركب السفينة وعش الإحساس باكتشاف المتسلل في كل لعبة! source بعض صور داخل الخادم و هناك الكثير من الشياء الاضافية نظام التصويت - نظام العملة (COIN) - تستطيع انشاء خادم داخل خادم بشراء سيرفر و الطريقة تلقائية - (package) تسطيع فتح صناديق عشوائية نظام - الدخول بطريقة تلقائية حساب عشوائي و كلمة سطر عشوائية - تغير اسم الحساب يتطلب منك مبلغ مالي - يمكنك متابعة احدث الإظافات و الاخبار على الديسكورد - S4CCn6Q يشرفنا و جودك معنا و السلام عليكم و رحمة الله تعالى وبركته
  33. 7 points
    Introduction This guide intends to teach 3ds Max users the basics and more advanced ways of working with Vertex Colors, in order to achieve lighting solutions for enhanced quality of game models, or blend several textures together using Vertex alpha. A lot of games utilises vertex colors to accomplish lighting or blending effects, which usually impacts the performance less than model shaders. Types of shaders such as Texture Splatting are pixel based techniques for rendering multiple textures onto a model, where each texture e.g earth, grass, gravel, has their own color on the splat map. This however may use up significantly more resources than its alternatives in some cases. As result, game developers may move their aim towards Vertex Alpha and Color rather than geometry shaders. Vertex Color works almost the same way, however it renders per vertex and not per pixel unlike shaders do. This may result in very poor results if the geometry is not subdivided at the places it is painted at. Besides texture blending, vertex colors are also widely used in games for fake lighting baked into models. This is due to some game engines not supporting Ray Tracing or other rendering, or they simply prefer using vertex colors over per-pixel lighting. In GTA:SA the only light rendering is done by vertex colors and 2DFX. In the days that the game was developed, vertex colors was a more sustainable rendering method over other options. Table of contents Different model lighting depending on game time Importance of vertex colors Importance of vertex illumination Basics of per-vertex Radiosity workflow Hard surface prelighting Faking ambient occlusion Texture blending with Vertex Alpha The vertexPaint modifier Extracting channel info Working with several VertexPaint modifiers Different model lighting depending on game time Game models use two vertex channels for lighting. Vertex color is displayed around 06:00 - 20:00. Vertex illumination is displayed outside that timeframe, that is, between 20:00 and 06:00. Between these timeframes, the two channels blends into eachother, creating a realistic daytime and nighttime visualization of the map. Remembering which channel is used for what can be a little troubling, on top of the many other things. Artists could consider Vertex Color = daytime, Vertex Illumination = nighttime. Below are various demonstrations of vertex color and illumination channels. Importance of vertex colors Below video demonstrates the effects of not prelighting game models for GTA:SA. The results are very easy to differ from prelit models, as the only depth seen on the models is made by the diffuse maps, which usually does not add sufficient shadows. That is where the artist may consider prelighting his model. As seen on the video, first footage is of San Fierro chunk without diffuse maps (textures) nor vertex colors. This results in completely white meshes. If however, the artist decides to utilise vertex colors, the model will have a lot greater depth added, without the need to bake light into textures at the expense of computer memory. The video's contents are 1:1 to how San Fierro would be rendered in-game around 12:00. No post processing or edits made to the models. Compression methods, post processing, sky and fog done by the Renderware engine will make it a tad different though. Below screenshot is taken from a Dust2 model ripped from Counter Strike. It shows how the vertex channel brings shadows and ambient occlusion into the model. If it did not have the vertex channel changes made, it would be completely flat, corridors would have no depth whatsoever, only some by the difference between the textures. Importance of vertex illumination Not all models use fancy colors like the pirate assets by Las Venturas strip. A lot of models use the same, though slightly darkened, version of vertex colors for the vertex illumination channel. The result of this is a darker object during night and brighter during day. Perhaps some has some highlights that are cast from streetlights and other light sources that appear during nighttime. Some models, notably light objects use vertex colors in conjunction with 2DFX in order to create realistic light with a real light source. Below example is a runway light. The white version is during day time, where the inner light mesh (the extruded part) is grey to represent an deactivated light. The red version is during night time, where the top surface has light reflected onto it, together with a corona image, more commonly known as 2D billboard or sprites. The corona acts as the light source and creates a bloom alike effect. (Not seen in image) Basics of per-vertex To get a somewhat understanding of how vertex colors work, below demonstration should be helpful. The triangle's top left vertex is painted blue, top right painted green and bottom painted red. This creates an RGB blend display of the triangle. The planar model has its bottom vertices painted black while the top ones are white. This creates more of a gradient across the entire model.To put the difference between per-vertex lighting and per-pixel lighting short, Vertex based lighting creates a gradient from one vertex towards the nearest one(s), and stops there. If a model has only 4 vertices, it is not possible to have circular or very detailed IES-like lighting, as the model would have only 4 points that can have light data. Pixel based lighting can have as many abstract details as artist wishes. It works as if there is a grayscale image on top of the model with a different blend mode, or dynamic lighting based on world models, hence the two are called per-vertex and per-pixel. Radiosity workflow Tired of painting vertex colors onto models with silly brushes all day? 3ds Max has an amazing light renderer, which can produce stunning renders and best of all, stunning prelights. As if it was made for GTA:SA era games! Not to forget, a 3rd party Max script was made to make the workflow a lot less difficult - can be found on: http://www.scriptspot.com/3ds-max/scripts/vertex-color-tools-1. With this script, artists can with a few clicks create a skylight, ground plane (for AO), then render a radiosity solution in less than a minute total. No more setting up radiosity settings, only a few adjustments to your likings if needed. I use it all the time myself, and in fact, I learned to create beautiful prelights by using this tool with radiosity rendering. Before moving on, ParoXum's Radiosity tutorial and the Radiosity wikipedia page contains extra information that is not covered in this thread, for instance particular use of point lights. For that reason they may be benefitable to read through. WARNING! Pressing the AO button on the Vertex Color Tool script, ALL materials will be reset to standard. This can not be reversed! Adding to the above. Make sure to create a backup Max project file prior to working with Radiosity. Use the backup Max project file for vertex colors, leave original file for modeling! This process is covered in the guide. Hard surface prelighting Most artists starting out with vertex colors have probably grown tired of selecting faces of a model, then painting a different value onto each to replicate a hard surface look. As it turns out, this is not an efficient way. The model will look odd if the artist has not put enough time (hours with sweat) into it. That is where automating it with Radiosity rendering is a fantastic solution. To get started, download the following FBX scene https://cdn.discordapp.com/attachments/308956559201796097/632340906170908673/demo.zip. Each point contains a spoiler with a video clip. For those who would like to mess around with the final result of mine, download FBX here: https://cdn.discordapp.com/attachments/308956559201796097/632559814387695626/demo_result.zip (video below) Important thing to note, when using Radiosity for prelights, the shading/lighting which is baked into the model entirely depends on the smoothing of the model. If it's set to Auto Smooth value 2 the shading will resemble 3ds Max's shading 'facets', while if the model has only one smoothing group, the shading will be incredibly smooth and generally won't have any facet shading. San Andreas models generally had very low smoothing value for its models at their creation, judging by their hard surface appearence. If a modeler were to create models that blend in with the game environment, they should strongly consider the above. Video tutorial: Text tutorial: Import the file Click the 3ds max upper left corner, at Import hover over the arrow for a drop down menu to appear. Click Import. Click the demo.FBX. Ensure to include Smoothing Groups on import, and units setup in Meters. Reset X, Y, Z positions to 0, 0, 0. At import the model is not centered. Create light Navigate to Create tab, click the gears icon, finally select the Daylight button. Max will ask if it can set an exposure control flag (not a country flag bleh), click Yes. Click anywhere, this sets the compass. Then, drag the mouse up into the sky, press LMB to spawn the daylight system. The compass position is not important. Alter light Navigate to Modify tab, change Sunlight from Standard to IES Sun. Likewise for sky, make it IES Sky. On Sun Parameters uncheck Shadows. Ensure the sun's state is On. On IES Sky Parameters it is possible to modify the intensity of the sky, as well as the sun. Some of the settings that affect the sun is whether the weather is clear or clouded. Leave default. On hierarchy list, select the Daylight001 item. While on Modify tab, click the Setup button for setting the scene weather. As the light system works like real daylight, the lower the number of hours, the darker the scene. Set hours at 9, month at 9, orbital scale at 320-360. Initiate the radiosity solution by running Vertex Color Tools Ver1.0. Press the AO button. Keep in mind, that this will remove all materials and cannot be reversed with undo. The render setup window opens. Another window from Rendering > Exposure Control is needed. On Exposure Control, change from none to Logarithmic. Tick on the Exterior daylight checkbox, which is required due to scene using a daylight system. Optionally, start rendering previews via the Exposure Control window. These previews are very low resolution and may help visualise the lighting. Or, real renders by SHIFT Q, although this may take significantly more time and processing power. On Render Setup window, reset value of Indirect Lighting Filtering. Increase the Direct Lighting Filtering to a value of 8. Under Radiosity Meshing Parameters tick the Include Skylight checkbox. Under Rendering Parameters select Re-Use Direct Illumination from Radiosity Solution. On Render Setup window, make sure to press Reset, to then start a clean rendering with the updated settings. Click Start. This may be an incredibly slow process, even on high end computers. If it gets stuck, set quality to less. It does not really have much of an impact for GTA:SA light anyway. Voila, done. The final result will be displayed in viewport. The result is equal to what is seen in-game during day hours. If something looks off, go back and tweak settings. Bake Radiosity lighting solution into vertex channel. Navigate to Utility tab, click More..., select Assign Vertex Colors. Upon scrolling down the utility tab, the Vertex Colors settings appear. Vertex Color is for day time, Vertex Illumination is for night time. Choose Vertex Color. Set light model as Lighting + Diffuse. Set Color Assignment as whichever seen fit. On Rendering options, enable Mapping and Radiosity, Reuse Direct Illum. from solution. Finally, click Assign to Selected View vertex color result in viewport. On the VertexPaint modifier, select the channel that was just modified. On the VertexPaint GUI, click the shaded box to the left. This displays the model with only vertex channel rendering, no other 3D shading will be used. Further tweaking If one wishes night time lighting, the best to do is render a new radiosity solution with less sun and daylight intensity, in order to darken the scene. Eventually change to clouded or mess with weather settings. The new radiosity solution will be equally the same as the one for daytime, although a tad darker. When rendered, assign to illumination channel. The letters can be painted for night time to look extra cool. This is where painting by buckets onto face selections of the mesh can come in handy, using the VertexPaint modifier. Odd looking shadows can be fixed up with the blur brush (VertexPaint modifier). Those who are able to get results with the above Radiosity workflow, may utilise their knowledge and take prelighting a next step with other types of lights, in order to create environment lights such as shadows for light poles, torches, buildings etc. Point lights, more specifically Free Light, were used a lot in the ship model further down the topic. Scene lighting is generally hit and miss. There are many settings which may need to be changed e.g scale of daylight and smoothing groups of models, in order to get the right look. Faking ambient occlusion Vertices can easily store ambient occlusion details, negating the need for geometry shaders. Some models may require additional geometry through subdividing the mesh, in order to achieve proper ambient occlusion details with vertex colors. The type of light used is usually skylight or daylight, this creates subtle shadows around corners and creaks, as well as maintaining global lighting. The below model has vertex AO baked by using a Skylight with the following settings. *you can eventually utilise a plane as ground for the ambient occlusion to calculate a lot better. The above practise can be used for GTA:SA assets as well, some settings may require to be tweaked first though. Prelighting in general is trial and error unless the artist has a solid background with lighting and rendering. Generally though, ambient occlusion should not be the only layer for lighting a model. Hard surface lighting as well as adding point lights is highly recommended. Without these, models with AO will still look rather flat in most cases, as there is not much definition between corners, other than soft shadows. Adding point lights to radiosity render will also give the lighting a more natural feeling, this can be done by adjusting the temporature of the light or its color. Combining point lights (free light, omni light, etcetera) with 2DFX can give stunning results. Texture blending with Vertex Alpha Texture blending on MTA was thought to only be possible by shaders, e.g texture splatmap. Instead, we can now blend textures using Vertex Alpha channel. On December 27 2019 we discovered that Vertex Alpha works without need for additional scripting (MTA Discord #modelling). We also need to thank Deniska for writing this guide (gtamaps) on vertex alpha plus creating a maxscript that exports vAlpha channel! Vertex Alpha works based on grayscale values just like alpha masks. Any vertex that's black will not be rendered - any vertex that's not black will be rendered. White is fully opaque, while the greyer it gets, the more transparency is made. Vertex Alpha will not render water behind its faces, so it's important to place an opaque object behind the vertex alpha mesh. This must be a separate model, not part of the mesh that uses vertex alpha. As with vertex prelights, vertex alpha needs geometry to work with. It's highly recommended to turbosmooth/subdivide the mesh so that you can paint in more detail. In the video below, I show how quickly the vertex alpha can be added to your models, and once that's done, you can export the model using the script from this page. Create a plane primitive. Give it 16x16 segments. Convert it to editable mesh. Give it the material that needs to blend using alpha. Set opacity of material to 98. Add a VertexPaint modifier. Select the vertex alpha channel. Use paint bucket with black color, 100 intensity, to paint entire mesh black. Add a secondary vertexpaint modifier. Grab your brush, adjust its size and strength. Begin painting a path from one end to another. Use the blur brush to finetune the semi-transparent edges of your path. Sharp edges ain't good. Looks OK? Start the export-script. You don't need to collapse your modifiers when exporting. Keep them in stack for later adjustments. Export with MMC. Remember to always set alphaTransparency enabled when replacing the model, or else only part of alpha will show. If you want to use another DFF script (for a higher quality dff), simply copy paste the sections e.g "Extra Vertex Colors" via RWanalyze. (Script will break (in which case, close script and run again) if you try to export vertex colors without having first assigned vertex colors/illumination to the model via its respective channels) List of model ID's that use the flag 68 (NO_ZBUFFER_WRITE(64) + DRAW_LAST(4)), which is required for Vertex Alpha: 2728, 3872, 3910, 4227, 4636, 4637, 7892, 9831, 9896, 9897, 11678, 11679, 11680, 11681, 13494, 13495, 13496, 13497, 13498, 13499, 13500, 13501, 13502, 13503, 13504, 13505, 13506, 13507, 13508, 13509, 13510, 13511, 13512, 13513, 13514, 13515, 13516, 13517, 13518, 13519, 13520, 13521, 13522, 13523, 13524, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13532, 13533, 13534, 13535, 13536, 13537, 13538, 13539, 13540, 13541, 13542, 13543, 13544, 13545, 13546, 13547, 13548, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13558, 13559, 13560, 13561, 13563, 16375, 16445, 16498, 16623, 16676, 16677, 16733, 16734, 16753, 16754, 16756, 16757, 16758, 16783, 16784, 17436, 17437, 17438, 17439, 17440, 17441, 17442, 17443, 17444, 17448, 17450, 17451, 17451, 17452, 17458, 17459, 17460, 17461, 17462, 17463, 17464, 17465, 17466, 17467, 17468, 17469, 17470, 17474, 17524, 18073, 18112, 18610, 18611, 18612, 18613, 18614, 18615, 18616, 18617, 18618, 18619, 18620, 18621, 18622, 18623, 18624, 18625, 18626, 18627, 18628, 18629, 18630, List of model ID's that use the flag 64 (NO_ZBUFFER_WRITE(64)) which are not tested, but might work for Vertex Alpha: 1315, 2981, 4712, 4724, 4554, 8004, 8044, 11306, 14765, Below are a few examples of how vertex alpha can be used to blend several textures together. Above image courtesy: worsas @ project tamriel (see link for more) 128x128 textures, 8192 polygons (can be a lot less!) You can probably create something a lot better than this. Time to get creative! If you're looking for additional inspiration, see the videos in spoiler. Note: The below spoiler contains information that does not apply to vertex alpha method, but instead to vertex colors. This requires shaders, since SA uses the colors for lighting, but is a decent alternative if the model use lighting shaders. The vertexPaint modifier VertexPaint is the modifier that houses the WIP vertex colors, illumination and alpha modifications. It may be accessed on Modifiers tab. While it is open, it allows the artist to do various changes to the vertex channels. Ranging from painting with the use of brushes, to refining vertex colors by blurring, adjusting hue, saturation, lightness etcetera. This is a very powerful tool, despite not having been updated for years. To get started, the modifier works with a float GUI with all of its necessary functions in it. It is worth noting that the modifier can not change existing vertex channel data, only the data that is stored in the modifier. That means it is not possible to import a GTA:SA asset and modify the hue of the vertex color channel. For an exhaustive list of what the modifier offers, check Autodesk's page on the VertexPaint Modifier. Brief explanation of what the modifier has to offer, from top to bottom: Extracting channel info For whatever reason, an artist may want to copy the vertex channel data, that is, the custom vertex information, and paste that onto their latest version of the mesh. This could be due to an irreversible action that would prevent the artist from undoing the lighting changes on present model, resulting in work lost and having to redo it all over again. Although this may seem like a promising solution to regain old channel data, it can generate problems if the two models contain different geometry counts. Below steps explains how to copy/paste data. Navigate to Utilities tab, click the More button, after which, click Channel info. At last, press the button that appeared on the bottom of the utilities tab. At first, the Channel Info GUI may seem complicated; but it really is not. The only information to look out for is the ID column and Channel Name column. The Num Verts, Faces etc. are only important to verify that the two model contains the same model geometry count. In the above example, the model has no custom channel data. The -2:Alpha, -1:Illum and 0:vc are the types of channel info's that are relevant for GTA:SA, although the Alpha data currently isn not compatible with MTA. To copy data, simply select either of the rows and press the Copy button. Then, highlight the present model, select the corresponding channel and paste. Working with several VertexPaint modifiers On more advanced tasks it may be necessary to use multiple VertexPaint modifiers stacked onto the model. Artist may find it helpful if they are doing several versions of prelighting for their model and wants to go through each result, picking the one that suits them the most. This means that each type of radiosity lighting solution will be stored in its own modifier, allowing artists to go through all of them and delete the poor ones. Having multiple modifiers on stack can also improve workflow by utilising each modifiers for each element of the model, such as Modifier1 for bonfire logs, Modifier2 for bonfire shadows, Modifier3 for ambient occlusion, Modifier4 for moonlight etc. Modifiers can also be renamed to quickly tell the artist what they are representing. The model can have as many modifiers in its stack as the artist wishes (or until the software times out), and they do not require to be collapsed when exporting the model to MTA. This means that the modeler simply needs to select the model, export it and load into MTA. Modifiers can then be collapsed to stack when job's done, however, it is strongly recommended to keep them in stack for future, in case of parts requiring rework. Below model may give a good look into just how much it helps to utilise multiple modifiers. The ship has its own modifier for virtually any type of light emmitting source. The rectangular screens to the right are symmetrical on the other side, so there is one modifier that represents those 6 rectangular emmissive screens. Same goes for the cyan U-shaped engravement, which uses its own independant modifier, and so on. This allowed to change the engravement prelight from initially dark blue to cyan, by not affecting other lights when modifying the hue, as the modifier was only used by that particular area. The stack works like so: By clicking the bottom modifier, only that one's layer will show. If clicking the one above it, assuming it is same channel, it will show both of them. Now, if clicking the top modifier, it will show all layers e.g the rest 4 that are associated with Vertex Illum channel. It will only display the channel that is selected on the right most panel. (This depends on version of Max)
  34. 7 points
    السلام عليكم ورحمة الله تعالى وبركته اليوم رجعت لكم بموضوع جديد اول شيئ : ولان اطرح معكم وافيدكم بشيئ مميز واخذ مني وقت حيث قمت بجمع جميع الوظائف المفيدة التي تم طرحها في المنتدى او غير المنتدى في ملف واحد يجمعهم كلهم المهم مأطول عليكم اول شيء : أعتذر من @Master_MTA @#,xiRocKyz @killerProject @#x1AhMeD-09 @N3xT @KillerX @3NAD @PaiN^ @Tete omar @Booo @|Mr|-Talal07-| @WASSIm. @Default#^ @jafar @</Mr.Tn6eL> @#CroSs @iMr.WiFi..! @Abdul KariM @!#NssoR_) @Blaawee @iPrestege @#DRAGON!FIRE @MoDeR2014@iMr.Dawix~#@LoOs@TAPL@Me[Z]oO@^iiEcoo'x_)@#Soking@MR.StoRm@#BrosS @ وأيضا كل من قام بدعم المحتوى العربي بالنشر لان نسيت احط حقوقهم المهم الي يبي احط حقوقه في أي وظيفة يكلمني او معه فكشن يبني اضيفه للمكتبة يروح على الرابط في GITHUB = https://github.com/MrPoper/Useful-World-Lua/projects/1 يضيف فكنشن حقه و يتبع و الطريقة الموجودة اسفل هذا الكلام و يغير Builder Name = your name https://pages.github.com/ = احد روابط مواقع التواصل الاجتماعي (المنتدى ’ فيس ’ وتس ’ ديسكور ...) -__**Function Info :**__ * info * -__**Function SYNTAX:**__ > Code HERE < - __**Function SOURCE CODE:**__ > Code HERE < - __**Function EXAMPLE :**__ > Code HERE < - __**Function TYPE :**__ - [ ] HELP - [ ] CONVERT - [ ] ELEMENT This Function BUILD By [Builder Name](https://pages.github.com/). المهم هاذا رابط تحميل كل الوظائف المفيدة: USEFUL FUCTION : 200+ LINES : 6500+ RECORD TIME : [12 November 2012] - [26 JUNE 2019] https://github.com/MrPoper/Useful-World-Lua/projects/1 💖لا تنسى الصلاة على سيدنا محمد صلى الله عليه وسلم
  35. 7 points
    Slipe is an open source framework that enables anyone to write scripts for MTA:San Andreas in C# instead of Lua, wrapping all MTA elements and classes and including some .NET Core namespaces. It is based on CSharp.Lua by Yang Huan. Slipe features: Runs on Windows and Linux Built in continuous deployment support with (GitHub) webhooks Object oriented wrappers for all MTA elements Async/await for MTA functions that use callbacks C# style Http requests, sockets and XML methods. Use Visual Studio and its Intellisense Type safety You can find more information about the project on https://mta-slipe.com. Our Discord Our Github The project is still in Alpha, and since it is open source anyone is welcome to contribute
  36. 7 points
    😛 and the original;
  37. 7 points
    سلام عليكم ورحمة الله آخخبااركم ان شاء الله طيبين ------------------------------------- Wasted في هذا الموضوع عندي مود ~~` بدون اي كلام كثير شوف الفيديو وتفهم المود لمعرفة كل شي عن المود في هذا الرابط / الفيديو وبالتـــوفييقء ~~  |~ الإهداءات ~| @!#DesTroyeR_,) @MrKAREEM @Mr.Falcon @DABL @KillerX @NX_CI @[AcM] - Major . @MR_Mahmoud @Ahmed Ly @MR.Mosa @N3xT @Abu-Solo @SuperX @#BrosS @iMr.WiFi..! @Mr.CnTroL @Abdul KariM @Hakan @!#NssoR_) @Simple. و جميع أعضاء المنتدى 
  38. 6 points
    Hello, As many of you know we are working on a new community website, and we need your help to design it! We are looking for a UI developer who: can design a website in Photoshop, Sketch, or another prototyping tool HTML/CSS experience is a plus, but not necessary would be open to further working with us to design a new homepage and forum design has an eye for good UX and good accessibility From you, we need: a new community website design that is suitable for the modern web not a redesign of the MTA logo Since we are an open source project, we all volunteer our time towards developing and moderating Multi Theft Auto. All of our donations go to server costs, therefore we are unable to pay for a designer. Here's what we can give you: a contributor rank on the forums a spot in the credits We understand that this is a lot of work, so we're primarily interested in working with you continuously over the next several months. How to apply Each submission should include: links to a redesign of a single MTA page of your choosing this can be any webpage on the MTA network (homepage, community, forum, nightly) an image or a sketch is enough (no HTML required!) For bonus points (optional), you can include: a couple sentences explaining your background/interest this can be anything relating to your activity in MTA or stuff you do in your spare time examples / a portfolio of your previous work (links are great!) If you are interested in working with us, please respond to this topic by the end of September with the above info & suitable links. If you have any questions, feel free to respond to this topic or contact us on Discord. After all the designs have been submitted we'll contact the author of the best submission. Incomplete submissions will not be considered. I'm not a web designer, how can I help? At the moment we are NOT currently looking for other contributors. Feel free to give feedback and vote on submissions. Please be considerate when using the quote feature (do not include large images in quotes). Thank you!
  39. 6 points
    السلام عليكم ورحمة الله وبركاته اسعد الله اوقاتكم بكل خير ، وأسأل المولى عزوجل أن يقينا ويقيكم شر كل داء ويحفظنا بحفظه .انه لمن دواعي سروري أن اكتب موضوعي هذا مبينا فيه السلسلة التاريخية لسيرفرنا والتي قد مرت بأزمات وصعاب ولكن بفضل من الله ثم بعزيمتنا تصدينا لها ولا أخفيكم انه من اهداف موضوعي هذا اود ايصال رسالة شكر لكل من ساهم في نجاح السيرفر منذ تأسيسه الى وقتنا الحاضر وكلنا نعلم أن من لايشكر الناس لا يشكر الرحمن . بداية تم تأسيس السيرفر ع يد -Mr-Wael -EBDA3 حيث أنهم قد استمروا الى حين انضمام المبرمج @Mr.Talal07 ولايخفى عليكم انه كان شمعة من شموع البرمجه واسم لامع حيث قاد هؤلاء الثلاثة السيرفر الى ان اصبح سيرفرا منافسا بعد ذلك بسبب ظروف المؤسسين فقد تم اعتزالهم وقمت انا محدثكم MAX-511 باستلام السيرفر سنتين انضم خلال هذه الفترة وبعد اعتزال المبرمج انذاك mrdk-ly @Do_De<3 حيث انهم قاموا بمجهودات عظيمة يصعب ان يتم جحدها او نكرانها بينت وفائهم لاصدقائهم وصدقهم واخلاصهم توقفت انا بسبب تخرجي وعدم القدرة على التفرغ الى تسليم ia7bk حيث كان مثالا للصبر والحكمة ولكن بسبب الظروف نفسها للسابقين فقد اعتزل وتسلمت الامور الى Howlywood والذي هو مستمر في فترته الحالية دون توقف في هذه الفترة انضم المبرمج نصور والذي هو السبب بعد الله في نجاح السيرفر هذه الفترة وذلك لما يقدمه من مودات وبرمجه ولمسات سحرية يعجز اللسان ان يصف جمالها كما لا ننسى شخصين من افضل مصممين المابات M3LM SHB7 تصميمهم الابداعي ولمساتهم الجميلة في المابات تزيد جمال السيرفر فلذلك ان كل مادفعني اليه الامر الى ايصال شكري لهؤلاء الاشخاص الذين حق لي فخرا ان اذكرأنني قمت بالعمل معهم حيث كانوا كالرجل الواحد وبالكلمه الواحدة حيث انني اريد رد الجميل لما يقدمونه ويسهرون ويتعبون ولكن لكل منهم دعوة اخويه في ظهر الغيب لا يعلمونها وفي النهاية اعتذر عن الاطاله ونوعدكم بالافضل دام مبرمجنا نصور ومصممينا موجودين مع احتمالية عودة صاحب السيرفر وائل والمبرمج السابق انكسار ضض والسلام عليكم ورحمة الله وبركاته تقبلوا تحياتي
  40. 6 points
    Hi everyone! I want to offer for sale a new sims based interior customizing system that can be a perfect DLC for your server. Basic informations The system contains a lot of individual models More than 340 different furnitures (with corrected offsets) More than 130 different walltextures More than 100 floortextures Userfriendly, sims based interface Optimized systems, that is by modern methode The script is easy to install Possibility for microtransaktion (Premium Points) Adjustable interior size (2x2 - 10x10) Tutorial Video Price: 108 € via Paypal Contact For more information you can contact me there: Facebook: facebook.com/stevenscottmta E-MAIL: stevenscottmta@gmail.com Forum: @</Steve>
  41. 6 points
    Installation: extract files to C:\Program Files (x86)\MTA San Andreas 1.5\MTA\cgui\images replace & launch the game. Mediafire Dropbox Google Drive
  42. 6 points
    مبارك عليكم الشهر الكريم , وكل عام وانتم بخير
  43. 6 points
    السيرفر الوحيد اللي اشوف كل واحد يجي يقول مود الوزاره كأن اللعبه مافيها غير السيرفر دا 😅
  44. 6 points
    Post Anterior: Comentando o Código Antes de mais nada, boas praticas de programação, não são uma regra fixa que não pode mudar, mas sim, praticas (como o nome já diz), que facilitam o desenvolvimento, e o trabalho em equipe em um código. A principal boa pratica de programação é comentar o código, em Lua os comentários podem ser feitos da seguinte forma. Para comentar linhas únicas se utiliza ( "--" ) da seguinte forma. if condição then -- Comentário do IF. Para comentar em blocos se utiliza --[[ Bloco a ser comentado ]] Tentem manter ao máximo a pratica de comentar oque cada função faz, variáveis e etc, assim fica mais fácil para você se encontrar no código, e para quem estiver trabalhando junto com você no código. Desenvolvimento & Identação Sempre que forem programar tente manter em mente que seu código deve ser: 1. Simples - Deve ser de fácil compreensão; 2. Direto - Deve executar aquilo que é proposto, sem rodeios, e sem funções desnecessárias e sem utilidade; 3. Organizado - Deve seguir uma ordem de organização (mais a baixo vou exemplificar uma organização.) 4. Sem duplicidade - não faz o que outra parte do código já faz; 5. Elegante e Único - Seu código deve ser algo que você se orgulhe de ter feito, que seja elegante, e funcional e que principalmente seja seu. Um dos pilares para organização do código e para facilitar a visualização do mesmo, seria a utilização de uma boa identação, como por exemplo: Código sem identação: addEventHandler( "onPlayerWasted", getRootElement( ),function() setTimer( spawnPlayer, 2000, 1, source, 0, 0, 3 ) end) Mesmo ainda sendo legível o exemplo básico de código logo acima, se ele for identado fica melhor a compreensão do mesmo. Código Identado: addEventHandler( "onPlayerWasted", getRootElement( ), function() setTimer( spawnPlayer, 2000, 1, source, 0, 0, 3 ) end) Pode parecer algo besta, só alguns tabs para organização, mas em um código com mais de 300 linhas, isso faz muita diferença. **Só para lembrar, Lua não necessariamente precisa de identação já que tem then/do e etc, mesmo assim é uma boa pratica.** Nome de Variáveis e Outras boas Praticas Outra boa pratica de programação é a forma como se nomeia as variáveis e funções, não há uma regra definidas mas existem padrões em outras linguagens para facilitar a leitura, por exemplo: Variáveis se escrevem com nome_nome = valor Funções se escrevem com nome_nome() Eu recomendo que nomeiem as funções dessa forma ou nomeNome = valor; nomeNome(); Além disso recomendo que sempre utilizem nomes que façam sentido por exemplo: local nomeJogador = getPlayerName(source) -- Vou explicar quando usar Source/Player/thePlayer na parte de Script. Caso fosse uma função poderia ser obterNomeJogador() ou obter_nomeJogador(), o importante é que seja legível e você consiga identificar oque ela faz. Alguns podem se perguntar, porque não utilizar tudo minúsculo e junto, bom quando você começa a trabalhar com letras iguais isso se torna um problema por exemplo: local casaamarela = x, y, z Nesse caso seria recomendável uma separação, por padrão eu sugerido que sempre usem minusco e _ dessa forma casa_amarela = x, y, z; Assim mesmo que as letras sejam iguais, você não teria que se preocupar com descobrir oque aquele variável faz. Um pratica que eu não recomendo de forma alguma é abreviação ou o uso de letras por exemplo: local obter_nomeJogador() Que passaria a ser local onj() Para você que esta programando pode fazer o maior sentido agora, mas para outras pessoas ficam muito confuso, além de que você pode se esquecer ou nomear funções com as mesmas letras mais a frente no código, oque geraria conflito com a informação. Outra boa pratica de programação seria a de utilização de parênteses () em verificações, eu pessoalmente não me atenho muito a isso, porem facilita muito a vida de quem esta começando exemplo: local x = 10; local y = 50; if x < y then Passaria a ser: if (x < y) then Essa pratica torna a condição muito mais visível, e facilita o entendimento da verificação. ** Porem no caso de Lua assim como o ; ao final das var não é de uso obrigatório, outras linguagens podem ser.** Loops e Condicionais Como foi explicado no post passado, os loops e condicionais são muito uteis e fazem grande parte da programação, porque querendo ou não, temos que verificar coisas, e agir de acordo com elas. Tendo isso em mente, vou dar uma dica básica, evite chamar funções em loops ou condicionais complexas, principalmente em loops. Oque acontece aqui é que mesmo um while/repeat executa varias vezes um mesmo bloco de código, até prover uma condição favorável a saída, e isso pode parecer Simples, mas imagine você chamando 10,20 ou 30 vezes uma mesma função, que atribui valores locais na memoria, e executa. Em Lua isso não se torna um problema muito grande, mas em outras,linguagens como C ou mesmo JS isso pode causar um crash na aplicação muito fácil, então para evitarmos que esses problemas possam acontecer, evitem ao máximo chamar funções dentro de l ops ou condições complexas. Negações no IF Outra pratica que e interessante se evitar, é utilizar as condicionais no negativo, por exemplo o if not. Lembre-se que uma condição, só é executada quando a condição se torna verdadeira, e um if not é uma negativa verdadeira, parece algo besta, mas você poderia lidar com ela no else, isso é mais uma recomendação mesmo, trate as verificações sempre como produtos verdadeiros e lide com os negativos no processo, não faça uma negativa verdadeira. Organização de Código No começo do código, geralmente é recomendável a importação de bibliotecas, funções externas, e etc. Depois a atribuição de variáveis globais se necessário. Podem seguir esse modelo básico: Variáveis globais e Datas; Objetos e Afins; Funções e Condicionais; Exports e Imports; Handles e eventos. Pode parecer meio confuso agora, mas quando chegarmos na parte de Script de MTA, vamos seguir essa organização e garanto que tudo vai ficar mais fácil. Como esse post trata de praticas de programação, eu recomendo que você retorne em seus códigos antigos e tentem refazer eles utilizando essas técnicas, e organizar o seu código da melhor maneira possível. O único exercício que eu vou deixar aqui, é que vocês tentem diminuir a quantidade de linhas nos seus código antigos, sem perder funcionalidade. Caso queiram, podem postar o código nesse tópico, e caso tenham alguma duvida, deixem logo a baixo. Só lembrando ao pessoal que já entende do assunto, ou pelo menos sabe o básico, vamos ajudar quem esta começando, todo mundo começou sem saber quase nada. Parte 04:
  45. 6 points
    Post Anterior: Eai pessoal tudo bom? Continuando o Curso básico, hoje vamos falar sobre Condicionais, Iteração e Variáveis: Para vocês irem se familiarizando eu vou começar a utilizar trechos de código em Lua. Nos exemplos anteriores além de utilizamos apenas linguagem padrão, e portugol, nos utilizamos apenas execuções sequenciais, ou seja, o algoritmo poderia apenas executar uma vez, e em uma sequencia, da linha 01 até a última, mesmo com o exemplo básico de verificação que nos fizemos, ainda sim, era uma execução sequencial. Para mudar isso, vou apresentar a vocês os principais condicionais e como utilizar o mesmo, e uma breve explicação sobre variáveis. Vamos começar pelas variáveis que são mais simples em grande parte. Diferente de outras linguagem as variáveis de Lua não são de tipo fixo, elas podem receber qualquer tipo de valor, as mesmo assim, elas respeitam a logica de combinação como por exemplo: local nome = "Dev" -- Atribuímos a um espaço de memoria o valor "Dev" e nomeamos esse espaço como "nome". local numero = 1 -- Atribuímos a um espaço de memoria o valor "1" e nomeamos esse espaço como "numero". Se fossemos utilizar outra linguagem, como C por exemplo, nos teríamos que definir o tipo de variavel, por exemplo: char nome = "dev"; int numero = 1; Em C no caso nós devemos nos prender a sintaxe padrão, e a utilização dos tipos: Sintaxe: <tipo> <nome_da_variável> ; int: armazena valores numéricos inteiros. char: armazena caracteres. float: armazena números com ponto flutuante (reais) com precisão simples. double: armazena números com ponto flutuante, com precisão dupla, ou seja normalmente possui o dobro da capacidade de uma variável do tipo float. E os principais tipos de dados seriam: Inteiro: armazena números inteiros Real: armazena números com casas decimais, são as variáveis de ponto flutuante; No caso de Lua essa lógica ainda existe. E ainda podemos armazenar dados do tipo Boolean (true/false) & nil. Como vocês puderam perceber as variáveis em Lua, funcionam de uma maneira muito pratica, porque você simples insere o valor nela, e automaticamente, ela entende o tipo e organiza a memoria dessa forma. Tendo isso em mente, vamos a algum exemplos básicos. Iguais combinam com iguais. Isso significa que se eu puxar a minha variável dev e a variável numero, e tentar unir as duas vai retornar um erro, pelo fato do tipo das duas serem diferentes. Imagem ilustratva: https://imgur.com/a/n0u9pL5 Para executar o print(dev + numero), teríamos que modificar o valor de numero para uma string. Com a utilização de tostring(numero); Para mudar o tipo de inteiro para string. Prestem atenção nisso, porque um numero pode ser um string por exemplo local numero = "1"; no caso esse 1 seria uma string e não um numero, oque impossibilitaria operações matemáticas com o mesmo. Nesse caso também poderia usar o tonumber(numero); para mudar o tipo. Caso tenham duvida sobre o valor de uma variável podem utilizar type(var); para saber qual tipo ela seria, por exemplo: local num = 1; --> Number/Integer local nam = "2"; --> String local status = false --> Boolean Caso desse um print(type(var)); e cada uma dessas receberia os valores citados acima. Caso você tente utilizar em uma var que não foi atribuída ira retornar o valor nil que significa que não há nada ali, não tem memoria atribuída nem valor a essa var. Condicionais Iniciando em condicionais vamos começar pela mais usada e básica de todas o if. O if funciona da seguinte maneira: if expressão_lógica then -- bloco de comandos end **Lembrando, o IF deve sempre ser fechado com o END, não se esqueçam disso.** Se ficar mais facil pode-se ler if como SE, então ficaria da seguinte forma SE expressão_lógica ENTÂO. Agora oque seria essa expressão lógica? Essa é a verificação que deve ser executada antes de se dar continuidade ao código, no nosso exemplo em linguagem padrão nos utilizamos o SE o relógio marcar = 6:30 ENTÂO, no caso a expressão_lógica será relógio marcar = 6:30 que só poderia retornar true ou false, no caso de uma verificação o valor true é sempre tido como condição principal a não ser que você exemplifique o contrario por exemplo: local nome = "dev"; if nome then -- código end A verificação aqui é simples, SE existir nome ENTÂO. Porque a condição é true, agora eu poderia usar: local nome = "dev"; if not nome then -- código end A verificação aqui é ao contrario da anterior, no estamos utilização a condição not como negação a existência da var então ficaria SE NÂO existir nome ENTÂO. Para vocês terem uma ideia melhor das expressão_lógicas vamos listar cada uma delas: Igual a | == | -- Verifica se os valores são iguais. Diferente de | ~= | -- Verifica se os valores são diferentes. Maior que | > | -- Verifica se o 1 valor é maior que o 2. Menor que | < | -- Verifica se o 1 valor é menor que o 2. Maior ou igual a | >= | -- Verifica se o 1 valor é maior OU igual ao 2. Menor ou igual a | <= | -- Verifica se o 1 valor é menor OU igual ao 2. As principais são true e false, exemplos: local x = 10; local y = 50; if x == y then -- Aqui estamos verificando se X é igual a Y, oque obviamente é uma mentira então o retorno será false, e o código abaixo não será executado. if x > y then -- Aqui também estamos em uma verificação False, portanto o código não ira executar, porem se usarmos not if not x > y then -- Aqui no caso o retorno é verdadeiro, então o código abaixo ira executar. Outro tipo de condição que nos podemos usar são os de concatenação: Conjunção | and | -- Verifica se duas ou mais condições são atendidas. Disjunção | or | -- Verifica se uma ou qualquer outra condição é atendida. Negação | not | -- Verifica se alguma condição não é atendida. Alguns exemplos: local x = 10; local y = 50; local nome = "dev"; local status = true; if nome == "dev" and status == true then -- Aqui verificamos se a var nome possui o valor "dev", e se a var status possui true, caso ambas sejam atendidas, o código executa. if status == false or x < y then -- Aqui estamos verificando se alguma das condições são verdadeiras, no caso o x é < que o y então o código executa. if not status == true or x > y or type(nome) == string then -- Aqui estamos passando mais de uma verificação com o OR e caso alguma delas seja verdadeira o código ira executar. Com essa regras básica em mente, eu sugiro que vocês, façam códigos simples utilizando esses conceitos para gravarem eles melhor. Continuando a falar sobre o if. O if ainda possui uma condição negativa por padrão que é chamada de else, da seguinte forma: if expressão_lógica then -- Bloco de comandos else -- Bloco de comandos end Dessa vez no fazemos uma verificação e caso ela não seja atendida nos executando outro bloco de código por exemplo: local x = 10; local y = 50; if x > y then print('X é maior que Y') else print('X é menor que Y') end Nesse caso nossa verificação não ira retornar true porque x não é maior que y, então o bloco 1 do código não será executado, porem com o else, o bloco dois será. Ainda no IF no temos o elseif que é uma segunda condicional dentro da primeira por exemplo: local x = 10; local y = 50; if x > y then print('X é maior que Y') else print('X é menor que Y') end Nesse caso nossa verificação não ira retornar true porque x não é maior que y, então o bloco 1 do código não será executado, porem com o else, o bloco dois será. Ainda no IF no temos o elseif que é uma segunda condicional dentro da primeira por exemplo: local x == 10; local y == 50; if x > y then -- bloco 1 elseif x < y then -- bloco 2 else -- bloco 3 end Nesse caso a primeira verificação é falsa, então a sequencia continua, a segunda verificação retorna true e então é executada, caso nenhuma das duas seja true, seria executado o bloco 3 do else. ** Lembrando o elseif sempre vem ante do else, e não tem limite de uso, apesar de não ser uma boa pratica de programação, enfiar um monte de if/elseif no código.** Iterações As iterações são estruturas de repetição, elas são o for / while e repeat. Vamos começar pelo while e repeat que são bem semelhantes: a sintaxe do while consiste em: while condição do -- código end Seguindo essa lógica a condição de entrada em um loop de while é definida antes do inicio. Para ficar mais simples pode-se ler while como: ENQUANTO condição FAÇA -- código FIM Vamos ao exemplo: local x = 1; local y = 10; while x < y do x = x + 1 end Nesse caso estamos executando um loop, da seguinte forma: ENQUANTO x for menor que Y FAÇA PEGUE x e Adicione X + 1 FIM Caso a gente desse um print(x) nesse caso a saida seria: 1 2 3 ... Até o 10. Ou seja o while significa **repita tal ação até que a condição seja verdadeira.** o repeat funciona semelhante ao while porem a condição de saida/verificação é posta no final, com a seguinte sintaxe: repeat -- bloco de código until(condição) Vamos usar o mesmo exemplo acima: local x = 1; local y = 10; repeat print(x) x = x + 1 until(x == y) O for pode ser ler PARA valor, max/min incremento FAÇA, a diferença do for para o while/repeat é que o for você tem um numero máximo e mínimo de execuções, que deve ser definidas no inicio da condicional por exemplo: for i=1, 10, 1 do print(i) end Aqui vamos ir do 1 ao 10 somando sempre 1 ao numero anterior, com uma saída de 1,2,3,4,5..10. Poderíamos utilizar 2, 3, -1 e qual numero quiséssemos no acréscimo Dentro de variáveis ainda temos os Arrays (tabelas), mas vou deixar para explicar depois de funções, já que tabelas em luas são bem extensas e com muitas funcionalidades. Exercícios 1. Faça um programa que verifique as medias dos alunos, em 2 cursos, e retorne aprovado ou reprovado baseado em média geral superior a 5. 2. Faça um programa que se repete até uma condição numérica retorne verdadeira, condição essa superior a 10. 3. Faça um programa que imprima na tela, tipos de variáveis utilizando um for. 4. Faça um programa que muda o tipo de variáveis e imprima elas. 5. Faça um programa que leia oque o usuário digitou e retorne na tela. Site que podem ser Uteis: https://www.Lua.org/portugues.html https://www.tutorialspoint.com/Lua/index.htm Caso queiram, podem postar o código nesse tópico, e caso tenham alguma duvida, deixem logo a baixo. Só lembrando ao pessoal que já entende do assunto, ou pelo menos sabe o básico, vamos ajudar quem ta começando, todo mundo começou sem saber quase nada. Parte 03:
  46. 6 points
    - طابت أوقاتكم أخواني الأعزاء - يسعدني و يسرني أن أقدم لكم مجموعة سيرفرات شبكة فينكس تعريف عن الشبكة شبكة فينكس هي شبكة نشأت هذا العام و بداية نشأتها كانت في سيرفر تيم سبيك يجمع لاعبين من جميع الألعاب , حيث أنه يوجد في سيرفر التيم سبيك فوق ال100 عضو , و أيضاً هذه الشبكة تدعم بعض الألعاب مثل MineCraft , GTA FiveM و MTA SA التابعة لشبكة فينكس MTA حيث أنه يوجد طاقم مخصص حالياً لبرمجة سيرفرات و هذا الطاقم مكون من مبرمجين و مصممين و إداريين ذوي كفائة عالية في اللعبة مما يساهم في تقديم كل شيء يساعد اللاعبين على الاستمتاع في السيرفر التابعة لشبكة فينكس MTA سيرفرات < هجولة > < حرب عصابات > < زومبي > < ريس > التابعة لشبكة فينكس MTA طاقم سيرفرات @DRRB-3 @[Anon]SaRaB11 @wSky @#Moha @Mr3b المبرمجين المشاركين @NX_CI @Abdul KariM @[T]|O|[P]George مصممين (مابات , اوبجكتات و صور) @KasaNoVa @MR.Saleh[Tito] @#-DR-[M]AN- @wSky طبعاً الحين شغالين بالمودات و التصاميم و بنزل لكم التحديثات كل فترة و بنعلن لكم متى افتتاح كل سيرفر تشرفونا و تنورونا بزيارتكم بنزل لكم كل جديد و التحديثات الي شغالين عليها ~ ترقبوا الإفتتاح ~ TeamSpeak Fenix Server [ ts.fx-n.net ]
  47. 6 points
    Introduction A collision model is used by the game to understand the impact between two entities to then calculate physics. These models are physical based, opposed to game models which are visual based. A collision model can generate particles when interacted with by being assigned surface materials. This guide is 3D modeling based and does not cover any procedures that require scripting. Table of Contents Importing collision models from the base game Patching and correcting default game collisions Primitives and why they're beneficial General limitations Surface materials Volumetric shadows Vehicle collisions Importing collision models from the base game Collision files from the base game are stored in large collision archives. These archives have the ability to stores numerous collision files, although custom archives aren't compatible with MTA. In order to find these files, it is recommended to have extracted all game models. Reading the section Extracting game assets on this thread is necessary as a first step. The best way of getting the name and location of an object's collision is using SAMP Editor. Simply double clicking the object shows the name of the collision and which .col it's stored inside. It's possible to have an instance of MTA running and then open SAMP Editor, by having a separate gta sa installation specifically for SAMP Editor. Collision files are named according to their area in the map, where lae_1 is Los Santos East part 1. Although SAMP Editor option is often better, Prineside also offers a way of getting to know the collision name. Clicking any object on Prineside shows its IDE name (item definition) which is the same name used for the collision file. For instance, ID 16003 drvin_ticket belongs in countn2.ide - this means that its collision is stored in countn2_1-20.col (has 20 files from that area). Finding which one contains collision-model drvin_ticket is like finding the needle in a haystack. Using Steve M's Collision Editor may speed up the process of finding the file containing the collision model. Using collisions from the base game and then modifying can be beneficial as they're often very optimised, and uses a lot more materials for both material brightness and various different surface properties. Such results may take a lot longer than one wishes to spend on a collision. Most collision models comes with primitives which are great to use and is explained in next part. Patching and correcting default game collisions Mappers might often enough come across of furniture objects which pivots around empty air rather than the corner or center of mass. Rockstar did this a lot, especially for beds. As if this wasn't the only issue, Rockstar actually added several broken collisions to the game leading to blue hell (void). These can be patched by 3D modelers. To get started with patching a broken collision model, find and load in vegasw_4.col to 3ds Max by following the above part of the guide. Scroll through and locate downvgnbild1 and import said collision. The problem with downvgnbild1's collision is that the store windows can be climbed over, as the ceiling and walls are nor solid. Every Default's are primitives - that is spheres or boxes. They can be adjusted in height, width, length and radius as well as segments. In this case, from bottom, number 4 and number 5 Default are models that represents the store windows - which are the ones causing the glitch. What exactly causes the glitch? The collision primitives representing the store windows are not tall enough to cover the walls, which essentially means anything can sneak through the gaps. From bottom to top, the 4th Default needs be raised in Z from a value of 3,8659m to 7,2524m. Exact same procedure needs be done for 5th Default. Now the collision is solid in every way, preventing characters from climbing in behind the store windows. To export this collision, follow below steps. Open COL IO. Where it says Export Setting ensure COL3 is highlighted. This is required for GTA SA collisions. The collision contains a collision mesh named CM_downvgnbild1. This must be registered as mesh by clicking the button Collision Mesh and then clicking the CM_downvgnbild1. Same procedure for Shadow Mesh if it has any (this doesn't). The Collision Mesh button should now read as CM_downvgnbild1. In the scene, select everything that's part of the collision. On COL IO there's a text field above the button Export. Here the collision model's name can be defined. Just name it downvgnbild1. Hit Export and find a place to save it. The file can be named anything the user likes. Primitives and why they're beneficial Most 3D applications has a library of basic 3D models; primitives. They are common shapes which on creation can have their quality modified and then remodeled afterwards. For GTA San Andreas, collisions support Box and Sphere as collision primitives. Primitives costs a lot less in terms of file sizes, as example, the below sphere's collision model would be 10.4 kb with collision mesh sphere, and 140 bytes with collision primitive sphere - both collision results are equal. Tall buildings with lots of details e.g support beams tend to use collision primitives as otherwise the collision would sky rocket in file size and polyrates. Some warehouses even use primitives for their gates, exterior fences and walls, while the more complex base models requires a collision mesh. Primitives are named 'Default', though, on export they can be named anything. General limitations Collision models has certain limits which may explain crashes and strange behavior of models. Collision models can be a maximum of 512 height, 512 width and 512 length. In short, a 512 radius sphere or cube would reach the dimensions limit. Polygon rates of collision meshes (not to be confused with primitives!) should reach no more than 3000. In cases of such high rates, the modeler should either split into multiple files or optimise the mesh further. A collision file can contain up to 65535 spheres, boxes and faces. Collision archives are not supported in MTA unlike in GTA. There are cases where invisible collisions appear even after following the rules of thumb for exporting collisions. Isolated edges and vertices can be contributors to invisible collision walls. For reproduction steps follow this Discord channel link to MTA discord. Surface materials GTA SA engine uses materials for collisions. These materials define what type of surface that the model represents. Kam's COL MTL has 179 ID's. Ranging from tarmac, destroyed tarmac, dry mud, wet mud to sea floor and grass. These surface properties generate sound fx and particle fx when walked, driven or shot upon. Collision material also has brightness setting, where 0 is dark and 150+ is bright. Entities affected by this setting are peds and vehicles. The below spoiler contains a list of all surface materials and their ID's. Volumetric shadows World objects and vehicles are able to cast shadows - dynamic ones. These are meshes stored inside the collision file. Generally the shadow mesh should be slightly smaller than the game mesh, as otherwise it'll glitch on the corners of the model. The setting to display shadows are found in MTA video settings. Vehicle collisions Where world objects uses separate .col files, vehicles require their collisions to be embedded or baked in the DFF. These collision models consists of mostly spheres but may also be found to contain boxes and of course their collision mesh (prefixed CM_vehicleName). The collisions use spheres due to the engine's ease of calculating physics with those primitives. They are named that of the material Brightness/Part section, e.g Boot or Rear bumper. Ones that are not used by vehicle components are named Default. In below screenshot, the white lines represents the collision mesh of a Tornado. Usually the collision meshes will suffice with 12 faces total for the hood, windshields, roof, boot and bottom.
  48. 6 points
    Events tutorial The reason why I created this topic, is that a lot of people are struckeling with them. In this tutorial I will only discus the very basic of them. If you want more, then there is a list of links at the end with more information. If I made any mistakes in the code, please let me know because I am not going to test every part. What are events? (basic description) Events are something custom added by MTA to make it easier to bring scripting(Lua) closer to our game. If we do not have events, then the only thing we can do is give instructions to our game. But our code will never detect changes in our game. The same question again: "So what are the events?" Events are a way to communicate changes in our game to our scripts (or from our scripts). So for example my little ped(cat) gets ran over by a car. Then I really want to know about that, don't I? When an event activates, I describe this as: triggered (from the word trigger) Full wiki information can be found here: Event_system Before we can use events, what do we need to know? There are two things we need to know: The reason why it is triggered. <What happens?/when something happens?> In MTA this is the eventName of the event. (Example: you <ran over> my ped) Who is the one using the event? The event system in MTA is using elements as base (baseElement). This makes it easier to combine the what/when happens? with the one who is related to it. In MTA this is the source of the event. (Example: you ran over my <ped>) Trigger an event A scripting example: (this is not an official event) local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped triggerEvent("onPedRanOver", ped) In this example, a custom event gets triggered to tell you that my new created ped has been ranOver. The eventName is "onPedRanOver" and the baseElement is ped. local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) In this SERVERSIDE example, I am also adding an extra argument drunkDriver to use the player that ran over the ped. This is not required, but it makes it more complete. See syntax. Syntax bool triggerEvent ( string eventName, element baseElement, [ var argument1, ... ] ) TriggerEvent Receiving triggers Receiving triggers is a bit more complicated, because there are a lot of options for it. You can receive events by listening to them. It is like: You know that something is going to happen but you do not know when. The first step that you have to take is related to this question: "Do I want to receive a custom or not custom event?" Custom events are self created events. They only exist when a scripter makes them. Two lists of NOT CUSTOM EVENTS but default MTA events, serverside and clientside: Server_Scripting_Events Client_Scripting_Events Do I want to receive a CUSTOM event? In case of a custom event, you have to register/enable it first. If you do not enable it and trigger it, you will receive a warning/error about that in your debug console. Syntax bool addEvent ( string eventName [, bool allowRemoteTrigger = false ] ) AddEvent The example below, shows you how to enable a custom event only for trigger events within the same server/client side. addEvent("eventName") -- Is the same as: addEvent("eventName", false) If you put the second argument to false or not fill it in, this means that you can't communicate from the other server/client-side. This option is most likely used for security reasons. Some events shouldn't be able to trigger by the other side For example, worst case scenario: (remote events enabled for a default MTA event) Serverside code: addEvent("onPlayerWasted", true) Clientside code: triggerServerEvent("onPlayerWasted", player, 0, localPlayer, 0, 9, false) OnPlayerWasted If this event is enabled for remote trigger events, then it might be possible to cheating kills/deaths score. Of course, it is not likely that players can run their own clientside code, but it is not impossible in case of not trust able community resources. Enable a custom event for trigger events that crossing sides (From clientside to serverside. From serverside to clientside). addEvent("eventName", true) This event can now be used by remote trigger event functions. See list: Client to server TriggerClientEvent TriggerLatentClientEvent Server to client TriggerServerEvent TriggerLatentServerEvent Enable the event from our previous example: addEvent("onPedRanOver", false) local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) If you do not use cross triggering, then I recommend to use the addEvent function in the same resource as where you are going to trigger from. This makes sure that the event is already added and that you will never receive this kind of error/warning "Event isn't added". If you put it in another resource which hasn't started yet, then after triggering you would still receive that error/warning. Start listening The next step is to add the addEventHandler. This function is used to listen to events. When an event is triggered, this handler(addEventHandler) will call the function you have attached to it, in MTA this function is called the handlerFunction. Syntax bool addEventHandler ( string eventName, element attachedTo, function handlerFunction [, bool getPropagated = true, string priority = "normal" ] ) AddEventHandler Resource 1 addEvent("onPedRanOver", false) local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) Resource 2 function handlerFunction () end addEventHandler("onPedRanOver", root, handlerFunction) The first 3 arguments, the require ones: eventName attachedTo handlerFunction Making sure that the addEventHandler options are correct set-up. Resource 1 addEvent("onPedRanOver", false) local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) Resource 2 function handlerFunction () end addEventHandler("onPedRanOver", root, handlerFunction) There are two conditions for an eventHandler to call the handlerFunction. 1. The event has to be exactly the same. In this case the event "onPedRanOver" is the same in both resources. 2. In both functions, triggerEvent and addEventHandler is an element being used. This element has to be exactly the same. (from where you trigger as well as where you receive) <OR> The triggered element from resource 1, has to be a CHILD of the element in resource 2. The root element is the very top layer of the MTA element structure. It will accept all elements you want to use for your events. See the element tree: If you do not understand the element tree please read this page: Element_tree Source variable The source of an event is the element that triggers the event. This variable isn't passed as an parameter, but it is predefined. This means that it is already created before hand. Some predefined variables do only exist under special conditions. The source variable is one of those, it is a hidden and local variable which is only available when a function is called by an event. List of predefined variables. addEvent("onPedRanOver", false) -- local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) function handlerFunction (drunkDriver) iprint(source) -- ped element end addEventHandler("onPedRanOver", resourceRoot, handlerFunction) In this example the ped is the source. See how those two code blocks are connected: addEvent("onPedRanOver", false) -- local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) function handlerFunction (drunkDriver) iprint(source) -- ped element end addEventHandler("onPedRanOver", resourceRoot , handlerFunction) resourceRoot In some examples, you see people use the resourceRoot instead of the root element for their addEventHandlers. The resourceRoot is an element created by a resource. This element holds all elements of that resource as (in)direct children. In the example above, the resourceRoot as baseElement will not work, because there are two resources. Each resource has it's own resourceRoot element. The resourceRoot is accessible with the same keyword: resourceRoot, but if you were to inspect the element in multiple resources, then the user data (element identifier) value is not the same. outputChatBox(inspect(resourceRoot)) If we were to put everything in one resource, then it would work: 🎉 addEvent("onPedRanOver", false) -- function handlerFunction () end addEventHandler("onPedRanOver", resourceRoot, handlerFunction) -- local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) In case of remote triggering, the resourceRoot in serverside and clientside is considered the same.(As long as they are part of the same resource) Why/when would we use resourceRoot? 1. Limit eventHandlers to the resource elements If you have 1000 markers in your server. One of the resources is for example a trucker mission, where you can get money by hitting markers. The resourceRoot element will make sure that the onMarkerHit event will only trigger for markers created by that resource. addEventHandler("onMarkerHit", resourceRoot, function () -- source element is the marker end) OnMarkerHit 2. Another benefit is that you are able to re-use the same eventNames. Resource 1 addEvent("onPedRanOver", false) function handlerFunction () end addEventHandler("onPedRanOver", resourceRoot, handlerFunction) -- local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) Resource 2 addEvent("onPedRanOver", false) function handlerFunction () end addEventHandler("onPedRanOver", resourceRoot, handlerFunction) -- local ped = createPed( 120, 5540.6654, 1020.55122, 1240.545 ) -- my ped local drunkDriver = getRandomPlayer() triggerEvent("onPedRanOver", ped, drunkDriver) These two resources do use the same event, but will not trigger each other their addEventHandlers. Warning: If root was used, then they will!!!! ;@ Lets cross triggering with resourceRoot! Clientside triggerServerEvent("example", resourceRoot) Serverside addEvent("example", true) -- second argument is true! cross triggering enabled! addEventHandler("example", resourceRoot, function () end) getPropagated In this bigger example we will be talking about the option getPropagated. If this option is disabled, it will not detect children any more. Keep reading! After that start code scanning from A, to B and then to C. Syntax addEventHandler bool addEventHandler ( string eventName, element attachedTo, function handlerFunction [, bool getPropagated = true, string priority = "normal" ] ) Example: Clientside -- A triggerServerEvent("onClientPlayerLoaded", resourceRoot) -- trigger an event to serverside --------------------------------------- -- C addEvent("onResponseServer", true) -- first listener addEventHandler("onResponseServer", resourceRoot, function () outputChatBox("getPropagated enabled") end, true) -- getPropagated true by default. -- second listener addEventHandler("onResponseServer", resourceRoot, function () outputChatBox("getPropagated disabled") end, false) -- getPropagated is false. Serverside -- B addEvent("onClientPlayerLoaded", true) -- second argument is true! cross triggering enabled! addEventHandler("onClientPlayerLoaded", resourceRoot, function () --[[ client is a predefined variable, which represents the client/player that communicates with the server More information about predefined variables: https://forum.mtasa.com/topic/33407-list-of-predefined-variables/ ]] triggerClientEvent(client, "onResponseServer", resourceRoot) -- first trigger event local element = createElement("randomElement") -- making a randomElement triggerClientEvent(client, "onResponseServer", element) -- second trigger event end) How does this this code works? A. When a client his code has been started, it will execute a triggerServerEvent. (It doesn't wait for any other clientside files to be loaded) B. The server receives the event. And sends two triggerClientEvents back: The first one is using the resourceRoot as baseElement. The second one is using a randomElement as baseElement. Both are using the event "onResponseServer" C. There are two addEventHandlers listening to the event: "onResponseServer" The first one is using getPropagated and the second one is not using getPropagated. The randomElement that is created, is by default an indirect child of the resourceRoot of the same resource. What will happen? When firing the first trigger event, both listeners will call their handlerFunction. But when firing the second trigger event, only the first listener will call it's handlerFunction. The randomElement is an indirect child of resourceRoot, but because getPropagated is disabled it will not call it's handlerFunction. Other tutorials related to this one: See also this tutorial about deeper limiting event ranges within your resource and reducing addEventHandlers https://forum.mtasa.com/topic/100069-tut-addeventhandler-on-a-group-of-elements-small-tutorial/ More information Full wiki information: Event_system A list of more information about triggering events: (Client to client / server to server) TriggerEvent Client to server TriggerClientEvent TriggerLatentClientEvent Server to client TriggerServerEvent TriggerLatentServerEvent A list of more information about receiving events: AddEvent AddEventHandler RemoveEventHandler Two lists of MTA events, serverside and clientside: (warning: not custom events) Server_Scripting_Events Client_Scripting_Events Cancel events CancelEvent WasEventCancelled (warning: custom events ONLY) GetCancelReason (Server only) Cancel latent events and their status GetLatentEventHandles CancelLatentEvent GetLatentEventStatus
  49. 6 points
    سلام عليكم ورحمة الله آخخبااركم ان شاء الله طيبين ------------------------------------- في هذا الموضوع عندي مود الميني مسج يعني تقدر ترسل رساله لشخص محدد بمبلغ من المال ض2 لمعرفة كل شي عن المود في هذا الرابط / الفيديو وبالتـــوفييقء ~~  |~ الإهداءات ~| @!#DesTroyeR_,) @Kareem Amer @MrKAREEM @Mr.Falcon @DABL @KillerX @NX_CI @[AcM] - Major . @MR_Mahmoud @Ahmed Ly @MR.Mosa @N3xT @Abu-Solo @SuperX @#BrosS @iMr.WiFi..! @Mr.CnTroL @Abdul KariM @Hakan @!#NssoR_) @Simple. @Abdo Nour @MR-HERO و جميع أعضاء المنتدى
  50. 6 points
    سلام عليكم ورحمة الله آخخبااركم ان شاء الله طيبين ------------------------------------- في هذا الموضوع عندي مود التوجيه الاصدار الثاني ~~` لمعرفة كل شي عن المود في هذا الرابط / الفيديو وبالتـــوفييقء ~~  |~ الإهداءات ~| @!#DesTroyeR_,) @Kareem Amer @MrKAREEM @Mr.Falcon @DABL @KillerX @NX_CI @[AcM] - Major . @MR_Mahmoud @Ahmed Ly @MR.Mosa @N3xT @Abu-Solo @SuperX @#BrosS @iMr.WiFi..! @Mr.CnTroL @Abdul KariM @Hakan @!#NssoR_) @Simple. @Abdo Nour و جميع أعضاء المنتدى