LR Fivem lua module
This repository is a basic boilerplate for getting started
with React in NUI. It contains several helpful utilities and
is bootstrapped using `create-react-app`. It is for both browser
and in-game based development workflows.
For in-game workflows, Utilizing `craco` to override CRA, we can have hot
builds that just require a resource restart instead of a full
production build
This version of the boilerplate is meant for the CfxLua runtime.
## Requirements
- [Node > v10.6](https://nodejs.org/en/)
- [Yarn](https://yarnpkg.com/getting-started/install) (Preferred but not required)
- [ox_lib](https://github.com/overextended/ox_lib)
_A basic understanding of the modern web development workflow. If you don't
know this yet, React might not be for you just yet._
## Getting Started
First clone the repository or use the template option and place
it within your `resources` folder
### Installation
_The boilerplate was made using `yarn` but is still compatible with
`npm`._
Install dependencies by navigating to the `web` folder within
a terminal of your choice and type `npm i` or `yarn`.
# Enable modules in Config.EnableModules
```lua
Config.EnableModules = {
["Newbie"] = {
enabled = true,
client = true, -- enable client side
priority = 1, -- 1 : init on start | 2 : init on player loaded
},
["Test"] = {
enabled = true,
priority = 2, -- 1 : init on start | 2 : init on player loaded
},
}
Config.Debug = true -- print log
Config.Dev = false
Config.Nui = true -- will wait NUI trigger RegisterNUICallback('AppReady', ...) before init
```
# This boilerplate will export all method from all modules
- To call method in module out side of script
```lua
exports['lr_addon']:ImplCall(name, func, ...) --Call a method in module external
```
# Main
```lua
variable `main` is global
you can use this variable in anywhere
```
- Properties
```lua
main.playerId
main.playerPed
main.playerCoords
main.playerHeading
main.playerServerId
```
- methods (internal use)
```lua
main:GetImpl(implName) --Get module instance
```
```lua
main:ImplCall(implName, methodName, ...args) --Call a method in module
--You can also use this way
local testImpl = main:GetImpl("Test")
testImpl:(...args)
```
# Impl
- default methods
```lua
Impl:GetName() --Get name of module
```
```lua
Impl:OnReady() --Called when module was initialized
--Example
local Impl = NewImpl("Test")
function Impl:OnReady()
self:LogInfo("%s initialized", self:GetName())
--will print out: [INFO] [TEST] Test initialized
--Your rest of script
end
function Impl:HookHere(value)
return value + 1
end
function Impl:ReplaceThis(a, b)
return a + b
end
```
```lua
Impl:OnDestroy() --Called when module start destroying (when hot reload module)
```
```lua
Impl:HookMethod(method, hookFn) --Hook a function at start of method. Must return value same as arguments of method
--Example
local testImpl = main:GetImpl("Test")
print(testImpl:HookHere(2))
--print out: 3
testImpl:HookMethod("HookHere", function(this, value)
print("Hook called");
return value
end)
print(testImpl:HookHere(2))
--print out: Hook called
--print out: 3
testImpl:HookMethod("HookHere", function(this, value)
print("Hook called 2");
return value + 1
end)
print(testImpl:HookHere(2))
--print out: Hook called 2
--print out: Hook called
--print out: 4 (because we was modified value = value + 1)
```
```lua
Impl:ReplaceMethod(method, newMethod) --Replace method with new function
--Example
local testImpl = main:GetImpl("Test")
print(testImpl:ReplaceThis(2, 3))
--print out: 5
testImpl:ReplaceMethod("ReplaceThis", function(this, a, b)
return a * b
end)
print(testImpl:ReplaceThis(2, 3))
--print out: 6
```
```lua
Impl:RefreshMethod(method) --Refresh method to original
--Example
local testImpl = main:GetImpl("Test")
testImpl:RefreshMethod("HookHere")
print(testImpl:HookHere(2))
--print out: 3
testImpl:RefreshMethod("ReplaceThis")
print(testImpl:ReplaceThis(2, 3))
--print out: 5
```
```lua
Impl:LogInfo(msg, ...) --Print log when Config.Debug == true
```
```lua
Impl:LogError(msg, ...) --Print log when Config.Debug == true
```
```lua
Impl:LogSuccess(msg, ...) --Print log when Config.Debug == true
```
```lua
Impl:LogWarning(msg, ...) --Print log when Config.Debug == true
```
```lua
Impl:Destroy() --Destroy module (Called when hot reload module)
```
- Impl default properties
```lua
self.destroyed = false
self.originalMethods = {}
self.eventHandlers = {}
```
- Create Impl
#### Module name must be the same as file name
```lua
local Impl = NewImpl("Test2")
--file name must be Test2.impl.lua
--Place file in client/impl for clientside and server/impl for serverside
```
```lua
local Impl = NewImpl("Test")
function Impl:OnReady()
-- Entry of module
self.testVar = 0
end
function Impl:GetData()
return self.data
end
function Impl:Add(amount, amount2)
self.testVar = self.testVar + amount + amount2
return self.testVar
end
```
# Commands
```lua
reload:
--Used for hot reload a module
--mode: 0 [default] (reload server and client) | 1 (reload only client) | 2 (reload only server)
--Example:
reload:lr_boilerplate Test --for reload module `Test` clientside and serverside
reload:lr_boilerplate Test 1 --for reload module `Test` clientside
reload:lr_boilerplate Test 2 --for reload module `Test` serverside
```
```lua
toggledebug:
--Used for toggle debug mode [modify variable Config.Debug] (print out log ...)
```
```lua
toggledev:
--Used for toggle dev mode [modify variable Config.Dev]
```