Libraries

Sign in to follow this  

48 files

  1. Timer Bars 2

    Timer Bars 2 is a complete rewrite of my old Timer Bars resource. It's not backwards compatible, meaning you'll need to update your existing timerbar code if you want to switch to this resource.
     
    Changes
    Now requires RAGE Multiplayer 1.1.0 and above Now using offsets, sizes and logic from alexguirre's RAGENativeUI. It really is a great project and deserves some GitHub stars, check it out. OOP approach Probably a bit more efficient Definitely more pleasing to look at  
    Clientside API
    You can access the API by loading timerbars into a variable:
    const timerBarPool = require("timerbars");  
    timerbars/index.js exports these functions:
    // Adds timerbars into the internal timerbar pool. Values sent to this function must be an instance of TimerBarBase or they'll be ignored. add(...args); // Returns whether the internal timerbar pool has specified timerbar. has(timerBar); // Removes the specified timerbar from the internal timerbar pool. If you added the same timerbar multiple times, you'll need to use this function multiple times. remove(timerBar); // Empties the internal timerbar pool. clear();  
    Timer Bars
    TimerBarBase
    This is the base class for other timer bar classes, not really useful on its own since it just draws the title and background. You can inherit from this class to implement your own timer bar designs.
    /* Constructor */ new TimerBarBase(title); /* Properties */ // Title (left text) of the timer bar. Accepts and returns a string. title // Color of the timer bar's title. Accepts HUD color IDs or RGBA array, returns RGBA array. titleColor // Highlight color of the timer bar. Accepts HUD color IDs or RGBA array. Returns null if a highlight color isn't set and RGBA array otherwise. highlightColor /* Functions */ // Calls mp.game.gxt.reset on the internal GXT entries. Should be used if you're going to stop using a timer bar completely. resetGxt()  
    TextTimerBar
    This is the timer bar with a title and a text.
    /* Constructor */ new TextTimerBar(title, text); /* Properties */ // Inherited from TimerBarBase title titleColor highlightColor // Label (right text) of the timer bar. Accepts and returns a string. text // Color of the timer bar's label. Accepts HUD color IDs or RGBA array, returns RGBA array. textColor // Color of the timer bar's label and title, accepts HUD color IDs or RGBA array. No return value since it's just a setter. color /* Functions */ // Inherited from TimerBarBase resetGxt()  
    PlayerTimerBar
    This is the timer bar with a title and a text, except the title is styled to be like GTA Online's player name display.
    /* Constructor */ new PlayerTimerBar(title, text); /* Properties */ // Inherited from TimerBarBase title titleColor highlightColor // Inherited from TextTimerBar text textColor color /* Functions */ // Inherited from TimerBarBase resetGxt()  
    BarTimerBar
    This is the timer bar with a title and a progress bar.
    /* Constructor */ new BarTimerBar(title, progress); /* Properties */ // Inherited from TimerBarBase title titleColor highlightColor // Progress of the timer bar. Accepts and returns a number between 0.0 and 1.0. progress // Background color of the progress bar. Accepts HUD color IDs or RGBA array, returns RGBA array. backgroundColor // Foreground color of the progress bar. Accepts HUD color IDs or RGBA array, returns RGBA array. foregroundColor /* Functions */ // Inherited from TimerBarBase resetGxt()  
    CheckpointTimerBar
    This is the timer bar with a title and a bunch of circles.
    /* Constructor */ new CheckpointTimerBar(title, numCheckpoints); /* Static properties */ CheckpointTimerBar.state = { inProgress: 0, completed: 1, failed: 2 }; /* Properties */ // Inherited from TimerBarBase title titleColor highlightColor // The amount of checkpoints of the timer bar. Read only, returns a number. numCheckpoints // Color of the checkpoints with the state "completed". Accepts HUD color IDs or RGBA array, returns RGBA array. color // Color of the checkpoints with the state "inProgress". Accepts HUD color IDs or RGBA array, returns RGBA array. inProgressColor // Color of the checkpoints with the state "failed". Accepts HUD color IDs or RGBA array, returns RGBA array. failedColor /* Functions */ // Inherited from TimerBarBase resetGxt() // Sets a specified checkpoint's state, checkpoint indices start from 0 and go up to numCheckpoints - 1. Refer to static properties section for newState values. setCheckpointState(index, newState); // Sets all checkpoints state of the timer bar. Refer to static properties section for newState values. setAllCheckpointsState(newState); Check the wiki for HUD colors: https://wiki.rage.mp/index.php?title=Fonts_and_Colors#HUD_Colors
     
    Example
    Creating the timerbars in the screenshot:
    const timerBarPool = require("timerbars"); const TextTimerBar = require("timerbars/classes/TextTimerBar"); const PlayerTimerBar = require("timerbars/classes/PlayerTimerBar"); const BarTimerBar = require("timerbars/classes/BarTimerBar"); const CheckpointTimerBar = require("timerbars/classes/CheckpointTimerBar"); // Set up text bars const mapTimeBar = new TextTimerBar("MAP TIME", "00:08"); mapTimeBar.textColor = [224, 50, 50, 255]; // or 6 (HUD_COLOUR_RED) mapTimeBar.highlightColor = 8; // HUD_COLOUR_REDDARK const ksBar = new TextTimerBar("KILLSTREAK", "5"); // Set up progress bar const progressBar = new BarTimerBar("CAPTURING", 0.33); // Set up checkpoint bar const checkpointBar = new CheckpointTimerBar("BASES", 5); checkpointBar.color = 18; // HUD_COLOUR_GREEN, or [114, 204, 114, 255] for (let i = 0; i < 3; i++) { checkpointBar.setCheckpointState(i, CheckpointTimerBar.state.completed); } // Set up player bars const playerBars = [ new PlayerTimerBar("3rd: PlayerName3", "9 kills"), new PlayerTimerBar("2nd: PlayerName2", "12 kills"), new PlayerTimerBar("1st: AimbotNub", "30 kills") ]; playerBars.forEach((bar, index) => { bar.color = 107 + index; }); // Bars won't be drawn until they are in the timerBarPool, so press F6 to add them mp.keys.bind(0x75 /* F6 */, false, () => { timerBarPool.add(mapTimeBar, ksBar, progressBar, checkpointBar, ...playerBars); }); // ...and press F7 to clear the timerBarPool (or remove them individually with the timerBarPool.remove function) mp.keys.bind(0x76 /* F7 */, false, () => { timerBarPool.clear(); }); // Pressing F8 toggles a loading prompt, which makes the timerbars go up a bit mp.keys.bind(0x77 /* F8 */, false, () => { mp.game.gxt.set("TB_TEST_LOADING", "Preparing next map..."); if (!mp.game.invoke("0xD422FCC5F239A915") /* BUSYSPINNER_IS_ON */) { mp.game.ui.setLoadingPromptTextEntry("TB_TEST_LOADING"); mp.game.ui.showLoadingPrompt(1); } else { mp.game.invoke("0x10D373323E5B9C0D" /* BUSYSPINNER_OFF */); } }); Source code is available on GitHub in case you don't want to download: https://github.com/root-cause/ragemp-timerbars

    15 downloads

       (1 review)

    0 comments

    Updated

  2. [C#]RAGE:MP Discord Integration

    RAGEMP-DiscordIntegration
    This wrapper allows you easily create an instance of a discord bot within your RAGE:MP server.
    Features:
    1. Send messages to discord from your RAGE:MP Server.
    2. Send messages to your RAGE:MP Server from your Discord server.
    3. Register specific channel for the bot to listen. (Can be changed during runtime).
    3. Remove specific channel for the bot to STOP listening. (Can be changed during runtime).
    4. Update bot status on setup and/or during runtime
     
    How to use the wrapper
    1. Add the RAGEMP-DiscordIntegration.dll as a reference to your project in visual studio.
    2. Make sure to place the three provided Discord.Net.xx.dll into your server/runtime folder.
    3. Enjoy))))
    How to set up
    1. Create a new application on Discord Developers
    2. Create a bot.
    3. Invite bot to discord server.
    4. Use the token from your bot to initialize the bot as shown in the example below.
    5. Register/Remove channels from where your bot sends to all players.
    Example script.
    using GTANetworkAPI; using System; using System.Collections.Generic; using System.Text; public class Yes : Script { public Yes() { NAPI.Util.ConsoleOutput("Loaded: yes"); } [ServerEvent(Event.ResourceStart)] public void OnResourceStart() { Integration.DiscordIntegration.SetUpBotInstance("TOKEN_HERE", "RAGE:MP", Discord.ActivityType.Playing, Discord.UserStatus.DoNotDisturb); } [ServerEvent(Event.ChatMessage)] public async void OnChatMessage(Player player, string strMessage) { string strFormatted = $"[RAGE:MP] {player.Name}: {strMessage}"; await Integration.DiscordIntegration.SendMessage(3897429387492374, strFormatted, true).ConfigureAwait(true); } [Command("registerchannel")] public void RegisterDiscord(Player player, ulong discordChannelID) { bool bSuccess = Integration.DiscordIntegration.RegisterChannelForListenting(discordChannelID); player.SendChatMessage(bSuccess ? "Success" : "No Success"); } [Command("removechannel")] public void RemoveDiscordChannel(Player player, ulong discordChannelID) { bool bSuccess = Integration.DiscordIntegration.RemoveChannelFromListening(discordChannelID); player.SendChatMessage(bSuccess ? "Success" : "No Success"); } [Command("botstatus")] public async void UpdateBotStatusCommand(Player player, string gameName, Discord.ActivityType eActivityType, Discord.UserStatus eUserStatus) { await Integration.DiscordIntegration.UpdateBotStatus(gameName, eActivityType, eUserStatus).ConfigureAwait(true); } } Source code can be found on my github: https://github.com/JeremyEspresso/RAGEMP-DiscordIntegration

    Bugs or feature requests and what not. Just open an issue on the github and I will take a look soon™️.

    56 downloads

       (5 reviews)

    0 comments

    Updated

  3. Fake Pickups

    Requires RAGE Multiplayer 1.1.0 and above.
    This resource adds the ability to create classic GTA style pickups we all love.
     
    Installing
    Put the files you downloaded in their respective places Add require('fake-pickups') to client_packages/index.js All done  
    Serverside API
    Global mp object extension:
    // Properties /* Returns the amount of existing pickups. */ mp.fakePickups.length; // Functions /* Creates a pickup. * model - Model name or hash, such as prop_armour_pickup. * position - Position of the pickup, recommended: mp.Vector3 instance * pickupRange - Collection range of the pickup. * respawnTime - Respawn time of the pickup after collection, values less than 1 will disable respawning of the pickup. * dimension - Dimension of the pickup. */ mp.fakePickups.new(model, position, pickupRange, respawnTime, dimension = 0); /* Returns the pickup instance with specified ID. */ mp.fakePickups.at(id); /* Returns whether a pickup with specified ID exists. */ mp.fakePickups.exists(id); /* Returns an array of existing pickups. */ mp.fakePickups.toArray();  
    FakePickup class:
    // Properties /* ID of the pickup, read only. */ instance.id; /* Model hash of the pickup, read only. */ instance.model; /* Position of the pickup, read only. */ instance.position; /* Collection range of the pickup, read only. */ instance.pickupRange; /* Respawn time of the pickup, can be changed. */ instance.respawnTime; /* Light data of the pickup, read only. */ instance.lightData; /* Whether the pickup is collected, read only. */ instance.isCollected; /* Dimension of the pickup, can be changed. */ instance.dimension; // Functions /* Allows you to set light data of the pickup, argument names should be obvious. If you want to remove the pickup's light, use resetLightData instead of this function with weird values. */ instance.setLightData(red, green, blue, range, intensity, shadow); /* Resets light data of the pickup. */ instance.resetLightData(); /* Respawns the pickup. (if collected) */ instance.respawn(); /* Destroys the pickup. */ instance.destroy();  
    Events:
    /* fakePickupSpawn is called when a pickup's prop is created. (Basically when it's created and respawned) */ mp.events.add("fakePickupSpawn", (pickup) => { // code here }); /* playerCollectFakePickup is called when a player collects a pickup. This event is cancelable. (Check example script) */ mp.events.add("playerCollectFakePickup", (player, pickup, cancel) => { // code here });  
    Example Script
    // setLightData calls are optional and you don't have to use them, just makes the pickups stand out at night time. const moneyPickup = mp.fakePickups.new("ex_prop_exec_cashpile", new mp.Vector3(1571.681, 3163.909, 40.331), 1.0, 5000); moneyPickup.setLightData(114, 204, 114, 2.0, 2.5, 15.0); const healthPickup = mp.fakePickups.new("prop_ld_health_pack", new mp.Vector3(1568.648, 3166.397, 40.331), 1.0, 5000); healthPickup.setLightData(53, 154, 71, 2.0, 2.5, 15.0); const armorPickup = mp.fakePickups.new("prop_armour_pickup", new mp.Vector3(1567.359, 3169.639, 40.331), 1.0, 5000); armorPickup.setLightData(93, 182, 229, 2.0, 2.5, 15.0); const weaponPickup = mp.fakePickups.new("w_mg_combatmg", new mp.Vector3(1569.465, 3172.773, 40.331), 1.0, 5000); weaponPickup.setLightData(255, 133, 85, 2.0, 2.5, 15.0); // You're better off using custom properties with your pickup instance, this code is for testing purposes. mp.events.add("playerCollectFakePickup", (player, pickup, cancel) => { if (pickup === moneyPickup) { player.outputChatBox("You picked up some money."); } else if (pickup === healthPickup) { if (player.health >= 75) { player.outputChatBox("You're just fine, no need to waste a health pack."); // Doing cancel.cancel = true; prevents the pickup from being marked as collected. cancel.cancel = true; return; } player.health = 100; player.outputChatBox("Health refilled."); } else if (pickup === armorPickup) { if (player.armour > 0) { player.outputChatBox("You already have armor."); // Doing cancel.cancel = true; prevents the pickup from being marked as collected. cancel.cancel = true; return; } player.armour = 100; player.outputChatBox("You picked up some armor."); } else if (pickup === weaponPickup) { player.giveWeapon(mp.joaat("weapon_combatmg"), 9999); player.outputChatBox("You picked up Combat MG."); } }); mp.events.add("fakePickupSpawn", (pickup) => { switch (pickup.model) { case mp.joaat("ex_prop_exec_cashpile"): mp.players.broadcast("The money pickup has respawned."); break; case mp.joaat("prop_ld_health_pack"): mp.players.broadcast("The health pickup has respawned."); break; case mp.joaat("prop_armour_pickup"): mp.players.broadcast("The body armor pickup has respawned."); break; case mp.joaat("w_mg_combatmg"): mp.players.broadcast("The Combat MG pickup has respawned."); break; } });  
    Source code is available on GitHub in case you don't want to download: https://github.com/root-cause/ragemp-fake-pickups

    48 downloads

       (5 reviews)

    0 comments

    Updated

  4. DavWebCreator

    DavWebCreator
    DavWebCreator is a C# class 'library' which provides you the possibility to generate HTML structures with according styles and logic behind each element.
    There are already plenty of examples online here: https://DavWebCreator.com
    But anyway I will provide you here at least one example 🙂
    Compatible with 1.1.0.0
     
    If you want to report a bug or just want some help join my discord: https://discord.gg/JYNDrSh
     
    Preview

     
    Code behind:
    [Command("yesno")] public void YesNoDialogExample(Client player) { // Generate the Browser Browser browser = new Browser("YesNoDialog", BrowserType.Custom, BrowserContentAlign.Center, "520px", "100%"); // Create the dialog. (Most of the elements will get a default value) var yesNoDialog = browser.GetYesNoDialog("YES_NO_EXAMPLE", "Character Deletion", "WARNING", "Do you really want to delete your character?", "Yes", "No"); // Customize for example the font size and the margin. yesNoDialog.Card.ContentTitle.FontSize = "30px"; yesNoDialog.Card.Margin = "33% 0 0 0"; // Add to the browser browser.AddYesNoDialog(yesNoDialog); // Finally open the browser for the desire player. browser.OpenBrowser(player); } //This event will be called when a button was clicked. [RemoteEvent("YES_NO_EXAMPLE")] public void YesNoExample(Client player, params object[] args) { if (args == null) return; // This is just a list of reponses. (You can bind for example 3 textboxes to a button and when someone click on that button, all 3 binded textboxes will be in the response, with their hidden values. List<BrowserEventResponse> responses = JsonConvert.DeserializeObject<List<BrowserEventResponse>>(args[0].ToString()); // For some reason we know that a YesNoDialog only gives you one response, because only the clicked button will be returned. BrowserEventResponse buttonResponse = responses[0]; player.SendChatMessage(buttonResponse.Value + " Clicked"); player.SendChatMessage(buttonResponse.HiddenValue + " This is our secret hidden value. e.g. some id"); // Close the browser player.TriggerEvent("CLOSE_BROWSER"); // Do stuff }  
    Installation
    Download the .rar Open the "DavWebCreator_Installation.rar" and open the directory called "DavWebCreator_GetStarted". Open the directory "Server Resources" and Copy and paste the directory "DavWebCreator" in to your"Visual Studio" server project. Go back to the directory called "DavWebCreator_GetStarted". Now open the directory "Client Resources" and Copy and paste the directory "DavWebCreator" in to your "Visual Studio" client project. Your solution should now look like this.

          6. Go back to the directory called"DavWebCreator_GetStarted".
          7. Now open the directory "Client Frontend" and copy and paste the directory "DavWebCreator" in to your RageMp "client_packages" directory.
     
    This is how it should look now:

    Done. Lets start with some examples…
    The project stays under the MIT license, feel free to contribute: https://github.com/davidowiz/DavWebBrowser 🙂
    Maybe the installation procedure will be improved. But as you all now, time is limited.
    Best regards,
    Davidowiz

    123 downloads

       (2 reviews)

    0 comments

    Updated

  5. MC-RP Object Editor

    This is a public release of the object editor used on the Mafia City Roleplay server. 
    Usage client-side: 
    let obj = mp.objects.new(mp.game.joaat(model), new mp.Vector3(position.x, position.y, position.z)); mp.events.call('objecteditor:start', obj.id); mp.events.add('objecteditor:finish', (objId, pos, rot) => { if(obj.id == objId) { // send pos and rot to server and save or do whatever. return; } });  
    Github Link: https://github.com/Ahmad45123/ragemp-objecteditor

    154 downloads

       (2 reviews)

    6 comments

    Updated

  6. Texture Variation Sync

    Requires RAGE Multiplayer 1.1.0 and above.
    This resource adds 2 new functions to mp.Object that provides texture variation sync.
    If you don't know the purpose of prop texture variations, you should check out GTA Online's stunt maps/props and yacht styles.
     
    Installing
    Put the files you downloaded in their respective places Add require('texturevariation') to client_packages/index.js All done  
    Serverside API
    /** * Sets the texture variation of the object. * @param {number} textureVariation Texture variation index. */ object.setTextureVariation(textureVariation); /** * Returns the texture variation of the object. * @return {number} */ object.getTextureVariation();  
    Example
    This snippet was used during development:
    const gamerChair = mp.objects.new("gr_prop_highendchair_gr_01a", new mp.Vector3(-425.517, 1123.620, 325.8544)); gamerChair.setTextureVariation(1); mp.events.addCommand("chaircol", (player, colorIndex) => { colorIndex = Number(colorIndex); if (!Number.isInteger(colorIndex)) { player.outputChatBox("Usage: /chaircol [color index]"); return; } gamerChair.setTextureVariation(colorIndex); }); mp.events.addCommand("spawntube", (player, colorIndex) => { colorIndex = Number(colorIndex); if (!Number.isInteger(colorIndex)) { player.outputChatBox("Usage: /spawntube [color index]"); return; } const tube = mp.objects.new("bkr_prop_biker_tube_xxs", player.position); tube.setTextureVariation(colorIndex); });  

    49 downloads

       (3 reviews)

    0 comments

    Submitted

  7. ZoneManager

    RageMP-ZoneManager
    A very useful client-side system which let you create four squares or hexagons in any shape like colshapes which support Z axis
    GIT REPO
    Why i needed something like this
    I was creating a traffic system which needed me to be able to check if a guy entered any crossroads and colshapes wasn't the thing i wanted + i wanted to sell farms by their shape and some of them wasn't shaped exaclty foursquare and i needed a little more, so i craeted this script to be able to make those things possible easily.
    Features
    You can create 4 types of zone which are defined az mp.zones.types in the script. You can loop through your zones and remove them. You can register zones by desired name. You may delete any zone any time. Server-side events also included. It supports Z axis which is still not very clever since it's not a big deal, all i needed was to prevent people to trigger some events from above the ground Have 4 testing functions which let you draw your zone on the map to see how it fits You can now register zones by any vector pointes above 2 Functions (Client-Side)
    /* Check if a zone is registered by it's name and it's dimension */ mp.zones.isZoneRegistered(zoneName, dimension) /* Unregister a zone by it's name and dimension */ mp.zones.unRegisterZone(zoneName, dimension) /* Register a zone by a list of vectors, height , zoneName, type, dimension Vectors: an arrayList of vectors depending on the type of the zone you are choosing to create for example if you are creating a 2PointZone all you need is 2 Vectors inside an array which are the starting point and the ending point and you have to pass height as -1 since it's not used in that type of zone if you are creating a 4PointZone you need to have an arrayList of vectors with 4 Vectors inside and height is used this time, same as 4PointZone in 6PointZone you need to pass 6 vectors and the height. Returns ZoneObject (contains name, type, positions, and zone.data [which never used it my self]) */ mp.zones.registerZone(Vectors, height, zoneName, type, dimension) /* Get ZoneObject by it's name and dimension */ mp.zones.getZoneByName(zoneName, dimension) /* Draw a 2PointZone for testing Requires 2 vectors */ mp.zones.drawZoneBy2(startPosition, endPosition) /* Draw a 4PointZone for testing Requires 4 vectors and height */ mp.zones.drawZoneBy4(Vectors, height) /* Draw a 6PointZone for testing Requires 6 vectors and height */ mp.zones.drawZoneBy6(Vectors, height) /* Draw a NPointZone for testing Requires array of vectors and height Unlimited number of points supported by this code */ mp.zones.drawZoneByN(Vectors, height) /* Check whether a point on the map is inside the zone or not */ mp.zones.isPointInZone(point, zoneName, dimension) /* This is a list of registered zone names used for looping through zones */ mp.zones.registered Events (Server-Side/Client-Side)
    On client side the player parameter is mostly the local player it self.
    /* mp.events.add('ZoneManager_PlayerEnterZone', (player, zoneName) => { //Your Code }) mp.events.add('ZoneManager_PlayerExitZone', (player, zoneName) => { //Your Code }) */ Changelog
    4/1/2020 - v0.0.1 - Added support for dimension - Addes support for NPointZone type which let you create zones by any number of points - Changed some functions to support dimensions, if you already used the script you may need to change them - getZoneByName now returns undefined if the zone on the dimension does not exists (this thing existed before but i forgot to mention it before)

    87 downloads

       (4 reviews)

    0 comments

    Updated

  8. Attachment Sync (C#)

    Source code : https://github.com/J4YT/RAGE-Multiplayer-Attachment-Sync

    C# Attachment sync for RAGE Multiplayer Server and Client. 
    Equivalent for the Efficient Attachment System made by ragempdev and rootcause
    https://rage.mp/files/file/144-efficient-attachment-sync
    Credits to DasNiels for the server-side Efficient Attachment Sync C#
    https://github.com/DasNiels/EfficientAttachmentSyncCSharp
    It has only been tested on RAGE Multiplayer 1.1
     

    192 downloads

       (3 reviews)

    1 comment

    Updated

  9. Better Clientside Commands

    This resource extends clientside mp.events object to make clientside command handling easier, which means no more splitting strings to use with if/else if or switch/case in playerCommand event
     
    Installing
    Put mp-commands into your server's client_packages directory, then add require('mp-commands'); to client_packages/index.js.
     
    Clientside API
    /** * Adds a clientside command. * @param {string} name Name of the command. * @param {function} handlerFn Function that will run when the command is used. * @throws {TypeError} name argument must be a string. * @throws {TypeError} handlerFn argument must be a function. * @throws {Error} Command with the given name already exists. */ mp.events.addCommand(name, handlerFn); /** * Returns clientside command names. * @return {string[]} */ mp.events.getCommandNames(); /** * Removes a clientside command. * @param {string} name Name of the command to remove. * @return {boolean} */ mp.events.removeCommand(name); /** * Removes all clientside commands. */ mp.events.removeAllCommands(); /** * (v2.0.0) Adds a console command. * @param {string} name Name of the console command. * @param {function} handlerFn Function that will run when the console command is used. * @throws {TypeError} name argument must be a string. * @throws {TypeError} handlerFn argument must be a function. * @throws {Error} Console command with the given name already exists. */ mp.console.addCommand(name, handlerFn); /** * (v2.0.0) Returns console command names. * @return {string[]} */ mp.console.getCommandNames(); /** * (v2.0.0) Removes a console command. * @param {string} name Name of the console command to remove. * @return {boolean} */ mp.console.removeCommand(name); /** * (v2.0.0) Removes all console commands. */ mp.console.removeAllCommands();  
    Example
    /* Looks like it's serverside code but it's not, updates GTA V's cash display. Usage: /updmoney [amount] */ mp.events.addCommand("updmoney", function (amount) { amount = Number(amount); if (!Number.isInteger(amount)) { mp.gui.chat.push("Invalid amount."); return; } mp.game.stats.statSetInt(mp.game.joaat("SP0_TOTAL_CASH"), amount, false); }); mp.events.addCommand("cmds", function () { mp.gui.chat.push(`Commands: ${mp.events.getCommandNames().join(", ")}`); });  
    Example (Console)
    NOTE: Console is a RAGE Multiplayer 1.1 feature, which means code below won't work on stable/prerelease/0.3.7 branch.
    // Write "hat 123 0" to the console and press enter to give yourself a cool helmet. mp.console.addCommand("hat", function (drawable, texture = 0) { drawable = Number(drawable); texture = Number(texture); if (!Number.isInteger(drawable) || !Number.isInteger(texture)) { mp.console.logError("Invalid drawable/texture."); return; } if (drawable < 0) { mp.players.local.clearProp(0); } else { mp.players.local.setPropIndex(0, drawable, texture, true); } }); // Write "cmds" to the console to see available console commands. mp.console.addCommand("cmds", function() { mp.console.logInfo(`Console commands: ${mp.console.getCommandNames().join(", ")}`); });  
    Notes
    I recommend loading mp-commands as the first script in client_packages/index.js so the functions become available in other scripts. Command names are case sensitive.

    65 downloads

       (4 reviews)

    0 comments

    Updated

  10. mp.game.data

    Requires RAGE Multiplayer 1.1.0 and above.
    This resource adds wrappers for these natives:
    _GET_TATTOO_COLLECTION_DATA GET_SHOP_PED_COMPONENT GET_SHOP_PED_PROP GET_DLC_WEAPON_DATA GET_DLC_WEAPON_COMPONENT_DATA GET_PED_HEAD_BLEND_DATA GET_WEAPON_HUD_STATS GET_WEAPON_COMPONENT_HUD_STATS Before 1.1.0, you couldn't use these natives because they needed pointers to their respective structures but since 1.1 allows developers to use ArrayBuffers, that is no longer a problem. Thing is, you still need to create a buffer, invoke the native and read the data from your buffer. (too much work)
    This resource is made to prevent that.
     
    Installing
    Put gamedata into your server's client_packages directory, then add require('gamedata'); to client_packages/index.js.
     
    Clientside API
    This resource extends "mp.game" by adding a "data" object that contains multiple functions.
    /* Returns information about a decoration/tattoo. characterType: * 0 = Michael * 1 = Franklin * 2 = Trevor * 3 = MPMale * 4 = MPFemale decorationIndex: * Decoration/tattoo index between 0 and _GET_NUM_DECORATIONS(characterType). Returned object: * { lockHash, id, collection, preset, cost, eFacing, updateGroup, textLabel } This native was researched & documented by TomGrobbe. (https://github.com/TomGrobbe) */ mp.game.data.getTattooCollectionData(characterType, decorationIndex); /* Returns information about a clothing item. componentHash: * Obtained by GET_HASH_NAME_FOR_COMPONENT. Returned object: * { lockHash, uniqueNameHash, locate, drawableIndex, textureIndex, unk1, eCompType, unk2, unk3, textLabel } */ mp.game.data.getShopPedComponent(componentHash); /* Returns information about a clothing item. (prop) propHash: * Obtained by GET_HASH_NAME_FOR_PROP. Returned object: * { lockHash, uniqueNameHash, locate, propIndex, textureIndex, unk1, eAnchorPoint, unk2, unk3, textLabel } */ mp.game.data.getShopPedProp(propHash); /* Returns information about a ped's headblend data. entityOrHandle: * Entity (mp.players.local) or handle (mp.players.local.handle) of the ped you want to get headblend data of. Returned object: * { shapeFirstId, shapeSecondId, shapeThirdId, skinFirstId, skinSecondId, skinThirdId, shapeMix, skinMix, thirdMix, isParent } */ mp.game.data.getPedHeadBlendData(entityOrHandle); /* Returns information about a weapon's HUD stats. weaponHash: * Hash of the weapon you want to get HUD stats of. Returned object: * { hudDamage, hudSpeed, hudCapacity, hudAccuracy, hudRange } */ mp.game.data.getWeaponHudStats(weaponHash); /* Returns information about a weapon component's HUD stats. componentHash: * Hash of the weapon component you want to get HUD stats of. Returned object: * { hudDamage, hudSpeed, hudCapacity, hudAccuracy, hudRange } */ mp.game.data.getWeaponComponentHudStats(componentHash); /* Returns information about a DLC weapon. dlcWeaponIndex: * DLC weapon index between 0 - GET_NUM_DLC_WEAPONS(). Returned object: * { lockHash, weaponHash, weaponHash2, cost, ammoCost, ammoType, defaultClipSize, textLabel, weaponDesc, weaponTT, weaponUppercase } */ mp.game.data.getDlcWeaponData(dlcWeaponIndex); /* Returns information about a DLC weapon's component. dlcWeaponIndex: * DLC weapon index between 0 - GET_NUM_DLC_WEAPONS(). dlcWeaponComponentIndex: * DLC weapon component index between 0 - GET_NUM_DLC_WEAPON_COMPONENTS(dlcWeaponIndex). Returned object: * { attachBone, isDefault, lockHash, componentHash, unk, cost, textLabel, componentDesc } */ mp.game.data.getDlcWeaponComponentData(dlcWeaponIndex, dlcWeaponComponentIndex);  
    Example Script
    Writes bunch of information to the console. (which you can access by pressing F11)
    mp.keys.bind(0x75, false, () => { // First freemode male tattoo const tattooData = mp.game.data.getTattooCollectionData(3, 0); if (tattooData) { mp.console.logInfo(`Tattoo data: ${JSON.stringify(tattooData)}`); } // Players top const component = 11; const componentHash = mp.game.invoke("0x0368B3A838070348", mp.players.local.handle, component, mp.players.local.getDrawableVariation(component), mp.players.local.getTextureVariation(component)); const topData = mp.game.data.getShopPedComponent(componentHash); if (topData) { mp.console.logInfo(`Top data: ${JSON.stringify(topData)}`); } // Players hat const prop = 0; const propHash = mp.game.invoke("0x5D6160275CAEC8DD", mp.players.local.handle, prop, mp.players.local.getPropIndex(prop), mp.players.local.getPropTextureIndex(prop)); const hatData = mp.game.data.getShopPedProp(propHash); if (hatData) { mp.console.logInfo(`Hat data: ${JSON.stringify(hatData)}`); } // Headblend mp.players.local.setHeadBlendData(21, 2, 0, 21, 2, 0, 0.75, 0.5, 0.0, false); const blendData = mp.game.data.getPedHeadBlendData(mp.players.local.handle); if (blendData) { mp.console.logInfo(`Headblend data: ${JSON.stringify(blendData)}`); } // Current weapon HUD stats const weaponData = mp.game.data.getWeaponHudStats(mp.players.local.weapon); if (weaponData) { mp.console.logInfo(`Current weapon HUD stats: ${JSON.stringify(weaponData)}`); } // COMPONENT_AT_MUZZLE_04 HUD stats const componentData = mp.game.data.getWeaponComponentHudStats(mp.game.joaat("COMPONENT_AT_MUZZLE_04")); if (componentData) { mp.console.logInfo(`Component HUD stats: ${JSON.stringify(componentData)}`); } // DLC weapon data const dlcWeaponIndex = 7; const dlcWeaponData = mp.game.data.getDlcWeaponData(dlcWeaponIndex); if (dlcWeaponData) { mp.console.logInfo(`DLC weapon data: ${JSON.stringify(dlcWeaponData)}`); // First component of weapon const dlcWeaponCompData = mp.game.data.getDlcWeaponComponentData(dlcWeaponIndex, 0); if (dlcWeaponCompData) { mp.console.logInfo(`DLC weapon first component data: ${JSON.stringify(dlcWeaponCompData)}`); } } });  
    Notes
    If mp.game.invoke fails (trying to get non-DLC item data/invalid params etc.), return value of the function will be null. Most non-DLC items (core GTAV weapons like Pistol, Assault Rifle etc, initial freemode tattoos, initial freemode clothes) are not supported by the natives. Strings returned by the functions (textLabel, componentDesc etc.) are GXT entries. You're supposed to use them with getLabelText.

    73 downloads

       (2 reviews)

    0 comments

    Submitted

  11. Efficient Attachment Sync

    Most of the server developers (ones that don't patiently wait for *something large*, though this resource is powerful enough) use their own server-side object attachments implementation that represents some large JSON with all the object and attachment information. This resource lets you cache "static attachments" in the client-side code so thanks to efficient utilization of the shared data it just uses a small shared variable to do the attachment processing without any need to create server-side objects nor send its data.
     
    For example, if you want to attach a specific object to specific ped bone with spefic bone offset and object rotation, this will only use a ~4-8 byte shared variable keeping it accurate. User-made implementations I have seen before usually take ~100 bytes per an object.
     
    API: Client-side
    mp.attachmentMngr.register(attachmentId, model, bone, offset, rotation) mp.attachmentMngr.addLocal(attachmentId) (synced!) mp.attachmentMngr.removeLocal(attachmentId) (synced!)  
    API: Server-side
    player.addAttachment(attachmentId, remove) player.hasAttachment(attachmentId)  
    Example Resource
    There's an example resource in /client-packages/epic-attachments folder. It lets you toggle attachments (there are like 30 attachments) using a NativeUI-based menu. Thanks to root for his contributions made to the example resource.
     
     
     

    1817 downloads

       (11 reviews)

    2 comments

    Updated

  12. NativeUI Improved

    Improvements over the previous nativeui:
    Added `UIMenuDynamicListItem`. Descriptions are no longer cut off at 99 characters, but now support 99 * 3. `UIMenuListItem` and `UIMenuSliderItem` can now store extra data. Improved description line wrapping. Description caption is now only updated when necessary. Description background is now only updated (recalculated) when necessary. Bettered the position of the left arrow for list items. Added new badges (Sale, Arrows and Voice Icons). Added `Menu.RemoveItem(item: UIMenuItem)`. When binding an item to a menu, automatically add that item if it isn't in the menu items list already. Added `MenuOpen` event when `menu.Visible` is changed. When hovering over the currently selected ListItem's title text, the cursor will be MiddleFinger, just like in the original menus. `GoLeft` and `GoRight` now correctly handles disabled items. Added experimental automated menu pool system (It's a bit effy right now). MENUS ARE NO LONGER SHOWN BY DEFAULT. Added `closeChildren: boolean = false` parameter to `menu.Close()`. An optional parameter specifiing whether or not you want to close all children with the menu. NOTE BRIEFLY:
    The description and optimization updates for me saved over 20-30 FPS while a menu is open. You might want to be careful with menu pools right now. I haven't went deep into it but for simple menu pools it works GREAT. `MenuClose` event is NOT emitted when Visible is set to false. This is to allow users to reopen menus at it's same state, for e.g searching through a store. The GitHub will not match the file here. So please download the file from GitHub (dist/index.ts) or compile it yourself.  
    https://github.com/karscopsandrobbers/RAGEMP-NativeUI

    310 downloads

       (5 reviews)

    3 comments

    Updated

  13. Zone API

    This resource adds 3 functions to the serverside mp.world object that provides zone name and type information.
     
    Serverside API
    /** * Returns the name of the area/zone at specified coords, ignores heights. * @param {object} coords An object with "x" and "y" properties. * @return {string} Zone name. */ mp.world.getNameOfZone2D(coords); /** * Returns the name of the area/zone at specified coords. * @param {object} coords An object with "x", "y" and "z" properties, such as mp.Vector3. * @return {string} Zone name. */ mp.world.getNameOfZone3D(coords); /** * Returns the type of the area/zone at specified coords. * @param {object} coords An object with "x" and "y" properties. * @return {string} Zone type, either "city" or "countryside". */ mp.world.getTypeOfZone(coords);  
    Example
    const coords = new mp.Vector3(1823.961, 4708.14, 42.4991); // Grapeseed Bunker console.log(`Name 2D: ${mp.world.getNameOfZone2D(coords)}`); // Expected output: Grapeseed console.log(`Name 3D: ${mp.world.getNameOfZone3D(coords)}`); // Expected output: Grapeseed console.log(`Zone Type: ${mp.world.getTypeOfZone(coords)}`); // Expected output: countryside  
    Notes
    Available on GitHub: https://github.com/root-cause/ragemp-zone-api N.O.O.S.E area returns Tataviam Mountains instead. There might be other areas with inaccuracies, feel free to share a fix in comments/send a pull request.

    59 downloads

       (3 reviews)

    0 comments

    Updated

  14. Tire Smoke Color Sync

    This resource provides 3 serverside functions to work with tire smoke color feature of GTA V.
     
    Installing
    Put the files you downloaded in their respective places Add require('tiresmoke') to client_packages/index.js All done  
    Serverside API
    /** * Sets the tire smoke color of a vehicle. * @param {Number} red * @param {Number} green * @param {Number} blue */ vehicle.setTyreSmokeColor(red, green, blue); /** * Gets the tire smoke color of a vehicle. * @return {Object} Tire smoke color, will be null if the vehicle doesn't have one set. */ vehicle.getTyreSmokeColor(); /** * Resets the tire smoke color of a vehicle. */ vehicle.resetTyreSmokeColor();  
    Example Code
    // Example: /setsmokecol 255 0 0 mp.events.addCommand("setsmokecol", (player, _, r, g, b) => { if (!player.vehicle) { player.outputChatBox("not in vehicle"); return; } player.vehicle.setTyreSmokeColor(Number(r), Number(g), Number(b)); player.outputChatBox("smoke color set"); }); // Output: "smoke color: {"r":255,"g":0,"b":0}" or "smoke color: null" if you haven't used setsmokecol before mp.events.addCommand("getsmokecol", (player) => { if (!player.vehicle) { player.outputChatBox("not in vehicle"); return; } player.outputChatBox(`smoke color: ${JSON.stringify(player.vehicle.getTyreSmokeColor())}`); }); mp.events.addCommand("remsmokecol", (player) => { if (!player.vehicle) { player.outputChatBox("not in vehicle"); return; } player.vehicle.resetTyreSmokeColor(); player.outputChatBox("smoke color reset"); });  
    Notes
    Since this script toggles the tire smoke mod (toggleMod 20), it may not work with your car customization script. Setting the tire smoke color of a vehicle, then changing its model will cause visual desync. Apply tire smoke color again/reset it after changing a vehicle's model to not have this issue. Even though NativeDB says setting the RGB to 0, 0, 0 applies independence day tire smoke, all it did for me was make the tire smoke invisible. Future versions of RAGEMP might add tire smoke color sync, if it happens you should stop using this resource.  
    Source code is available on GitHub in case you don't want to download: https://github.com/root-cause/ragemp-tire-smoke

    80 downloads

       (4 reviews)

    0 comments

    Updated

  15. [TypeScript] Client-Framerate library

    This TypeScript library allows you to request the current clientside FPS.
    Licensed under the MIT License (see README.md for more info).
    Sincerely,
    ~Vincent
     
    Used icon: https://www.shareicon.net/screen-monitor-93177

    149 downloads

       (0 reviews)

    0 comments

    Updated

  16. Custom Sound CEF

    Simple CEF to play custom mp3's in the background. The CEF autodestroys after the sound has finished to not use our beloved PC resources.
     
    Copy client_packages and packages content in their respective directory, then import them.
    You can put your mp3's inside client_packages/Sound/sounds/ and trigger them with their filename. Only mp3 is supported right now, although ogg works as well, it's easily exchangeable and/or extensible to allow for both.
    As of right now, you can play a sound with the "/playsound NAME" command. You can use this as you want, this is only a barebones example to show how it works.
    I have not experimented when it comes to max sound length / filesize. I'd like to know though

    294 downloads

       (1 review)

    2 comments

    Submitted

  17. Colshape Handler

    Simple CommonJS singleton module to handle colshape entering and exiting.
    Copy the Colshapes folder inside packages inside your packages folder. See the Examples folder for an example.
    Simply create your colshape like this:
    const colshape = mp.colshapes.newSphere(34, 15, 69, 15, 0) colshape.name = 'example' and then pull in the colshapeHandler singleton to add it to the array the following:
    const colshapeHandler = require('../Colshapes/index').getInstance() colshapeHandler.addColshape('example') If a player enters the specified colshape, the colshape name will be pushed towards a colshapes array as a player property, like this. Definition of this is inside the "playerJoin" event in the Colshapes\index.js. The specified colshape name will then be removed from the array again if the player exits the colshape.
     
    player.colshapes = [];  

    54 downloads

       (0 reviews)

    0 comments

    Submitted

  18. rage-progressbar

    rage-progressbar

    Very simple Progress Bar to delay event execution.
     
    How to use:

    Put the "progress" folder inside "client_packages" into your "client_packages" folder (or wherever you have your client files).
    Import the "progress/index.js" in your main "index.js" like it is done in my main "index.js"
    You can then create a Progress Bar on the server-side with the following code:
    player.call('progress:start', [SECONDS, TASK, DIRECTION, EVENT, PARAMS]);
    SECONDS
    How many seconds is the Progress Bar running

    TASK
    String which is displayed inside the progress bar

    DIRECTION
    Is the event which is called after the bar has finished a server-side or client-side event

    EVENT
    The event to be called afterwards

    PARMS
    Additional params to send to the following event
     

    That's pretty much it. Customize it as you want, this is as basic as possible.
    "packages/Progress/index.js" contains an example with an example /progress command and a follow-up event.

    180 downloads

       (1 review)

    0 comments

    Updated

  19. RAGE MP + React

    To install all packages, use: yarn install or npm install.
    For running this example, use: yarn run start or npm start.
    For building project, use: yarn run build or npm run build.
     
    In client_packages is an example of how you can use compiled RAGE MP functions and React.
    Credits to Mispon(rage-mp-react-ui) for branch example.
     
    The principal difference between our examples is hot reload and more understandable example of code in my version.
    Repo: https://github.com/Corso-Project/RAGE-MP-React-Example

    83 downloads

       (0 reviews)

    0 comments

    Submitted

  20. Inventory API

    This resource provides an inventory API to server developers.
    This resource will not save anything on its own, it just provides you the functions to make your own inventory system using CEF/NativeUI/commands.
     
    Installing
    Put the files you downloaded in their respective places Read the documentation and examples to set up some items etc. All done  
    Features
    Easy to use (hopefully!) Events Custom attributes for items (see examples)  
    Inventory API
    const invAPI = require("../inventory-api"); /** * Adds an item to the inventory system. * @param {string} key Item identifier, such as "item_medkit". * @param {string} name Item name, such as "Medkit". * @param {string} description Item description, such as "Gives you 10 health". * @param {function} [onUse] Optional - Function that gets called when the item is used. * @param {function} [nameFunc] Optional - Function that gets called when getItemName() is used. * @param {function} [descFunc] Optional - Function that gets called when getItemDescription() is used. * @return {object} The added item, will be null if there are any mistakes. * @fires itemDefined */ invAPI.addItem(key, name, description, onUse, nameFunc, descFunc); /** * Returns whether the specified key is a registered or not. * @param {string} key Item identifier, such as "item_medkit". * @return {Boolean} True if registered, false otherwise. */ invAPI.hasItem(key); /** * Returns the specified item. * @param {string} key Item identifier, such as "item_medkit". * @return {object} The item at the specified key, will be undefined if the key isn't registered. */ invAPI.getItem(key); /** * Returns all registered item identifiers. * @return {string[]} An array of registered item identifiers. */ invAPI.getAllItems(); /** * Returns the human readable name of the specified item. * @param {string} key Item identifier, such as "item_medkit". * @param {string} [data] Optional - An object that has item attributes. * @return {string} Human readable item name. */ invAPI.getItemName(key, data); /** * Returns the description of the specified item. * @param {string} key Item identifier, such as "item_medkit". * @param {string} [data] Optional - An object that has item attributes. * @return {string} Item's description. */ invAPI.getItemDescription(key, data);  
    Inventory API Events
    /** * itemDefined * This event is called when an item is added to the system with invAPI.addItem() * @param {string} key Item identifier. * @param {string} name Human readable name of the item. * @param {string} description Description of the item. */ invAPI.on("itemDefined", (key, name, description) => { // Example: console.log(`Item defined, key: ${key} | name: ${name} | description: ${description}`); }); /** * itemAdded * This event is called when a player receives an item. * @param {player} player The player who received the item. * @param {string} key Item identifier. * @param {number} amount Amount the player received. * @param {object} data Item attributes. */ invAPI.on("itemAdded", (player, key, amount, data) => { // Example: console.log(`${player.name} received ${amount}x ${key}.`); }); /** * itemUsed * This event is called when a player uses an item. * @param {player} player The player who used the item. * @param {number} invIdx Index of the item in player's inventory. * @param {string} key Item identifier. * @param {object} data Item attributes. */ invAPI.on("itemUsed", (player, invIdx, key, data) => { // Example: console.log(`${player.name} used ${key}.`); }); /** * itemRemoved * This event is called when an item is removed from a player's inventory. * @param {player} player The player who lost an item. * @param {number} invIdx Index of the item that got removed in player's inventory. * @param {string} key Item identifier. * @param {number} amount Removed item amount. * @param {object} data Item attributes. */ invAPI.on("itemRemoved", (player, invIdx, key, amount, data) => { // Example: console.log(`${player.name} lost ${amount}x ${key}.`); }); /** * itemRemovedCompletely * This event is called when an item is no longer in a player's inventory. * @param {player} player The player who lost an item. * @param {string} key Item identifier. * @param {object} data Item attributes. */ invAPI.on("itemRemovedCompletely", (player, key, data) => { // Example: console.log(`${player.name} no longer has ${key} (${data ? "with data" : "without data"}) in their inventory.`); }); /** * inventoryReplaced * This event is called when a player's inventory array gets changed by player.setInventory() * @param {player} player The player who had an inventory change. * @param {object[]} oldInventory The player's old inventory array. * @param {object[]} newInventory The player's new inventory array. */ invAPI.on("inventoryReplaced", (player, oldInventory, newInventory) => { // Example: console.log(`${player.name} had their inventory replaced. (Old item count: ${oldInventory.length}, new: ${newInventory.length})`); });  
    Player API
    /** * Returns the inventory array of the player. * @return {object[]} An array that holds all items of the player. */ player.getInventory(); /** * Replaces the inventory array of the player with the specified one. * @param {Array} newInventory An array that's going to be the new inventory of the player. * @return {Boolean} True if successful, false otherwise. * @fires inventoryReplaced */ player.setInventory(newInventory); /** * Returns whether the player has the specified item or not. * @param {string} itemKey Item identifier. * @return {Boolean} True if player has the item, false otherwise. */ player.hasItem(itemKey); /** * Same as hasItem but for items with custom attributes. * @param {string} itemKey Item identifier. * @param {object} data An object that has item attributes. * @return {Boolean} True if player has the item, false otherwise. */ player.hasItemWithData(itemKey, data); /** * Gets the item's index in the player's inventory. * @param {string} itemKey Item identifier. * @return {number} Index of the item, -1 if not found. */ player.getItemIndex(itemKey); /** * Same as getItemIndex but for items with custom attributes. * @param {string} itemKey Item identifier. * @param {object} data An object that has item attributes. * @return {number} Index of the item, -1 if not found. */ player.getItemIndexWithData(itemKey, data); /** * Gets how many of the specified item exists in the player's inventory. * @param {string} itemKey Item identifier. * @return {number} Item amount. */ player.getItemAmount(itemKey); /** * Same as getItemAmount but for items with custom attributes. * @param {string} itemKey Item identifier. * @param {object} data An object that has item attributes. * @return {number} Item amount. */ player.getItemAmountWithData(itemKey, data); /** * Gets total amount of items the player has in their inventory. * @return {number} Amount of all items. */ player.getTotalItemAmount(); /** * Gives the specified item to the player. * @param {string} itemKey Item identifier. * @param {number} amount Amount to give. * @param {object} [data] Optional - An object that has item attributes. * @return {Boolean} True if successful, false otherwise. * @fires itemAdded */ player.giveItem(itemKey, amount, data); /** * Uses the item at the specified index of the player's inventory array. * @param {number} itemIdx Index of the item in player's inventory array. * @return {Boolean} True if successful, false otherwise. * @fires itemUsed */ player.useItem(itemIdx); /** * Removes the item at the specified index of the player's inventory array. * @param {number} itemIdx Index of the item in player's inventory array. * @param {number} [amount] Optional - Amount to remove. * @return {Boolean} True if successful, false otherwise. * @fires itemRemoved * @fires itemRemovedCompletely */ player.removeItem(itemIdx, amount);  
    Examples
    Full Test Script (used during development): https://gist.github.com/root-cause/6f15f0ee2276872c2d15a5333fed6a10
    Name/Description Function Test Script: https://gist.github.com/root-cause/500b6e197348e941aeebfa8f883486bb
    Source code is available on GitHub in case you don't want to download: https://github.com/root-cause/ragemp-inventory-api

    1290 downloads

       (11 reviews)

    2 comments

    Updated

  21. [C# Server-Side] Events+Commands at Runtime

    Github page: https://github.com/robertnisipeanu/ragemp-server-events
     
    ragemp-server-events
    OOP Implementation of the RAGEMP server events (so you don't have to use [Command] or [ServerEvent] annotations). It allows you to add event handlers and commands at runtime.
    How to use
    Copy /client_packages/cs_packages/CustomCommands.cs to your server client resources (server-files/client_packages/cs_packages).
    From folder 'server' import Delegates.cs and Events.cs into your server-side project.
    Add using robearded; at the top of the files where you want to use my API.
    Use Events.*EventName* += EventHandler; to add an event handler and Events.AddCommand("*commandName*", CommandHandler); to add a command handler.
    Added events
    OnPlayerReady(Client client) -> This event is not available by default on the C# API If any other events will be custom implemented they will be added here ^
    Example
    You can find an example inside the 'example' folder.
    Need help?
    Please do not contact me if you didn't followed the above steps, I'm not gonna tell you again the steps in private when you have them here.
    If you need any other help, feel free to contact me on Discord at @rumble06#4127 or on RAGE.MP Forums at https://rage.mp/profile/45121-robearded/

    53 downloads

       (2 reviews)

    0 comments

    Updated

  22. Maze Bank UI with CSS

    A free Maze Bank UI. Have fun
     

    263 downloads

       (0 reviews)

    0 comments

    Submitted

  23. rage_utils

    A bunch of utility functions for rage (cross environment: server, client, browser) that are not easy to implement in JS specially for client and browser! Also you can use this package for projects other than rage.
    If you want a new feature in utilities that you think others might use too, submit an issue on github page
    Install instructions, features and documentation are all available on npm registery and github page
    I highly recommend visiting the linked pages and using npm/yarn for installing
     

    52 downloads

       (0 reviews)

    0 comments

    Updated

  24. [DISCONTINUED] Ajcom

    This library is discontinued and lacks some features. I'm working on a new remote call library which is faster and more secure
    Asynchronous Javascript Communication is a module to allow easy communication between server, client and CEF/browser. This module lets you call server handlers from clients (and vice versa) without dealing with adding and managing custom event handlers.
    You can easily call a handler and get your callback called as soon as everything is returned from the handler in a promise like way! Let's see how it works in action:
    // server side const ajcom = require("./ajcom") ajcom.register("getServerName", hCtx => { return mp.config.name }) // client side const ajcom = require("./[package name]/ajcom.js") mp.events.add("guiReady", () => { ajcom.callServer("getServerName").then((ctx, serverName) => { mp.gui.chat.push(`Welcome to ${serverName} ragemp server!`) }) }) That's all! Not convinced yet? See how the above code is done without ajcom:
    // server side mp.events.add("getServerName", (player) => { player.call("gotServerName", [mp.config.name]) }) // client side mp.events.add("gotServerName", (serverName) => { mp.gui.chat.push(`Welcome to ${serverName} ragemp server!`) }) mp.events.add("guiReady", () => { mp.events.callRemote("getServerName") }) See? It eases the event handling mess. But there's a lot more to ajcom. You can easily handle errors happening on handler's side or any of the callbacks, set delays and other stuff. The full documentation is available here
    Please post your questions and issues to the forum post
    Github repo

    77 downloads

       (2 reviews)

    1 comment

    Updated

  25. Shared World Data

    If you ever used GTA Network's setWorldSyncedData/SetWorldSharedData, you probably have an idea of what this resource does. If you haven't used those, this resource lets you set variables that will be synced to all clients.
     
    Installing
    Put the files you downloaded in their respective places Add require('worlddata') to client_packages/index.js, preferably as the first module you require All done  
    Using
    There isn't much to it, you can do one of these to set shared data:
    mp.world.data.myDataKey = myValue; mp.world.data["myDataKey"] = myValue; you can do one of these to get shared data:
    mp.world.data.myDataKey mp.world.data["myDataKey"] and you can do one of these to remove shared data:
    delete mp.world.data.myDataKey; delete mp.world.data["myDataKey"]; (1.1) now you can do this to set multiple shared data at once, thanks to @kemperrr:
    mp.world.setData(updatedObject); // see examples You can use setting/deleting code on clientside as well but it won't affect the data on serverside. If anything your changes will get overriden when myDataKey is updated, so there's no point in using setting/deleting code on clientside.
     
    Events (Clientside)
    // worldDataReady is called when the player receives all shared data. mp.events.add("worldDataReady", () => { // Example, print all data keys to chat mp.gui.chat.push(`World data ready! ${Object.keys(mp.world.data).join(",")}`); }); // worldDataChanged is called when shared data changes. mp.events.add("worldDataChanged", (key, oldValue, newValue) => { // Example, show which data key changed with its old and new value mp.gui.chat.push(`World data changed: ${key} | old: ${oldValue} | new: ${newValue}`); }); // worldDataRemoved is called when shared data is removed. mp.events.add("worldDataRemoved", (key) => { // Example, show which data key got removed mp.gui.chat.push(`World data removed: ${key}`); });  
    Example (Serverside)
    let gameSeconds = 0; // Increase gameSeconds every second and update the world data every 5 seconds, for no reason... setInterval(() => { gameSeconds++; if (gameSeconds % 5 === 0) { // You can use mp.world.data["exampleVariable"] as well mp.world.data.exampleVariable = gameSeconds; console.log(`exampleVariable is now ${mp.world.data.exampleVariable}`); } }, 1000); // Will update serverUpdated, serverName, serverWebsite shared data. mp.world.setData({ "serverUpdated": Date.now(), "serverName": "RAGE Multiplayer Server #545" "serverWebsite": "https://rage.mp/" }); Source code is available on GitHub in case you don't want to download: https://github.com/root-cause/ragemp-world-data

    115 downloads

       (3 reviews)

    0 comments

    Updated

Sign in to follow this