fixes etc

This commit is contained in:
Nordi98 2025-06-12 03:36:12 +02:00
parent 4a0c8c6204
commit 453b281a4b
644 changed files with 1907 additions and 2456 deletions

View file

@ -0,0 +1,47 @@
# RPEmotes - Contributing Guidelines
Thank you for considering contributing to our project! We value the involvement of every community member and appreciate your help in making this project better. To ensure a positive and inclusive experience for everyone, we have established these guidelines, which we expect all contributors to follow.
## Code of Conduct
Before contributing, please review our [Code of Conduct](CODE_OF_CONDUCT.md) to understand the expected behavior and our commitment to maintaining a respectful and inclusive environment.
## How to Contribute
1. Fork the repository and create your branch from the `master` branch.
2. Ensure that your code follows our coding conventions and style guidelines.
3. Make your changes, including tests if applicable, and ensure that the code compiles successfully.
4. Commit your changes and provide a clear and descriptive commit message.
5. Push your branch to your forked repository.
6. Submit a pull request to the `master` branch of the main repository.
7. Be responsive to any feedback or questions that may arise during the review process.
## Communication
- If you have questions or need clarification, feel free to open an issue in the repository.
- Use respectful and inclusive language in all communications.
- Be open to feedback and be constructive in your responses.
## Reporting Issues
- If you encounter any issues or have suggestions for improvement, please check the issue tracker to see if it has already been reported.
- If the issue is new, feel free to open a new issue, providing a clear and descriptive title and description.
- Include as much relevant information as possible to help us understand and address the issue more efficiently.
- Be respectful to others when commenting on existing issues.
## Pull Request Guidelines
- Before submitting a pull request, make sure that your changes address the problem or feature request effectively.
- Provide a clear and descriptive title for your pull request.
- Include a summary of the changes made and any additional information that may be helpful for the reviewer.
- Ensure that your code is well-documented and tested, when applicable.
- Be open to feedback and be responsive to any requests for changes or improvements.
## Attribution
These Contributing Guidelines are adapted from the [Open Source Guide](https://opensource.guide/), available at [https://opensource.guide/starting-a-project/#writing-contributor-guidelines](https://opensource.guide/starting-a-project/#writing-contributor-guidelines).
## Acknowledgment
We appreciate the time and effort you put into contributing to this project. Your contributions help make this project better for everyone involved. Thank you for being a part of our community!

View file

@ -0,0 +1,14 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: popcornrp
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View file

@ -0,0 +1,24 @@
---
name: Bug Report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behaviour:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behaviour**
A clear and concise description of what you expected to happen.
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,16 @@
---
name: Feature Request
about: Looking for a feature to be added? Use this template!
title: ''
labels: ''
assignees: ''
---
**Describe the Feature**
A clear and concise description of what the feature is and how it will function and improve remotes-reborn.
**Example/Mock up**
An image or mockup of how it would look for function.
**Additional context**
Add any other context that might be useful.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,516 @@
![image](https://github.com/alberttheprince/rpemotes-reborn/assets/85725579/25b38001-1b50-42ff-b9c9-07046d8be0a1)
Rpemotes-reborn is a community-driven FiveM emote menu allowing players to express themselves in roleplay with custom animations, countless facial expressions, walk styles, and props.
Rpemotes-reborn is free, **and will always be free**: accept no substitutes or reproductions from scummy people reselling other's hard work against agreements made with creators. We're committed to the open-source community and the dozens of contributors who put hard work into rpemotes to provide the community with free emotes and props.
Want to help support them? Check out our credits section at the bottom of the Readme and support those creators!
Interested in joining our community? You can find our Discord [here](https://discord.gg/UJ72w8rgar).
# Features 🛠️
- Emote Preview - View emotes before you use them
- Changeable Banner Font
- Changeable Banner Colour
- Multiple Translations 🌏
- Search Function 🔎
- Custom Animations with **permission from the community** 🏃
- Persistent Facial Expressions via client KVP 🤪
- Animal Emotes 🐩
- Shared Dances 🕺💃
- Persistent Walkstyles via client KVP 🚶‍♂️ - Standalone, QB-Core and ESX support!
- Persistent Disabling Of Idle Camera via KVP 🎥
- Crouching 🐞
- Crawling 🐛
- Finger Pointing 👆
- Ragdoll 😵
- Hands up 🙌
- Shared Particle Effects 💨
- QB-Core Framework & KVP Keybinding Support ⚙️
- Further support for shared and couple poses/animations 👫
- Easily convert Menyoo to RPEmotes 🔄
- Hide Adult Emotes 🔞
- Hide Animal Emotes ⛔
- Easy To Understand Configuration File ⚙️
- Exit Emotes 😎
- Working Binoculars 👀
- News Camera 🎤📹
- Props Extractor for anti-cheat scripts 💾
**Available in the following languages:**
Albanian, Brazilian Portuguese, Chinese (Simplified), Chinese (Traditional), Czech, Danish, Dutch, English, Finnish, French, German, Greek, Hungarian, Indonesian, Italian, Lithuanian, Norwegian, Persian, Polish, Romanian, Russian, Serbian, Sinhala, Slovenian, Spanish, Swedish, Turkish, Vietnamese
Languages can be selected and/or added in the config.lua.
All languages were translated or contributed by the FiveM community, with the odd exception of using Google Translate.
If you find any incorrect translations or would like to add more languages, please make a pull request with the corrections.
# Header
To edit the header, find the image in the main directory of rpemotes-reborn and edit the image in your program of choice. The image dimensions are 512 x 128.
Do not change the name of the image file.
Example Banner:
![image](https://github.com/user-attachments/assets/dac5b7e5-4b63-4d10-8d59-3e8502d9913c)
**Note for users of older versions of rpemotes:** Previously, the banner was hosted through a web link on an image hosting website. Due to various image hosting sites dealing with large amounts of traffic from FiveM, they cut off access to FiveM.
# Exports and Documentation
Find our documentation [here](https://rpemotes-reborn.gitbook.io/guide)
The rpemotes-reborn resource has the following exports:
```lua
exports["rpemotes-reborn"]:EmoteCommandStart(emoteName, textureVariation)
exports["rpemotes-reborn"]:EmoteCancel(forceCancel) forceCancel is optional
exports["rpemotes-reborn"]:CanCancelEmote(state)
exports["rpemotes-reborn"]:IsPlayerCrouched()
exports["rpemotes-reborn"]:IsPlayerProne()
exports["rpemotes-reborn"]:StopPlayerProne(force) -- force is optional
exports["rpemotes-reborn"]:GetPlayerProneType() -- returns the type of prone the player is in, either "onfront" or "onback"
exports["rpemotes-reborn"]:IsPlayerCrawling()
exports["rpemotes-reborn"]:IsPlayerPointing()
exports["rpemotes-reborn"]:IsPlayerInAnim() -- returns current animation name or nil
exports["rpemotes-reborn"]:IsPlayerInHandsUp()
exports["rpemotes-reborn"]:toggleBinoculars()
exports["rpemotes-reborn"]:toggleNewscam()
exports["rpemotes-reborn"]:getWalkstyle() -- Gets walk style of player, used to detect certain walk. useful for applying effects while doing certain walks like tripping or other "funny" effects.
exports["rpemotes-reborn"]:setWalkstyle(name, force) -- name = "move_m@alien" or any other, force = optional bool. Lets you set or force a walk style, useful for scripts like retrieving a style before drinking and restoring it after sobering up.
exports["rpemotes-reborn"]:toggleWalkstyle(bool, message) -- bool to allow the user to change their walkstyle in the menu or not / message to show the user (optional, default is :"You are unable to change your walking style right now.")"
```
Having issues with players using emotes when/where they're not supposed to? Use the following where you need. This would be somewhere like if you want to disable emotes in jail or when someone is handcuffed/escorted:
```lua
LocalPlayer.state:set('canEmote', false, true) -- stops emoting
LocalPlayer.state:set('canEmote', true, true) -- allows emoting
```
# Menu Keybind 🎛️
The keybind uses RegisterKeyMapping. By default the configured keybind in the _initial_ config.lua will be the default key, however once the keybind is set for a user it'll remain and can be changed in the users settings under `Esc > settings > keybinds > fivem`.
**Menu key:**
| COMMAND: | ACTION: |
| -------- | -------------------------- |
| F4 | Open / Close RPEmotes menu |
Server owners can change this in the `config.lua`.
Alternatively, the player base can set their menu keybind to open rpemotes-reborn
`Esc > settings > keybinds > fivem`
- More keybinds are now using key mappings which means that they are now available in your FiveM settings to change (`RagdollKeybind`)
# Keybinds 🎛️
To use the features, enable the setting in `config.lua`
```lua
Keybinding = false,
```
Alternatively, you can use the keybind command that comes with FiveM without having to use SQL, by entering the following into F8:
`bind keyboard "Yourbutton" "e youremote"`. To remove the keybind, type `"unbind keyboard "Yourbutton"`.
# Menu Customization
In the`config.lua` file, server owners can set the MenuTitle or simply leave it blank. Ideally, this should be 11 characters or less without any spaces.
You can also set the font and decide whether or not you want an outline and MenuPosition. The available fonts are as follows:
```lua
-- 0 : Chalet London
-- 1 : House Script
-- 2 : Monospace
-- 4 : Chalet Comprime Cologne
-- 7 : Pricedown
```
Additional customizations can be found in the config. Please note due to limitations by Imgur and Discord; images can not be directly linked from either platform. You may link directly to an image from the forums, or just leave it blank.
# Increments
Pressing 'LEFT ALT' on the keyboard allows players to scroll through the menu one by one, or by 10.
Alternatively, players can use the `SHARE` button on an Xbox controller or `OPTIONS` button on a Playstation controller.
# Ragdoll 🥴
- To enable ragdoll, change `RagdollEnabled = false,` to true in config.lua.
- Much like the menu key, `RagdollKeybind` is also using RegisterKeyMapping. It is currently set to `U` by default _(server side)_ however can be set to the player's preferred keybind in the FiveM keybinds setting found in the settings menu within the Esc Menu.
- New setting: `RagdollAsToggle`, this will make either the ragdoll be a toggle or a hold key
# Finger Pointing & Hands Up 👆
Once enabled, players can press `B` on the keyboard to enable standalone finger pointing, and `Y` to put their hands up, without the need for unnecessary frameworks or "small resources".
Much like everything else in the menu, server owners can change these keybinds to their own preferences.
| COMMAND: | ACTION: |
| --------- | ---------------------- |
| B | Toggle Finger Pointing |
| Y | Toggle Hands Up |
| /pointing | Toggle Finger Pointing |
| /handsup | Toggle Hands Up |
# Crouching & Crawling
**Crouching:**
RIGHT CONTROL. Players can move forward, back, left, and right as well as turn around. Press SPACEBAR to switch from stomach to back. Pressing the RIGHT CONTROL key while running will have the player "dive into" a crouching animation.
**Crawling:**
Server owners can opt in to either overriding the stealth/action animation when pressing the LEFT CONTROL keybind or have players tap LEFT CONTROL twice to switch from stealth to crouch (when enabled in the config.lua file)
# Chat Commands
| COMMAND: | ACTION: |
| ------------- | ------------------------- |
| LEFT CONTROL | Toggle Crouching On / Off |
| RIGHT CONTROL | Toggle Crawling On / Off |
| /crouch | Toggle Crouching On / Off |
| /crawl | Toggle Crawling On / Off |
---
# Moods & Walkstyles 😜🚶‍♂️
Moods and walk styles can be set from the menu. These will save to your character and reapply when exiting a vehicle, or loading back into the server as they are saved via client-side KVP.
| COMMAND: | ACTION: |
| ----------- | ------------------------------------- |
| F4 | Opens RPEmotes menu |
| /walks | See A List Of Walkstyles In Chat |
| /moods | See A List Of Walkstyles In Chat |
| /reset mood | Remove preferred mood and set default |
| /reset walk | Remove last walkstyle and set default |
Having problems with users "abusing" certain walk styles? rpemotes-reborn checks if a user has an "abusable" walk style saved and clears it when a player joins. Alternatively, you can use a resource like [rpemotes-punishment](https://github.com/alberttheprince/rpemotes-punishment/) to trip players abusing these emotes.
Just want to remove them? Delete the following walk styles from Animationlist.lua:
Bigfoot, Hurry, Hurry2, Hurry3, Flee, Flee2, Flee3, Flee4, and Flee5
# No Idle Cam 📷
No Idle Cam allows players to disable the idle camera animation on foot and in vehicle, making RP scenarios, streaming on Twitch, or just general gameplay just a little more enjoyable.
| COMMAND: | ACTION: |
| ----------- | ---------------------- |
| /Idlecamon | deactivates the native |
| /idlecamoff | enables the native |
# Binoculars 👀
| COMMAND: | ACTION: |
| ----------- | --------------------------------------------- |
| /binoculars | starts the binoculars |
| L ALT | Toggle between night, heat and normal visions |
| G | Show or hide the instructions |
| BACKSPACE | Exit the binoculars |
<img src="https://forum.cfx.re/uploads/default/original/4X/2/6/3/263b6f2afe148191193fca8c8cc0b9bc666da9e8.jpeg" width="600" height="auto">
# News Camera
| COMMAND: | ACTION: |
| --------- | ----------------------------- |
| /newscam | starts the News Camera |
| H | Edit Text |
| L ALT | Toggle between vision modes |
| G | Show or hide the instructions |
| BACKSPACE | Exit News Camera |
<img src="https://forum.cfx.re/uploads/default/optimized/4X/5/4/e/54e47db5ae45f5afa4b84c2ae4858bc9ab0a8187_2_690x388.jpeg" width="600" height="auto">
# Exit Emotes
Exit Emotes are used to make cancelling an animation more smoother and dynamic, such as getting up off a chair or throwing a cigarette out instead of dropping it.
You can add your own Exit Emotes under `AnimationListCustom.lua`'s new `CustomDP.Exits = {}` array.
Below is an example of how this would look:
```lua
},
["sit"] = {
"anim@amb@business@bgen@bgen_no_work@",
"sit_phone_phoneputdown_idle_nowork",
"Sit",
AnimationOptions = {
EmoteLoop = true,
ExitEmote = "getup",
ExitEmoteType = "Exits"
}
},
```
The ExitEmote calls for the 'getup' emote, which is noted as the following:
```lua
["getup"] = {
"get_up@sat_on_floor@to_stand",
"getup_0",
"Get Up",
AnimationOptions = {
EmoteDuration = 2000
}
}
}
```
# Adult Emotes 🔞
Adult Emotes can be hidden from the menu by setting `AdultEmotesDisabled` to `true` in the config.lua file.
This will completely conceal the emotes from the lists _(Emotes, Shared Emotes, etc)_ at startup making them unusable.
The emotes that are concealed, are the ones flagged in the animation list with `AdultAnimation`. You can see how it is done with `fspose`.
Alternatively, you can also hide animal emotes.
# QB-Core ⚙️
**QBCore integration to match their fork of dpemotes**
- Config option that supports the QB Framework in their fork of the original dpemotes.
If youre using qb-core, you can now set
```lua
Framework = "qb-core",
```
in the config file, otherwise, leave it as
```lua
Framework = false,
```
_You may need to alter some code within qb-core to work with RPEmotes._
# Prop Extractor ↔️
Many people have expressed concerns over anticheat scripts kicking or banning their community members due to the fact RPEmotes uses props and anticheats detecting said props being spawned.
To make server owners' jobs a little easier, we have added a prop extractor command that you can enter into the server console which will automate a file inside the RPEmotes resource folder appropriately named, `prop_list.lua`.
### Command:
`emoteextract`
```lua
Available output formats:
1 - 'prop_name',
2 - "prop_name",
3 - prop_name
4 - calculate total emotes
Command usage example: emoteextract 1
```
![image](https://github.com/user-attachments/assets/6ec6e042-00b7-4be2-8086-1805eb87196c)
# Installation Instructions ⚙️:
- Add `ensure rpemotes` to your `server.cfg`
- Download the latest recommended artifacts [for Windows](https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/) or [for Linux](https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/)
- [Enforce gamebuild to latest build](https://forum.cfx.re/t/tutorial-forcing-gamebuild-to-casino-cayo-perico-or-tuners-update/4784977) for all emotes and props to work as intended.
**Onesync Infinity is required for the particle effects to work as intended** This can be done via txadmin or your localhost .bat file.\*\*
For localhost servers, comment out onesync from your server.cfg and add the following to your `.bat` file:
```lua
+set onesync on +set onesync_enableInfinity 1 +set onesync_enableBeyond 1 +set onesync_population true
```
You can put this before your gamebuild enforcement, aka `+set sv_enforceGameBuild XXXX`
- Set the desired language and settings in the config.lua under `MenuLanguage = 'en',`
- Qb-Core server owners, set `Framework = 'qb-core'` in the config file, otherwise leave it as false.
- If you do not want to use the Kvp features, you can use the keybind command that comes with FiveM, by entering the following into F8:
`bind keyboard "Yourbutton" "e youremote"`. To remove the keybind, type `"unbind keyboard "Yourbutton"`.
- Type `/refresh` and `/ensure rpemotes` into your chat resource, or simply restart your server
# Shared emotes 👩🏻‍❤️‍💋‍👨🏼
Emotes will work with either `SyncOffset` or `Attachto`.
If it is with `SyncOffsetFront` or `SyncOffsetSide`, then the offset used is the one of the emote the player started.<br/>
For example, if player one starts the emote `handshake` which has `SyncOffsetFront`, then player one will have the `SyncOffsetFront` but not the other player.
- If it is with `Attachto`, then it'll either be player one's data used for attaching or player two's data.<br/>
For example, if player one starts the emote carry, then the other player will be attached but not the player one because Attachto is set in `carry2` and not `carry`.<br/>
- If player one starts the emote `carry2`, then player one will be attached and not the other player.
it's the player who starts the animation who will in most cases be moved
_Special case, if both emote have the `Attachto` then only the player who started the emote will be attached._
You can find a list of ped bones to attach the other player here: [Ped Bones](https://wiki.rage.mp/index.php?title=Bones) or alternatively, if the link is down for some reason, you can check [here](https://wiki.rage.mp/index.php?title=Bones)
Using the websites provided above, enter the bone ID, ie `1356` and not `111`, which is the Bone Index.
Understandably, this can be confusing for some people. We suggest using the `Attachto` approach.
# Particle Effects 💨
**REQUIRES ONESYNC INFINITY**
Particle effects can be found using the [DurtyFree GTA V Dump](https://github.com/DurtyFree/gta-v-data-dumps/blob/master/particleEffectsCompact.json). You will need to add the particle asset, name, and placement. Placement is done via XYZ, Pitch, Roll, Yaw, and scale.
Onesync is required for them to work across all clients.
```lua
PtfxPlacement = {
-0.15, -- X
-0.35, -- Y
0.0, -- Z
0.0, -- ROTATION X
90.0, -- ROTATION Y
180.0, -- ROTATION Z
1.0 -- SCALE
},
```
<img src="screenshots/pfxcoords.png" width="350">
By default, the main prop will share its coordinates with the particle effect, so just put 0.0 for the particle effects and you will be good to go.
If no prop is used in the animation or you require the particle effect to be in a different location, use `PtfxNoProp = true`, and 0.0 will 9/10 times be the human peds' stomach; you can then offset your coordinates based on that with the first 3 entries being XYZ, and the last 3 being rotation XYZ.
Alternatively, you can use the `PtfxBone =` AnimationOption to attach the PTFX to the ped's bone, similarly to how you attach props.
Using Menyoo, spawn down a tennis ball and attach it to a human, by default menyoo will attach it to the SKEL_ROOT bone (stomach), so from that, what we can do is either offset the coordinates, say, up to the human ped's mouth, or change the bone altogether. Once we've got it correct, we can transfer those coordinates over to RPEmotes, and tah dah, we have our Ptfx Placement.
Note that `ptfxwait = ` is in ms, so if you'd like a particle to last for 30 seconds, it should be `ptfxwait = 30000`.
# Adding Your Own Animations ⚙️
Because the menu gets updated frequently, the files get overwritten. To avoid this, you can add your own / downloaded animation files `(.ycd)` inside of a newly created folder, give it a name, and place it in the `rpemotes\stream\[Custom Emotes]` folder.
Add your animation code to the `AnimationListCustom.lua` and make a backup of this file and call it `BackUpAnimationListCustom.lua`.
**Note on vehicle emotes:** If you want your emote to play in a vehicle with the full body, you must add the FullBody tag to the emote options.
**Note on animal emotes:** For the addition of custom emotes for animal peds, you must add use the `sdog` or `bdog` tags. For example if you want to add an emote of `laydownflat` it must be either `sdoglaydownflat` or `bdoglaydownflat`. You must also add any custom addon peds to the `animals.lua` file in either category for these animations to be played on those models.
Whenever an update is released, rename `BackUpAnimationListCustom.lua` to `AnimationListCustom.lua`, click yes to overwrite, and you're good to go.
Note that `AnimationListCustom.lua` and `BackUpAnimationListCustom.lua` files from versions prior to version 1.5.0 are not compatible with version 1.5.0, and files from version 1.5.0 are not backwards compatible with versions prior to version 1.5.0. To retain any custom animation code from previous versions, copy over any customizations into the `AnimationListCustom.lua` file that is included in the current version.
It is also a good idea to keep a backup of your config file.
Below is an example:
<img src="screenshots/customanims.png" width="550">
# Credits 🤝
**All** custom animations and props were added with permission from the creators.
All animation creators have **_specifically_** asked that their content remain free and that the RPEmotes team and community do not try to profit from them, claim them as their own, or reupload them anywhere else.
**A huge thank you the following people for their amazing contributions to the menu:**
- the FiveM community for using RP and updating rpemotes-reborn!
### Developers:
- [The Popcorn RP community](https://discord.gg/popcornroleplay) for putting up with all my emote menu testing and troubleshooting issues with me
- [Mathu_lmn](https://github.com/Mathu-lmn) for maintaining the menu and adding features
- [enzo2991](https://github.com/enzo2991) for creating the ped preview functionality, keybind with kvp
- [DerDevHD](https://forum.cfx.re/t/fixed-remove-prop-after-scenario-animation/5002332/8) for the insight on deleting scenario props.
- [iSentrie](https://forum.cfx.re/u/isentrie/) for additional code, support, and joining the RPEmotes project
- [Kibook](https://github.com/kibook) for the addition of the Animal Emotes sub-menu
- [AvaN0x](https://github.com/AvaN0x) for reformatting and assisting with code, additional features, and figuring out shared particle effects
- [Mads](https://github.com/MadsLeander) for joining the team as Co-Developer
- [Tigerle](https://forum.cfx.re/u/tigerle_studios) for providing the additional code required to make Shared Emotes work to its full extent
- [GeekGarage](https://github.com/geekgarage) for their knowledge, time, and dedication, helping to bring new and exciting features to the menu
- [northsqrd](https://github.com/0sqrd) for adding the search function, Animal Emotes config, mobile phone prop texture variants, and general contributions
- [Chico](https://forum.cfx.re/u/chico) for implementing natives to reapply persistent moods and walk styles for ESX and QB-Core frameworks
- [Scully](https://github.com/Scullyy/) for their past work on rpemotes
- Crusopaul and Eki for discussing KVP and initializing it to the menu for persistent walk styles
### Emote & Props Creators:
- [SMGMissy](https://jenscreations.tebex.io/) for creating the pride flag props
- [MissSnowie](https://www.gta5-mods.com/users/MissySnowie)
- [Smokey](https://www.gta5-mods.com/users/struggleville)
- [BzZzi](https://forum.cfx.re/u/bzzzi/summary)
- [Natty3d](https://forum.cfx.re/u/natty3d/summary)
- [Amnilka](https://www.gta5-mods.com/users/frabi)
- [LittleSpoon](https://discord.gg/safeword)
- [LadyyShamrockk](https://www.gta5-mods.com/users/LadyyShamrockk)
- [Pupppy](https://discord.gg/rsN35X4s4N)
- [SapphireMods](https://discord.gg/Hf8F4nTyzt)
- [QueenSisters Animations](https://discord.gg/qbPtGwQuep)
- DurtyFree for his work on particle effects and cataloging GTA-related information [DurtyFree GTA V Dump](https://github.com/DurtyFree/gta-v-data-dumps/blob/master/particleEffectsCompact.json)
- [BoringNeptune](https://www.gta5-mods.com/users/BoringNeptune)
- [CMG Mods](https://www.gta5-mods.com/users/-moses-)
- [prue 颜](discord.gg/lunyxmods)
- [PataMods](https://forum.cfx.re/u/Pata_PataMods)
- [Crowded1337](https://www.gta5-mods.com/users/crowded1337)
- [EnchantedBrownie](https://www.gta5-mods.com/users/EnchantedBrownie)
- Chocoholic Animations
- [CrunchyCat](https://www.gta5-mods.com/users/crunchycat)
- [KayKayMods](https://discord.gg/5bYQVWVaxG)
- [MonkeyWhisper](https://github.com/MonkeyWhisper) and [Project Sloth](https://github.com/Project-Sloth)
- [Brummieee](https://forum.cfx.re/u/brummieee_maps/summary)
- [Dark Animations](https://www.gta5-mods.com/users/Darks%20Animations).
- [-EcLiPsE-](https://www.gta5-mods.com/users/-EcLiPsE-) for allowing me to implement [Improved Prop Sets](https://www.gta5-mods.com/misc/improved-propsets-meta) and [GTA Online Biker Idle Anims](https://www.gta5-mods.com/misc/bike-idle-animations)
- [MrWitt](https://www.gta5-mods.com/users/MrWitt)
- [Vedere](https://discord.gg/XMywAMQ8Ef)
- [DRX Animations](https://www.gta5-mods.com/users/DRX%2DAnimations)
- [VNSIanims](https://discord.gg/cTNrjYSXXG)
- [PNWParksFan](https://www.gta5-mods.com/users/PNWParksFan)
- [LSPDFR member Sam](https://www.lcpdfr.com/downloads/gta5mods/misc/23386-lspd-police-badge/)
- [GTA5Mods user Sladus_Slawonkus](https://www.gta5-mods.com/misc/lspd-police-badge-replace-sladus_slawonkus)
- [EP](https://github.com/EpKouhia)
- [TayMcKenzieNZ](https://github.com/TayMcKenzieNZ)
- [41anims](https://www.gta5-mods.com/users/41anims)
- [corbs](https://www.gta5-mods.com/users/corbs)
- [jaysigx](https://www.gta5-mods.com/misc/improved-umbrella)

View file

@ -0,0 +1,14 @@
BigDogs = {
"a_c_chop",
"a_c_husky",
"a_c_retriever",
"a_c_shepherd",
"a_c_rottweiler",
"ft-groe"
}
SmallDogs = {
"a_c_poodle",
"a_c_pug",
"a_c_westy",
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
-- Emotes you add in the file will automatically be added to AnimationList.lua
-- If you have multiple custom list files they MUST be added between AnimationList.lua and Emote.lua in fxmanifest.lua!
-- Don't change 'CustomDP' it is local to this file!
-- Remove the } from the = {} then enter your own animation code ---
-- Don't forget to close the tables.
local CustomDP = {}
CustomDP.Expressions = {}
CustomDP.Walks = {}
CustomDP.Shared = {}
CustomDP.Dances = {}
CustomDP.AnimalEmotes = {}
CustomDP.Exits = {}
CustomDP.Emotes = {}
CustomDP.PropEmotes = {}
-----------------------------------------------------------------------------------------
--| I don't think you should change the code below unless you know what you are doing |--
-----------------------------------------------------------------------------------------
function LoadAddonEmotes()
local prefixes = {
Shared = '🤼 ',
AnimalEmotes = '🐶 ',
PropEmotes = '📦 '
}
for arrayName, array in pairs(CustomDP) do
if RP[arrayName] then
local prefix = prefixes[arrayName]
for emoteName, emoteData in pairs(array) do
if prefix then
emoteData[3] = prefix .. emoteData[3]
end
RP[arrayName][emoteName] = emoteData
end
end
end
-- Free memory
CustomDP = nil
end

View file

@ -0,0 +1,168 @@
IsUsingBinoculars = false
if Config.BinocularsEnabled then
RegisterCommand("binoculars", function()
UseBinocular()
end, false)
TriggerEvent('chat:addSuggestion', '/binoculars', 'Use binoculars', {})
local fov = 40.0
local index = 0
local cam
local prop_binoc
local instructions = true
local scaleform_bin
local scaleform_instructions
local function CleanupBinoculars()
ClearPedTasks(PlayerPedId())
ClearTimecycleModifier()
RenderScriptCams(false, false, 0, true, false)
SetScaleformMovieAsNoLongerNeeded(scaleform_bin)
SetScaleformMovieAsNoLongerNeeded(scaleform_instructions)
DestroyCam(cam, false)
if prop_binoc then
DeleteEntity(prop_binoc)
end
SetNightvision(false)
SetSeethrough(false)
end
function UseBinocular()
if IsPedSittingInAnyVehicle(PlayerPedId()) then
return
end
if IsInActionWithErrorMessage({ ['IsUsingBinoculars'] = true }) then
return
end
IsUsingBinoculars = not IsUsingBinoculars
if IsUsingBinoculars then
CreateThread(function()
DestroyAllProps()
ClearPedTasks(PlayerPedId())
RequestAnimDict("amb@world_human_binoculars@male@idle_a")
while not HasAnimDictLoaded("amb@world_human_binoculars@male@idle_a") do
Wait(5)
end
-- attach the prop to the player
local boneIndex = GetPedBoneIndex(PlayerPedId(), 28422)
local x, y, z = table.unpack(GetEntityCoords(PlayerPedId(), true))
if not HasModelLoaded("prop_binoc_01") then
LoadPropDict("prop_binoc_01")
end
prop_binoc = CreateObject(`prop_binoc_01`, x, y, z + 0.2, true, true, true)
AttachEntityToEntity(prop_binoc, PlayerPedId(), boneIndex, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, true, true,
false, true, 1, true)
TaskPlayAnim(PlayerPedId(), "amb@world_human_binoculars@male@idle_a", "idle_c", 5.0, 5.0, -1, 51, 0,
false, false, false)
PlayAmbientSpeech1(PlayerPedId(), "GENERIC_CURSE_MED", "SPEECH_PARAMS_FORCE")
SetCurrentPedWeapon(PlayerPedId(), `WEAPON_UNARMED`, true)
RemoveAnimDict("amb@world_human_binoculars@male@idle_a")
SetModelAsNoLongerNeeded("prop_binoc_01")
end)
Wait(200)
SetTimecycleModifier("default")
SetTimecycleModifierStrength(0.3)
scaleform_bin = RequestScaleformMovie("BINOCULARS")
while not HasScaleformMovieLoaded(scaleform_bin) do
Wait(10)
end
cam = CreateCam("DEFAULT_SCRIPTED_FLY_CAMERA", true)
AttachCamToEntity(cam, PlayerPedId(), 0.0, 0.0, 1.2, true)
SetCamRot(cam, 0.0, 0.0, GetEntityHeading(PlayerPedId()))
SetCamFov(cam, fov)
RenderScriptCams(true, false, 0, true, false)
PushScaleformMovieFunction(scaleform_bin, "SET_CAM_LOGO")
PushScaleformMovieFunctionParameterInt(0) -- 0 for nothing, 1 for LSPD logo
PopScaleformMovieFunctionVoid()
local keyList
if Config.AllowVisionsToggling then
keyList = {
{ key = 177, text = 'exit_binoculars' },
{ key = 19, text = 'toggle_binoculars_vision' },
{ key = 47, text = 'toggle_instructions' }
}
else
keyList = {
{ key = 177, text = 'exit_binoculars' },
{ key = 47, text = 'toggle_instructions' }
}
end
scaleform_instructions = SetupButtons(keyList)
while IsUsingBinoculars and not IsEntityDead(PlayerPedId()) and not IsPedSittingInAnyVehicle(PlayerPedId()) do
if IsControlJustPressed(0, 177) then
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
IsUsingBinoculars = false
end
fov = HandleZoomAndCheckRotation(cam, fov)
HideHUDThisFrame()
DisableControlAction(0, 25, true) -- disable aim
DisableControlAction(0, 44, true) -- INPUT_COVER
DisableControlAction(0, 37, true) -- INPUT_SELECT_WEAPON
DisableControlAction(0, 24, true) -- Attack
DisablePlayerFiring(PlayerPedId(), true) -- Disable weapon firing
if IsControlJustPressed(0, 19) and Config.AllowVisionsToggling then
-- if index = 0, toggle night vision, if index = 1, toggle thermal vision, if index = 2, toggle normal vision and reset index
if index == 0 then
SetNightvision(true)
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
index = index + 1
elseif index == 1 then
SetSeethrough(true)
SetNightvision(false)
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
index = index + 1
elseif index == 2 then
SetNightvision(false)
SetSeethrough(false)
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
index = 0
end
end
if IsControlJustPressed(0, 47) then
instructions = not instructions
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
end
DrawScaleformMovieFullscreen(scaleform_bin, 255, 255, 255, 255)
if instructions then
DrawScaleformMovieFullscreen(scaleform_instructions, 255, 255, 255, 255)
end
Wait(1)
end
end
-- RESET EVERYTHING
IsUsingBinoculars = false
index = 0
CleanupBinoculars()
end
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
CleanupBinoculars()
end
end)
CreateExport('toggleBinoculars', function()
UseBinocular()
end)
end

View file

@ -0,0 +1,107 @@
Framework = 'standalone'
PlayerLoaded, PlayerData = nil, {}
local function InitializeFramework()
if GetResourceState('es_extended') == 'started' then
ESX = exports['es_extended']:getSharedObject()
Framework = 'esx'
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
PlayerLoaded = true
end)
RegisterNetEvent('esx:onPlayerLogout', function()
PlayerData = {}
PlayerLoaded = false
end)
AddEventHandler('esx:setPlayerData', function(key, value)
PlayerData[key] = value
end)
AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end
PlayerData = ESX.GetPlayerData()
PlayerLoaded = true
end)
elseif GetResourceState('qb-core') == 'started' then
QBCore = exports['qb-core']:GetCoreObject()
Framework = 'qb'
AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
PlayerData = QBCore.Functions.GetPlayerData()
end)
RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
PlayerData = {}
end)
AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() ~= resourceName then return end
PlayerData = QBCore.Functions.GetPlayerData()
end)
end
print('[RPEmotes-Reborn] Framework initialized: ' .. Framework)
end
function CanDoAction()
if Framework == 'esx' then
return PlayerLoaded and not PlayerData.dead
elseif Framework == 'qb' then
return LocalPlayer.state.isLoggedIn and not (PlayerData.metadata.inlaststand or PlayerData.metadata.isdead)
end
-- here you can implement your own standalone framework check
return true
end
InitializeFramework()
-- EVENTS
RegisterNetEvent('animations:client:PlayEmote', function(args)
if CanDoAction() then
EmoteCommandStart(args)
end
end)
if Config.Keybinding then
RegisterNetEvent('animations:client:BindEmote', function(args)
if CanDoAction() then
EmoteBindStart(nil, args)
end
end)
RegisterNetEvent('animations:client:EmoteBinds', function()
if CanDoAction() then
ListKeybinds()
end
end)
RegisterNetEvent('animations:client:EmoteDelete', function(args)
if CanDoAction() then
DeleteEmote(args)
end
end)
end
RegisterNetEvent('animations:client:EmoteMenu', function()
if CanDoAction() then
OpenEmoteMenu()
end
end)
RegisterNetEvent('animations:client:Walk', function(args)
if CanDoAction() then
WalkCommandStart(args)
end
end)
RegisterNetEvent('animations:client:ListWalks', function()
if CanDoAction() then
WalksOnCommand()
end
end)

View file

@ -0,0 +1,501 @@
IsProne = false
local isCrouched = false
local isCrawling = false
local inAction = false
local proneType = 'onfront'
local lastKeyPress = 0
local forceEndProne = false
-- Crouching --
local function ResetCrouch()
local playerPed = PlayerPedId()
ResetPedStrafeClipset(playerPed)
ResetPedWeaponMovementClipset(playerPed)
SetPedMaxMoveBlendRatio(playerPed, 1.0)
SetPedCanPlayAmbientAnims(playerPed, true)
local walkstyle = GetResourceKvpString("walkstyle")
if walkstyle then
local toApply = RP[walkstyle]
if not toApply or type(toApply) ~= "table" or toApply.category ~= "Walks" then
ResetPedMovementClipset(playerPed, 0.5)
DeleteResourceKvp("walkstyle")
DebugPrint('Invalid walkstyle found in KVP, resetting to default.')
return
end
RequestWalking(toApply[1])
SetPedMovementClipset(PlayerPedId(), toApply[1], 0.5)
RemoveClipSet(toApply[1])
else
ResetPedMovementClipset(playerPed, 0.5)
end
RemoveAnimSet('move_ped_crouched')
end
local function CrouchLoop()
local playerId = PlayerId()
while isCrouched do
local playerPed = PlayerPedId()
if not CanPlayerCrouchCrawl(playerPed) then
isCrouched = false
break
end
if IsPlayerAiming(playerId) then
SetPedMaxMoveBlendRatio(playerPed, 0.15)
end
SetPedCanPlayAmbientAnims(playerPed, false)
DisableControlAction(0, 36, true)
if IsPedUsingActionMode(playerPed) == 1 then
SetPedUsingActionMode(playerPed, false, -1, 'DEFAULT_ACTION')
end
DisableFirstPersonCamThisFrame()
if Config.FpsMode == true then
DisableControlAction(2, 25, true) -- disables the aim control action entirely while crouched
end
Wait(0)
end
TriggerEvent('crouch_crawl:onCrouch', false)
ResetCrouch()
end
local function StartCrouch()
isCrouched = true
RequestWalking('move_ped_crouched')
local playerPed = PlayerPedId()
if GetPedStealthMovement(playerPed) ~= 0 then
SetPedStealthMovement(playerPed, false, 'DEFAULT_ACTION')
Wait(100)
end
if GetFollowPedCamViewMode() == 4 then
SetFollowPedCamViewMode(0) -- THIRD_PERSON_NEAR
end
SetPedMovementClipset(playerPed, 'move_ped_crouched', 0.6)
SetPedStrafeClipset(playerPed, 'move_ped_crouched_strafing')
-- For other scripts to use
TriggerEvent('crouch_crawl:onCrouch', true)
CreateThread(CrouchLoop)
end
---@param playerPed number
---@return boolean success
local function AttemptCrouch(playerPed)
if CanPlayerCrouchCrawl(playerPed) and IsPedHuman(playerPed) then
StartCrouch()
return true
else
return false
end
end
---Disables a control until it's key has been released
---@param padIndex integer
---@param control integer
local function DisableControlUntilReleased(padIndex, control)
CreateThread(function()
while IsDisabledControlPressed(padIndex, control) do
DisableControlAction(padIndex, control, true)
Wait(0)
end
end)
end
local function CrouchKeyPressed()
if not LocalPlayer.state.canEmote then return end
if inAction then
return
end
if IsPauseMenuActive() or IsNuiFocused() then
return
end
if isCrouched then
isCrouched = false
local crouchKey = GetControlInstructionalButton(0, `+crouch` | 0x80000000, false)
local lookBehindKey = GetControlInstructionalButton(0, 26, false) -- INPUT_LOOK_BEHIND
if crouchKey == lookBehindKey then
DisableControlUntilReleased(0, 26) -- INPUT_LOOK_BEHIND
end
return
end
local playerPed = PlayerPedId()
if not CanPlayerCrouchCrawl(playerPed) or not IsPedHuman(playerPed) then
return
end
local crouchKey = GetControlInstructionalButton(0, `+crouch` | 0x80000000, false)
local lookBehindKey = GetControlInstructionalButton(0, 26, false) -- INPUT_LOOK_BEHIND
local duckKey = GetControlInstructionalButton(0, 36, false) -- INPUT_DUCK
if crouchKey == lookBehindKey then
DisableControlUntilReleased(0, 26) -- INPUT_LOOK_BEHIND
end
if crouchKey == duckKey then
if Config.CrouchOverrideStealthMode then
DisableControlAction(0, 36, true) -- Disable INPUT_DUCK this frame
elseif not IsProne then
local timer = GetGameTimer()
if GetPedStealthMovement(playerPed) ~= 0 and timer - lastKeyPress < 1000 then
DisableControlAction(0, 36, true) -- Disable INPUT_DUCK this frame
lastKeyPress = 0
else
lastKeyPress = timer
return
end
end
end
StartCrouch()
if IsProne then
inAction = true
IsProne = false
PlayAnimOnce(playerPed, 'get_up@directional@transition@prone_to_knees@crawl', 'front', nil, nil, 780)
Wait(780)
inAction = false
end
end
-- Crawling --
---@param playerPed number
---@return boolean
local function ShouldPlayerDiveToCrawl(playerPed)
if IsPedRunning(playerPed) or IsPedSprinting(playerPed) then
return true
end
return false
end
---Stops the player from being prone
---@param force boolean If forced then no exit anim is played
local function stopPlayerProne(force)
IsProne = false
forceEndProne = force
end
---@param playerPed number
---@param heading number|nil
---@param blendInSpeed number|nil
local function PlayIdleCrawlAnim(playerPed, heading, blendInSpeed)
local playerCoords = GetEntityCoords(playerPed)
TaskPlayAnimAdvanced(playerPed, 'move_crawl', proneType..'_fwd', playerCoords.x, playerCoords.y, playerCoords.z, 0.0, 0.0, heading or GetEntityHeading(playerPed), blendInSpeed or 2.0, 2.0, -1, 2, 1.0, false, false)
end
---@param forceEnd boolean
local function PlayExitCrawlAnims(forceEnd)
if not forceEnd then
inAction = true
local playerPed = PlayerPedId()
local animDict, animName, waitTime
if proneType == 'onfront' then
animDict, animName, waitTime = 'get_up@directional@transition@prone_to_knees@crawl', 'front', 780
else
animDict, animName, waitTime = 'get_up@directional@transition@prone_to_seated@crawl', 'back', 950
end
PlayAnimOnce(playerPed, animDict, animName, nil, nil, waitTime)
if not isCrouched then
Wait(waitTime)
PlayAnimOnce(playerPed, 'get_up@directional@movement@from_'..(proneType == 'onfront' and 'knees' or 'seated')..'@standard', 'getup_l_0', nil, nil, 1300)
end
end
end
-- Crawls one "step" forward/backward
---@param playerPed number
---@param type string
---@param direction string
local function Crawl(playerPed, type, direction)
isCrawling = true
TaskPlayAnim(playerPed, 'move_crawl', type..'_'..direction, 8.0, -8.0, -1, 2, 0.0, false, false, false)
local time = {
['onfront'] = {
['fwd'] = 820,
['bwd'] = 990
},
['onback'] = {
['fwd'] = 1200,
['bwd'] = 1200
}
}
SetTimeout(time[type][direction], function()
isCrawling = false
end)
end
-- Flips the player when crawling
---@param playerPed number
local function CrawlFlip(playerPed)
inAction = true
local heading = GetEntityHeading(playerPed)
proneType = proneType == 'onfront' and 'onback' or 'onfront'
if proneType == 'onback' then
PlayAnimOnce(playerPed, 'get_up@directional_sweep@combat@pistol@front', 'front_to_prone', 2.0)
ChangeHeadingSmooth(playerPed, -18.0, 3600)
else
PlayAnimOnce(playerPed, 'move_crawlprone2crawlfront', 'back', 2.0, nil, -1)
ChangeHeadingSmooth(playerPed, 12.0, 1700)
end
PlayIdleCrawlAnim(playerPed, heading + 180.0)
Wait(400)
inAction = false
end
local function CrawlLoop()
Wait(400)
while IsProne do
local playerPed = PlayerPedId()
if not CanPlayerCrouchCrawl(playerPed) or IsEntityInWater(playerPed) then
ClearPedTasks(playerPed)
stopPlayerProne(true)
break
end
local forward, backwards = IsControlPressed(0, 32), IsControlPressed(0, 33) -- INPUT_MOVE_UP_ONLY, INPUT_MOVE_DOWN_ONLY
if not isCrawling then
if forward then -- Forward
Crawl(playerPed, proneType, 'fwd')
elseif backwards then -- Back
Crawl(playerPed, proneType, 'bwd')
end
end
-- Moving left/right
if IsControlPressed(0, 34) then -- INPUT_MOVE_LEFT_ONLY
if isCrawling then
local headingDiff = forward and 1.0 or -1.0
SetEntityHeading(playerPed, GetEntityHeading(playerPed) + headingDiff)
else
inAction = true
if proneType == 'onfront' then
local playerCoords = GetEntityCoords(playerPed)
TaskPlayAnimAdvanced(playerPed, 'move_crawlprone2crawlfront', 'left', playerCoords.x, playerCoords.y, playerCoords.z, 0.0, 0.0, GetEntityHeading(playerPed), 2.0, 2.0, -1, 2, 0.1, false, false)
ChangeHeadingSmooth(playerPed, -10.0, 300)
Wait(700)
else
PlayAnimOnce(playerPed, 'get_up@directional_sweep@combat@pistol@left', 'left_to_prone')
ChangeHeadingSmooth(playerPed, 25.0, 400)
PlayIdleCrawlAnim(playerPed)
Wait(600)
end
inAction = false
end
elseif IsControlPressed(0, 35) then -- INPUT_MOVE_RIGHT_ONLY
if isCrawling then
local headingDiff = backwards and 1.0 or -1.0
SetEntityHeading(playerPed, GetEntityHeading(playerPed) + headingDiff)
else
inAction = true
if proneType == 'onfront' then
local playerCoords = GetEntityCoords(playerPed)
TaskPlayAnimAdvanced(playerPed, 'move_crawlprone2crawlfront', 'right', playerCoords.x, playerCoords.y, playerCoords.z, 0.0, 0.0, GetEntityHeading(playerPed), 2.0, 2.0, -1, 2, 0.1, false, false)
ChangeHeadingSmooth(playerPed, 10.0, 300)
Wait(700)
else
PlayAnimOnce(playerPed, 'get_up@directional_sweep@combat@pistol@right', 'right_to_prone')
ChangeHeadingSmooth(playerPed, -25.0, 400)
PlayIdleCrawlAnim(playerPed)
Wait(600)
end
inAction = false
end
end
if not isCrawling then
if IsControlPressed(0, 22) then -- INPUT_JUMP
CrawlFlip(playerPed)
end
end
Wait(0)
end
TriggerEvent('crouch_crawl:onCrawl', false)
PlayExitCrawlAnims(forceEndProne)
isCrawling = false
inAction = false
forceEndProne = false
proneType = 'onfront'
SetPedConfigFlag(PlayerPedId(), 48, false) -- CPED_CONFIG_FLAG_BlockWeaponSwitching
RemoveAnimDict('move_crawl')
RemoveAnimDict('move_crawlprone2crawlfront')
end
local function CrawlKeyPressed()
if not LocalPlayer.state.canEmote then return end
if inAction then
return
end
if IsPauseMenuActive() or IsNuiFocused() then
return
end
if IsProne then
IsProne = false
return
end
if IsInAnimation then
EmoteCancel()
end
local wasCrouched = false
if isCrouched then
isCrouched = false
wasCrouched = true
end
local playerPed = PlayerPedId()
if not CanPlayerCrouchCrawl(playerPed) or IsEntityInWater(playerPed) or not IsPedHuman(playerPed) then
return
end
inAction = true
if Pointing then
Pointing = false
end
if InHandsup then
return
end
if IsInActionWithErrorMessage({['IsProne'] = true}) then
return
end
IsProne = true
SetPedConfigFlag(playerPed, 48, true) -- CPED_CONFIG_FLAG_BlockWeaponSwitching
if GetPedStealthMovement(playerPed) ~= 0 then
SetPedStealthMovement(playerPed, false, 'DEFAULT_ACTION')
Wait(100)
end
LoadAnim('move_crawl')
LoadAnim('move_crawlprone2crawlfront')
if ShouldPlayerDiveToCrawl(playerPed) then
PlayAnimOnce(playerPed, 'explosions', 'react_blown_forwards', nil, 3.0)
Wait(1100)
elseif wasCrouched then
PlayAnimOnce(playerPed, 'amb@world_human_sunbathe@male@front@enter', 'enter', nil, nil, -1, 0.3)
Wait(1500)
else
PlayAnimOnce(playerPed, 'amb@world_human_sunbathe@male@front@enter', 'enter')
Wait(3000)
end
if CanPlayerCrouchCrawl(playerPed) and not IsEntityInWater(playerPed) then
PlayIdleCrawlAnim(playerPed, nil, 3.0)
end
TriggerEvent('crouch_crawl:onCrawl', true)
inAction = false
CreateThread(CrawlLoop)
end
-- Commands & KeyMapping --
if Config.CrouchEnabled then
if Config.CrouchKeybindEnabled then
RegisterKeyMapping('+crouch', Translate('register_crouch'), 'keyboard', Config.CrouchKeybind)
RegisterCommand('+crouch', function() CrouchKeyPressed() end, false)
RegisterCommand('-crouch', function() end, false) -- This needs to be here to prevent warnings in chat
end
RegisterCommand('crouch', function()
if not LocalPlayer.state.canEmote then return end
if isCrouched then
isCrouched = false
return
end
AttemptCrouch(PlayerPedId())
end, false)
TriggerEvent('chat:addSuggestion', '/crouch', Translate('crouch'))
end
if Config.CrawlEnabled then
if Config.CrawlKeybindEnabled then
RegisterKeyMapping('+crawl', Translate('register_crawl'), 'keyboard', Config.CrawlKeybind)
RegisterCommand('+crawl', function() CrawlKeyPressed() end, false)
RegisterCommand('-crawl', function() end, false) -- This needs to be here to prevent warnings in chat
end
RegisterCommand('crawl', function() CrawlKeyPressed() end, false)
TriggerEvent('chat:addSuggestion', '/crawl', Translate('crawl'))
end
---Returns if the player is crouched
---@return boolean
local function IsPlayerCrouched()
return isCrouched
end
CreateExport('IsPlayerCrouched', IsPlayerCrouched)
---Returns if the player is prone (both when laying still and when moving)
---@return boolean
local function IsPlayerProne()
return IsProne
end
CreateExport('IsPlayerProne', IsPlayerProne)
---Returns if the player is crawling (only when moving forward/backward)
---@return boolean
local function IsPlayerCrawling()
return isCrawling
end
CreateExport('IsPlayerCrawling', IsPlayerCrawling)
---Returns either "onfront" or "onback", this can be used to check if the player is on his back or on his stomach. NOTE: This will still return a string even if the player is not prone. Use IsPlayerProne() to check if the player is prone.
---@return string
local function GetPlayerProneType()
return proneType
end
CreateExport('GetPlayerProneType', GetPlayerProneType)
-- Useful to call if the player gets handcuffed etc.
CreateExport('StopPlayerProne', stopPlayerProne)

View file

@ -0,0 +1,895 @@
-- You probably shouldn't touch these.
IsInAnimation = false
CurrentAnimationName = nil
CurrentTextureVariation = nil
InHandsup = false
CONVERTED = false
local ChosenDict = ""
local CurrentAnimOptions = false
local PlayerGender = "male"
local PlayerProps = {}
local PreviewPedProps = {}
local PtfxNotif = false
local PtfxPrompt = false
local AnimationThreadStatus = false
local CheckStatus = false
local CanCancel = true
local InExitEmote = false
local ExitAndPlay = false
local EmoteCancelPlaying = false
local currentEmote = {}
local attachedProp
local scenarioObjects = {
`p_amb_coffeecup_01`,
`p_amb_joint_01`,
`p_cs_ciggy_01`,
`p_cs_ciggy_01b_s`,
`p_cs_clipboard`,
`prop_curl_bar_01`,
`p_cs_joint_01`,
`p_cs_joint_02`,
`prop_acc_guitar_01`,
`prop_amb_ciggy_01`,
`prop_amb_phone`,
`prop_beggers_sign_01`,
`prop_beggers_sign_02`,
`prop_beggers_sign_03`,
`prop_beggers_sign_04`,
`prop_bongos_01`,
`prop_cigar_01`,
`prop_cigar_02`,
`prop_cigar_03`,
`prop_cs_beer_bot_40oz_02`,
`prop_cs_paper_cup`,
`prop_cs_trowel`,
`prop_fib_clipboard`,
`prop_fish_slice_01`,
`prop_fishing_rod_01`,
`prop_fishing_rod_02`,
`prop_notepad_02`,
`prop_parking_wand_01`,
`prop_rag_01`,
`prop_scn_police_torch`,
`prop_sh_cigar_01`,
`prop_sh_joint_01`,
`prop_tool_broom`,
`prop_tool_hammer`,
`prop_tool_jackham`,
`prop_tennis_rack_01`,
`prop_weld_torch`,
`w_me_gclub`,
`p_amb_clipboard_01`
}
if not Config.AnimalEmotesEnabled then
RP.AnimalEmotes = {}
end
CreateThread(function()
LocalPlayer.state:set('canEmote', true, true)
end)
local function RunAnimationThread()
local pPed = PlayerPedId()
if AnimationThreadStatus then return end
AnimationThreadStatus = true
CreateThread(function()
local sleep
while AnimationThreadStatus and (IsInAnimation or PtfxPrompt) do
sleep = 500
if IsInAnimation then
sleep = 0
if IsPlayerAiming(pPed) then
EmoteCancel()
end
if not Config.AllowPunchingDuringEmote then
DisableControlAction(2, 140, true)
DisableControlAction(2, 141, true)
DisableControlAction(2, 142, true)
end
end
if PtfxPrompt and CurrentAnimOptions then
sleep = 0
if not PtfxNotif then
SimpleNotify(CurrentAnimOptions.PtfxInfo or Translate('ptfxinfo'))
PtfxNotif = true
end
if IsControlPressed(0, 47) then
PtfxStart()
Wait(CurrentAnimOptions.PtfxWait)
if CurrentAnimOptions.PtfxCanHold then
while IsControlPressed(0, 47) and IsInAnimation and AnimationThreadStatus do
Wait(5)
end
end
PtfxStop()
end
end
Wait(sleep)
end
end)
end
local function CheckStatusThread(dict, anim)
CreateThread(function()
if CheckStatus then
CheckStatus = false
Wait(10)
end
CheckStatus = true
while not IsEntityPlayingAnim(PlayerPedId(), dict, anim, 3) do
Wait(5)
end
while CheckStatus and IsInAnimation do
if not IsEntityPlayingAnim(PlayerPedId(), dict, anim, 3) then
DebugPrint("Animation ended")
DestroyAllProps()
EmoteCancel()
break
end
Wait(0)
end
end)
end
local function cleanScenarioObjects(isClone)
local ped = isClone and ClonedPed or PlayerPedId()
local playerCoords = GetEntityCoords(ped)
for i = 1, #scenarioObjects do
local deleteScenarioObject = GetClosestObjectOfType(playerCoords.x, playerCoords.y, playerCoords.z, 1.0,
scenarioObjects[i], false, true, true)
if DoesEntityExist(deleteScenarioObject) then
SetEntityAsMissionEntity(deleteScenarioObject, false, false)
DeleteObject(deleteScenarioObject)
end
end
end
function EmoteCancel(force)
LocalPlayer.state:set('currentEmote', nil, true)
EmoteCancelPlaying = true
if InExitEmote then
return
end
if not CanCancel and not force then return end
if ChosenDict == "MaleScenario" and IsInAnimation then
ClearPedTasksImmediately(PlayerPedId())
IsInAnimation = false
DebugPrint("Forced scenario exit")
elseif ChosenDict == "Scenario" and IsInAnimation then
ClearPedTasksImmediately(PlayerPedId())
IsInAnimation = false
DebugPrint("Forced scenario exit")
end
PtfxNotif = false
PtfxPrompt = false
Pointing = false
if IsInAnimation then
local ped = PlayerPedId()
if LocalPlayer.state.ptfx then
PtfxStop()
end
DetachEntity(ped, true, false)
CancelSharedEmote()
if CurrentAnimOptions and CurrentAnimOptions.ExitEmote then
local options = CurrentAnimOptions
local ExitEmoteType = options.ExitEmoteType or "Emotes"
if not RP[options.ExitEmote] then
DebugPrint("Exit emote was invalid")
IsInAnimation = false
ClearPedTasks(ped)
return
end
OnEmotePlay(options.ExitEmote)
DebugPrint("Playing exit animation")
local animationOptions = RP[options.ExitEmote].AnimationOptions
if animationOptions and animationOptions.EmoteDuration then
InExitEmote = true
SetTimeout(animationOptions.EmoteDuration, function()
InExitEmote = false
DestroyAllProps()
ClearPedTasks(ped)
EmoteCancelPlaying = false
end)
return
end
else
IsInAnimation = false
ClearPedTasks(ped)
EmoteCancelPlaying = false
end
DestroyAllProps()
end
cleanScenarioObjects(false)
AnimationThreadStatus = false
CheckStatus = false
end
function EmoteMenuStart(name, category, textureVariation)
local emote = RP[name]
if not emote then
return
end
if emote.category ~= category then
DebugPrint("Emote category mismatch : " .. emote.category .. " vs " .. category)
return
end
if category == "Expressions" then
SetPlayerPedExpression(name, true)
return
end
if emote.category == "AnimalEmotes" then
CheckAnimalAndOnEmotePlay(name)
return
end
OnEmotePlay(name, textureVariation)
end
function EmoteMenuStartClone(name, category)
if not Config.PreviewPed then return end
if not DoesEntityExist(ClonedPed) then return end
local emote = RP[name]
if not emote then
return
end
if emote.category ~= category then
DebugPrint("Emote category mismatch : " .. emote.category .. " vs " .. category)
return
end
if category == "Expressions" then
SetFacialIdleAnimOverride(ClonedPed, emote[1], true)
return
end
OnEmotePlayClone(name)
end
function EmoteCommandStart(args)
if #args > 0 then
if IsEntityDead(PlayerPedId()) or IsPedRagdoll(PlayerPedId()) or IsPedGettingUp(PlayerPedId()) or IsPedInMeleeCombat(PlayerPedId()) then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
multiline = true,
args = { "RPEmotes", Translate('dead') }
})
return
end
if (IsPedSwimming(PlayerPedId()) or IsPedSwimmingUnderWater(PlayerPedId())) and not Config.AllowInWater then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0 },
multiline = true,
args = { "RPEmotes", Translate('swimming') }
})
return
end
local name = string.lower(args[1])
if name == "c" then
if IsInAnimation then
EmoteCancel()
else
EmoteChatMessage(Translate('nocancel'))
end
return
end
local emote = RP[name]
if emote then
if emote.category == "AnimalEmotes" then
if Config.AnimalEmotesEnabled then
CheckAnimalAndOnEmotePlay(name)
else
EmoteChatMessage(Translate('animaldisabled'))
end
return
end
if emote.category == "PropEmotes" and emote.AnimationOptions.PropTextureVariations then
if #args > 1 then
local textureVariation = tonumber(args[2])
if emote.AnimationOptions.PropTextureVariations[textureVariation] then
OnEmotePlay(name, textureVariation - 1)
return
else
local str = ""
for k, v in ipairs(emote.AnimationOptions.PropTextureVariations) do
str = str .. string.format("\n(%s) - %s", k, v.Name)
end
EmoteChatMessage(string.format(Translate('invalidvariation'), str), true)
OnEmotePlay(name, 0)
return
end
end
end
OnEmotePlay(name)
else
EmoteChatMessage("'" .. name .. "' " .. Translate('notvalidemote') .. "")
end
end
end
function CheckAnimalAndOnEmotePlay(name)
local playerPed = PlayerPedId()
local isValidPet = false
if string.sub(name, 1, 4) == "bdog" then
for _, model in ipairs(BigDogs) do
if IsPedModel(playerPed, GetHashKey(model)) then
isValidPet = true
break
end
end
elseif string.sub(name, 1, 4) == "sdog" then
for _, model in ipairs(SmallDogs) do
if IsPedModel(playerPed, GetHashKey(model)) then
isValidPet = true
break
end
end
end
if isValidPet then
OnEmotePlay(name)
else
EmoteChatMessage(Translate('notvalidpet'))
end
end
---@param isClone? boolean
function DestroyAllProps(isClone)
if isClone then
for _, v in pairs(PreviewPedProps) do
DeleteEntity(v)
end
PreviewPedProps = {}
else
for _, v in pairs(PlayerProps) do
DeleteEntity(v)
end
PlayerProps = {}
end
DebugPrint("Destroyed Props for " .. (isClone and "clone" or "player"))
end
---@param data table
---@return boolean
function AddProp(data)
assert(data.prop1, 'no prop1 passed')
assert(data.bone, 'no bone passed')
data.off1 = data.off1 or 0.0
data.off2 = data.off2 or 0.0
data.off3 = data.off3 or 0.0
data.rot1 = data.rot1 or 0.0
data.rot2 = data.rot2 or 0.0
data.rot3 = data.rot3 or 0.0
assert(data.noCollision == nil or type(data.noCollision) == "boolean", 'noCollision must be a boolean')
local target = data.isClone and ClonedPed or PlayerPedId()
local x, y, z = table.unpack(GetEntityCoords(target))
if not IsModelValid(data.prop1) then
DebugPrint(tostring(data.prop1) .. " is not a valid model!")
return false
end
LoadPropDict(data.prop1)
attachedProp = CreateObject(GetHashKey(data.prop1), x, y, z + 0.2, not data.isClone, true, true)
if data.textureVariation ~= nil then
SetObjectTextureVariation(attachedProp, data.textureVariation)
end
if data.noCollision then
SetEntityCollision(attachedProp, false, false)
end
AttachEntityToEntity(attachedProp, target, GetPedBoneIndex(target, data.bone), data.off1, data.off2, data.off3, data.rot1, data.rot2, data.rot3,
true, true, false, true, 1, true)
if data.isClone then
table.insert(PreviewPedProps, attachedProp)
else
table.insert(PlayerProps, attachedProp)
end
SetModelAsNoLongerNeeded(data.prop1)
DebugPrint("Added prop to " .. (data.isClone and "clone" or "player"))
return true
end
function CheckGender()
PlayerGender = "male"
if GetEntityModel(PlayerPedId()) == GetHashKey("mp_f_freemode_01") then
PlayerGender = "female"
end
DebugPrint("Set gender to " .. PlayerGender)
end
RegisterNetEvent('animations:ToggleCanDoAnims', function(value)
LocalPlayer.state:set('canEmote', value, true)
end)
function OnEmotePlay(name, textureVariation)
local emoteData = RP[name]
if not emoteData then
EmoteChatMessage("'" .. name .. "' " .. Translate('notvalidemote') .. "")
return
end
if not LocalPlayer.state.canEmote then return end
if not DoesEntityExist(PlayerPedId()) then
return false
end
cleanScenarioObjects(false)
InVehicle = IsPedInAnyVehicle(PlayerPedId(), true)
Pointing = false
if not Config.AllowEmoteInVehicle and InVehicle then
return
end
if Config.AdultEmotesDisabled and emoteData.AdultAnimation then
return EmoteChatMessage(Translate('adultemotedisabled'))
end
if InExitEmote then
return false
end
if Config.CancelPreviousEmote and IsInAnimation and not ExitAndPlay and not EmoteCancelPlaying then
ExitAndPlay = true
DebugPrint("Canceling previous emote and playing next emote")
PlayExitAndEnterEmote(name, textureVariation)
return
end
local animOption = emoteData.AnimationOptions
if InVehicle then
if animOption and animOption.NotInVehicle then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
elseif animOption and animOption.onlyInVehicle then
return EmoteChatMessage(Translate('in_a_vehicle'))
end
if CurrentAnimOptions and CurrentAnimOptions.ExitEmote and animOption and animOption.ExitEmote then
if not (animOption and CurrentAnimOptions.ExitEmote == animOption.ExitEmote) and RP[CurrentAnimOptions.ExitEmote][2] ~= emoteData[2] then
return
end
end
if IsInActionWithErrorMessage() then
return false
end
ChosenDict = emoteData[1]
local anim = emoteData[2]
CurrentAnimationName = name
LocalPlayer.state:set('currentEmote', name, true)
CurrentTextureVariation = textureVariation
CurrentAnimOptions = animOption
if Config.DisarmPlayerOnEmote then
if IsPedArmed(PlayerPedId(), 7) then
SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
end
end
if animOption and animOption.Prop then
DestroyAllProps()
end
if ChosenDict == "MaleScenario" or ChosenDict == "Scenario" or ChosenDict == "ScenarioObject" then
if InVehicle then return end
CheckGender()
ClearPedTasks(PlayerPedId())
DestroyAllProps()
if ChosenDict == "MaleScenario" then
if PlayerGender == "male" then
TaskStartScenarioInPlace(PlayerPedId(), anim, 0, true)
DebugPrint("Playing scenario = (" .. anim .. ")")
else
EmoteCancel()
EmoteChatMessage(Translate('maleonly'))
return
end
elseif ChosenDict == "ScenarioObject" then
local BehindPlayer = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, -0.5, -0.5)
TaskStartScenarioAtPosition(PlayerPedId(), anim, BehindPlayer.x, BehindPlayer.y, BehindPlayer.z, GetEntityHeading(PlayerPedId()), 0, true, false)
DebugPrint("Playing scenario = (" .. anim .. ")")
else
TaskStartScenarioInPlace(PlayerPedId(), anim, 0, true)
DebugPrint("Playing scenario = (" .. anim .. ")")
end
IsInAnimation = true
RunAnimationThread()
return
end
-- Small delay at the start
if animOption and animOption.StartDelay then
Wait(animOption.StartDelay)
end
if not LoadAnim(ChosenDict) then
EmoteChatMessage("'" .. name .. "' " .. Translate('notvalidemote') .. "")
return
end
local movementType = 0
if InVehicle then
if animOption and animOption.FullBody then
movementType = 35
else
movementType = 51
end
elseif animOption then
if animOption.EmoteMoving then
movementType = 51
elseif animOption.EmoteLoop then
movementType = 1
elseif animOption.EmoteStuck then
movementType = 50
end
end
DebugPrint("Animation flag = (" .. movementType .. ")")
if animOption then
if animOption.PtfxAsset then
Ptfx1, Ptfx2, Ptfx3, Ptfx4, Ptfx5, Ptfx6, PtfxScale = table.unpack(animOption.PtfxPlacement)
PtfxNotif = false
PtfxPrompt = true
RunAnimationThread()
TriggerServerEvent("rpemotes:ptfx:sync", animOption.PtfxAsset, animOption.PtfxName, vector3(Ptfx1, Ptfx2, Ptfx3),
vector3(Ptfx4, Ptfx5, Ptfx6), animOption.PtfxBone, PtfxScale, animOption.PtfxColor)
else
PtfxPrompt = false
end
end
if IsPedUsingAnyScenario(PlayerPedId()) or IsPedActiveInScenario(PlayerPedId()) then
ClearPedTasksImmediately(PlayerPedId())
end
TaskPlayAnim(PlayerPedId(), ChosenDict, anim, animOption?.BlendInSpeed or 5.0, animOption?.BlendOutSpeed or 5.0, animOption?.EmoteDuration or -1, animOption?.Flag or movementType, 0, false, false,
false)
RemoveAnimDict(ChosenDict)
IsInAnimation = true
RunAnimationThread()
if not (animOption and animOption.Prop) then
CheckStatusThread(ChosenDict, anim)
end
local currentEmoteTable = emoteData
for _, tabledata in pairs(RP) do
for command, emotedata in pairs(tabledata) do
if emotedata == emoteData then
table.insert(currentEmoteTable, command)
break
end
end
end
currentEmote = currentEmoteTable
if animOption and animOption.Prop then
PropPl1, PropPl2, PropPl3, PropPl4, PropPl5, PropPl6 = table.unpack(animOption.PropPlacement)
Wait(animOption and animOption.EmoteDuration or 0)
if not AddProp({
prop1 = animOption.Prop,
bone = animOption.PropBone,
off1 = PropPl1, off2 = PropPl2, off3 = PropPl3,
rot1 = PropPl4, rot2 = PropPl5, rot3 = PropPl6,
textureVariation = textureVariation,
isClone = false,
noCollision = animOption.PropNoCollision
}) then return end
if animOption.SecondProp then
SecondPropPl1, SecondPropPl2, SecondPropPl3, SecondPropPl4, SecondPropPl5, SecondPropPl6 = table.unpack(animOption.SecondPropPlacement)
if not AddProp({
prop1 = animOption.SecondProp,
bone = animOption.SecondPropBone,
off1 = SecondPropPl1, off2 = SecondPropPl2, off3 = SecondPropPl3,
rot1 = SecondPropPl4, rot2 = SecondPropPl5, rot3 = SecondPropPl6,
textureVariation = textureVariation,
isClone = false,
noCollision = animOption.SecondPropNoCollision
}) then
DestroyAllProps()
return
end
end
-- Ptfx is on the prop, then we need to sync it
if not animOption then return end
if animOption.PtfxAsset and not animOption.PtfxNoProp then
TriggerServerEvent("rpemotes:ptfx:syncProp", ObjToNet(attachedProp))
end
end
end
function OnEmotePlayClone(name)
if not Config.PreviewPed then return end
cleanScenarioObjects(true)
if not DoesEntityExist(ClonedPed) then
return false
end
if InExitEmote then
return false
end
if Config.CancelPreviousEmote and not ExitAndPlay and not EmoteCancelPlaying then
ExitAndPlay = true
DebugPrint("Canceling previous emote and playing next emote")
return
end
local emoteData = RP[name]
local animOption = emoteData.AnimationOptions
local dict, anim = table.unpack(emoteData)
if animOption and animOption.Prop then
DestroyAllProps(true)
end
if dict == "MaleScenario" or dict == "Scenario" or dict == "ScenarioObject" then
CheckGender()
ClearPedTasks(ClonedPed)
DestroyAllProps(true)
if dict == "MaleScenario" then
if PlayerGender == "male" then
TaskStartScenarioInPlace(ClonedPed, anim, 0, true)
end
elseif dict == "ScenarioObject" then
local BehindPlayer = GetOffsetFromEntityInWorldCoords(ClonedPed, 0.0, -0.5, -0.5)
TaskStartScenarioAtPosition(ClonedPed, anim, BehindPlayer.x, BehindPlayer.y, BehindPlayer.z, GetEntityHeading(ClonedPed), 0, true, false)
elseif dict == "Scenario" then
TaskStartScenarioInPlace(ClonedPed, anim, 0, true)
end
return
end
if not LoadAnim(dict) then
EmoteChatMessage("'" .. name .. "' " .. Translate('notvalidemote') .. "")
return
end
local movementType = 0
if animOption then
if animOption.EmoteMoving then
movementType = 51
elseif animOption.EmoteLoop then
movementType = 1
elseif animOption.EmoteStuck then
movementType = 50
end
end
if IsPedUsingAnyScenario(ClonedPed) or IsPedActiveInScenario(ClonedPed) then
ClearPedTasksImmediately(ClonedPed)
end
TaskPlayAnim(ClonedPed, dict, anim, 5.0, 5.0, animOption and animOption.EmoteDuration or -1, animOption?.Flag or movementType, 0, false, false, false)
RemoveAnimDict(dict)
if animOption and animOption.Prop then
local PropPl1, PropPl2, PropPl3, PropPl4, PropPl5, PropPl6 = table.unpack(animOption.PropPlacement)
Wait(animOption and animOption.EmoteDuration or 0)
if not AddProp({
prop1 = animOption.Prop,
bone = animOption.PropBone,
off1 = PropPl1, off2 = PropPl2, off3 = PropPl3,
rot1 = PropPl4, rot2 = PropPl5, rot3 = PropPl6,
isClone = true,
noCollision = animOption.PropNoCollision
}) then return end
if animOption.SecondProp then
local SecondPropPl1, SecondPropPl2, SecondPropPl3, SecondPropPl4, SecondPropPl5, SecondPropPl6 = table.unpack(animOption.SecondPropPlacement)
if not AddProp({
prop1 = animOption.SecondProp,
bone = animOption.SecondPropBone,
off1 = SecondPropPl1, off2 = SecondPropPl2, off3 = SecondPropPl3,
rot1 = SecondPropPl4, rot2 = SecondPropPl5, rot3 = SecondPropPl6,
isClone = true,
noCollision = animOption.SecondPropNoCollision
}) then
DestroyAllProps(true)
return
end
end
end
end
function PlayExitAndEnterEmote(name, textureVariation)
local ped = PlayerPedId()
if not CanCancel then return end
if ChosenDict == "MaleScenario" and IsInAnimation then
ClearPedTasksImmediately(ped)
IsInAnimation = false
DebugPrint("Forced scenario exit")
elseif ChosenDict == "Scenario" and IsInAnimation then
ClearPedTasksImmediately(ped)
IsInAnimation = false
DebugPrint("Forced scenario exit")
end
PtfxNotif = false
PtfxPrompt = false
Pointing = false
if LocalPlayer.state.ptfx then
PtfxStop()
end
DetachEntity(ped, true, false)
CancelSharedEmote()
if CurrentAnimOptions?.ExitEmote then
local options = CurrentAnimOptions or {}
if not RP[options.ExitEmote] then
DebugPrint("Exit emote was invalid")
ClearPedTasks(ped)
IsInAnimation = false
return
end
OnEmotePlay(options.ExitEmote)
DebugPrint("Playing exit animation")
local animationOptions = RP[options.ExitEmote].AnimationOptions
if animationOptions and animationOptions.EmoteDuration then
InExitEmote = true
SetTimeout(animationOptions.EmoteDuration, function()
InExitEmote = false
DestroyAllProps(true)
ClearPedTasks(ped)
OnEmotePlay(name, textureVariation)
ExitAndPlay = false
end)
return
end
else
ClearPedTasks(ped)
IsInAnimation = false
ExitAndPlay = false
DestroyAllProps(true)
OnEmotePlay(name, CurrentTextureVariation)
end
end
RegisterNetEvent('animations:client:EmoteCommandStart', function(args)
EmoteCommandStart(args)
end)
CreateExport("EmoteCommandStart", function(emoteName, textureVariation)
EmoteCommandStart({ emoteName, textureVariation })
end)
CreateExport("EmoteCancel", EmoteCancel)
CreateExport("CanCancelEmote", function(State)
CanCancel = State == true
end)
CreateExport('IsPlayerInAnim', function()
return LocalPlayer.state.currentEmote
end)
CreateExport('getCurrentEmote', function()
return currentEmote
end)
-- Door stuff
local openingDoor = false
AddEventHandler('CEventOpenDoor', function(unk1)
if unk1[1] ~= PlayerPedId() then return end
if ShowPed then
return
end
if not IsInAnimation then
return
end
if openingDoor then
return
end
openingDoor = true
while IsPedOpeningADoor(PlayerPedId()) do
Wait(100)
end
openingDoor = false
Wait(200)
ClearPedTasks(PlayerPedId())
DestroyAllProps()
OnEmotePlay(CurrentAnimationName, CurrentTextureVariation)
end)
local isBumpingPed = false
local timeout = 500
AddEventHandler("CEventPlayerCollisionWithPed", function(unk1)
if unk1[1] ~= PlayerPedId() then return end
if not IsInAnimation then
return
end
if isBumpingPed then
timeout = 500
return
end
isBumpingPed = true
timeout = 500
-- We wait a bit to avoid collision with the ped resetting the animation again
while timeout > 0 do
Wait(100)
timeout = timeout - 100
end
if not IsInAnimation then
return
end
isBumpingPed = false
ClearPedTasks(PlayerPedId())
Wait(125)
DestroyAllProps()
OnEmotePlay(CurrentAnimationName, CurrentTextureVariation)
end)
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
local ped = PlayerPedId()
ClosePedMenu()
DestroyAllProps()
ClearPedTasksImmediately(ped)
DetachEntity(ped, true, false)
ResetPedMovementClipset(ped, 0.8)
end)

View file

@ -0,0 +1,521 @@
local isSearching = false
local rightPosition = { x = 1430, y = 200 }
local leftPosition = { x = 0, y = 200 }
local menuPosition = { x = 0, y = 200 }
local menuHeader = "shopui_title_sm_hangar"
if GetAspectRatio() > 2.0 then
rightPosition = { x = 1200, y = 100 }
leftPosition = { x = -250, y = 100 }
end
if Config.MenuPosition then
if Config.MenuPosition == "left" then
menuPosition = leftPosition
elseif Config.MenuPosition == "right" then
menuPosition = rightPosition
end
end
if Config.CustomMenuEnabled then
local txd = CreateRuntimeTxd('Custom_Menu_Head')
CreateRuntimeTextureFromImage(txd, 'Custom_Menu_Head', 'header.png')
menuHeader = "Custom_Menu_Head"
end
local _menuPool = NativeUI.CreatePool()
local mainMenu = NativeUI.CreateMenu(Config.MenuTitle or "", "", menuPosition["x"], menuPosition["y"], menuHeader, menuHeader)
_menuPool:Add(mainMenu)
local sharemenu, shareddancemenu, infomenu
local EmoteTable = {}
local DanceTable = {}
local AnimalTable = {}
local PropTable = {}
local WalkTable = {}
local FaceTable = {}
local ShareTable = {}
function AddEmoteMenu(menu)
local submenu = _menuPool:AddSubMenu(menu, Translate('emotes'), "", true, true)
if Config.Search then
submenu:AddItem(NativeUI.CreateItem(Translate('searchemotes'), ""))
table.insert(EmoteTable, Translate('searchemotes'))
end
local dancemenu = _menuPool:AddSubMenu(submenu, Translate('danceemotes'), "", true, true)
local animalmenu
if Config.AnimalEmotesEnabled then
animalmenu = _menuPool:AddSubMenu(submenu, Translate('animalemotes'), "", true, true)
table.insert(EmoteTable, Translate('animalemotes'))
end
local propmenu = _menuPool:AddSubMenu(submenu, Translate('propemotes'), "", true, true)
table.insert(EmoteTable, Translate('danceemotes'))
table.insert(EmoteTable, Translate('danceemotes'))
if Config.SharedEmotesEnabled then
sharemenu = _menuPool:AddSubMenu(submenu, Translate('shareemotes'),
Translate('shareemotesinfo'), true, true)
shareddancemenu = _menuPool:AddSubMenu(sharemenu, Translate('sharedanceemotes'), "", true, true)
table.insert(ShareTable, 'none')
table.insert(EmoteTable, Translate('shareemotes'))
end
if Config.Keybinding then
table.insert(EmoteTable, "keybinds")
submenu:AddItem(NativeUI.CreateItem(Translate('keybinds'), Translate('keybindsinfo') .. " /emotebind [~y~num4-9~w~] [~g~emotename~w~]"))
end
for a, b in PairsByKeys(RP.Emotes) do
local x, y, z = table.unpack(b)
submenu:AddItem(NativeUI.CreateItem(z, "/e (" .. a .. ")"))
table.insert(EmoteTable, a)
end
for a, b in PairsByKeys(RP.Dances) do
local name = '🤼 ' .. b[3]
dancemenu:AddItem(NativeUI.CreateItem(name, "/e (" .. a .. ")"))
if Config.SharedEmotesEnabled then
shareddancemenu:AddItem(NativeUI.CreateItem(name, "/nearby (" .. a .. ")"))
end
table.insert(DanceTable, a)
end
if Config.AnimalEmotesEnabled then
for a, b in PairsByKeys(RP.AnimalEmotes) do
local name = '🐶 ' .. b[3]
animalmenu:AddItem(NativeUI.CreateItem(name, "/e (" .. a .. ")"))
table.insert(AnimalTable, a)
end
end
if Config.SharedEmotesEnabled then
for a, b in PairsByKeys(RP.Shared) do
local name = b[3]
local shareitem = NativeUI.CreateItem(name, "/nearby (~g~" .. a .. "~w~)" .. (otheremotename and " " .. Translate('makenearby') .. " (~y~" .. otheremotename .. "~w~)" or ""))
sharemenu:AddItem(shareitem)
table.insert(ShareTable, a)
end
end
for a, b in PairsByKeys(RP.PropEmotes) do
local name = '📦 ' .. b[3]
local propitem = b.AnimationOptions.PropTextureVariations and
NativeUI.CreateListItem(name, b.AnimationOptions.PropTextureVariations, 1, "/e (" .. a .. ")") or
NativeUI.CreateItem(name, "/e (" .. a .. ")")
propmenu:AddItem(propitem)
table.insert(PropTable, a)
end
-- Ped Emote on Change Index
dancemenu.OnIndexChange = function(_, newindex)
ClearPedTaskPreview()
EmoteMenuStartClone(DanceTable[newindex], "Dances")
end
propmenu.OnIndexChange = function(_, newindex)
ClearPedTaskPreview()
EmoteMenuStartClone(PropTable[newindex], "PropEmotes")
end
submenu.OnIndexChange = function(_, newindex)
if newindex > 5 then
ClearPedTaskPreview()
EmoteMenuStartClone(EmoteTable[newindex], "Emotes")
end
end
dancemenu.OnMenuClosed = function()
ClearPedTaskPreview()
end
dancemenu.OnItemSelect = function(_, _, index)
EmoteMenuStart(DanceTable[index], "Dances")
end
if Config.AnimalEmotesEnabled then
animalmenu.OnItemSelect = function(_, _, index)
EmoteMenuStart(AnimalTable[index], "AnimalEmotes")
end
end
if Config.SharedEmotesEnabled then
sharemenu.OnItemSelect = function(_, _, index)
if ShareTable[index] ~= 'none' then
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), ShareTable[index])
SimpleNotify(Translate('sentrequestto') .. GetPlayerName(target))
else
SimpleNotify(Translate('nobodyclose'))
end
end
end
shareddancemenu.OnItemSelect = function(_, _, index)
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), DanceTable[index], 'Dances')
SimpleNotify(Translate('sentrequestto') .. GetPlayerName(target))
else
SimpleNotify(Translate('nobodyclose'))
end
end
end
propmenu.OnItemSelect = function(_, _, index)
EmoteMenuStart(PropTable[index], "PropEmotes")
end
propmenu.OnListSelect = function(_, item, itemIndex, listIndex)
EmoteMenuStart(PropTable[itemIndex], "PropEmotes", item:IndexToItem(listIndex).Value)
end
submenu.OnItemSelect = function(_, _, index)
if Config.Search and EmoteTable[index] == Translate('searchemotes') then
EmoteMenuSearch(submenu)
else
EmoteMenuStart(EmoteTable[index], "Emotes")
end
end
submenu.OnMenuClosed = function()
if not isSearching then
ClosePedMenu()
end
end
end
if Config.Search then
local ignoredCategories = {
["Walks"] = true,
["Expressions"] = true,
["Shared"] = not Config.SharedEmotesEnabled
}
function EmoteMenuSearch(lastMenu)
ClosePedMenu()
AddTextEntry("PM_NAME_CHALL", Translate('searchinputtitle'))
DisplayOnscreenKeyboard(1, "PM_NAME_CHALL", "", "", "", "", "", 30)
while UpdateOnscreenKeyboard() == 0 do
DisableAllControlActions(0)
Wait(100)
end
local input = GetOnscreenKeyboardResult()
if input ~= nil then
local results = {}
for a, b in pairs(RP) do
if not ignoredCategories[b.category] then
if string.find(string.lower(a), string.lower(input)) or (b[3] ~= nil and string.find(string.lower(b[3]), string.lower(input))) then
table.insert(results, { table = b.category, name = a, data = b })
end
end
end
if #results > 0 then
isSearching = true
local searchMenu = _menuPool:AddSubMenu(lastMenu, string.format('%s '..Translate('searchmenudesc')..' ~r~%s~w~', #results, input), "", true, true)
local sharedDanceMenu
if Config.SharedEmotesEnabled then
sharedDanceMenu = _menuPool:AddSubMenu(searchMenu, Translate('sharedanceemotes'), "", true, true)
end
table.sort(results, function(a, b) return a.name < b.name end)
for k, v in pairs(results) do
local desc = ""
if v.table == "Shared" then
local otheremotename = v.data[4]
if otheremotename == nil then
desc = "/nearby (~g~" .. v.name .. "~w~)"
else
desc = "/nearby (~g~" .. v.name .. "~w~) " .. Translate('makenearby') .. " (~y~" .. otheremotename .. "~w~)"
end
else
desc = "/e (" .. v.name .. ")"
end
if v.data.AnimationOptions and v.data.AnimationOptions.PropTextureVariations then
searchMenu:AddItem(NativeUI.CreateListItem(v.data[3], v.data.AnimationOptions.PropTextureVariations, 1, desc))
else
searchMenu:AddItem(NativeUI.CreateItem(v.data[3], desc))
end
if v.table == "Dances" and Config.SharedEmotesEnabled then
sharedDanceMenu:AddItem(NativeUI.CreateItem(v.data[3], ""))
end
end
searchMenu.OnMenuChanged = function()
isSearching = false
ShowPedMenu()
end
searchMenu.OnIndexChange = function(_, newindex)
local data = results[newindex]
ClearPedTaskPreview()
EmoteMenuStartClone(data.name, data.data.category)
end
searchMenu.OnItemSelect = function(_, _, index)
local data = results[index]
if data == Translate('sharedanceemotes') then return end
if data.table == "Shared" then
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), data.name)
SimpleNotify(Translate('sentrequestto') .. GetPlayerName(target))
else
SimpleNotify(Translate('nobodyclose'))
end
else
EmoteMenuStart(data.name, data.data.category)
end
end
searchMenu.OnListSelect = function(_, item, itemIndex, listIndex)
EmoteMenuStart(results[itemIndex].name, "PropEmotes", item:IndexToItem(listIndex).Value)
end
if Config.SharedEmotesEnabled then
if #sharedDanceMenu.Items > 0 then
table.insert(results, 1, Translate('sharedanceemotes'))
sharedDanceMenu.OnItemSelect = function(_, _, index)
if not LocalPlayer.state.canEmote then return end
local data = results[index]
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), data.name, 'Dances')
SimpleNotify(Translate('sentrequestto') .. GetPlayerName(target))
else
SimpleNotify(Translate('nobodyclose'))
end
end
else
sharedDanceMenu:Clear()
searchMenu:RemoveItemAt(1)
end
end
searchMenu.OnMenuClosed = function()
searchMenu:Clear()
lastMenu:RemoveItemAt(#lastMenu.Items)
_menuPool:RefreshIndex()
results = {}
end
_menuPool:RefreshIndex()
_menuPool:CloseAllMenus()
searchMenu:Visible(true)
ShowPedMenu()
else
SimpleNotify(string.format(Translate('searchnoresult')..' ~r~%s~w~', input))
end
end
end
end
function AddCancelEmote(menu)
local newitem = NativeUI.CreateItem(Translate('cancelemote'), Translate('cancelemoteinfo'))
menu:AddItem(newitem)
newitem.Activated = function()
EmoteCancel()
DestroyAllProps()
end
end
ShowPedPreview = function(menu)
menu.OnItemSelect = function(_, _, index)
if index == 1 then
isSearching = false
ShowPedMenu()
elseif index == 4 then
ShowPedMenu(true)
end
end
end
function AddWalkMenu(menu)
local submenu = _menuPool:AddSubMenu(menu, Translate('walkingstyles'), "", true, true)
local walkreset = NativeUI.CreateItem(Translate('normalreset'), Translate('resetdef'))
submenu:AddItem(walkreset)
table.insert(WalkTable, Translate('resetdef'))
local sortedWalks = {}
for a, b in PairsByKeys(RP.Walks) do
if b[1] == "move_m@injured" then
table.insert(sortedWalks, 1, {label = a, anim = b[1]})
else
table.insert(sortedWalks, {label = a, anim = b[1]})
end
end
for _, walk in ipairs(sortedWalks) do
submenu:AddItem(NativeUI.CreateItem(walk.label, "/walk (" .. string.lower(walk.label) .. ")"))
table.insert(WalkTable, walk.label)
end
submenu.OnItemSelect = function(_, item, index)
if item == walkreset then
ResetWalk()
DeleteResourceKvp("walkstyle")
else
WalkMenuStart(WalkTable[index])
end
end
end
function AddFaceMenu(menu)
local submenu = _menuPool:AddSubMenu(menu, Translate('moods'), "", true, true)
local facereset = NativeUI.CreateItem(Translate('normalreset'), Translate('resetdef'))
submenu:AddItem(facereset)
table.insert(FaceTable, "")
for name, data in PairsByKeys(RP.Expressions) do
local faceitem = NativeUI.CreateItem(data[2] or name, "")
submenu:AddItem(faceitem)
table.insert(FaceTable, name)
end
submenu.OnIndexChange = function(_, newindex)
EmoteMenuStartClone(FaceTable[newindex], "Expressions")
end
submenu.OnItemSelect = function(_, item, index)
if item == facereset then
DeleteResourceKvp("Expressions")
ClearFacialIdleAnimOverride(PlayerPedId())
else
EmoteMenuStart(FaceTable[index], "Expressions")
end
end
submenu.OnMenuClosed = function()
ClosePedMenu()
end
end
function AddInfoMenu(menu)
infomenu = _menuPool:AddSubMenu(menu, Translate('infoupdate'), "~h~~y~The RPEmotes Developers~h~~y~", true, true)
for _,v in ipairs(Config.Credits) do
local item = NativeUI.CreateItem(v.title,v.subtitle or "")
infomenu:AddItem(item)
end
end
function OpenEmoteMenu()
if IsEntityDead(PlayerPedId()) then
-- show in chat
TriggerEvent('chat:addMessage', {
color = {255, 0, 0},
multiline = true,
args = {"RPEmotes", Translate('dead')}
})
return
end
if (IsPedSwimming(PlayerPedId()) or IsPedSwimmingUnderWater(PlayerPedId())) and not Config.AllowInWater then
-- show in chat
TriggerEvent('chat:addMessage', {
color = {255, 0, 0},
multiline = true,
args = {"RPEmotes", Translate('swimming')}
})
return
end
if _menuPool:IsAnyMenuOpen() then
_menuPool:CloseAllMenus()
else
mainMenu:Visible(true)
ProcessMenu()
end
end
CreateThread(function()
LoadAddonEmotes()
AddEmoteMenu(mainMenu)
AddCancelEmote(mainMenu)
if Config.PreviewPed then
ShowPedPreview(mainMenu)
end
if Config.WalkingStylesEnabled then
AddWalkMenu(mainMenu)
end
if Config.ExpressionsEnabled then
AddFaceMenu(mainMenu)
end
AddInfoMenu(mainMenu)
_menuPool:RefreshIndex()
local newRP = {}
for emoteType, content in pairs(RP) do
for emoteName, emoteData in pairs(content) do
local shouldRemove = false
if Config.AdultEmotesDisabled and emoteData.AdultAnimation then
shouldRemove = true
end
if newRP[emoteName] then
print('WARNING - Duplicate emote name found: ' .. emoteName .. ' in ' .. emoteType .. ' and ' .. newRP[emoteName].category)
end
if shouldRemove then
elseif type(emoteData) == "table" then
newRP[emoteName] = {}
for k, v in pairs(emoteData) do
newRP[emoteName][k] = v
end
newRP[emoteName].category = emoteType
else
newRP[emoteName] = { emoteData }
newRP[emoteName].category = emoteType
end
end
newRP[emoteType] = nil
end
RP = newRP
CONVERTED = true
end)
local isMenuProcessing = false
function ProcessMenu()
if isMenuProcessing then return end
isMenuProcessing = true
while _menuPool:IsAnyMenuOpen() do
_menuPool:ProcessMenus()
Wait(0)
end
isMenuProcessing = false
end
-- While ped is dead, don't show menus
CreateThread(function()
while true do
Wait(500)
if IsEntityDead(PlayerPedId()) then
_menuPool:CloseAllMenus()
end
if (IsPedSwimming(PlayerPedId()) or IsPedSwimmingUnderWater(PlayerPedId())) and not Config.AllowInWater then
-- cancel emote, destroy props and close menu
if IsInAnimation then
EmoteCancel()
end
_menuPool:CloseAllMenus()
end
end
end)

View file

@ -0,0 +1,50 @@
function SetPlayerPedExpression(expression, saveToKvp)
local emote = RP[expression]
if emote and emote.category == "Expressions" then
SetFacialIdleAnimOverride(PlayerPedId(), emote[1], 0)
if Config.PersistentExpression and saveToKvp then SetResourceKvp("expression", emote[1]) end
else
ClearFacialIdleAnimOverride(PlayerPedId())
DeleteResourceKvp("expression")
end
end
if Config.ExpressionsEnabled then
RegisterCommand('mood', function(_source, args, _raw)
local expression = FirstToUpper(string.lower(args[1]))
local emote = RP[expression]
if emote and emote.category == "Expressions" then
SetPlayerPedExpression(RP[expression][1], true)
elseif expression == "Reset" then
ClearFacialIdleAnimOverride(PlayerPedId())
DeleteResourceKvp("expression")
else
EmoteChatMessage("'" .. expression .. "' is not a valid mood")
end
end, false)
TriggerEvent('chat:addSuggestion', '/mood', 'Set your current mood/expression.',
{ { name = "expression", help = "/moods for a list of valid moods" } })
TriggerEvent('chat:addSuggestion', '/moods', 'List available walking moods/expressions.')
local function LoadPersistentExpression()
local expression = GetResourceKvpString("expression")
if expression then
Wait(2500)
SetPlayerPedExpression(expression, false)
end
end
if Config.PersistentExpression then
AddEventHandler('playerSpawned', LoadPersistentExpression)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', LoadPersistentExpression)
RegisterNetEvent('esx:playerLoaded', LoadPersistentExpression)
end
AddEventHandler('onResourceStart', function(resource)
if resource == GetCurrentResourceName() then
LoadPersistentExpression()
end
end)
end

View file

@ -0,0 +1,86 @@
local function HandsUpLoop()
CreateThread(function()
while InHandsup do
if Config.DisabledHandsupControls then
for control, state in pairs(Config.DisabledHandsupControls) do
DisableControlAction(0, control, state)
end
end
if IsPlayerAiming(PlayerId()) then
ClearPedSecondaryTask(PlayerPedId())
CreateThread(function()
Wait(350)
InHandsup = false
end)
end
Wait(0)
end
end)
end
if Config.HandsupEnabled then
local function ToggleHandsUp(commandType)
RegisterCommand(commandType, function()
if IsPedInAnyVehicle(PlayerPedId(), false) and not Config.HandsupInCar and not InHandsup then
return
end
Handsup()
end, false)
end
if Config.HoldToHandsUp then
ToggleHandsUp('+handsup')
ToggleHandsUp('-handsup')
else
ToggleHandsUp('handsup')
end
function Handsup()
local playerPed = PlayerPedId()
if not IsPedHuman(playerPed) then
return
end
if IsInActionWithErrorMessage() then
return
end
InHandsup = not InHandsup
if InHandsup then
LocalPlayer.state:set('currentEmote', 'handsup', true)
DestroyAllProps()
local dict = "random@mugging3"
RequestAnimDict(dict)
while not HasAnimDictLoaded(dict) do
Wait(0)
end
TaskPlayAnim(PlayerPedId(), dict, "handsup_standing_base", 3.0, 3.0, -1, 49, 0, false,
IsThisModelABike(GetEntityModel(GetVehiclePedIsIn(PlayerPedId(), false))) and 4127 or false, false)
HandsUpLoop()
else
LocalPlayer.state:set('currentEmote', nil, true)
ClearPedSecondaryTask(PlayerPedId())
if Config.ReplayEmoteAfterHandsup and IsInAnimation then
local emote = RP[CurrentAnimationName]
if not emote then
return
end
Wait(400)
DestroyAllProps()
OnEmotePlay(CurrentAnimationName, CurrentTextureVariation)
end
end
end
TriggerEvent('chat:addSuggestion', '/handsup', Translate('handsup'))
if Config.HandsupKeybindEnabled then
RegisterKeyMapping("handsup", Translate('register_handsup'), "keyboard", Config.HandsupKeybind)
end
CreateExport('IsPlayerInHandsUp', function()
return InHandsup
end)
end

View file

@ -0,0 +1,96 @@
CreateThread(function()
TriggerEvent('chat:addSuggestion', '/e', Translate('play_emote'),
{ { name = "emotename", help = Translate('help_command') },
{ name = "texturevariation", help = Translate('help_variation') } })
TriggerEvent('chat:addSuggestion', '/emote', Translate('play_emote'),
{ { name = "emotename", help = Translate('help_command') },
{ name = "texturevariation", help = Translate('help_variation') } })
if Config.Keybinding then
TriggerEvent('chat:addSuggestion', '/emotebind', Translate('link_emote_keybind'),
{ { name = "key", help = "num4, num5, num6, num7. num8, num9. Numpad 4-9!" },
{ name = "emotename", help = Translate('help_command') } })
TriggerEvent('chat:addSuggestion', '/emotebinds', Translate('show_emote_keybind'))
TriggerEvent('chat:addSuggestion', '/emotedelete', Translate('remove_emote_keybind'),
{ { name = "key", help = "num4, num5, num6, num7. num8, num9. Numpad 4-9!" } })
end
TriggerEvent('chat:addSuggestion', '/emotemenu', Translate('open_menu_emote'))
TriggerEvent('chat:addSuggestion', '/emotes', Translate('show_list_emote'))
TriggerEvent('chat:addSuggestion', '/emotecancel', Translate('cancel_emote'))
end)
RegisterCommand('e', function(source, args, raw) EmoteCommandStart(args) end, false)
RegisterCommand('emote', function(source, args, raw) EmoteCommandStart(args) end, false)
RegisterCommand('emotecancel', function() EmoteCancel() end, false)
if Config.MenuKeybindEnabled then
RegisterCommand('emoteui', function() OpenEmoteMenu() end, false)
RegisterKeyMapping("emoteui", Translate('register_open_menu'), "keyboard", Config.MenuKeybind)
else
RegisterCommand('emotemenu', function() OpenEmoteMenu() end, false)
end
if Config.EnableCancelKeybind then
RegisterKeyMapping("emotecancel", Translate('register_cancel_emote'), "keyboard", Config.CancelEmoteKey)
end
-- BINDING EMOTES TO KEYS
if Config.Keybinding then
RegisterCommand('emotebind', function(source, args, raw) EmoteBindStart(source, args, raw) end, false)
RegisterCommand('emotebinds', function(source, args, raw) ListKeybinds() end, false)
RegisterCommand('emotedelete', function(source, args) DeleteEmote(args) end, false)
for i = 1, #Config.KeybindKeys do
local cmd = string.format('emoteSelect%s', i)
RegisterCommand(cmd, function()
local emote = GetResourceKvpString(string.format('%s_emob%s', Config.keybindKVP, i))
if emote and emote ~= "" then
EmoteCommandStart({ emote, 0 })
end
end, false)
RegisterKeyMapping(cmd, string.format('Emote bind %s', i), 'keyboard', Config.KeybindKeys[i])
end
function EmoteBindStart(source, args, raw)
if #args > 0 then
local numkey = tonumber(args[1])
local emote = string.lower(args[2])
if not (numkey and emote) then
DebugPrint('Invalid arguments to EmoteBindStart')
return
end
if type(numkey) == "number" then
if RP[emote] then
SetResourceKvp(string.format('%s_emob%s', Config.keybindKVP, numkey), emote)
else
EmoteChatMessage("'" .. emote .. "' " .. Translate('notvalidemote') .. "")
end
else
EmoteChatMessage("'" .. numkey .. "' " .. Translate('notvalidkey'))
end
else
DebugPrint('Invalid number of arguments to EmoteBindStart')
end
end
function ListKeybinds()
for i = 1, #Config.KeybindKeys do
local emote = GetResourceKvpString(string.format('%s_emob%s', Config.keybindKVP, i))
if emote then
EmoteChatMessage(string.format('Emote %s : %s',i, emote))
end
end
end
function DeleteEmote(args)
if #args > 0 then
local numkey = tonumber(args[1])
if type(numkey) == "number" then
DeleteResourceKvp(string.format('%s_emob%s', Config.keybindKVP, numkey))
else
EmoteChatMessage("'" .. numkey .. "' " .. Translate('notvalidkey'))
end
else
DebugPrint("invalid")
end
end
end

View file

@ -0,0 +1,245 @@
IsUsingNewscam = false
if Config.NewscamEnabled then
RegisterCommand("newscam", function()
UseNewscam()
end, false)
TriggerEvent('chat:addSuggestion', '/newscam', 'Use newscam', {})
local fov = 40.0
local index = 0
local scaleform_instructions
local scaleform_news
local prop_newscam
local msg = "YOUR TEXT HERE"
local bottom = "YOUR TEXT HERE"
local title = "YOUR TEXT HERE"
local instructions = true
local cam
local function CleanupNewscam()
ClearPedTasks(PlayerPedId())
ClearTimecycleModifier()
RenderScriptCams(false, false, 0, true, false)
SetScaleformMovieAsNoLongerNeeded(breaking_news)
SetScaleformMovieAsNoLongerNeeded(scaleform_instructions)
DestroyCam(cam, false)
if prop_newscam then
DeleteEntity(prop_newscam)
end
SetNightvision(false)
SetSeethrough(false)
end
function UseNewscam()
if IsPedSittingInAnyVehicle(PlayerPedId()) then
return
end
if IsInActionWithErrorMessage({ ['IsUsingNewscam'] = true }) then
return
end
IsUsingNewscam = not IsUsingNewscam
if IsUsingNewscam then
CreateThread(function()
DestroyAllProps()
ClearPedTasks(PlayerPedId())
RequestAnimDict("missfinale_c2mcs_1")
while not HasAnimDictLoaded("missfinale_c2mcs_1") do
Wait(5)
end
-- attach the prop to the player
local boneIndex = GetPedBoneIndex(PlayerPedId(), 28422)
local x, y, z = table.unpack(GetEntityCoords(PlayerPedId(), true))
if not HasModelLoaded("prop_v_cam_01") then
LoadPropDict("prop_v_cam_01")
end
prop_newscam = CreateObject(`prop_v_cam_01`, x, y, z + 0.2, true, true, true)
AttachEntityToEntity(prop_newscam, PlayerPedId(), boneIndex, 0.0, 0.03, 0.01, 0.0, 0.0, 0.0, true, true, false, true, 1, true)
TaskPlayAnim(PlayerPedId(), "missfinale_c2mcs_1", "fin_c2_mcs_1_camman", 5.0, 5.0, -1, 51, 0, false, false, false)
PlayAmbientSpeech1(PlayerPedId(), "GENERIC_CURSE_MED", "SPEECH_PARAMS_FORCE")
SetCurrentPedWeapon(PlayerPedId(), `WEAPON_UNARMED`, true)
RemoveAnimDict("missfinale_c2mcs_1")
SetModelAsNoLongerNeeded("prop_v_cam_01")
end)
Wait(200)
SetTimecycleModifier("default")
SetTimecycleModifierStrength(0.3)
local breaking_news = RequestScaleformMovie("breaking_news")
while not HasScaleformMovieLoaded(breaking_news) do
Wait(10)
end
PushScaleformMovieFunction(breaking_news, "breaking_news")
PopScaleformMovieFunctionVoid()
BeginScaleformMovieMethod(breaking_news, 'SET_TEXT')
PushScaleformMovieMethodParameterString(msg)
PushScaleformMovieMethodParameterString(bottom)
EndScaleformMovieMethod()
BeginScaleformMovieMethod(breaking_news, 'SET_SCROLL_TEXT')
PushScaleformMovieMethodParameterInt(0) -- top ticker
PushScaleformMovieMethodParameterInt(0) -- Since this is the first string, start at 0
PushScaleformMovieMethodParameterString(title)
EndScaleformMovieMethod()
BeginScaleformMovieMethod(breaking_news, 'DISPLAY_SCROLL_TEXT')
PushScaleformMovieMethodParameterInt(0) -- Top ticker
PushScaleformMovieMethodParameterInt(0) -- Index of string
EndScaleformMovieMethod()
scaleform_news = breaking_news
cam = CreateCam("DEFAULT_SCRIPTED_FLY_CAMERA", true)
AttachCamToEntity(cam, PlayerPedId(), 0.0, 0.0, 1.2, true)
SetCamRot(cam, 0.0, 0.0, GetEntityHeading(PlayerPedId()))
SetCamFov(cam, fov)
RenderScriptCams(true, false, 0, true, false)
scaleform_instructions = SetupButtons({
{ key = 177, text = 'exit_news' },
{ key = 19, text = 'toggle_news_vision' },
{ key = 74, text = "edit_values_newscam" },
{ key = 47, text = 'toggle_instructions' }
})
while IsUsingNewscam and not IsEntityDead(PlayerPedId()) and not IsPedSittingInAnyVehicle(PlayerPedId()) do
if IsControlJustPressed(0, 177) then
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
IsUsingNewscam = false
end
fov = HandleZoomAndCheckRotation(cam, fov)
HideHUDThisFrame()
DisableControlAction(0, 25, true) -- disable aim
DisableControlAction(0, 44, true) -- INPUT_COVER
DisableControlAction(0, 37, true) -- INPUT_SELECT_WEAPON
DisableControlAction(0, 24, true) -- Attack
DisablePlayerFiring(PlayerPedId(), true) -- Disable weapon firing
if IsControlJustPressed(0, 19) then
-- if index = 0, show the "security_camera" scaleform, if index = 1, show the "breaking_news" scaleform and reset the index to 0
if index == 0 then
index = 1
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
scaleform_news = nil
CreateThread(function()
while index == 1 do
DrawRect(0.0, 0.0, 2.0, 0.2, 0, 0, 0, 255)
DrawRect(0.0, 1.0, 2.0, 0.2, 0, 0, 0, 255)
Wait(1)
end
end)
else
index = 0
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
scaleform_news = breaking_news
end
end
if IsControlJustPressed(0, 74) then
SetMsgBottomTitle()
end
if IsControlJustPressed(0, 47) then
instructions = not instructions
PlaySoundFrontend(-1, "SELECT", "HUD_FRONTEND_DEFAULT_SOUNDSET", false)
end
DrawScaleformMovieFullscreen(scaleform_news, 255, 255, 255, 255)
if instructions then
DrawScaleformMovieFullscreen(scaleform_instructions, 255, 255, 255, 255)
end
Wait(1)
end
end
-- RESET EVERYTHING
IsUsingNewscam = false
index = 0
CleanupNewscam()
end
function SetMsgBottomTitle()
-- keyboard input to set the message and bottom title
AddTextEntry("top", "Enter the top message of the news")
DisplayOnscreenKeyboard(1, "top", "", "", "", "", "", 200)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0);
Wait(0);
end
if (GetOnscreenKeyboardResult()) then
title = tostring(GetOnscreenKeyboardResult())
end
AddTextEntry("bottom", "Enter the bottom title of the news")
DisplayOnscreenKeyboard(1, "bottom", "", "", "", "", "", 200)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0);
Wait(0);
end
if (GetOnscreenKeyboardResult()) then
bottom = tostring(GetOnscreenKeyboardResult())
end
AddTextEntry("title", "Enter the title of the news")
DisplayOnscreenKeyboard(1, "title", "", "", "", "", "", 200)
while (UpdateOnscreenKeyboard() == 0) do
DisableAllControlActions(0);
Wait(0);
end
if (GetOnscreenKeyboardResult()) then
msg = tostring(GetOnscreenKeyboardResult())
end
-- reset the scaleform and set the new values
SetScaleformMovieAsNoLongerNeeded(breaking_news)
breaking_news = RequestScaleformMovie("breaking_news")
while not HasScaleformMovieLoaded(breaking_news) do
Wait(10)
end
PushScaleformMovieFunction(breaking_news, "breaking_news")
PopScaleformMovieFunctionVoid()
BeginScaleformMovieMethod(breaking_news, 'SET_TEXT')
PushScaleformMovieMethodParameterString(msg)
PushScaleformMovieMethodParameterString(bottom)
EndScaleformMovieMethod()
BeginScaleformMovieMethod(breaking_news, 'SET_SCROLL_TEXT')
PushScaleformMovieMethodParameterInt(0) -- top ticker
PushScaleformMovieMethodParameterInt(0) -- Since this is the first string, start at 0
PushScaleformMovieMethodParameterString(title)
EndScaleformMovieMethod()
BeginScaleformMovieMethod(breaking_news, 'DISPLAY_SCROLL_TEXT')
PushScaleformMovieMethodParameterInt(0) -- Top ticker
PushScaleformMovieMethodParameterInt(0) -- Index of string
EndScaleformMovieMethod()
end
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
CleanupNewscam()
end
end)
CreateExport('toggleNewscam', function()
UseNewscam()
end)
end

View file

@ -0,0 +1,35 @@
if not Config.DisableIdleCam then return end
RegisterCommand('idlecamoff', function() -- help2 31, 167, 9
TriggerEvent('chat:addMessage', {
color = {227,8,0},
multiline = true,
args = {'[RPEmotes]', 'Idle Cam Is Now Off'}
})
DisableIdleCamera(true)
SetPedCanPlayAmbientAnims(PlayerPedId(), false)
SetResourceKvpInt("idleCamToggle", 1)
end, false)
RegisterCommand('idlecamon', function() -- help2 31, 167, 9
TriggerEvent('chat:addMessage', {
color = {31,167,9},
multiline = true,
args = {'[RPEmotes]', 'Idle Cam Is Now On'}
})
DisableIdleCamera(false)
SetPedCanPlayAmbientAnims(PlayerPedId(), true)
SetResourceKvpInt("idleCamToggle", 2)
end, false)
CreateThread(function()
TriggerEvent("chat:addSuggestion", "/idlecamon", "Re-enables the idle cam")
TriggerEvent("chat:addSuggestion", "/idlecamoff", "Disables the idle cam")
local idleCamKvp = GetResourceKvpInt("idleCamToggle")
if idleCamKvp == 0 then
return
end
DisableIdleCamera(idleCamKvp == 1)
end)

View file

@ -0,0 +1,65 @@
local PlayerParticles = {}
function PtfxThis(asset)
while not HasNamedPtfxAssetLoaded(asset) do
RequestNamedPtfxAsset(asset)
Wait(10)
end
UseParticleFxAsset(asset)
end
function PtfxStart()
LocalPlayer.state:set('ptfx', true, true)
end
function PtfxStop()
LocalPlayer.state:set('ptfx', nil, true)
end
AddStateBagChangeHandler('ptfx', '', function(bagName, key, value, _unused, replicated)
local plyId = tonumber(bagName:gsub('player:', ''), 10)
if (PlayerParticles[plyId] and value) or (not PlayerParticles[plyId] and not value) then return end
local ply = GetPlayerFromServerId(plyId)
if ply <= 0 then return end
local plyPed = GetPlayerPed(ply)
if not DoesEntityExist(plyPed) then return end
local stateBag = Player(plyId).state
if value then
local boneIndex = stateBag.ptfxBone and GetPedBoneIndex(plyPed, stateBag.ptfxBone) or GetEntityBoneIndexByName(stateBag.ptfxName, "VFX")
local entityTarget = plyPed
if stateBag.ptfxPropNet then
local propObj = NetToObj(stateBag.ptfxPropNet)
if DoesEntityExist(propObj) then
entityTarget = propObj
end
end
PtfxThis(stateBag.ptfxAsset)
local offset = stateBag.ptfxOffset
local rot = stateBag.ptfxRot
PlayerParticles[plyId] = StartNetworkedParticleFxLoopedOnEntityBone(stateBag.ptfxName, entityTarget, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, boneIndex, (stateBag.ptfxScale or 1) + 0.0, false, false, false)
local color = stateBag.ptfxColor
if color then
if color[1] and type(color[1]) == 'table' then
local randomIndex = math.random(1, #color)
color = color[randomIndex]
end
SetParticleFxLoopedAlpha(PlayerParticles[plyId], color.A)
SetParticleFxLoopedColour(PlayerParticles[plyId], color.R / 255, color.G / 255, color.B / 255, false)
end
DebugPrint("Started PTFX: " .. PlayerParticles[plyId])
else
DebugPrint("Stopped PTFX: " .. PlayerParticles[plyId])
StopParticleFxLooped(PlayerParticles[plyId], false)
RemoveNamedPtfxAsset(stateBag.ptfxAsset)
PlayerParticles[plyId] = nil
end
end)

View file

@ -0,0 +1,124 @@
Pointing = false
local function IsPlayerAiming(player)
return IsPlayerFreeAiming(player) or IsAimCamActive() or IsAimCamThirdPersonActive()
end
local function CanPlayerPoint()
local playerPed = PlayerPedId()
local playerId = PlayerId()
if not DoesEntityExist(playerPed) or IsPedOnAnyBike(playerPed) or IsPlayerAiming(playerId) or IsPedFalling(playerPed) or IsPedInjured(playerPed) or IsPedInMeleeCombat(playerPed) or IsPedRagdoll(playerPed) or not IsPedHuman(playerPed) then
return false
end
return true
end
local function PointingStopped()
local playerPed = PlayerPedId()
RequestTaskMoveNetworkStateTransition(playerPed, 'Stop')
SetPedConfigFlag(playerPed, 36, false)
if not IsPedInjured(playerPed) then
ClearPedSecondaryTask(playerPed)
end
RemoveAnimDict("anim@mp_point")
if Config.ReplayEmoteAfterPointing and IsInAnimation then
local emote = RP[CurrentAnimationName]
if not emote then
return
end
Wait(400)
DestroyAllProps()
OnEmotePlay(CurrentAnimationName, CurrentTextureVariation)
end
end
local function PointingThread()
CreateThread(function()
local playerPed = PlayerPedId()
while Pointing do
Wait(0)
if not CanPlayerPoint() then
Pointing = false
break
end
local camPitch = GetGameplayCamRelativePitch()
if camPitch < -70.0 then
camPitch = -70.0
elseif camPitch > 42.0 then
camPitch = 42.0
end
camPitch = (camPitch + 70.0) / 112.0
local camHeading = GetGameplayCamRelativeHeading()
local cosCamHeading = math.cos(camHeading)
local sinCamHeading = math.sin(camHeading)
if camHeading < -180.0 then
camHeading = -180.0
elseif camHeading > 180.0 then
camHeading = 180.0
end
camHeading = (camHeading + 180.0) / 360.0
local coords = GetOffsetFromEntityInWorldCoords(playerPed, (cosCamHeading * -0.2) - (sinCamHeading * (0.4 * camHeading + 0.3)), (sinCamHeading * -0.2) + (cosCamHeading * (0.4 * camHeading + 0.3)), 0.6)
local _, blocked = GetShapeTestResult(StartShapeTestCapsule(coords.x, coords.y, coords.z - 0.2, coords.x, coords.y, coords.z + 0.2, 0.4, 95, playerPed, 7))
SetTaskMoveNetworkSignalFloat(playerPed, 'Pitch', camPitch)
SetTaskMoveNetworkSignalFloat(playerPed, 'Heading', (camHeading * -1.0) + 1.0)
SetTaskMoveNetworkSignalBool(playerPed, 'isBlocked', blocked)
SetTaskMoveNetworkSignalBool(playerPed, 'isFirstPerson', GetCamViewModeForContext(GetCamActiveViewModeContext()) == 4)
end
PointingStopped()
end)
end
local function StartPointing()
if IsInActionWithErrorMessage() then
return
end
if not CanPlayerPoint() then
return
end
Pointing = not Pointing
if Pointing and LoadAnim("anim@mp_point") then
SetPedConfigFlag(PlayerPedId(), 36, true)
TaskMoveNetworkByName(PlayerPedId(), 'task_mp_pointing', 0.5, false, 'anim@mp_point', 24)
DestroyAllProps()
PointingThread()
end
end
-- Commands & KeyMapping --
if Config.PointingEnabled then
RegisterCommand('pointing', function()
if IsPedInAnyVehicle(PlayerPedId(), false) and not Config.PointingInCar then
return
end
StartPointing()
end, false)
if Config.PointingKeybindEnabled then
RegisterKeyMapping("pointing", Translate('register_pointing'), "keyboard", Config.PointingKeybind)
end
TriggerEvent('chat:addSuggestion', '/pointing', Translate('pointing'))
end
---@return boolean
local function IsPlayerPointing()
return Pointing
end
CreateExport('IsPlayerPointing', IsPlayerPointing)

View file

@ -0,0 +1,33 @@
if Config.RagdollEnabled then
RegisterCommand('+ragdoll', function() Ragdoll() end, false)
RegisterCommand('-ragdoll', function() StopRagdoll() end, false)
RegisterKeyMapping('+ragdoll', Translate('register_ragdoll'), 'keyboard', Config.RagdollKeybind)
local isRagdolling = true
function Ragdoll()
if IsInAnimation then return end
local ped = PlayerPedId()
if not IsPedOnFoot(ped) then return end
if Config.RagdollAsToggle then
isRagdolling = not isRagdolling
else
isRagdolling = true
end
while isRagdolling do
ped = PlayerPedId()
SetPedRagdollForceFall(ped)
ResetPedRagdollTimer(ped)
SetPedToRagdoll(ped, 1000, 1000, 3, false, false, false)
ResetPedRagdollTimer(ped)
Wait(0)
end
end
function StopRagdoll()
if Config.RagdollAsToggle then return end
isRagdolling = false
end
end

View file

@ -0,0 +1,164 @@
local isRequestAnim = false
local targetPlayerId
if Config.SharedEmotesEnabled then
RegisterCommand('nearby', function(source, args, raw)
if not LocalPlayer.state.canEmote then return end
if IsPedInAnyVehicle(PlayerPedId(), true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
if #args > 0 then
local emotename = string.lower(args[1])
local target, distance = GetClosestPlayer()
if (distance ~= -1 and distance < 3) then
if RP[emotename] ~= nil and RP[emotename].category == "Shared" then
local _, _, ename = table.unpack(RP[emotename])
TriggerServerEvent("rpemotes:server:requestEmote", GetPlayerServerId(target), emotename)
SimpleNotify(Translate('sentrequestto') ..
GetPlayerName(target) .. " ~w~(~g~" .. ename .. "~w~)")
else
EmoteChatMessage("'" .. emotename .. "' " .. Translate('notvalidsharedemote') .. "")
end
else
SimpleNotify(Translate('nobodyclose'))
end
else
NearbysOnCommand()
end
end, false)
end
RegisterNetEvent("rpemotes:client:syncEmote", function(emote, player)
EmoteCancel()
Wait(300)
targetPlayerId = player
local plyServerId = GetPlayerFromServerId(player)
if IsPedInAnyVehicle(GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer()), true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
if RP[emote] then
local options = RP[emote].AnimationOptions
if options and options.Attachto then
local targetEmote = RP[emote][4]
if not targetEmote or not RP[targetEmote] or not RP[targetEmote].AnimationOptions or not RP[targetEmote].AnimationOptions.Attachto then
local ped = PlayerPedId()
local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer())
AttachEntityToEntity(
ped,
pedInFront,
GetPedBoneIndex(pedInFront, options.bone or -1),
options.xPos or 0.0,
options.yPos or 0.0,
options.zPos or 0.0,
options.xRot or 0.0,
options.yRot or 0.0,
options.zRot or 0.0,
false,
false,
false,
true,
1,
true
)
end
end
OnEmotePlay(emote)
return
else
DebugPrint("rpemotes:client:syncEmote : Emote not found")
end
end)
RegisterNetEvent("rpemotes:client:syncEmoteSource", function(emote, player)
local ped = PlayerPedId()
local plyServerId = GetPlayerFromServerId(player)
local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer())
if IsPedInAnyVehicle(ped, true) or IsPedInAnyVehicle(pedInFront, true) then
return EmoteChatMessage(Translate('not_in_a_vehicle'))
end
local options = RP[emote] and RP[emote].AnimationOptions
if options then
if (options.Attachto) then
AttachEntityToEntity(
ped,
pedInFront,
GetPedBoneIndex(pedInFront, options.bone or -1),
options.xPos or 0.0,
options.yPos or 0.0,
options.zPos or 0.0,
options.xRot or 0.0,
options.yRot or 0.0,
options.zRot or 0.0,
false,
false,
false,
true,
1,
true
)
end
end
local coords = GetOffsetFromEntityInWorldCoords(pedInFront, (options and options.SyncOffsetSide or 0) + 0.0, (options and options.SyncOffsetFront or 1) + 0.0, (options and options.SyncOffsetHeight or 0) + 0.0)
local heading = GetEntityHeading(pedInFront)
SetEntityHeading(ped, heading - (options and options.SyncOffsetHeading or 180) + 0.0)
SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z)
EmoteCancel()
Wait(300)
targetPlayerId = player
if RP[emote] ~= nil then
OnEmotePlay(emote)
return
end
end)
RegisterNetEvent("rpemotes:client:cancelEmote", function(player)
if targetPlayerId and targetPlayerId == player then
targetPlayerId = nil
EmoteCancel()
end
end)
function CancelSharedEmote()
if targetPlayerId then
TriggerServerEvent("rpemotes:server:cancelEmote", targetPlayerId)
targetPlayerId = nil
end
end
RegisterNetEvent("rpemotes:client:requestEmote", function(emotename, etype, target)
isRequestAnim = true
local displayed = RP[emotename] and select(3, table.unpack(RP[emotename]))
PlaySound(-1, "NAV", "HUD_AMMO_SHOP_SOUNDSET", false, 0, true)
SimpleNotify(Translate('doyouwanna') .. displayed .. "~w~)")
-- The player has now 10 seconds to accept the request
local timer = 10 * 1000
while isRequestAnim do
Wait(5)
timer = timer - 5
if timer <= 0 then
isRequestAnim = false
SimpleNotify(Translate('refuseemote'))
end
if IsControlJustPressed(1, 246) then
isRequestAnim = false
local otheremote = RP[emotename] and RP[emotename][4] or emotename
TriggerServerEvent("rpemotes:server:confirmEmote", target, emotename, otheremote)
elseif IsControlJustPressed(1, 182) then
isRequestAnim = false
SimpleNotify(Translate('refuseemote'))
end
end
end)

View file

@ -0,0 +1,395 @@
-- You can edit this function to add support for your favorite notification system
function SimpleNotify(message)
if Config.NotificationsAsChatMessage then
TriggerEvent("chat:addMessage", { color = { 255, 255, 255 }, args = { tostring(message) } })
else
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(message)
EndTextCommandThefeedPostTicker(true, true)
end
end
-- Don't touch after this line if you don't know what you're doing
CreateExport = function(name, func)
AddEventHandler('__cfx_export_rpemotes_'..name, function(setCb)
setCb(function(...)
return func(...)
end)
end)
exports(name, func)
end
function DebugPrint(...)
if Config.DebugDisplay then
print(...)
end
end
function FirstToUpper(str)
return (str:gsub("^%l", string.upper))
end
function IsPlayerAiming(player)
return (IsPlayerFreeAiming(player) or IsAimCamActive() or IsAimCamThirdPersonActive()) and
tonumber(GetSelectedPedWeapon(player)) ~= tonumber(GetHashKey("WEAPON_UNARMED"))
end
function CanPlayerCrouchCrawl(playerPed)
if not IsPedOnFoot(playerPed) or IsPedJumping(playerPed) or IsPedFalling(playerPed) or IsPedInjured(playerPed) or IsPedInMeleeCombat(playerPed) or IsPedRagdoll(playerPed) then
return false
end
return true
end
function PlayAnimOnce(playerPed, animDict, animName, blendInSpeed, blendOutSpeed, duration, startTime)
LoadAnim(animDict)
TaskPlayAnim(playerPed, animDict, animName, blendInSpeed or 2.0, blendOutSpeed or 2.0, duration or -1, 0,
startTime or 0.0, false, false, false)
RemoveAnimDict(animDict)
end
function ChangeHeadingSmooth(playerPed, amount, time)
local times = math.abs(amount)
local test = amount / times
local wait = time / times
for _i = 1, times do
Wait(wait)
SetEntityHeading(playerPed, GetEntityHeading(playerPed) + test)
end
end
function EmoteChatMessage(msg, multiline)
if msg then
TriggerEvent("chat:addMessage", {
multiline = multiline == true or false,
color = { 255, 255, 255 },
args = { "^1Help^0", tostring(msg) }
})
end
end
function PairsByKeys(t, f)
local a = {}
for n in pairs(t) do
table.insert(a, n)
end
table.sort(a, f)
local i = 0 -- iterator variable
local iter = function() -- iterator function
i = i + 1
if a[i] == nil then
return nil
else
return a[i], t[a[i]]
end
end
return iter
end
function LoadAnim(dict)
if not DoesAnimDictExist(dict) then
return false
end
local timeout = 2000
while not HasAnimDictLoaded(dict) and timeout > 0 do
RequestAnimDict(dict)
Wait(5)
timeout = timeout - 5
end
if timeout == 0 then
DebugPrint("Loading anim dict " .. dict .. " timed out")
return false
else
return true
end
end
function LoadPropDict(model)
if not HasModelLoaded(GetHashKey(model)) then
RequestModel(GetHashKey(model))
local timeout = 2000
while not HasModelLoaded(GetHashKey(model)) and timeout > 0 do
Wait(5)
timeout = timeout - 5
end
if timeout == 0 then
DebugPrint("Loading model " .. model .. " timed out")
return
end
end
end
function TableHasKey(table, key)
return table[key] ~= nil
end
function RequestWalking(set)
local timeout = GetGameTimer() + 5000
while not HasAnimSetLoaded(set) and GetGameTimer() < timeout do
RequestAnimSet(set)
Wait(5)
end
end
function GetPedInFront()
local player = PlayerId()
local plyPed = GetPlayerPed(player)
local plyPos = GetEntityCoords(plyPed, false)
local plyOffset = GetOffsetFromEntityInWorldCoords(plyPed, 0.0, 1.3, 0.0)
local rayHandle = StartShapeTestCapsule(plyPos.x, plyPos.y, plyPos.z, plyOffset.x, plyOffset.y, plyOffset.z, 10.0, 12
, plyPed, 7)
local _, _, _, _, ped2 = GetShapeTestResult(rayHandle)
return ped2
end
function NearbysOnCommand(source, args, raw)
local NearbysCommand = ""
for a, b in PairsByKeys(RP) do
if type(b) == "table" and b.category == "Shared" then
NearbysCommand = NearbysCommand .. a .. ", "
end
end
EmoteChatMessage(NearbysCommand)
EmoteChatMessage(Translate('emotemenucmd'))
end
function GetClosestPlayer()
local players = GetPlayers()
local closestDistance = -1
local closestPlayer
local ped = PlayerPedId()
local pedCoords = GetEntityCoords(ped, false)
for index, value in ipairs(players) do
local target = GetPlayerPed(value)
if (target ~= ped) then
local targetCoords = GetEntityCoords(GetPlayerPed(value), false)
local distance = GetDistanceBetweenCoords(targetCoords["x"], targetCoords["y"], targetCoords["z"],
pedCoords["x"], pedCoords["y"], pedCoords["z"], true)
if (closestDistance == -1 or closestDistance > distance) then
closestPlayer = value
closestDistance = distance
end
end
end
return closestPlayer, closestDistance
end
function GetPlayers()
local players = {}
for i = 0, 255 do
if NetworkIsPlayerActive(i) then
table.insert(players, i)
end
end
return players
end
-- Function that'll check if player is already proning, using news cam or else
---@param ignores? table | nil key string is the ignored value
function IsInActionWithErrorMessage(ignores)
if ignores then DebugPrint(ignores) end
DebugPrint('IsProne', IsProne)
DebugPrint('IsUsingNewscam', IsUsingNewscam)
DebugPrint('IsUsingBinoculars', IsUsingBinoculars)
if (ignores == nil) then ignores = {} end
if not ignores['IsProne'] and IsProne then
EmoteChatMessage(Translate('no_anim_crawling'))
return true
end
if not ignores['IsUsingNewscam'] and IsUsingNewscam then
-- TODO: use specific error message
EmoteChatMessage(Translate('no_anim_right_now'))
return true
end
if not ignores['IsUsingBinoculars'] and IsUsingBinoculars then
-- TODO: use specific error message
EmoteChatMessage(Translate('no_anim_right_now'))
return true
end
return false
end
function HideHUDThisFrame()
HideHelpTextThisFrame()
HideHudAndRadarThisFrame()
HideHudComponentThisFrame(19) -- weapon wheel
HideHudComponentThisFrame(1) -- Wanted Stars
HideHudComponentThisFrame(2) -- Weapon icon
HideHudComponentThisFrame(3) -- Cash
HideHudComponentThisFrame(4) -- MP CASH
HideHudComponentThisFrame(13) -- Cash Change
HideHudComponentThisFrame(11) -- Floating Help Text
HideHudComponentThisFrame(12) -- more floating help text
HideHudComponentThisFrame(15) -- Subtitle Text
HideHudComponentThisFrame(18) -- Game Stream
end
function SetupButtons(button)
local scaleform = RequestScaleformMovie("instructional_buttons")
while not HasScaleformMovieLoaded(scaleform) do
Wait(10)
end
PushScaleformMovieFunction(scaleform, "CLEAR_ALL")
PopScaleformMovieFunctionVoid()
PushScaleformMovieFunction(scaleform, "SET_CLEAR_SPACE")
PushScaleformMovieFunctionParameterInt(200)
PopScaleformMovieFunctionVoid()
for i, btn in pairs(button) do
PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT")
PushScaleformMovieFunctionParameterInt(i - 1)
ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(0, btn.key, true))
BeginTextCommandScaleformString("STRING")
AddTextComponentScaleform(Translate(btn.text))
EndTextCommandScaleformString()
PopScaleformMovieFunctionVoid()
end
PushScaleformMovieFunction(scaleform, "DRAW_INSTRUCTIONAL_BUTTONS")
PopScaleformMovieFunctionVoid()
return scaleform
end
function HandleZoomAndCheckRotation(cam, fov)
local zoomspeed = 10.0 -- camera zoom speed
local lPed = PlayerPedId()
local fov_max = 70.0
local fov_min = 10.0 -- max zoom level (smaller fov is more zoom)
local speed_lr = 8.0 -- speed by which the camera pans left-right
local speed_ud = 8.0 -- speed by which the camera pans up-down
local zoomvalue = (1.0 / (fov_max - fov_min)) * (fov - fov_min)
local rightAxisX = GetDisabledControlNormal(0, 220)
local rightAxisY = GetDisabledControlNormal(0, 221)
local rotation = GetCamRot(cam, 2)
if rightAxisX ~= 0.0 or rightAxisY ~= 0.0 then
local new_z = rotation.z + rightAxisX * -1.0 * (speed_ud) * (zoomvalue + 0.1)
local new_x = math.max(math.min(20.0, rotation.x + rightAxisY * -1.0 * (speed_lr) * (zoomvalue + 0.1)), -29.5)
SetCamRot(cam, new_x, 0.0, new_z, 2)
end
if not (IsPedSittingInAnyVehicle(lPed)) then
if IsControlJustPressed(0, 241) then -- Scrollup
fov = math.max(fov - zoomspeed, fov_min)
end
if IsControlJustPressed(0, 242) then
fov = math.min(fov + zoomspeed, fov_max) -- ScrollDown
end
local current_fov = GetCamFov(cam)
if math.abs(fov - current_fov) < 0.1 then
fov = current_fov
end
SetCamFov(cam, current_fov + (fov - current_fov) * 0.05)
else
if IsControlJustPressed(0, 17) then -- Scrollup
fov = math.max(fov - zoomspeed, fov_min)
end
if IsControlJustPressed(0, 16) then
fov = math.min(fov + zoomspeed, fov_max) -- ScrollDown
end
local current_fov = GetCamFov(cam)
if math.abs(fov - current_fov) < 0.1 then -- the difference is too small, just set the value directly to avoid unneeded updates to FOV of order 10^-5
fov = current_fov
end
SetCamFov(cam, current_fov + (fov - current_fov) * 0.05) -- Smoothing of camera zoom
end
return fov
end
----------------------------------------------------------------------
ShowPed = false
function ShowPedMenu(zoom)
if not Config.PreviewPed then return end
if not ShowPed then
CreateThread(function()
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed) - vector3(0.0, 0.0, 10.0)
ClonedPed = CreatePed(26, GetEntityModel(playerPed), coords.x, coords.y, coords.z, 0, false, false)
ClonePedToTarget(playerPed, ClonedPed)
SetEntityInvincible(ClonedPed, true)
SetEntityLocallyVisible(ClonedPed)
NetworkSetEntityInvisibleToNetwork(ClonedPed, true)
SetEntityCanBeDamaged(ClonedPed, false)
SetBlockingOfNonTemporaryEvents(ClonedPed, true)
SetEntityAlpha(ClonedPed, 254, false)
SetEntityCollision(ClonedPed, false, false)
ShowPed = true
local positionBuffer = {}
local bufferSize = 5
while ShowPed do
local screencoordsX = zoom and 0.6 or 0.65135417461395
local screencoordsY = zoom and 1.9 or 0.77
if Config.MenuPosition == "left" then
screencoordsX = 1.0 - screencoordsX
end
local world, normal = GetWorldCoordFromScreenCoord(screencoordsX, screencoordsY)
local depth = zoom and 2.0 or 3.5
local target = world + normal * depth
local camRot = GetGameplayCamRot(2)
table.insert(positionBuffer, target)
if #positionBuffer > bufferSize then
table.remove(positionBuffer, 1)
end
local averagedTarget = vector3(0, 0, 0)
for _, position in ipairs(positionBuffer) do
averagedTarget = averagedTarget + position
end
averagedTarget = averagedTarget / #positionBuffer
SetEntityCoords(ClonedPed, averagedTarget.x, averagedTarget.y, averagedTarget.z, false, false, false, true)
local heading_offset = Config.MenuPosition == "left" and 170.0 or 190.0
SetEntityHeading(ClonedPed, camRot.z + heading_offset)
SetEntityRotation(ClonedPed, camRot.x * (-1), 0.0, camRot.z + 170.0, 2, false)
Wait(4)
end
DeleteEntity(ClonedPed)
ClonedPed = nil
end)
end
end
function ClosePedMenu()
if not Config.PreviewPed then return end
if ClonedPed then
ShowPed = false
ClearPedTaskPreview()
DeleteEntity(ClonedPed)
end
end
function ClearPedTaskPreview()
if not Config.PreviewPed then return end
if ClonedPed then
DestroyAllProps(true)
ClearPedTasksImmediately(ClonedPed)
end
end

View file

@ -0,0 +1,124 @@
local canChange = true
local unable_message = "You are unable to change your walking style right now."
function WalkMenuStart(name, force)
if not canChange and not force then
EmoteChatMessage(unable_message)
return
end
if not name or name == "" then
ResetWalk()
return
end
if not RP[name] or type(RP[name]) ~= "table" or RP[name].category ~= "Walks" then
EmoteChatMessage("'" .. tostring(name) .. "' is not a valid walk")
return
end
local walk = RP[name][1]
RequestWalking(walk)
SetPedMovementClipset(PlayerPedId(), walk, 0.2)
RemoveAnimSet(walk)
if Config.PersistentWalk then SetResourceKvp("walkstyle", name) end
end
function ResetWalk()
if not canChange then
EmoteChatMessage(unable_message)
return
end
ResetPedMovementClipset(PlayerPedId(), 0.0)
end
function WalksOnCommand()
local WalksCommand = ""
for name, data in PairsByKeys(RP) do
if type(data) == "table" and data.category == "Walks" then
WalksCommand = WalksCommand .. string.lower(name) .. ", "
end
end
EmoteChatMessage(WalksCommand)
EmoteChatMessage("To reset do /walk reset")
end
function WalkCommandStart(name)
if not canChange then
EmoteChatMessage(unable_message)
return
end
name = FirstToUpper(string.lower(name))
if name == "Reset" then
ResetPedMovementClipset(PlayerPedId(), 0.0)
DeleteResourceKvp("walkstyle")
return
end
WalkMenuStart(name, true)
end
if Config.WalkingStylesEnabled and Config.PersistentWalk then
local function walkstyleExists(kvp)
while not CONVERTED do
Wait(0)
end
if not kvp or kvp == "" then
return false
end
local walkstyle = RP[kvp]
if walkstyle and type(walkstyle) == "table" and walkstyle.category == "Walks" then
return true
end
return false
end
local function handleWalkstyle()
local kvp = GetResourceKvpString("walkstyle")
if kvp then
if walkstyleExists(kvp) then
WalkMenuStart(kvp, true)
else
ResetPedMovementClipset(PlayerPedId(), 0.0)
DeleteResourceKvp("walkstyle")
end
end
end
AddEventHandler('playerSpawned', function()
Wait(3000)
handleWalkstyle()
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', handleWalkstyle)
RegisterNetEvent('esx:playerLoaded', handleWalkstyle)
AddEventHandler('onResourceStart', function(resource)
if resource == GetCurrentResourceName() then
handleWalkstyle()
end
end)
end
if Config.WalkingStylesEnabled then
RegisterCommand('walks', function() WalksOnCommand() end, false)
RegisterCommand('walk', function(_, args, _) WalkCommandStart(tostring(args[1])) end, false)
TriggerEvent('chat:addSuggestion', '/walk', 'Set your walkingstyle.', { { name = "style", help = "/walks for a list of valid styles" } })
TriggerEvent('chat:addSuggestion', '/walks', 'List available walking styles.')
end
CreateExport('toggleWalkstyle', function(bool, message)
canChange = bool
if message then
unable_message = message
end
end)
CreateExport('getWalkstyle', function()
return GetResourceKvpString("walkstyle")
end)
CreateExport('setWalkstyle', WalkMenuStart)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,164 @@
-- FOR ALL KEYBINDS, GET THE BUTTON STRING HERE: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/
Config = {
MenuLanguage = 'de', -- Change the language of the menu here
EnableCancelKeybind = true,
CancelEmoteKey = 'X',
MenuKeybindEnabled = true,
MenuKeybind = 'F4',
Keybinding = false,
keybindKVP = "rpemotes",
NotificationsAsChatMessage = false,
Search = true, -- Used to enable or disable the search feature in the menu.
CancelPreviousEmote = false, -- If turned on, playing an emote will cancel the previous one.
DisableControlsInMenu = false,
MenuTitle = '',
TitleOutline = true,
TitleColour = { R = 255, G = 0, B = 255, A = 255 },
MenuPosition = 'right', -- 'left' / 'right'
CustomMenuEnabled = true, -- Change the header.png to your own image
-- Combat Car, and Player Movement
DisarmPlayerOnEmote = false,
AllowPunchingDuringEmote = false,
AllowEmoteInVehicle = true,
AllowInWater = false,
-- Ragdoll
RagdollEnabled = false,
RagdollKeybind = 'U',
RagdollAsToggle = true,
-- Expressions, Walks, and More
ExpressionsEnabled = true,
PersistentExpression = true,
WalkingStylesEnabled = true,
PersistentWalk = true,
SharedEmotesEnabled = true,
AdultEmotesDisabled = false,
AnimalEmotesEnabled = true,
-- Hands Up
HandsupEnabled = false,
HandsupKeybind = 'Y',
HandsupKeybindEnabled = false,
HandsupInCar = false,
ReplayEmoteAfterHandsup = true,
HoldToHandsUp = false,
-- Pointing
PointingEnabled = true,
PointingKeybindEnabled = true,
PointingKeybind = 'B',
PointingInCar = false,
ReplayEmoteAfterPointing = true,
-- Crouching
CrouchEnabled = true,
CrouchKeybindEnabled = true,
CrouchKeybind = 'LCONTROL',
CrouchOverrideStealthMode = false, -- If true, you won't enter stealth mode even if the crouch key and the 'duck' key are the same.
FpsMode = false, -- set this to true if you have first-person shooting to disable the ability to crouch and shoot in third-person
-- Crawling
CrawlEnabled = true,
CrawlKeybindEnabled = true,
CrawlKeybind = 'RCONTROL',
-- Binocular (/binoculars)
BinocularsEnabled = false,
AllowVisionsToggling = false,
-- News Camera (/newscam)
NewscamEnabled = true,
DisableIdleCam = true,
-- Preview Ped : Shows a preview of the emote on the player's ped next to the emote menu. Note that resmon will increase when this when emotes are being previewed.
PreviewPed = false,
CheckForUpdates = true,
DebugDisplay = false,
}
Config.KeybindKeys = {
'NUMPAD1',
'NUMPAD2',
'NUMPAD3',
'NUMPAD4',
'NUMPAD5',
'NUMPAD6',
'NUMPAD7',
'NUMPAD8',
'NUMPAD9'
}
Config.DisabledHandsupControls = {
[36] = true, -- INPUT_DUCK
[44] = true, -- INPUT_COVER
[53] = true, -- INPUT_WEAPON_SPECIAL
[54] = true, -- INPUT_WEAPON_SPECIAL_TWO
[59] = true, -- INPUT_VEH_MOVE_LR
[60] = true, -- INPUT_VEH_MOVE_UD
[61] = true, -- INPUT_VEH_MOVE_UP_ONLY
[62] = true, -- INPUT_VEH_MOVE_DOWN_ONLY
[63] = true, -- INPUT_VEH_MOVE_LEFT_ONLY
[64] = true, -- INPUT_VEH_MOVE_RIGHT_ONLY
[65] = true, -- INPUT_VEH_SPECIAL
[66] = true, -- INPUT_VEH_GUN_LR
[67] = true, -- INPUT_VEH_GUN_UD
[69] = true, -- INPUT_VEH_ATTACK
[70] = true, -- INPUT_VEH_ATTACK2
[71] = true, -- INPUT_VEH_ACCELERATE
[72] = true, -- INPUT_VEH_BRAKE
[73] = true, -- INPUT_VEH_DUCK
[74] = true, -- INPUT_VEH_HEADLIGHT
[77] = true, -- INPUT_VEH_HOTWIRE_LEFT
[78] = true, -- INPUT_VEH_HOTWIRE_RIGHT
[80] = true, -- INPUT_VEH_CIN_CAM
[86] = true, -- INPUT_VEH_HORN
[91] = true, -- INPUT_VEH_PASSENGER_AIM
[102] = true, -- INPUT_VEH_JUMP
[104] = true, -- INPUT_VEH_SHUFFLE
[105] = true, -- INPUT_VEH_DROP_PROJECTILE
[136] = true, -- INPUT_VEH_PUSHBIKE_PEDAL
[137] = true, -- INPUT_VEH_PUSHBIKE_SPRINT
[139] = true, -- INPUT_VEH_PUSHBIKE_REAR_BRAKE
[140] = true, -- INPUT_MELEE_ATTACK_LIGHT
[141] = true, -- INPUT_MELEE_ATTACK_HEAVY
[142] = true, -- INPUT_MELEE_ATTACK_ALTERNATE
[143] = true, -- INPUT_MELEE_BLOCK
[337] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_TOGGLE
[338] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_LEFT
[339] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_RIGHT
[340] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_UP
[341] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_DOWN
[342] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_UD
[343] = true, -- INPUT_VEH_HYDRAULICS_CONTROL_LR
[351] = true, -- INPUT_VEH_ROCKET_BOOST
[354] = true, -- INPUT_VEH_BIKE_WINGS
[357] = true, -- INPUT_VEH_TRANSFORM
[345] = true, -- INPUT_VEH_MELEE_HOLD
[346] = true, -- INPUT_VEH_MELEE_LEFT
[347] = true, -- INPUT_VEH_MELEE_RIGHT
}
Config.Credits = {
{ title = "<b>Thanks to the community<b>", subtitle = "For supporting and using RP Emotes!" },
{ title = "Thanks ~o~DullPear 🍐~s~", subtitle = "~o~DullPear~s~ for the original dpemotes ❤️" },
{ title = "Thanks <font color=\"#ff451d\">Mathu_lmn 🇫🇷 </font>", subtitle = "<font color=\"#ff451d\">Mathu_lmn 🇫🇷</font> Maintainer, additional features and fixes 🛠️" },
{ title = "Thanks <font color=\"#ff451d\">Enzo2991 🇧🇪 </font>", subtitle = "<font color=\"#ff451d\">Enzo2991 🇧🇪 </font> for creating the ped preview functionality, keybind with kvp" },
{ title = "Thanks <b>Kibook 🐩</b>", subtitle = "<b>Kibook</b> for the addition of Animal Emotes 🐩 submenu." },
{ title = "Thanks ~y~AvaN0x 🇫🇷~s~", subtitle = "~y~AvaN0x~s~ 🇫🇷 for reformatting and assisting with code and additional features 🙏" },
{ title = "Thanks <font color=\"#40E0D0\">iSentrie </font>", subtitle = "<font color=\"#40E0D0\">iSentrie</font> for assisting with code 🛠️" },
{ title = "Thanks <font color=\"#0e64ed\">Mads 🤖</font>", subtitle = "<font color=\"#0e64ed\">Mads 🤖</font> for the addition of Exit Emotes, Crouch & Crawl ⚙️" },
{ title = "Thanks <font color=\"#ff00c3\">Tigerle 🐯</font>", subtitle = "<font color=\"#ff00c3\">Tigerle</font> for assisting with attached Shared Emotes ⚙️." },
{ title = "Thanks <font color=\"#1C9369\">northsqrd ⚙️</font>", subtitle = "<font color=\"#1C9369\">northsqrd</font> for assisting with search feature and phone colours 🔎" },
{ title = "Thanks <font color=\"#15BCEC\">GeekGarage 🤓</font>", subtitle = "<font color=\"#15BCEC\">GeekGarage</font> for assisting with code and features" },
}

View file

@ -0,0 +1,88 @@
fx_version 'cerulean'
game 'gta5'
description 'rpemotes-reborn'
version '1.9.0'
lua54 'yes'
use_experimental_fxv2_oal 'yes'
provide "rpemotes"
dependencies {
'/server:6683',
'/onesync'
}
files {
'conditionalanims.meta',
'header.png'
}
data_file 'CONDITIONAL_ANIMS_FILE' 'conditionalanims.meta'
shared_scripts {
'config.lua',
'locale.lua',
'locales/*.lua',
'animals.lua'
}
server_scripts {
'server/Server.lua',
'server/Updates.lua',
}
client_scripts {
'NativeUI.lua',
'client/Utils.lua',
'client/Bridge.lua',
'client/AnimationList.lua',
'client/AnimationListCustom.lua',
'client/Binoculars.lua',
'client/Crouch.lua',
'client/Emote.lua',
'client/EmoteMenu.lua',
'client/Expressions.lua',
'client/Handsup.lua',
'client/Keybinds.lua',
'client/NewsCam.lua',
'client/NoIdleCam.lua',
'client/Pointing.lua',
'client/PTFX.lua',
'client/Ragdoll.lua',
'client/Syncing.lua',
'client/Walk.lua',
}
data_file 'DLC_ITYP_REQUEST' 'stream/rpemotesreborn_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/brummie_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/bzzz_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/bzzz_camp_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/apple_1.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/kaykaymods_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/knjgh_pizzas.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/natty_props_lollipops.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/ultra_ringcase.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/pata_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/vedere_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/pnwsigns.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/pprp_icefishing.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/scully_props.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/samnick_prop_lighter01.ytyp'
data_file 'DLC_ITYP_REQUEST' 'stream/bzzz_murderpack.ytyp'

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View file

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View file

@ -0,0 +1,28 @@
Locales = {}
function Translate(str, ...)
if not str then
print(("[^1ERROR^7] Resource ^5%s^7 You did not specify a parameter for the Translate function or the value is nil!"):format(GetInvokingResource() or GetCurrentResourceName()))
return "Unknown"
end
if Locales[Config.MenuLanguage] then
if Locales[Config.MenuLanguage][str] then
return string.format(Locales[Config.MenuLanguage][str], ...)
elseif Config.MenuLanguage ~= "en" and Locales["en"] and Locales["en"][str] then
return string.format(Locales["en"][str], ...)
else
return "Translation [" .. Config.MenuLanguage .. "][" .. str .. "] does not exist"
end
elseif Config.MenuLanguage ~= "en" and Locales["en"] and Locales["en"][str] then
return string.format(Locales["en"][str], ...)
else
return "Locale [" .. Config.MenuLanguage .. "] does not exist"
end
end
function TranslateCap(str, ...)
return _(str, ...):gsub("^%l", string.upper)
end
_ = Translate
_U = TranslateCap

View file

@ -0,0 +1,62 @@
Locales['ar'] = {
-- Arabic
['emotes'] = " ~h~~p~حركات 🎬",
['danceemotes'] = "~h~~p~ 🕺 حركات الرقص",
['animalemotes'] = "~h~~p~ 🐩 حركات الحيوانات",
['propemotes'] = "~h~~p~ 📦 حركات الاوبجكتات",
['prop2info'] = "❓ حركات الاوبجكتات تكون محددة في النهاية",
['set'] = "وضع (",
['newsetemote'] = "~w~ هي حركتك المربوطة , اضغط على ~g~CapsLock~w~ لإستخدامها",
['cancelemote'] = "~h~~r~ الغاء الحركة 🚷",
['cancelemoteinfo'] = "لالغاء لعب الحركة الحالية ~r~X~w~",
['walkingstyles'] = "~h~~p~ اساليب المشي 🚶🏻‍",
['resetdef'] = "اعادتها للوضع الطبيعي",
['normalreset'] = "~h~~r~ العادي (اعادة تعيين)",
['moods'] = "~h~~p~ المزاج 😒",
['infoupdate'] = "حقوق & للاقتراحات 🤝🏻",
['infoupdateav'] = "المعلومات (التحديث متاح)",
['infoupdateavtext'] = "يوجد تحديث جديد متاح , قم بالحصول عليه من هنا : ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "لديك اقتراحات؟",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ على منتدى فايف ام لأي اقتراحات او حركات! ✉️",
['notvaliddance'] = "هذه الرقصة غير متاحة",
['notvalidemote'] = "هذه الحركة غير متاحة.",
['nocancel'] = "لا يوجد حركة لالغائها.",
['maleonly'] = "هذه الحركة مخصصة فقط للذكور، المعذرة!",
['emotemenucmd'] = "استخدم امر emotemenu\' قائمة الحركات لفتح قائة الحركات",
['shareemotes'] = "~h~~p~ 👫 الحركات المشتركة",
['shareemotesinfo'] = "دعوة شخص قريب لعمل حركات معه",
['sharedanceemotes'] = "~h~~p~ 🕺 الرقصات المشتركة",
['notvalidsharedemote'] = "هذه ليست حركة مشتركة متاحة.",
['sentrequestto'] = "تم ارسال الطلب الى ~y~",
['nobodyclose'] = "لا يوجد شخص ~r~قريب عليك~w~ كفاية.",
['doyouwanna'] = "~y~Y~w~ للقبول, ~r~L~w~ للرفض (~g~",
['refuseemote'] = "تم رفض الحركة",
['makenearby'] = "قم بجعل اقرب لاعب يلعب",
['useleafblower'] = "اضغط ~y~G~w~ لإستخدام ورقة منفاخ.",
['camera'] = "اضغط ~y~G~w~ لاستخدام فلاش الكاميرا.",
['makeitrain'] = "اضغط ~y~G~w~ لجعلها تمطر.",
['pee'] = "اضغط ضغطة مطولة على ~y~G~w~ لقضاء الحاجة.",
['spraychamp'] = "اضغط ضغطة مطولة على ~y~G~w~ لرش الشمبانيا",
['stun'] = "اضغط ~y~G~w~ لاستخدام بندقية حصرية",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "اضغط ~y~G~w~ لتدخين الفيب.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "%s مرتبط إلى (%s)",
['currentlyboundemotes'] = " الحركات المشغلة حاليا:",
['notvalidkey'] = "كبسة غير صالحة",
['keybinds'] = "🔢 كبسات الفاتيح",
['keybindsinfo'] = "استخدام",
['searchemotes'] = "~h~~y~ 🔍 بحث عن حركة",
['searchinputtitle'] = "بحث:",
['searchmenudesc'] = " نتيجة لـ ",
['searchnoresult'] = "لا يوجد نتيجة للبحث ",
['invalidvariation'] = "تكستشر غير صالح, الاختيارات الصحيحة هي : %s",
['firework'] = "اضغط ~y~G~w~ لاستخدام الالعاب النارية",
['poop'] = "اضغط ~y~G~w~ لقضاء الحاجة 2",
['puke'] = "اضغط ~y~G~w~ للتقيؤ",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "اختيار",
['btn_back'] = "العودة",
['btn_switch'] = "حركة",
['btn_increment'] = "زيادة"
}

View file

@ -0,0 +1,78 @@
Locales['cs'] = {
-- Czech 🇨🇿
['emotes'] = "~h~~p~ Animace 🎬",
['danceemotes'] = "~h~~p~ 🕺 Taneční Animace",
['animalemotes'] = "~h~~p~ 🐩 Zvířecí Animace",
['propemotes'] = "~h~~p~ 📦 Animace s předměty",
['prop2info'] = "❓ Pomůcky se mohou nacházet na konci",
['set'] = "Nastavit",
['newsetemote'] = "~w~ je nyní vaší novou nastavenou animací. Chcete-li jej použít, stiskněte ~g~CapsLock~w~.",
['cancelemote'] = "~h~~r~ Zrušit animaci 🚷",
['cancelemoteinfo'] = "~r~X~w~ Zruší aktuálně přehrávanou animaci",
['walkingstyles'] = "Styly chůze 🚶🏻‍♂️",
['resetdef'] = "Obnovit do základního nastavení",
['normalreset'] = "~h~~r~ Neutrální výraz",
['moods'] = "~h~~p~ Výrazy 😒",
['infoupdate'] = "~h~~g~ Kredity 🤝🏻",
['infoupdateav'] = "Informace (aktualizace dostupná)",
['infoupdateavtext'] = "Je k dispozici aktualizace, stáhněte si nejnovější verzi z ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Nápady?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ na FiveM forums je pro jakýkoliv návrh! ✉️",
['notvaliddance'] = "Není platný tanec.",
['notvalidemote'] = "Není platná animace.",
['nocancel'] = "Žádné animace ke zrušení.",
['maleonly'] = "Tato emoce je pouze pro muže, omlouvám se!",
['emotemenucmd'] = "Použij /emotemenu pro otevření menu.",
['shareemotes'] = "~h~~p~ 👫 Sdílené animace",
['shareemotesinfo'] = "Pozvěte osobu v okolí, k tanci",
['sharedanceemotes'] = "~h~~p~ 🕺 Sdílené tance",
['notvalidsharedemote'] = "Není platný Sdílený tanec.",
['sentrequestto'] = "Odeslal jsi ~y~ žádost o tanec ",
['nobodyclose'] = "Nikdo ~r~není~w~ v dostatečné blízkosti.",
['doyouwanna'] = "~y~Y~w~ pro příjmutí, ~r~L~w~ pro odmítnutí (~g~",
['refuseemote'] = "Emote odmítnut.",
['makenearby'] = "Požádat nejbližšího hráče",
['useleafblower'] = "Stiskněte ~yG~w~ pro použití foukače listí", -- GOOGLE TRANSLATED
['camera'] = "Stiskni ~y~G~w~ pro použítí blesku u fotoaparátu.",
['makeitrain'] = "Stiskni ~y~G~w~ pro spuštení deště.",
['pee'] = "Podrž ~y~G~w~ pro čůrání.",
['spraychamp'] = "Podrž ~y~G~w~ pro stříkaní šampaňského",
['stun'] = "Stiskni ~y~G~w~ pro použití paralyzéru.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Stiskni ~y~G~w~ pro použití vapky.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bound (%s) to %s",
['currentlyboundemotes'] = "Momentálně nastavené animace:",
['notvalidkey'] = "Není platná klávesa.",
['keybinds'] = "🔢 Klávesové Zkratky",
['keybindsinfo'] = "Use",
['searchemotes'] = "~h~~y~ 🔍 Vyhledat animace",
['searchinputtitle'] = "Vyhledáno:",
['searchmenudesc'] = "výsledek pro",
['searchnoresult'] = "Žádna animace nebyla nalezena",
['invalidvariation'] = "Neplatná variace textury. Platné výběry jsou: %s",
['firework'] = "Stiskni ~y~G~w~ pro použití ohňostroje",
['poop'] = "Stisknutím ~y~G~w~ se vykakáte",
['puke'] = "Stiskni ~y~G~w~ pro zvracení",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Vybrat",
['btn_back'] = "Zpět",
['btn_switch'] = "Pohyb",
['btn_increment'] = "Increment",
['dead'] = "Nemůžeš používat emoce, když jsi mrtvý!",
['swimming'] = "Nemůžeš používat emoce, když plaveš!",
['notvalidpet'] = "OOOh! Zjištěn nesprávný model peda! 🐕",
['animaldisabled'] = "Omlouváme se! Zvířecí emotikony jsou na tomto serveru zakázány",
['adultemotedisabled'] = "Bonk! Dospělé emotikony vypnuty 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Výstup z dalekohledu",
['toggle_binoculars_vision'] = "Přepínání mezi režimy vidění",
['exit_news'] = "Výstup ze zpravodajské kamery",
['toggle_news_vision'] = "Přepínání mezi režimy vidění",
['edit_values_newscam'] = "Úprava textu zprávy",
['not_in_a_vehicle'] = "Tuto animaci nelze přehrávat ve vozidle.",
['in_a_vehicle'] = "Tuto animaci lze přehrát pouze ve vozidle.",
['no_anim_crawling'] = "Při plazení nelze přehrávat animace",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['da'] = {
-- Danish 🇩🇰
['emotes'] = "~h~~p~ Animationer",
['danceemotes'] = "~h~~p~ 🕺 Danse Animationer",
['animalemotes'] = "~h~~p~ 🐩 Dyr Animationer",
['propemotes'] = "~h~~p~ 📦 Rekvisit Animationer",
['prop2info'] = "❓ Rekvisit animationer findes i slutningen",
['set'] = "Sæt (",
['newsetemote'] = "~w~ er nu din favorit animation, tryk ~g~CapsLock~w~ for at bruge den.",
['cancelemote'] = "~h~~r~ Afbryd animation",
['cancelemoteinfo'] = "~r~X~w~ annullerer din igangværende animation.",
['walkingstyles'] = "~h~~p~ Gågange 🚶",
['resetdef'] = "Nulstil til standard",
['normalreset'] = "Normal (Nulstil)",
['moods'] = "~h~~p~ Humør 😒",
['infoupdate'] = "~h~~g~ Credits 🤝",
['infoupdateav'] = "Information (Opdatering tilgængelig)",
['infoupdateavtext'] = "En opdatering er tilgænglig, hent den nyeste version fra ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Forslag?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ på FiveM-forum for alle funktioner/emote-forslag! ✉️",
['notvaliddance'] = "er ikke en gyldig dans",
['notvalidemote'] = "er ikke en gyldig animation",
['nocancel'] = "Ingen animationer bruges lige nu",
['maleonly'] = "Denne animation virker kun til mænd!",
['emotemenucmd'] = "Skriv /emotemenu for animationsmenuen",
['shareemotes'] = "👫 Delte animationer",
['shareemotesinfo'] = "Inviter en person i nærheden til at dele en animationer",
['sharedanceemotes'] = "~h~~p~ 🕺 Delete Danse",
['notvalidsharedemote'] = "er ikke en gyldig delt animation.",
['sentrequestto'] = "Anmodning sendt til ~y~",
['nobodyclose'] = "Ingen ~r~personer~w~ i nærheden.",
['doyouwanna'] = "~y~Y~w~ for at acceptere, ~r~L~w~ for at afvist (~g~",
['refuseemote'] = "Animation afvist.",
['makenearby'] = "får den nærliggende person til at bruge",
['useleafblower'] = "Tryk på ~yG~w~ for at bruge løvblæseren",
['camera'] = "Tryk ~y~G~w~ for at bruge kameraets blitz.",
['makeitrain'] = "Tryk ~y~G~w~ for at regne med penge.",
['pee'] = "Hold ~y~G~w~ for at tisse.",
['spraychamp'] = "Hold ~y~G~w~ for at sprøjte med champagnen",
['stun'] = "Tryk på ~y~G~w~ for at bruge elektrisk pistol.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Press ~y~G~w~ to vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bound (%s) to %s",
['currentlyboundemotes'] = " Keybind animationer:",
['notvalidkey'] = "er ikke en gyldigt nøgle.",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Brug",
['searchemotes'] = "~h~~y~ 🔍 Søg efter animation",
['searchinputtitle'] = "Søg:",
['searchmenudesc'] = "resultat(er) for",
['searchnoresult'] = "Ingen resultater fundet med",
['invalidvariation'] = "Ugyldig teksturvariation. Gyldige valg er: %s",
['firework'] = "Tryk på ~y~G~w~ for at bruge fyrværkeri",
['poop'] = "Tryk på ~y~G~w~ for at skide",
['puke'] = "Tryk ~y~G~w~ for at kaste op", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Vælg",
['btn_back'] = "Tilbage",
['btn_switch'] = "Bevægelse",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,99 @@
Locales['de'] = {
-- German 🇩🇪
['emotes'] = "~h~~p~ Emotes 🎬",
['danceemotes'] = "~h~~p~ 🕺 Tanz-Emotes",
['animalemotes'] = "~h~~p~ 🐩 Tier Emotes",
['propemotes'] = "~h~~p~ 📦 Prop-Emotes",
['prop2info'] = "❓ Prop-Emotes können am Ende platziert werden",
['set'] = "Setze (",
['newsetemote'] = "~w~ ist jetzt ein gebundenes Emote, drücke ~g~CapsLock~w~, um es zu verwenden.",
['cancelemote'] = "~h~~r~ Emote abbrechen 🚷",
['cancelemoteinfo'] = "~r~ X ~w~ Bricht das aktuell wiedergegebene Emote ab",
['walkingstyles'] = "~h~~p~ Gehstile 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Auf Standard zurücksetzen",
['normalreset'] = "~h~~r~ Normal (Zurücksetzen)",
['moods'] = "~h~~p~ Stimmungen 😒",
['infoupdate'] = "~h~~g~ Credits 🤝🏻",
['remove_emote_keybind'] = 'Emote von den Tastenkombinationen entfernen',
['show_emote_keybind'] = 'Emotes mit Tastenkombination anzeigen',
['play_emote'] = 'Eine Animation abspielen',
['open_menu_emote'] = 'Animationsmenü öffnen',
['show_list_emote'] = 'Liste der möglichen Emotes anzeigen',
['link_emote_keybind'] = 'Einen Emote einer Taste zuordnen',
['help_command'] = 'Tanz, Kamera, Sitz oder andere Emotes',
['help_variation'] = '(Optional) 1, 2, 3 oder eine andere Zahl. Ändert die Textur bestimmter Accessoires in Emotes, z.B. die Farbe eines Telefons. Gib -1 ein, um eine Liste der Varianten zu sehen',
['infoupdateav'] = "Information (Update verfügbar)",
['infoupdateavtext'] = "Eine Aktualisierung ist verfügbar ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Vorschläge?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ in FiveM-Foren für alle Feature- / Emote-Vorschläge! ✉️",
['notvaliddance'] = "ist kein gültiger Tanz",
['notvalidemote'] = "ist kein gültiges Emote",
['nocancel'] = "Kein Emote zum Abbrechen",
['maleonly'] = "Dieser Emote ist nur für Männer, tut mir leid!",
['emotemenucmd'] = "Verwende den Befehl /emotemenu, um das Animationsmenü zu öffnen.",
['shareemotes'] = "~h~~p~ 👫 Geteilte Emotes",
['shareemotesinfo'] = "Laden Sie eine Person in Ihrer Nähe zum Emoten ein",
['sharedanceemotes'] = "~h~~p~ 🕺 Geteilte Tänze",
['notvalidsharedemote'] = "ist kein gültiges geteiltes Emote.",
['sentrequestto'] = "Anfrage an ~g~ gesendet",
['nobodyclose'] = "Niemand ist nah genug dran.",
['doyouwanna'] = "~y~Z~w~ zu akzeptieren, ~r~L~w~ zu verweigern (~g~",
['refuseemote'] = "Emote abgelehnt.",
['makenearby'] = "Starte einen Emote mit einer Person in deiner Nähe",
['useleafblower'] = "Drücke ~y~G~w~, um den Laubgebläse zu verwenden.",
['camera'] = "Drücke ~y~G~w~, um den Kamera-Blitz zu verwenden.",
['makeitrain'] = "Drücke ~y~G~w~, um Geld zu werfen.",
['pee'] = "Halte ~y~G~w~, um zu urinieren.",
['spraychamp'] = "Halte ~y~G~w~, um Champagner zu sprühen",
['stun'] = "Drücke ~y~G~w~, um die Elektroschockpistole zu 'verwenden'.",
['smoke'] = "Halte ~y~G~w~, um zu rauchen.",
['vape'] = "Halte ~y~G~w~, um zu vapen.",
['candle'] = "Drücke ~y~G~w~, um die Kerze anzuzünden.",
['boundto'] = "Gebunden (~y~%s~w~) an ~g~%s~w~",
['handsup'] = "Hände hoch",
['currentlyboundemotes'] = "Aktuell gebundene Emotes:",
['notvalidkey'] = "ist keine gültige Taste.",
['keybinds'] = "🔢 Tastenkombinationen",
['keybindsinfo'] = "verwenden",
['searchemotes'] = "~h~~y~ 🔍 Suche nach Bestimmten Emotes",
['searchinputtitle'] = "Suche:",
['searchmenudesc'] = "Ergebnis(se) für ",
['searchnoresult'] = "Es wurden keine Ergebnisse gefunden für",
['invalidvariation'] = "Ungültige Texturvariante. Gültige Auswahlen sind: %s",
['firework'] = "Drücke ~y~G~w~, um das Feuerwerk zu zünden",
['poop'] = "Drücke ~y~G~w~, um zu kacken",
['puke'] = "Drücke ~y~G~w~, um dich zu übergeben",
['cut'] = "Drücke ~y~G~w~, um zu schneiden",
['btn_select'] = "Auswählen",
['btn_back'] = "Zurück",
['btn_increment'] = "Erhöhen",
['dead'] = "Du kannst keine Emotes verwenden, während du tot bist!",
['swimming'] = "Du kannst keine Emotes verwenden, während du schwimmst",
['notvalidpet'] = "RUH ROH! Falsches Tiermodell erkannt 🐕!",
['animaldisabled'] = "Entschuldigung! Tier-Emotes sind auf diesem Server deaktiviert",
['adultemotedisabled'] = "Bonk! Erwachsene Emotes deaktiviert 🔞",
['toggle_instructions'] = "Anweisungen umschalten",
['exit_binoculars'] = "Fernglas verlassen",
['toggle_binoculars_vision'] = "Zwischen den Ansichtsmodi wechseln",
['exit_news'] = "Nachrichtenkamera verlassen",
['toggle_news_vision'] = "Zwischen den Ansichtsmodi wechseln",
['edit_values_newscam'] = "Den Nachrichtentext bearbeiten",
['not_in_a_vehicle'] = "Du kannst diese Animation nicht im Fahrzeug abspielen",
['in_a_vehicle'] = "Du kannst diese Animation nur im Fahrzeug abspielen 🚷",
['no_anim_crawling'] = "Du kannst keine Animationen abspielen, während du kriechst",
['no_anim_right_now'] = "Du kannst jetzt keine Animation abspielen",
-- Key maps
['register_cancel_emote'] = "Aktuellen Emote abbrechen",
['register_open_menu'] = "Animationsmenü öffnen",
['register_handsup'] = "Hände hoch",
['register_crouch'] = "Hocken",
['register_crawl'] = "Kriechen",
['register_pointing'] = "Mit dem Finger zeigen",
['register_ragdoll'] = "Ragdoll umschalten",
-- Commands descriptions
['cancel_emote'] = "Aktuellen Emote abbrechen",
['crouch'] = "Hocken",
['crawl'] = "Kriechen",
['pointing'] = "Mit dem Finger zeigen"
}

View file

@ -0,0 +1,78 @@
Locales['el'] = {
-- Greek 🇬🇷
['emotes'] = '~h~~p~ Κινήσεις 🎬',
['danceemotes'] = "~h~~p~ 🕺 Χοροί",
['animalemotes'] = "~h~~p~ 🐩 Ζώα",
['propemotes'] = "~h~~p~ 📦 Αντικείμενα",
['prop2info'] = "Τα αντικείμενα βρίσκοντε στο τέλος",
['set'] = "Set (",
['newsetemote'] = "~w~ είναι τώρα στα αγαπημένα σου, πάτησε ~g~CapsLock~w~ για να την χρησιμοποιήσεις.",
['cancelemote'] = "~h~~r~ Ακύρωση Κίνησης 🚷",
['cancelemoteinfo'] = "~r~X~w~ Ακυρώνει την κίνηση που κάνεις τώρα",
['walkingstyles'] = "~h~~p~ Είδη Περπατήματος 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Επαναφορα αρχικών ρυθμίσεων",
['normalreset'] = "~h~~r~ Κανονική (Αρχική)",
['moods'] = "~h~~p~ Διαθέσεις 😒",
['infoupdate'] = "~h~~g~ Ευχαριστήρια 🤝🏻",
['infoupdateav'] = "Πληροφορίες (Νέα έκδοση διαθέσιμη!)",
['infoupdateavtext'] = "Υπάρχει νέα έκδοση διαθέσιμη, κατέβασέτην από εδώ ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Προτάσεις?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ στο φόρουμ του FiveM για οποιαδήποτε πρόταση! ✉️",
['notvaliddance'] = "δεν είναι διαθέσιμος χορός.",
['notvalidemote'] = "δεν είναι διαθέσιμη κίνηση.",
['nocancel'] = "Δεν κάνεις κάποια κίνηση για να ακυρωθεί.",
['maleonly'] = "Αυτή η κίνηση είναι μόνο για άνδρες,συγνώμη!",
['emotemenucmd'] = "Χρησιμοποίησε την εντολή /emotemenu για να ανοίξεις το μενού κινήσεων.",
['shareemotes'] = "~h~~p~ 👫 Κινήσεις Με Άλλους Παίκτες",
['shareemotesinfo'] = "Προσκάλεσε τον κοντινότερο παίκτη για να κάνετε μια κίνηση",
['sharedanceemotes'] = "~h~~p~ 🕺 Χοροί Με Άλλους Παίκτες",
['notvalidsharedemote'] = "δεν είναι διαθέσιμη κίνηση για να κάνεις με άλλον παίκτη.",
['sentrequestto'] = "Στείλε αίτημα σε ~y~",
['nobodyclose'] = "Κανείς ~r~κοντα~w~ σου.",
['doyouwanna'] = "~y~Y~w~ για να δεχτείς, ~r~L~w~ για να αρνηθείς (~g~",
['refuseemote'] = "Η κίνηση δεν αποδέχτηκε.",
['makenearby'] = "κάνει τον κοντινό παίκτη να παίξει",
['useleafblower'] = "Πάτησε ~y~G~w~ για να χρησιμοποιήσεις την συσκευή φυσίματος.",
['camera'] = "Πάτησε ~y~G~w~ για να χρησιμοποιήσεις το φλας της κάμερας.",
['makeitrain'] = "Πάτησε ~y~G~w~ για βροχή χρημάτων.",
['pee'] = "Κράτα πατημένο το ~y~G~w~ για να κατουρήσεις.",
['spraychamp'] = "Κράτα πατημένο το ~y~G~w~ για άνοιγμα σαμπάνιας",
['stun'] = "Πάτησε ~y~G~w~ για να 'χρησιμοποιήσεις' πιστόλι ακινητοποίησης.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Πάτησε ~y~G~w~ για να ατμίσεις.",
['candle'] = "press ~y~G~w~ to light candle.",
['bound'] = "Σύνδεση (%s) στο %s",
['currentlyboundemotes'] = " Τωρινές συντομεύσεις κινήσεων:",
['notvalidkey'] = "δεν είναι σωστό κουμπί.",
['keybinds'] = "🔢 Συντομεύσεις Πλήκτρων",
['keybindsinfo'] = "Χρήση",
['searchemotes'] = "~h~~y~ 🔍 Αναζήτηση Κινήσεων",
['searchinputtitle'] = "Αναζήτηση:",
['searchmenudesc'] = "αποτέλεσμα(ατα) για",
['searchnoresult'] = "Κανένα απότέλεσμα για την αναζήτηση",
['invalidvariation'] = "Μη έγκυρη επιλογή. Σωστές επιλογές είναι: %s",
['firework'] = "Πάτησε ~y~G~w~ για να χρησιμοποιήσεις βεγγαλικό",
['poop'] = "Πάτησε ~y~G~w~ για χέσιμο",
['puke'] = "Πάτησε ~y~G~w~ για εμετό",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Επιλογή",
['btn_back'] = "Πίσω",
['btn_switch'] = "Κίνηση",
['btn_increment'] = "Ταχύτητα Κίνησης",
['dead'] = "Δεν μπορείς να κάνεις κάποια κίνηση ενώ έχεις πεθάνει!",
['swimming'] = "Δεν μπορείς να κάνεις κάποια κίνηση ενώ κολυμπάς",
['notvalidpet'] = "RUH ROH! Λάθος ped model, δεν μπορεί να κάνει κινήσεις ο χαρακτήρας σου 🐕!",
['animaldisabled'] = "Συγνώμη! Οι κινήσεις με ζώα είναι απενεργοποιήμενα σε αυτόν τον server",
['adultemotedisabled'] = "Ούπς! Οι κινήσεις Ενηλίκων είναι απενεργοποιήμενες! 🔞",
['toggle_instructions'] = "Εμφάνιση/Απόκρυψη οδηγιών",
['exit_binoculars'] = "Κλείσε τα κυάλια",
['toggle_binoculars_vision'] = "Εναλλαγή φακών",
['exit_news'] = "Κλείσε την Κάμερα Ειδήσεων",
['toggle_news_vision'] = "Εναλλαγή φακών",
['edit_values_newscam'] = "Επεξεργασία κειμένου της είδησης",
['not_in_a_vehicle'] = "Δεν μπορείς να κάνεις αυτή τη κίνηση ενώ είσαι σε όχημα ",
['in_a_vehicle'] = "Μπορείς να κάνεις αυτή τη κίνηση μόνο ενώ είσαι σε όχημα 🚷",
['no_anim_crawling'] = "Δεν μπορείς να κάνεις κάποια κίνηση ενώ σέρνεσαι",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,99 @@
Locales['en'] = {
-- English 🇬🇧
['emotes'] = 'Emotes 🎬',
['danceemotes'] = "🕺 Dance Emotes",
['animalemotes'] = "🐩 Animal Emotes",
['propemotes'] = "📦 Prop Emotes",
['prop2info'] = "❓ Prop Emotes can be located at the end",
['set'] = "Set (",
['newsetemote'] = "~w~ is now your bound emote, press ~g~CapsLock~w~ to use it.",
['cancelemote'] = "Cancel Emote 🚷",
['cancelemoteinfo'] = "~r~X~w~ Cancels the currently playing emote",
['walkingstyles'] = "Walking Styles 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Reset to default",
['normalreset'] = "~h~~r~ Normal (Reset)",
['moods'] = "Moods 😒",
['infoupdate'] = "Credits 🤝🏻",
['remove_emote_keybind'] = 'Delete an emote from keybinds',
['show_emote_keybind'] = 'view emotes on keybinds',
['play_emote'] = 'play an animation',
['open_menu_emote'] = 'Open animation menu',
['show_list_emote'] = 'See the list of possible emotes',
['link_emote_keybind'] = 'Linking an emote to a key',
['help_command'] = 'dance, camera, sit or any other emote',
['help_variation'] = '(Optional) 1, 2, 3 or any number. Will change the texture of certain accessories used in emotes, for example the color of a telephone. Enter -1 to see a list of variants',
['infoupdateav'] = "Information (Update available)",
['infoupdateavtext'] = "An update is available, get the latest version from ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Suggestions?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ on FiveM forums for any feature/emote suggestions! ✉️",
['notvaliddance'] = "is not a valid dance.",
['notvalidemote'] = "is not a valid emote.",
['nocancel'] = "No emote to cancel.",
['maleonly'] = "This emote is male only, sorry!",
['emotemenucmd'] = "Use command /emotemenu to open animations menu.",
['shareemotes'] = "👫 Shared Emotes",
['shareemotesinfo'] = "Invite a nearby person to emote",
['sharedanceemotes'] = "🕺 Shared Dances",
['notvalidsharedemote'] = "is not a valid shared emote.",
['sentrequestto'] = "Sent request to ~y~",
['nobodyclose'] = "Nobody ~r~close~w~ enough.",
['doyouwanna'] = "~y~Y~w~ to accept, ~r~L~w~ to refuse (~g~",
['refuseemote'] = "Emote refused.",
['makenearby'] = "makes the nearby player play",
['useleafblower'] = "Press ~y~G~w~ to use the leaf blower",
['camera'] = "Press ~y~G~w~ to use camera flash",
['makeitrain'] = "Press ~y~G~w~ to make it rain",
['pee'] = "Hold ~y~G~w~ to pee",
['spraychamp'] = "Hold ~y~G~w~ to spray champagne",
['stun'] = "Press ~y~G~w~ to 'use' stun gun",
['smoke'] = "Press ~y~G~w~ to smoke",
['vape'] = "Press ~y~G~w~ to vape",
['candle'] = "Press ~y~G~w~ to light candle",
['ptfxinfo'] = "Press ~y~G~w~ to activate the effects",
['boundto'] = "Bound (~y~%s~w~) to ~g~%s~w~",
['handsup'] = "Hands up",
['currentlyboundemotes'] = "Currently bound emotes:",
['notvalidkey'] = "is not a valid key.",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Use",
['searchemotes'] = "🔍 Search for Emotes",
['searchinputtitle'] = "Search:",
['searchmenudesc'] = "result(s) for",
['searchnoresult'] = "No results for search",
['invalidvariation'] = "Invalid texture variation. Valid selections are: %s",
['firework'] = "Press ~y~G~w~ to use the firework",
['poop'] = "Press ~y~G~w~ to poop",
['puke'] = "Press ~y~G~w~ to puke",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Select",
['btn_back'] = "Back",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
-- Key maps
['register_cancel_emote'] = "Cancel current emote",
['register_open_menu'] = "Open animation menu",
['register_handsup'] = "Raise hands up",
['register_crouch'] = "Crouch",
['register_crawl'] = "Crawl",
['register_pointing'] = "Point with a finger",
['register_ragdoll'] = "Toggle ragdoll",
-- Commands descriptions
['cancel_emote'] = "Cancel current emote",
['crouch'] = "Crouch",
['crawl'] = "Crawl",
['pointing'] = "Finger pointing"
}

View file

@ -0,0 +1,77 @@
Locales['es'] = {
-- Spanish 🇪🇸
['emotes'] = "~h~~p~ Animaciones 🎬",
['danceemotes'] = "~h~~p~ 🕺 Bailes",
['animalemotes'] = "~h~~p~ 🐩 Emotes de animales",
['propemotes'] = "~h~~p~ 📦 Objetos",
['prop2info'] = "❓ Los Prop Emotes se pueden encontrar al final",
['set'] = "Elegir (",
['newsetemote'] = "~w~ es ahora tu animación favorita, presiona ~g~[CapsLock]~w~ para usarla.",
['cancelemote'] = "~h~~r~ Cancelar animación 🚷",
['cancelemoteinfo'] = "~r~X~w~ Cancela la animación actual.",
['walkingstyles'] = "~h~~p~ Formas de caminar 🚶🏻‍♂️",
['resetdef'] = "Reiniciar a por defecto",
['normalreset'] = "~h~~r~ Normal (Reiniciar)",
['moods'] = "~h~~p~ Estados de animo 😒",
['infoupdate'] = "~h~~g~ Créditos 🤝🏻",
['infoupdateav'] = "Información (Actualización disponible)",
['infoupdateavtext'] = "Hay una actualización disponible, para conseguir la ultima version ingrese a ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Sugerencias?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ en el foro de FiveM para cualquier sugerencia! ✉️",
['notvaliddance'] = "no es un baile valido.",
['notvalidemote'] = "no es una animación valida.",
['nocancel'] = "No hay animación para cancelar.",
['maleonly'] = "Esta animación es solo de hombre!",
['emotemenucmd'] = "Escribe /emotemenu para abrir el menu.",
['shareemotes'] = "~h~~p~ 👫 Animaciones compartidas",
['shareemotesinfo'] = "Invita a una persona cercana para la animación.",
['sharedanceemotes'] = "~h~~p~ 🕺 Bailes compartidos",
['notvalidsharedemote'] = "no es una animación compartida valida.",
['sentrequestto'] = "Solicitud enviada ~y~",
['nobodyclose'] = "Nadie ~r~cerca~w~.",
['doyouwanna'] = "~y~Y~w~ para aceptar, ~r~L~w~ para rechazar (~g~",
['refuseemote'] = "Animacion rechazada.",
['makenearby'] = "hacer que el jugador cercano juegue",
['useleafblower'] = "Presione ~y~G~w~ para utilizar el soplador de hojas.",
['camera'] = "Presione ~y~G~w~ para usar el flash de la cámara.",
['makeitrain'] = "Presione ~y~G~w~ para hacer llover.",
['pee'] = "Mantén la ~y~G~w~ para mear.",
['spraychamp'] = "Mantén la ~y~G~w~ para rociar champán.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Presione ~y~G~w~ para vapear.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Unida (%s) a %s",
['currentlyboundemotes'] = " Emotes vinculados actualmente:",
['notvalidkey'] = "no es una clave válida.",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Utilizar",
['searchemotes'] = "~h~~y~ 🔍 Busca animaciones",
['searchinputtitle'] = "Buscar:",
['searchmenudesc'] = "resultado(s) para",
['searchnoresult'] = "No se encontró nada con",
['invalidvariation'] = "Variación de textura no válida. Las opciones válidas son: %s",
['firework'] = "Presione ~y~G~w~ para usar los fuegos artificiales",
['poop'] = "Presione ~y~G~w~ para hacer caca",
['puke'] = "Presiona ~y~G~w~ para vomitar", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Seleccionar",
['btn_back'] = "Atrás ",
['btn_switch'] = "Movimiento ",
['btn_increment'] = "Increment",
['dead'] = "¡No puedes usar animaciones mientras estás muerto!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['fa'] = {
-- persian 🇮🇷
['emotes'] = "~h~~p~ Emotes 🎬",
['danceemotes'] = "~h~~p~ 🕺 raghs Emotes",
['animalemotes'] = "~h~~p~ 🐩 hevanat Emotes",
['propemotes'] = "~h~~p~ 📦 tekye dadan Emotes",
['prop2info'] = "❓ bad az tekye dadan be yek ja motavaghef mishavad",
['set'] = "Set (",
['newsetemote'] = "~w~ baray dastresi sari, press ~g~CapsLock~w~ baray ejra",
['cancelemote'] = "~h~~r~ laghv emote🚷",
['cancelemoteinfo'] = "~r~X~w~ baray laghv emote ",
['walkingstyles'] = "~h~~p~ style rah raftan🚶🏻",
['resetdef'] = "bazneshani pishfarz",
['normalreset'] = "~h~~r~ Mamoli (Pishfarz)",
['moods'] = "~h~~p~ halat sorat 😒",
['infoupdate'] = "~h~~g~ pishnahad 🤝🏻",
['infoupdateav'] = "etelaate (berozresani mojod)",
['infoupdateavtext'] = "update jadid vojod darad baray daryaft ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "pishnahad?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ on FiveM forums for any feature/emote suggestions! ✉️",
['notvaliddance'] = "raghsi vojod nadarad.",
['notvalidemote'] = "emote motabar nist.",
['nocancel'] = "emote baray laghv vojod nadarad.",
['maleonly'] = "in emote faghat baray mardan ast motasefam!",
['emotemenucmd'] = "ba farman /emotemenu be menu emote ha miravid",
['shareemotes'] = "👫 eshterak emote",
['shareemotesinfo'] = "peyvastan afrad atraf be in emote",
['sharedanceemotes'] = "🕺 eshtrak raghs",
['notvalidsharedemote'] = "in emote baray eshtrak motabar nist.",
['sentrequestto'] = "ersal darkhast ~y~",
['nobodyclose'] = "hichkas nist ~r~bastan~w~ kafi nist.",
['doyouwanna'] = "~y~Y~w~ baray ghabol, ~r~L~w~ baray rad kardan (~g~",
['refuseemote'] = "Emote rad shod.",
['makenearby'] = "sakht baray bazi ba atrafian",
['useleafblower'] = "entekhab ~y~G~w~ baray entekhab barg rob.",
['camera'] = "entekhab ~y~G~w~ baray entekhab cheragh.",
['makeitrain'] = "entekhab ~y~G~w~ baray sakht chatr.",
['pee'] = "negahdarid ~y~G~w~ baray shashidan.",
['spraychamp'] = "negahdarid ~y~G~w~ baray rikhtan mashrob",
['stun'] = "Press ~y~G~w~ baray 'use' tofang bihoshi.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "entekhab ~y~G~w~ to vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bound (%s) baray %s",
['currentlyboundemotes'] = " emote mahdod ast:",
['notvalidkey'] = "vojod nadarad.",
['keybinds'] = "🔢 kilid sari",
['keybindsinfo'] = "entekhab",
['searchemotes'] = "~h~~y~ 🔍 jostjo Emotes",
['searchinputtitle'] = "jostojo:",
['searchmenudesc'] = "result(s) for",
['searchnoresult'] = "No results for search",
['invalidvariation'] = "Invalid texture variation. Valid selections are: %s",
['firework'] = "Press ~y~G~w~ to use the firework",
['poop'] = "Press ~y~G~w~ to poop",
['puke'] = "Press ~y~G~w~ to vomit",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Select",
['btn_back'] = "Back",
['btn_switch'] = "Movement",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['fi'] = {
-- Finnish 🇫🇮
['emotes'] = "~h~~p~ Animaatiot 🎬",
['danceemotes'] = "~h~~p~ 🕺 Tanssi Animaatiot",
['animalemotes'] = "~h~~p~ 🐩 Eläin Animaatiot",
['propemotes'] = "~h~~p~ 📦 Esine Animaatiot",
['prop2info'] = "❓ Esine animaatiot voivat sijaita lopussa",
['set'] = "Aseta (",
['newsetemote'] = "~w~ on nyt bindattu animaatio, paina ~g~CapsLock~w~ käyttääksesi",
['cancelemote'] = "~h~~r~ Peru animaatio 🚷",
['cancelemoteinfo'] = "~r~X~w~ Peruu tämän hetkisen animaation",
['walkingstyles'] = "~h~~p~ Kävelytyylit 🚶🏻‍♂️",
['resetdef'] = "Resetoi oletuksen",
['normalreset'] = "~h~~r~ Normaali (Reset)",
['moods'] = "~h~~p~ Mielialat 😒",
['infoupdate'] = "~h~~g~ Krediitit 🤝🏻",
['infoupdateav'] = "Informaatio (Päivitys saatavilla)",
['infoupdateavtext'] = "Uusin versio saatavilla täältä ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Ehdotukset?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ FiveM foorumeilla liittyen mihin tahansa ominaisuus/animaatio ehdotukseen! ✉️",
['notvaliddance'] = "Ei ole tanssi.",
['notvalidemote'] = "Ei ole animaatio.",
['nocancel'] = "Ei ole animaatiota peruutettavaksi.",
['maleonly'] = "Tämä animaatio on ainostaan miehille, pahoittelut!",
['emotemenucmd'] = "Käytä /emotemenu avataksesi animaatio valikon",
['shareemotes'] = "~h~~p~ 👫 Yhteiset Animaatiot",
['shareemotesinfo'] = "Kutsu lähin pelaaja animaatioon ",
['sharedanceemotes'] = "~h~~p~ 🕺 Yhteiset Tanssit",
['notvalidsharedemote'] = "Ei ole yhteinen tanssi animaatio.",
['sentrequestto'] = "Kutsu lähetetty pelaajalle ~y~",
['nobodyclose'] = "Kukaan ei ole ~r~lähelläsi~w~.",
['doyouwanna'] = "~y~Y~w~ hyväksyäksesi, ~r~L~w~ kieltäytyäksesi (~g~",
['refuseemote'] = "Kieltäytyi animaatiosta.",
['makenearby'] = "lähellä oleva pelaaja tekee",
['useleafblower'] = "Paina ~y~G~w~ käyttääksesi lehtipuhallinta.",
['camera'] = "Paina ~y~G~w~ käyttääksesi kameran salamaa.",
['makeitrain'] = "Paina ~y~G~w~ heittääksesi rahaa.",
['pee'] = "Pidä ~y~G~w~ pissataksesi.",
['spraychamp'] = "Pidä ~y~G~w~ suihkuttaaksesi shamppanjaa",
['stun'] = "Paina ~y~G~w~ 'käyttääksesi' etälamautinta.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Paina ~y~G~w~ käyttääksesi vapea.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bindata (%s) näppäimeen %s",
['currentlyboundemotes'] = "Bindatut animaatiot:",
['notvalidkey'] = "ei ole käytettävä näppäin.",
['keybinds'] = "🔢 Pikanäppäimet",
['keybindsinfo'] = "Käytä",
['searchemotes'] = "~h~~y~ 🔍 Etsiäksesi emoten",
['searchinputtitle'] = "Etsi:",
['searchmenudesc'] = "tulokset",
['searchnoresult'] = "Ei tuloksia haulle",
['invalidvariation'] = "Virheellinen tekstuurimuunnelma. Kelvollisia valintoja ovat: %s",
['firework'] = "Käytä ilotulitteita painamalla ~y~G~w~",
['poop'] = "Paina ~y~G~w~ kakataksesi.",
['puke'] = "Paina ~y~G~w~ oksentaaksesi.",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Valitse",
['btn_back'] = "Takaisin",
['btn_switch'] = "Liike",
['btn_increment'] = "Lisäys",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Vääränlainen ped modeli havaittu! 🐕",
['animaldisabled'] = "Anteeksi! Eläin animaatiot on poistettu käytöstä tällä palvelimella",
['adultemotedisabled'] = "Bonk! Aikuisten animaatio pois käytöstä :underage:",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Poistuaksesi kiikareista",
['toggle_binoculars_vision'] = "Vaihtele kiikariden näköetäisyyttä",
['exit_news'] = "Poistuaksesi uutiskamerasta",
['toggle_news_vision'] = "Vaihtele uutiskameran näkymää",
['edit_values_newscam'] = "Muokkaa uutistekstiä",
['not_in_a_vehicle'] = "Et voi toistaa tätä animaatiota ajoneuvossa",
['in_a_vehicle'] = "Voit toistaa tämän animaation vain ajoneuvossa",
['no_anim_crawling'] = "Animaatiota ei voi toistaa ryömiessä",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['fr'] = {
-- French 🇫🇷
['emotes'] = "~p~ Emotes 🎬",
['danceemotes'] = "~p~ 🕺 Danses",
['animalemotes'] = "~p~ 🐩 Emotes d'animaux",
['propemotes'] = "~p~ 📦 Emotes objet",
['prop2info'] = "❓ Les emotes d'objet peuvent être à la fin",
['set'] = "Mettre (",
['newsetemote'] = "~w~ est maintenant votre emote favorite, appuyez sur ~g~CapsLock~w~ pour l'utiliser.",
['cancelemote'] = "~r~ Annuler l'émote 🚷",
['cancelemoteinfo'] = "~r~X~w~ Annule l'emote en cours",
['walkingstyles'] = "~p~ Styles de marche 🚶🏻‍♂️",
['resetdef'] = "Réinitialiser aux valeurs par défaut",
['normalreset'] = "~h~~r~ Normal (réinitialiser)",
['moods'] = "~p~ Humeurs 😒",
['infoupdate'] = "Crédits 🤝🏻",
['infoupdateav'] = "Information (Mise à jour disponible)",
['infoupdateavtext'] = "Une mise à jour est disponible ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Suggestions?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ sur les forums FiveM pour toutes les suggestions! ✉️",
['notvaliddance'] = "n'est pas une danse valide",
['notvalidemote'] = "n'est pas une emote valide",
['nocancel'] = "Pas d'emote à annuler",
['maleonly'] = "Cet emote est réservé aux hommes, désolé!",
['emotemenucmd'] = "Fait /emotemenu pour ouvrir le menu",
['shareemotes'] = "👫 Emotes partagées",
['shareemotesinfo'] = "Invite une personne proche à faire une emote avec toi",
['sharedanceemotes'] = "🕺 Dances partagées",
['notvalidsharedemote'] = "n'est pas un emote partagée valide.",
['sentrequestto'] = "Demande envoyée à <b>",
['nobodyclose'] = "Personne n'est assez proche.",
['doyouwanna'] = "<b>Y</b> accepter, <b>L</b> refuser (~g~",
['refuseemote'] = "Emote refusée.",
['makenearby'] = "fait jouer le joueur à proximité",
['useleafblower'] = "Appuyez sur <b>G</b> pour utiliser le souffleur à feuilles.",
['camera'] = "Appuyez sur <b>G</b> pour utiliser le flash de l'appareil.",
['makeitrain'] = "Appuyez sur <b>G</b> pour jeter de l'argent.",
['pee'] = "Appuyez sur <b>G</b> pour faire pipi.",
['spraychamp'] = "Appuyez sur <b>G</b> pour vaporiser du champagne.",
['smoke'] = "Appuyez sur <b>G</b> pour fumer.",
['vape'] = "Appuyez sur <b>G</b> pour vapoter.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Liée (%s) à %s",
['currentlyboundemotes'] = " Emotes actuellement liées:",
['notvalidkey'] = "n'est pas une clé valide.",
['keybinds'] = "🔢 Raccourcis clavier",
['keybindsinfo'] = "Utilise",
['searchemotes'] = "~h~~y~ 🔍 Rechercher des emotes",
['searchinputtitle'] = "Recherche:",
['searchmenudesc'] = "resultat(s) pour",
['searchnoresult'] = "Aucun résultat pour la recherche : ",
['invalidvariation'] = "Variation de texture invalide. Les sélections valides sont : %s",
['firework'] = "Appuyez sur <b>G</b> pour utiliser les feux d'artifice",
['poop'] = "Appuyez sur <b>G</b> pour faire caca.",
['puke'] = "Appuyez sur <b>G</b> pour vomir.",
['cut'] = "appuyez sur <b>G</b> pour couper",
['btn_select'] = "Sélectionner",
['btn_back'] = "Retour",
['btn_switch'] = "Mouvement",
['btn_increment'] = "Vitesse déplacement",
['dead'] = "Vous ne pouvez pas faire d'animation en étant mort !",
['swimming'] = "Vous ne pouvez pas faire d'emotes en nageant",
['notvalidpet'] = "RUH ROH! Vous n'avez pas un ped adapté 🐕!",
['animaldisabled'] = "Désolé! Les emotes d'animaux sont désactivées sur ce serveur",
['adultemotedisabled'] = "Bonk ! Les Emotes adultes sont désactivées🔞",
['toggle_instructions'] = "Afficher / Masquer les instructions",
['exit_binoculars'] = "Quitter les jumelles",
['toggle_binoculars_vision'] = "Basculer entre les modes de vision",
['exit_news'] = "Quitter la caméra des news",
['toggle_news_vision'] = "Basculer entre les modes de vision",
['edit_values_newscam'] = "Editer les textes",
['not_in_a_vehicle'] = "Vous ne pouvez pas jouer cette animation dans un véhicule",
['in_a_vehicle'] = "Vous ne pouvez jouer cette animation que dans un véhicule 🚷",
['no_anim_crawling'] = "Vous ne pouvez pas jouer d'animations pendant que vous rampez",
['no_anim_right_now'] = "Vous ne pouvez pas jouer une animation pour l'instant",
['register_cancel_emote'] = "Annuler l'émote actuelle",
}

View file

@ -0,0 +1,77 @@
Locales['hu'] = {
-- Hungarian 🇭🇺
['emotes'] = "~h~~p~ Animációs Menü 🎬",
['danceemotes'] = "~h~~p~ 🕺 Tánc Animációk",
['animalemotes'] = "~h~~p~ 🐩 Állatos Animációk",
['propemotes'] = "~h~~p~ 📦 Tárgyas Animációk",
['prop2info'] = "❓ A Prop Emote-ok a végén találhatók",
['set'] = "Kiválasztod (",
['newsetemote'] = "~w~ lett a kedvenc animációd, nyomj egy ~g~CapsLock~w~-ot a használatához.",
['cancelemote'] = "~h~~r~ Animáció Befejezése 🚷",
['cancelemoteinfo'] = "~r~X~w~ Megszünteti az aktuálisan lejátszott animációt",
['walkingstyles'] = "~h~~p~ Séta Stílusok 🚶🏻‍♂️",
['resetdef'] = "Séta alaphelyzetbe állítása",
['normalreset'] = "~h~~r~ Normális (Alaphelyzet)",
['moods'] = "~h~~p~ Archangulatok 😒",
['infoupdate'] = "~h~~g~ Kreditek 🤝🏻",
['infoupdateav'] = "Információ (frissítés elérhető)",
['infoupdateavtext'] = "A frissítés elérhető, a legfrissebb verziót a következő címen tudod beszerezni ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Javaslatok?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ a FiveM fórumokon bármilyen funkcióra/animációra vonatkozó javaslatért! ✉️",
['notvaliddance'] = "nem érvényes tánc.",
['notvalidemote'] = "nem érvényes animáció.",
['nocancel'] = "Nincs animáció amit visszavonhatnál.",
['maleonly'] = "Ez az animáció csak férfi karaktereknek szól, sajnálom!",
['emotemenucmd'] = "A /emotemenu paranccsal nyisd meg az animációk menüt.",
['shareemotes'] = "~h~~p~ 👫 Megosztott animációk",
['shareemotesinfo'] = "Hívj meg egy közeli személyt animációra",
['sharedanceemotes'] = "~h~~p~ 🕺 Közös Táncok",
['notvalidsharedemote'] = "nem érvényes megosztott animáció.",
['sentrequestto'] = "Elküldted a kérelmet a(z) ~y~",
['nobodyclose'] = "Senki sincs elég ~r~közel~w~.",
['doyouwanna'] = "~y~Y~w~ gomb az elfogadáshoz, ~r~L~w~ gomb az elutasításhoz (~g~",
['refuseemote'] = "Animáció elutasítva.",
['makenearby'] = "a közelben lévő játékos játsza le ezt az animációt:",
['useleafblower'] = "Nyomj ~y~G~w~ gombot a lombfúvó használatához.",
['camera'] = "Nyomj ~y~G~w~ gombot a fényképezőgép vakujának használatához.",
['makeitrain'] = "Nyomj ~y~G~w~ gombot hogy elkezdd szórni a pénzt.",
['pee'] = "Nyomj ~y~G~w~ gombot a pisiléshez.",
['spraychamp'] = "Nyomj ~y~G~w~ gombot a pezsgő fröcsköléséhez.",
['stun'] = "Nyomj ~y~G~w~ gombot hogy 'használd' a sokkolót.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Nyomj ~y~G~w~ gombot a vapeeléshez.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Rögzített (%s) ehhez %s",
['currentlyboundemotes'] = " Jelenleg rögzített animációk:",
['notvalidkey'] = "nem érvényes gombkiosztás.",
['keybinds'] = "🔢 Gombkiosztások",
['keybindsinfo'] = "Használat",
['searchemotes'] = "~h~~y~ 🔍 Animációk Keresése",
['searchinputtitle'] = "Keresés:",
['searchmenudesc'] = "eredmény erre: ",
['searchnoresult'] = "Nincs eredmény erre:",
['invalidvariation'] = "Érvénytelen textúra variáció. Érvényes választások a következők: %s",
['firework'] = "Nyomj ~y~G~w~ gombot a tűzijáték használatához",
['poop'] = "Nyomj ~y~G~w~ gombot a kakiláshoz",
['puke'] = "Nyomja meg az ~y~G~w~ gombot a hányáshoz", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Kiválasztás",
['btn_back'] = "Vissza",
['btn_switch'] = "Mozgás",
['btn_increment'] = "Increment",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['id'] = {
-- Indonesian 🇮🇩
['emotes'] = " ~h~~p~ Emote 🎬",
['danceemotes'] = "~h~~p~ 🕺 Emote Menari",
['animalemotes'] = "~h~~p~ 🐩 Emote Hewan",
['propemotes'] = "~h~~p~ 📦 Prop Emotes",
['prop2info'] = "❓ Prop Emotes can be located at the end",
['set'] = "Tetapkan (",
['newsetemote'] = "~w~ sekarang menjadi emote terikat Anda, tekan ~g~CapsLock~w~ untuk menggunakannya.",
['cancelemote'] = "~h~~r~ Batalkan Emote 🚷",
['cancelemoteinfo'] = "~r~X~w~ Batalkan emote yang sedang dimainkan",
['walkingstyles'] = "~h~~p~ Gaya Berjalan 🚶🏻‍♂️",
['resetdef'] = "Mengatur ulang ke default",
['normalreset'] = "~h~~r~ Normal (Atur Ulang)",
['moods'] = "~h~~p~ Ekspresi 😒",
['infoupdate'] = "~h~~g~ Kredit 🤝🏻",
['infoupdateav'] = "Informasi (Pembaruan tersedia)",
['infoupdateavtext'] = "Pembaruan tersedia, dapatkan versi terbaru dari ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Saran?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ di forum FiveM untuk mendapatkan saran fitur/emote! ✉️",
['notvaliddance'] = "bukanlah tarian yang valid.",
['notvalidemote'] = "bukanlah emote yang valid.",
['nocancel'] = "Tidak ada emote yang harus dibatalkan.",
['maleonly'] = "Emoticon ini hanya untuk pria, maaf!",
['emotemenucmd'] = "Gunakan perintah /emotemenu untuk membuka menu animasi.",
['shareemotes'] = "~h~~p~ 👫 Emote Bersama",
['shareemotesinfo'] = "Undang orang terdekat untuk beremote",
['sharedanceemotes'] = "~h~~p~ 🕺 Tarian Bersama",
['notvalidsharedemote'] = "bukan merupakan emote bersama yang valid.",
['sentrequestto'] = "Mengirim permintaan ke ~y~",
['nobodyclose'] = "Tidak ada yang ~r~mendekati~w~ cukup.",
['doyouwanna'] = "~y~Y~w~ untuk menerima, ~r~L~w~ untuk menolak (~g~",
['refuseemote'] = "Emote ditolak.",
['makenearby'] = "membuat pemain di dekatnya bermain",
['useleafblower'] = "Tekan ~y~G~w~ untuk menggunakan peniup daun.",
['camera'] = "Tekan ~y~G~w~ untuk menggunakan lampu kilat kamera.",
['makeitrain'] = "Tekan ~y~G~w~ untuk membuat hujan.",
['pee'] = "Tahan ~y~G~w~ untuk buang air kecil.",
['spraychamp'] = "Tahan ~y~G~w~ untuk menyemprotkan sampanye",
['stun'] = "Tekan ~y~G~w~ untuk 'menggunakan' stun gun.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Tekan ~y~G~w~ untuk melakukan vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Terikat (~y~%s~w~) untuk ~g~%s~w~",
['currentlyboundemotes'] = " Emoticon yang saat ini terikat:",
['notvalidkey'] = "bukan merupakan kunci yang valid.",
['keybinds'] = "🔢 Tombol-tombol",
['keybindsinfo'] = "Gunakan",
['searchemotes'] = "~h~~y~ 🔍 Mencari Emotes",
['searchinputtitle'] = "Cari:",
['searchmenudesc'] = "hasil untuk",
['searchnoresult'] = "Tidak ada hasil untuk pencarian",
['invalidvariation'] = "Variasi tekstur tidak valid. Pilihan yang valid adalah: %s",
['firework'] = "Tekan ~y~G~w~ untuk menggunakan kembang api",
['poop'] = "Tekan ~y~G~w~ untuk buang air besar",
['puke'] = "Tekan ~y~G~w~ untuk muntah",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Pilih",
['btn_back'] = "Kembali",
['btn_switch'] = "Gerakan",
['btn_increment'] = "Kenaikan",
['dead'] = "Anda tidak dapat menggunakan emote saat mati!",
['swimming'] = "Anda tidak dapat menggunakan emote saat berenang",
['notvalidpet'] = "RUH ROH! Model pedal yang salah terdeteksi :dog2:!",
['animaldisabled'] = "Maaf! Emote hewan dinonaktifkan di server ini",
['adultemotedisabled'] = "Bonk! Emote dewasa dinonaktifkan :underage:",
['toggle_instructions'] = "Beralih intruksi",
['exit_binoculars'] = "Keluar dari teropong",
['toggle_binoculars_vision'] = "Beralih di antara mode penglihatan",
['exit_news'] = "Keluar dari Kamera Berita",
['toggle_news_vision'] = "Beralih di antara mode penglihatan",
['edit_values_newscam'] = "Edit teks berita",
['not_in_a_vehicle'] = "Anda tidak dapat memainkan animasi ini saat berada di dalam kendaraan",
['in_a_vehicle'] = "Anda hanya dapat memainkan animasi ini saat berada di dalam kendaraan :no_pedestrians:",
['no_anim_crawling'] = "Anda tidak dapat memutar animasi sambil merayap",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['it'] = {
-- Italian 🇮🇹
['emotes'] = " ~h~~p~ Animazioni 🎬",
['danceemotes'] = "~h~~p~ 🕺 Animazioni Di Danza",
['animalemotes'] = "~h~~p~ 🐩 Animazioni Di Animali",
['propemotes'] = "~h~~p~ 📦 Animazioni Prop",
['prop2info'] = "❓ Le animazioni Prop possono essere trovate in fondo.",
['set'] = "Imposta (",
['newsetemote'] = "~w~ è ora la tua animazione corrente, premi ~g~CapsLock~w~ per usarla.",
['cancelemote'] = "~h~~r~ Annulla animazione 🚷",
['cancelemoteinfo'] = "~r~X~w~ Cancella l'animazione in corso.",
['walkingstyles'] = "~h~~p~ Stili di camminata 🚶🏻‍♂️",
['resetdef'] = "Ripristina predefiniti",
['normalreset'] = "~h~~r~ Normale (Reset)",
['moods'] = "~h~~p~ Umori 😒",
['infoupdate'] = "~h~~g~ Crediti 🤝🏻",
['infoupdateav'] = "Informazioni (Aggiornamento disponibile)",
['infoupdateavtext'] = "Un aggiornamento è disponibile, ottieni l'ulima versione qui ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Suggerimenti?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ nei forum di FiveM per suggerimenti su funzionalitá/animazioni! ✉️",
['notvaliddance'] = "non è un ballo valido.",
['notvalidemote'] = "non è un'animazione valida.",
['nocancel'] = "Nessun'animazione da cancellare.",
['maleonly'] = "Quest'animazione è solo maschile!",
['emotemenucmd'] = "Esegui /emotemenu per aprire il menù.",
['shareemotes'] = "~h~~p~ 👫 Animazioni di coppia",
['shareemotesinfo'] = "Invita un giocatore vicino ad un'animazione",
['sharedanceemotes'] = "~h~~p~ 🕺 Balli di coppia",
['notvalidsharedemote'] = "non è un'animazione di coppia valida.",
['sentrequestto'] = "Richiesta mandata a ~y~",
['nobodyclose'] = "Nessun giocatore abbastanza ~r~vicino~w~.",
['doyouwanna'] = "~y~Y~w~ per accettare, ~r~L~w~ per rifiutare (~g~",
['refuseemote'] = "Animazione rifiutata.",
['makenearby'] = "fa eseguire l'animazione al giocatore vicino",
['useleafblower'] = "Premi ~yG~w~ per usare il soffia foglie.", -- GOOGLE TRANSLATED
['camera'] = "Premi ~y~G~w~ per usare il flash della fotocamera.",
['makeitrain'] = "Premi ~y~G~w~ per far piovere.",
['pee'] = "Tieni premuto ~y~G~w~ per urinare.",
['spraychamp'] = "Tieni premuto ~y~G~w~ per spruzzare champagne",
['stun'] = "Premi ~y~G~w~ per 'usare' la pistola stordente.",
['boundto'] = "Bound (~y~%s~w~) to ~g~%s~w~",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Press ~y~G~w~ to vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['currentlyboundemotes'] = " Animazioni correnti:",
['notvalidkey'] = "non è una chiave valida.",
['keybinds'] = "🔢 Tasti",
['keybindsinfo'] = "Utilizza",
['searchemotes'] = "~h~~y~ 🔍 Search for Emotes",
['searchinputtitle'] = "Search:",
['searchmenudesc'] = "result(s) for",
['searchnoresult'] = "No results for search",
['invalidvariation'] = "Opzioni colore non valide. scelte valide sono: %s",
['firework'] = "Premere ~y~G~w~ per utilizzare il fuoco d'artificio",
['poop'] = "Premere ~y~G w~ per fare la cacca",
['puke'] = "Premi ~y~G~w~ per vomitare", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Seleziona",
['btn_back'] = "Indietro",
['btn_switch'] = "Movimento",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['lk'] = {
-- Sinhala 🇱🇰
['emotes'] = "~h~~p~ Emotes 🎬",
['danceemotes'] = "~h~~p~ 🕺 Natana Emotes",
['animalemotes'] = "~h~~p~ 🐩 Sattunge Emotes",
['propemotes'] = "~h~~p~ 📦 Prop Emotes",
['prop2info'] = "❓ Prop emotes tiyenne anthimata",
['set'] = "Set karanna (",
['newsetemote'] = "~w~ thamai oyage favorite emote eka, ~g~CapsLock~w~ eken use karanna.",
['cancelemote'] = "~h~~r~ Emote Eka Nawattanna 🚷",
['cancelemoteinfo'] = "~r~X~w~ Wetila thiyana emote eka nawattanawa",
['walkingstyles'] = "~h~~p~ Awidina Styles 🚶🏻‍♂️",
['resetdef'] = "Yathã thatweta path karanna",
['normalreset'] = "~h~~r~ Normal (Reset karanna)",
['moods'] = "~h~~p~ Mood Eka 😒",
['infoupdate'] = "~h~~g~ Credits 🤝🏻",
['infoupdateav'] = "Information (Update ekak tiyanawa)",
['infoupdateavtext'] = "Update ekak tiyanawa, alutma update eka methanin ganna ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Suggestions?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ on FiveM forums for any feature/emote suggestions! ✉️",
['notvaliddance'] = "kiyanne weradi natana emote ekak.",
['notvalidemote'] = "kiyanne weradi emote ekak.",
['nocancel'] = "Nawattanna emote ekak na.",
['maleonly'] = "Me emote eka piriminta witharai, sorry!",
['emotemenucmd'] = "/emotemenu kiyana command eken animations menu eka ganna.",
['shareemotes'] = "~h~~p~ 👫 Shared Emotes",
['shareemotesinfo'] = "Laga inna kenata emote eka danna katha krnna",
['sharedanceemotes'] = "~h~~p~ 🕺 Shared Natana Emotes",
['notvalidsharedemote'] = "kiyanne weradi shared emote ekak.",
['sentrequestto'] = "Request ekak yewwa ~y~",
['nobodyclose'] = "Kawruwat ~r~Laga~w~ na.",
['doyouwanna'] = "~y~Y~w~ accept karanna, ~r~L~w~ decline karanna (~g~",
['refuseemote'] = "Emote eka decline kara.",
['makenearby'] = "laga inna playerta play karawanna",
['useleafblower'] = "Meka weda karawanna ~y~G~w~ press karanna.",
['camera'] = "Camera flash ekata ~y~G~w~ press karanna.",
['makeitrain'] = "Salli wattanna ~y~G~w~ press karanna.",
['pee'] = "Chuu danna ~y~G~w~ obagena inna.",
['spraychamp'] = "Spray karanna ~y~G~w~ press karanna",
['stun'] = "Stun karanna ~y~G~w~ press karanna.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Vape ekata ~y~G~w~ press karanna.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bound karanna (~y~%s~w~) ta ~g~%s~w~",
['currentlyboundemotes'] = " Denata bound karapu emotes:",
['notvalidkey'] = "kiyanne weradi key ekak.",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Use karanna",
['searchemotes'] = "~h~~y~ 🔍 Emotes Hoyaganna",
['searchinputtitle'] = "Search karanna:",
['searchmenudesc'] = "result(s) for",
['searchnoresult'] = "Mukut hambune na",
['invalidvariation'] = "Weradi texture variation ekak. Hari ewa thamai: %s",
['firework'] = "Firework ekata ~y~G~w~ press karanna",
['poop'] = "Kakki danna ~y~G~w~ press karanna",
['puke'] = "Wamane danna ~y~G~w~ press karanna",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Select Karanna",
['btn_back'] = "Aapassata",
['btn_switch'] = "Movement eka",
['btn_increment'] = "Wedi karanna",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,99 @@
Locales['lt'] = {
-- Lithuanian (LT)
['emotes'] = '~h~~p~ Animacijos 🎬',
['danceemotes'] = "~h~~p~ 🕺 Sokiu animacijos",
['animalemotes'] = "~h~~p~ 🐩 Gyvunu animacijos",
['propemotes'] = "~h~~p~ 📦 Daiktu animacijos",
['prop2info'] = "❓ Daiktu animacijos gali buti pabaigoje",
['set'] = "Rinkinys (",
['newsetemote'] = "~w~ dabar yra jusu susietas jaustukas, paspauskite ~g~CapsLock~w~, kad ji naudotumete.",
['cancelemote'] = "~h~~r~ Atsaukti animacija 🚷",
['cancelemoteinfo'] = "~r~X~w~ Atsaukti dabar naudojama animacija",
['walkingstyles'] = "~h~~p~ Ejimo stiliai 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Atstatyti i numatytuosius nustatymus",
['normalreset'] = "~h~~r~ Iprasta (nustatyti is naujo)",
['moods'] = "~h~~p~ Nuotaikos 😒",
['emotemenu'] = 'Žr. galimų emocijų sąrašą',
['remove_emote_keybind'] = 'Ištrinti animaciją iš susieto mygtuko',
['show_emote_keybind'] = 'peržiūrėti animacijas ant klavišų',
['play_emote'] = 'vykdyti animaciją',
['open_menu_emote'] = 'Animacijos',
['show_list_emote'] = 'Peržiūrėti galimų emocijų sąrašą',
['link_emote_keybind'] = 'Animacijos susiejimas su mygtuku',
['help_command'] = 'dance, camera, sit arba kita animacija',
['help_variation'] = '(Nebūtina) 1, 2, 3 ar kitas skaičius. Pakeis tam tikrų priedų, naudojamų emocijoms, tekstūrą, pavyzdžiui, telefono spalvą. Įrašykite -1 norėdami pamatyti variantų sąrašą',
['infoupdate'] = "~h~~g~ Porines animacijos 🤝🏻",
['infoupdateavtext'] = "Galimas naujinimas, gaukite naujausia versija is ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Pasiulymus?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ FiveM forumuose del bet kokiu funkciju / emociju pasiulymu! ✉️",
['notvaliddance'] = "Sokis nera tinkamas.",
['notvalidemote'] = "Nera tinkama animacija.",
['nocancel'] = "Nera animaciju, kurias butu galima atsaukti.",
['maleonly'] = "Si animacija yra tik vyriska, atsiprasome!",
['emotemenucmd'] = "Noredami atidaryti animaciju meniu, naudokite komanda /emotemenu.",
['shareemotes'] = "~h~~p~ 👫 Porines animacijos",
['shareemotesinfo'] = "Pakvieskite salia esanti zmogu animacijai kartu",
['sharedanceemotes'] = "~h~~p~ 🕺 Poriniai sokiai",
['notvalidsharedemote'] = "Nera tinkama porine animacija.",
['sentrequestto'] = "Prasymas issiustas asmeniui ~y~",
['nobodyclose'] = "Nieko ~r~arti~w~ nera.",
['doyouwanna'] = "~y~Y~w~ priimti, ~r~L~w~ atsisakyti (~g~",
['refuseemote'] = "Animacijos atsisake.",
['makenearby'] = "Kviecia arti esanti asmeni bendrai animacijai",
['useleafblower'] = "Paspauskite ~y~G~w~, kad naudotumete lapu pustuva.",
['camera'] = "Paspauskite ~y~G~w~, kad galetumete naudoti fotoaparato blykste.",
['makeitrain'] = "Paspauskite ~y~G~w~, kad pradetu lyti.",
['pee'] = "Laikykites ~y~G~w~, kad slapintumete.",
['spraychamp'] = "Laikykite ~y~G~w~, kad ispurkstumete sampana",
['stun'] = "Paspauskite ~y~G~w~, kad 'naudotumete' apsvaiginimo pistoleta.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Paspauskite ~y~G~w~, kad garuotumete",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Suristi (~y~%s~w~) I ~g~%s~w~",
['handsup'] = "pakelti rankas",
['currentlyboundemotes'] = " Siuo metu susietos animacijos:",
['notvalidkey'] = "raktas nera tinkamas.",
['keybinds'] = "🔢 Keybind'ai",
['keybindsinfo'] = "Naudoti",
['searchemotes'] = "~h~~y~ 🔍 Iskoti animacijos",
['searchinputtitle'] = "Ieskoti:",
['searchmenudesc'] = "rezultatas (-ai), skirtas",
['searchnoresult'] = "Paieskos rezultatu nera",
['invalidvariation'] = "Netinkamas teksturos variantas. Galiojantys pasirinkimai yra: %s",
['firework'] = "Paspauskite ~y~G~w~, kad galetumete naudoti fejerverka",
['poop'] = "Paspauskite ~y~G~w~, kad istustumete",
['puke'] = "Paspauskite ~y~G~w~, kad vemtumete",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Pasirinkti",
['btn_back'] = "Atgal",
['btn_switch'] = "Judejimas",
['btn_increment'] = "Padidejimas",
['dead'] = "Negalite naudoti animaciju, kai esate mires!",
['swimming'] = "Jus negalite naudoti animaciju plaukdami",
['notvalidpet'] = "AU AU! Aptiktas netinkamas ped modelis 🐕!",
['animaldisabled'] = "atsiprasome! Gyvunu emocijos siame serveryje isjungtos",
['adultemotedisabled'] = "Boom! Suaugusiuju emocijos neleidziamos 🔞",
['toggle_instructions'] = "Perjunkite nurodymus",
['exit_binoculars'] = "Pasidekite ziuronus",
['toggle_binoculars_vision'] = "Perjungti regejimo rezimus",
['exit_news'] = "Iseikite is 'News Camera'.",
['toggle_news_vision'] = "Perjungti regejimo rezimus",
['edit_values_newscam'] = "Redaguoti naujienu teksta",
['not_in_a_vehicle'] = "Negalite leisti sios animacijos budami transporto priemoneje",
['in_a_vehicle'] = "Sia animacija galite leisti tik budami transporto priemoneje 🚷",
['no_anim_crawling'] = "Narsydami negalite leisti animacijos",
['no_anim_right_now'] = "You can't play an animation right now",
-- Key maps
['register_cancel_emote'] = "Atšaukti animaciją",
['register_handsup'] = "Pakelti rankas",
['register_open_menu'] = "Animacijų meniu",
['register_crouch'] = "Pritūpti",
['register_crawl'] = "Šliaužti",
['register_pointing'] = "Rodyti pirštu",
['register_ragdoll'] = "Ragdoll perjungimas",
-- Commands descriptions
['cancel_emote'] = "Atšaukti animaciją",
['crouch'] = "Pritūpti",
['crawl'] = "Šliaužti",
['pointing'] = "Rodyti pirštu"
}

View file

@ -0,0 +1,98 @@
Locales['nl'] = {
-- Dutch 🇳🇱
['emotes'] = "Animaties 🎬",
['danceemotes'] = "🕺 Dans Animaties",
['animalemotes'] = "🐩 Dier Animaties",
['propemotes'] = "📦 Voorwerp Animaties",
['prop2info'] = "❓ Voorwerp animaties aan het einde",
['set'] = "Maak (",
['newsetemote'] = "~w~ is nu je toegewezen animatie, druk op ~g~CapsLock~w~ om het te gebruiken.",
['cancelemote'] = "Animatie Stoppen 🚷",
['cancelemoteinfo'] = "~r~X~w~ Stopt je huidige animatie.",
['walkingstyles'] = "Loopjes 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Reset naar standaard.",
['normalreset'] = "~h~~r~ Normaal (Reset)",
['moods'] = "Stemmingen 😒",
['infoupdate'] = "Credits 🤝🏻",
['remove_emote_keybind'] = 'Verwijder een gebonden animatie van een toets',
['show_emote_keybind'] = 'Zie een lijst met gebonden animaties',
['play_emote'] = 'Start een animatie',
['open_menu_emote'] = 'Open het animatiemenu',
['show_list_emote'] = 'Zie een lijst met beschikbare animaties',
['link_emote_keybind'] = 'Bind een animatie aan een toets',
['help_command'] = 'dance, camera, sit of een andere animatie',
['help_variation'] = '(Optioneel) 1, 2, 3 of een ander geldig nummer. Verandert de texture van een accessoire in een animatie, bijvoorbeeld de kleur van een telefoon. Voor een lijst van variaties -1',
['infoupdateav'] = "Informatie (Update beschikbaar)",
['infoupdateavtext'] = "Er is een update beschikbaar, download de laatste versie via ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Suggesties?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ op de FiveM forums om suggesties in te dienen! ✉️",
['notvaliddance'] = "is geen geldige dans",
['notvalidemote'] = "is geen geldige animatie",
['nocancel'] = "Er is geen animatie om te stoppen",
['maleonly'] = "Deze animatie is alleen voor mannen",
['emotemenucmd'] = "Gebruik /emotemenu om het animatiemenu te openen",
['shareemotes'] = "👫 Gedeelde Animaties",
['shareemotesinfo'] = "Nodig een persoon in de buurt uit om een animatie te doen.",
['sharedanceemotes'] = "~h~~p~ 🕺 Gedeelde Dansjes",
['notvalidsharedemote'] = "is geen geldige gedeelde animatie",
['sentrequestto'] = "Verzoek gestuurd naar ~y~",
['nobodyclose'] = "Er is niemand ~r~dichtbij~w~ genoeg",
['doyouwanna'] = "~y~Y~w~ om te accepteren, ~r~L~w~ om te weigeren (~g~",
['refuseemote'] = "Animatie geweigerd",
['makenearby'] = "laat iemand dichtbij",
['useleafblower'] = "Druk op ~y~G~w~ om de bladblazer te gebruiken",
['camera'] = "Druk op ~y~G~w~ om de flitser te gebruiken",
['makeitrain'] = "Druk op ~y~G~w~ om geld te gooien",
['pee'] = "Druk op ~y~G~w~ om te plassen",
['spraychamp'] = "Druk op ~y~G~w~ om champagne te spuiten",
['stun'] = "Druk op ~y~G~w~ om de taser te gebruiken",
['smoke'] = "Druk op ~y~G~w~ om te roken",
['vape'] = "Druk op ~y~G~w~ om te vapen",
['candle'] = "Druk op ~y~G~w~ om kaars aan te steken.",
['boundto'] = "(~y~%s~w~) gebonden aan ~g~%s~w~",
['handsup'] = "Handen omhoog",
['currentlyboundemotes'] = "Gebonden animaties:",
['notvalidkey'] = "is geen geldige toets",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Gebruik",
['searchemotes'] = "~h~~y~ 🔍 Zoeken naar animaties",
['searchinputtitle'] = "Zoeken:",
['searchmenudesc'] = "resultaten voor",
['searchnoresult'] = "Geen resultaten voor zoekopdracht",
['invalidvariation'] = "Ongeldige texture variatie. Geldige selecties zijn: %s",
['firework'] = "Druk op ~y~G~w~ om het vuurwerk te gebruiken",
['poop'] = "Druk op ~y~G~w~ om te poepen",
['puke'] = "Druk op ~y~G~w~ om te kotsen",
['cut'] = "Druk op ~y~G~w~ om te snijden",
['btn_select'] = "Selecteren",
['btn_back'] = "Terug",
['btn_increment'] = "Stappen",
['dead'] = "Je kan geen animaties gebruiken terwijl je dood bent",
['swimming'] = "Je kan geen animaties gebruiken tijdens het zwemmen",
['notvalidpet'] = "Je kan deze animatie niet uitvoeren als deze ped 🐕",
['animaldisabled'] = "Je kan geen dieranimaties gebruiken in deze server",
['adultemotedisabled'] = "Bonk! Animaties voor volwassenen zijn uitgeschakeld 🔞",
['toggle_instructions'] = "Instructies verbergen",
['exit_binoculars'] = "Verrekijker verlaten",
['toggle_binoculars_vision'] = "Wisselen tussen weergaven",
['exit_news'] = "Nieuws camera verlaten",
['toggle_news_vision'] = "Wisselen tussen weergaven",
['edit_values_newscam'] = "Nieuws tekst bewerken",
['not_in_a_vehicle'] = "Je kan deze animatie niet gebruiken in een voertuig",
['in_a_vehicle'] = "Je kan deze animatie alleen in een voertuig gebruiken 🚷",
['no_anim_crawling'] = "Je kan deze animatie niet gebruiken tijdens het kruipen",
['no_anim_right_now'] = "Je kan nu geen animaties starten",
-- Key maps
['register_cancel_emote'] = "Huidige animatie stoppen",
['register_open_menu'] = "Animatiemenu openen",
['register_handsup'] = "Handen omhoog",
['register_crouch'] = "Hurken",
['register_crawl'] = "Kruipen",
['register_pointing'] = "Wijzen",
['register_ragdoll'] = "Ragdoll",
-- Commands descriptions
['cancel_emote'] = "Huidige animatie stoppen",
['crouch'] = "Hurken",
['crawl'] = "Kruipen",
['pointing'] = "Wijzen"
}

View file

@ -0,0 +1,78 @@
Locales['no'] = {
-- Norwegian 🇳🇴
['emotes'] = " ~h~~p~Animasjoner 🎬",
['danceemotes'] = "~h~~p~ 🕺 Danse Animasjoner",
['animalemotes'] = "~h~~p~ 🐩 Dyreanimasjoner",
['propemotes'] = "~h~~p~ 📦 Rekvisitt Animasjoner",
['prop2info'] = "❓ Rekvisitt Animasjoner er på bunnen",
['set'] = "Vil du sette (",
['newsetemote'] = "~w~ er nå lagret som din favoritt, trykk ~g~CapsLock~w~ for å bruke den.",
['cancelemote'] = "~h~~r~ Avbryt Animasjonen 🚷",
['cancelemoteinfo'] = "~r~X~w~ Avbryt den nåværende animasjonen",
['walkingstyles'] = "~h~~p~ Gangart 🚶🏻‍♂️",
['resetdef'] = "Reset til standard",
['normalreset'] = "~h~~r~ Normal (Reset)",
['moods'] = "~h~~p~ Ansiktsuttrykk 😒",
['infoupdate'] = "~h~~g~ Anerkjennelser 🤝🏻",
['infoupdateav'] = "Informasjon (Oppdatering tilgjengelig)",
['infoupdateavtext'] = "En oppdatering er tilgjengelig, du finner den nyeste versjonen her: ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Forslag?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ på FiveM forumet vist du har forslag til forbedringer/ animasjoner! ✉️",
['notvaliddance'] = "er ikke en gyldig dans.",
['notvalidemote'] = "er ikke en gyldig animasjon.",
['nocancel'] = "Fant ingen animasjon å avbryte.",
['maleonly'] = "Denne animasjonen er kun for men, beklager!",
['emotemenucmd'] = "Use command /emotemenu to open animations menu.",
['shareemotes'] = "~h~~p~ 👫 Felles Animasjoner",
['shareemotesinfo'] = "Inviter den nærmeste personen til en felles animasjon",
['sharedanceemotes'] = "~h~~p~ 🕺 Felles Danser",
['notvalidsharedemote'] = "er ikke en gyldig felles animasjon.",
['sentrequestto'] = "Sendte en forespørsel til ~y~",
['nobodyclose'] = "Ingen ~r~personer~w~ er i nærheten.",
['doyouwanna'] = "~y~Y~w~ for å akseptere, ~r~L~w~ for å avvise (~g~",
['refuseemote'] = "Du avviste animasjonen.",
['makenearby'] = "får personen i nærheten til å spille",
['useleafblower'] = "Trykk ~y~G~w~ for å bruke løvblåseren.",
['camera'] = "Trykk ~y~G~w~ for å bruke kamerablitsen.",
['makeitrain'] = "Trykk ~y~G~w~ for å få det til å regne penger.",
['pee'] = "Hold ~y~G~w~ for å tisse.",
['spraychamp'] = "Hold ~y~G~w~ for å sprute champagne",
['stun'] = "Trykk ~y~G~w~ for å 'bruke' elektrosjokkvåpenet.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Trykk ~y~G~w~ for å vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Du har bundet (~y~%s~w~) til ~g~%s~w~",
['currentlyboundemotes'] = " Dine bundne animasjoner:",
['notvalidkey'] = "er ikke en gyldig tast.",
['keybinds'] = "🔢 Hurtigtaster",
['keybindsinfo'] = "Bruk",
['searchemotes'] = "~h~~y~ 🔍 Søk for Animasjoner",
['searchinputtitle'] = "Søk:",
['searchmenudesc'] = "resultat(er) for",
['searchnoresult'] = "Ingen resultater for søk",
['invalidvariation'] = "Ugyldig tekstur variant. Gyldige varianter: %s",
['firework'] = "Trykk ~y~G~w~ for å avfyre fyrverkeriet",
['poop'] = "Hold ~y~G~w~ for å bæsje",
['puke'] = "Trykk ~y~G~w~ for å spy", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Velg",
['btn_back'] = "Tilbake",
['btn_switch'] = "Bevegelse",
['btn_increment'] = "Increment",
['dead'] = "Du kan ikke starte animasjoner mens du er død!",
['swimming'] = "Du kan ikke bruke animasjoner mens du svømmer",
['notvalidpet'] = "RUH ROH! Denne animasjonen er ikke laget for denne peden! 🐕",
['animaldisabled'] = "Beklager! Dyreanimasjoner er deaktivert på denne serveren",
['adultemotedisabled'] = "Bonk! Voksen animasjoner er deaktivert 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Forlatt kikkerten",
['toggle_binoculars_vision'] = "Veksle mellom synsmodusene",
['exit_news'] = "Forlatt Kameraet",
['toggle_news_vision'] = "Veksle mellom synsmodusene",
['edit_values_newscam'] = "Rediger nyhetsteksten",
['not_in_a_vehicle'] = "Du kan ikke bruke denne animasjonen mens du er i et kjøretøy",
['in_a_vehicle'] = "Du kan kun bruke denne animasjonen menst du er i et kjøretøy",
['no_anim_crawling'] = "Du kan ikke starte animasjoner mens du kryper",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,77 @@
Locales['pl'] = {
-- Polish 🇵🇱
['emotes'] = "~h~~p~ Animacje 🎬",
['danceemotes'] = "~h~~p~ 🕺 Tańce",
['animalemotes'] = "~h~~p~ 🐩 Animacje zwierząt",
['propemotes'] = "~h~~p~ 📦 Animacje z propami",
['prop2info'] = "❓ Animacje z propami są zlokalizowane na samym końcu listy",
['set'] = "Ustaw (",
['newsetemote'] = "~w~ jest teraz Twoją przypisaną animacją, wciśnij ~g~CapsLock~w~ by jej użyć.",
['cancelemote'] = "~h~~r~ Anuluj animację 🚷",
['cancelemoteinfo'] = "~r~X~w~ Anuluje aktualnie graną animację",
['walkingstyles'] = "~h~~p~ Style chodzenia 🚶🏻‍♂️",
['resetdef'] = "Zresetuj do ustawień domyślnych",
['normalreset'] = "~h~~r~ Normal (Reset)",
['moods'] = "~h~~p~ Nastroje 😒",
['infoupdate'] = "~h~~g~ Creditsy 🤝🏻",
['infoupdateav'] = "Informacje (aktualizacja dostępna)",
['infoupdateavtext'] = "Dostępna jest nowa aktualizacja, pobierz ją z: ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Masz sugestie?",
['suggestionsinfo'] = "Napisz do ~r~Noor_Nahas~s~ na forum FiveMa odnośnie przyszłych ficzerów czy propozycji! ✉️",
['notvaliddance'] = "nie jest poprawnym tańcem.",
['notvalidemote'] = "nie jest poprawną animacją.",
['nocancel'] = "Brak animacji do anulowania.",
['maleonly'] = "Niestety ta animacja działa tylko dla męskich modeli postaci!",
['emotemenucmd'] = "Użyj komendy /emotemenu by otworzyć menu animacji.",
['shareemotes'] = "~h~~p~ 👫 Współdzielone animacje",
['shareemotesinfo'] = "Zaproś pobliską osobę do wspólnej animacji",
['sharedanceemotes'] = "~h~~p~ 🕺 Współdzielone tańce",
['notvalidsharedemote'] = "nie jest poprawną współdzieloną animacją.",
['sentrequestto'] = "Wysyłasz prośbę do ~y~",
['nobodyclose'] = "Nie ma nikogo ~r~w pobliżu~w~.",
['doyouwanna'] = "~y~Y~w~ by zaakceptować, ~r~L~w~ by odrzucić (~g~",
['refuseemote'] = "Odrzucono Twoją prośbę.",
['makenearby'] = "sprawia, że pobliski gracz gra animację",
['useleafblower'] = "Naciśnij ~y~G~w~ by użyć dmuchawy do liści.",
['camera'] = "Wciśnij ~y~G~w~ by użyć lampy błyskowej aparatu.",
['makeitrain'] = "Wciśnij ~y~G~w~ by zrobić deszcz pieniędzy.",
['pee'] = "Przytrzymaj ~y~G~w~ by oddać mocz.",
['spraychamp'] = "Przytrzymaj ~y~G~w~ by opryskać szampanem",
['stun'] = "Wciśnij ~y~G~w~ by 'użyć' tazera.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Press ~y~G~w~ to vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Przypisz (~y~%s~w~) do ~g~%s~w~",
['currentlyboundemotes'] = " Aktualnie przypisane animacje:",
['notvalidkey'] = "nie jest poprawnym klawiszem.",
['keybinds'] = "🔢 Przypisane klawisze",
['keybindsinfo'] = "Użyj",
['searchemotes'] = "~h~~y~ 🔍 Szukaj animacji",
['searchinputtitle'] = "Szukaj:",
['searchmenudesc'] = "wyników dla frazy",
['searchnoresult'] = "Brak wyników dla frazy",
['invalidvariation'] = "Niepoprawny wariant tekstury. Dostępne tekstury to: %s",
['firework'] = "Naciśnij ~y~G~w~ aby odpalić fajerwerki",
['poop'] = "Naciśnij ~y~G~w~ by zrobić kupę",
['puke'] = "Naciśnij ~y~G~w~, aby zwymiotować", ---- Translated via smodin.io
['btn_select'] = "Wybierz",
['btn_back'] = "Wstecz",
['btn_switch'] = "Ruch",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['pt'] = {
-- Brazilian Portuguese 🇧🇷
['emotes'] = "~h~~p~ Emotes 🎬",
['danceemotes'] = "~h~~p~ 🕺 Emotes de Danças",
['animalemotes'] = "~h~~p~ 🐩 Emotes de Animais",
['propemotes'] = "~h~~p~ 📦 Emotes com Props",
['prop2info'] = "❓ Emotes de props podem ser localizados no fim",
['set'] = "Set (",
['newsetemote'] = "~w~ é o seu emote vinculado, pressione ~g~CapsLock~w~ para usá-lo",
['cancelemote'] = "~h~~r~ Cancelar emote 🚷",
['cancelemoteinfo'] = "~r~X~w~ Cancela os emotes rodando atualmente",
['walkingstyles'] = "~h~~p~ Estilos de Caminhada 🚶🏻‍♂️",
['resetdef'] = "Resetar para o padrão",
['normalreset'] = "~h~~r~ Normal (Resetar)",
['moods'] = "~h~~p~ Humores 😒",
['infoupdate'] = "~h~~y~ Crédito 🤝🏻",
['infoupdateav'] = "Informação (Atualização disponível)",
['infoupdateavtext'] = "Uma atualização disponível, veja ~y~https://github.com/alberttheprince/rpemotes-reborn~w~ para pegar",
['suggestions'] = "Sugestões?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ no fórum do FiveM para qualquer sugestão de recurso/emotes! ✉️",
['notvaliddance'] = "não é uma dança válida.",
['notvalidemote'] = "não é um emote válido.",
['nocancel'] = "Nenhum emote para cancelar",
['maleonly'] = "Este emote é para homens, desculpe!",
['emotemenucmd'] = "Use /emotemenu para abrir o menu.",
['shareemotes'] = "~h~~p~ 👫 Emotes compartilhados",
['shareemotesinfo'] = "Convide uma pessoa próxima para realizar a animação",
['sharedanceemotes'] = "~h~~p~ 🕺 Danças compartilhadas",
['notvalidsharedemote'] = "não é um emote compartilhado válido.",
['sentrequestto'] = "Enviar solicitação para ~y~",
['nobodyclose'] = "Ninguém próximo o ~r~suficiente~w~.",
['doyouwanna'] = "~y~Y~w~ para aceitar, ~r~L~w~ para recusar (~g~",
['refuseemote'] = "Emote recusado",
['makenearby'] = "Faz o jogador próximo participar",
['useleafblower'] = "Pressione ~y~G~w~ para usar o soprador de folhas",
['camera'] = "Pressione ~y~G~w~ para usar o flash da câmera",
['makeitrain'] = "Pressione ~y~G~w~ para fazer chover.",
['pee'] = "Mantenha pressionado ~y~G~w~ para fazer xixi.",
['spraychamp'] = "Mantenha pressionado ~y~G~w~ jogar champagne",
['stun'] = "Pressione ~y~G~w~ para 'usar' stun gun.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Pressione ~y~G~w~ para vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Vinculado (~y~%s~w~) para ~g~%s~w~",
['currentlyboundemotes'] = "Emotes atualmente vinculados: ",
['notvalidkey'] = "isto não é uma chave válida",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Usar",
['searchemotes'] = "~h~~y~ 🔍 Procure por Emotes",
['searchinputtitle'] = "Procurar:",
['searchmenudesc'] = "resultado(s) para",
['searchnoresult'] = "Nenhum resultado para a pesquisa",
['invalidvariation'] = "Variação de textura inválida. As opções válidas são: %s",
['firework'] = "Pressione ~y~G~w~ para usar o fogo de artifício",
['poop'] = "Pressione ~y~G~w~ para fazer cocô", -- Translated using smodin.io
['puke'] = "Pressione ~y~G~w~ para vomitar",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Selecionar",
['btn_back'] = "Voltar",
['btn_switch'] = "Movimento",
['btn_increment'] = "Incremento",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['ro'] = {
-- Romanian 🇷🇴
['emotes'] = "~h~~p~ Emote-uri 🎬",
['danceemotes'] = "~h~~p~ 🕺 Dansuri",
['animalemotes'] = "~h~~p~ 🐩 Emote-uri pentru animale",
['propemotes'] = "~h~~p~ 📦 Prop Emote-uri",
['prop2info'] = "❓ Prop Emote-urile pot fi gasite la final",
['set'] = "Seteaza (",
['newsetemote'] = "~w~ este acum emote-ul tau binduit, apasa ~g~CapsLock~w~ pentru a folosi.",
['cancelemote'] = "~h~~r~ Anuleaza animatia 🚷",
['cancelemoteinfo'] = "~r~X~w~ Anuleaza animatia curenta",
['walkingstyles'] = "~h~~p~ Stiluri de mers 🚶🏻‍♂️",
['resetdef'] = "Reseteaza la default",
['normalreset'] = "~h~~r~ Normal (Reset)",
['moods'] = "~h~~p~ Expresii 😒",
['infoupdate'] = "~h~~g~ Credits 🤝🏻",
['infoupdateav'] = "Informatii",
['infoupdateavtext'] = "Credits: See our read me for credits!",
['suggestions'] = "Sugestii?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ pe forumurile FiveM pentru orice sugestie de feature/emote nou! ✉️",
['notvaliddance'] = "nu este un emote valid.",
['notvalidemote'] = "nu este un emote valid.",
['nocancel'] = "Niciun emote de anulat.",
['maleonly'] = "Acest emote este doar pentru barbati, scuze!",
['emotemenucmd'] = "Foloseste comanda /emotemenu pentru a deschide meniul de animatii.",
['shareemotes'] = "👫 Shared Emotes",
['shareemotesinfo'] = "Invita persoana de langa tine",
['sharedanceemotes'] = "🕺 Shared Dances",
['notvalidsharedemote'] = "nu este un emote shared valid.",
['sentrequestto'] = "Am trimis propunerea catre ~y~",
['nobodyclose'] = "Nu este nici o persoana ~r~langa tine~w~.",
['doyouwanna'] = "~y~Y~w~ pentru a accepta, ~r~L~w~ pentru a refuza (~g~",
['refuseemote'] = "Emote refuzat.",
['makenearby'] = "face jucatorul de langa sa aiba animatia",
['useleafblower'] = "Apasă ~y~G~w~ pentru a folosi suflătorul de frunze.",
['camera'] = "Apasa ~y~G~w~ pentru a folosi blitz-ul.",
['makeitrain'] = "Apasa ~y~G~w~ pentru a da bani fara numar.",
['pee'] = "tine apasat ~y~G~w~ pentru a urina.",
['spraychamp'] = "tine apasat ~y~G~w~ pentru a stropi cu sampanie",
['stun'] = "Apasa ~y~G~w~ pentru a 'folosi' electrosocul.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Press ~y~G~w~ to vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Binduite (~y~%s~w~) la ~g~%s~w~",
['currentlyboundemotes'] = " Emote-uri prezent binduite:",
['notvalidkey'] = "nu este o tasta valida.",
['keybinds'] = "🔢 Bind-uri",
['keybindsinfo'] = "Foloseste",
['searchemotes'] = "~h~~y~ 🔍 Cautare Emote-uri",
['searchinputtitle'] = "Cautare:",
['searchmenudesc'] = "rezultat(e) pentru",
['searchnoresult'] = "Fara rezultate pentru cautarea",
['invalidvariation'] = "Variație nevalidă a texturii. Selectările valide sunt: %s",
['firework'] = "Apasa ~y~G~w~ pentru a folosi artificiile",
['poop'] = "Apăsați pe ~y~G~w~ pentru a face caca", --Trannslated using smodin.io
['puke'] = "Apăsați pe ~y~G~w~ pentru a vomita", ---- Translated via smodin.io
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Selectare",
['btn_back'] = "Înapoi",
['btn_switch'] = "Mișcare",
['btn_increment'] = "Increment",
['dead'] = "You can't use emotes while dead!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Incorrect ped model detected 🐕!",
['animaldisabled'] = "Sorry! Animal emotes are disabled on this server",
['adultemotedisabled'] = "Bonk! Adult emotes disabled 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Exit binoculars",
['toggle_binoculars_vision'] = "Toggle between vision modes",
['exit_news'] = "Exit News Camera",
['toggle_news_vision'] = "Toggle between vision modes",
['edit_values_newscam'] = "Edit the news text",
['not_in_a_vehicle'] = "You can't play this animation while in a vehicle",
['in_a_vehicle'] = "You can only play this animation while in a vehicle 🚷",
['no_anim_crawling'] = "You can't play animations while crawling",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,98 @@
Locales['ru'] = {
-- Russian 🇷🇺 by denrulezz
['emotes'] = "~h~~p~ Эмоции 🎬",
['danceemotes'] = "~h~~p~ 🕺 Танцевальные эмоции",
['animalemotes'] = "~h~~p~ 🐩 Эмоции животных",
['propemotes'] = "~h~~p~ 📦 Эмоции с пропом",
['prop2info'] = "❓ Эмоции с пропом могут быть расположены в конце",
['set'] = "Установить (",
['newsetemote'] = "~w~ теперь привязанная эмоция, нажмите ~g~CapsLock~w~ для использования.",
['cancelemote'] = "~h~~r~ Остановить эмоцию 🚷",
['cancelemoteinfo'] = "~r~X~w~ Отменяет воспроизводимую эмоцию",
['walkingstyles'] = "~h~~p~ Стили ходьбы 🚶🏻‍♂️",
['resetdef'] = "Сбросить на обычную",
['normalreset'] = "~h~~r~ Обычная (Сбросить)",
['moods'] = "~h~~p~ Настроение 😒",
['infoupdate'] = "Признательность 🤝🏻",
['remove_emote_keybind'] = 'Удаление эмоции из привязок клавиш',
['show_emote_keybind'] = 'просмотр эмоций на сочетаниях клавиш',
['play_emote'] = 'воспроизвести анимацию',
['open_menu_emote'] = 'Открыть меню анимаций',
['show_list_emote'] = 'Посмотреть список возможных эмоций',
['link_emote_keybind'] = 'Привязка эмоции к клавише',
['help_command'] = 'dance, camera, sit или любая другая эмоция',
['help_variation'] = '(Необязательно) 1, 2, 3 или любое число. Изменится текстура некоторых аксессуаров, используемых в эмоциях, например цвет телефона. Введите -1, чтобы увидеть список вариантов.',
['infoupdateav'] = "Информация (Доступно обновление)",
['infoupdateavtext'] = "Доступно обновление, загрузите последнюю версию с ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Предложения?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ на форумах FiveM для любых предложений по функциям/эмоциям! ✉️",
['notvaliddance'] = "не существующий танец.",
['notvalidemote'] = "не существующая эмоция.",
['nocancel'] = "Нет эмоций для отмены.",
['maleonly'] = "Эта эмоция только для мужчин, извините!",
['emotemenucmd'] = "Используйте команду /emotemenu, чтобы открыть меню анимации.",
['shareemotes'] = "~h~~p~ 👫 Совместные эмоции",
['shareemotesinfo'] = "Пригласите человека рядом для воспроизведения эмоции",
['sharedanceemotes'] = "~h~~p~ 🕺 Совместные танцы",
['notvalidsharedemote'] = "не существующая совместная эмоция.",
['sentrequestto'] = "Отправлен запрос ~y~",
['nobodyclose'] = "Никого ~r~close~w~ нет поблизости.",
['doyouwanna'] = "~y~Y~w~ для принятия, ~r~L~w~ для отмены (~g~",
['refuseemote'] = "Эмоция откленена.",
['makenearby'] = "заставляет ближайшего игрока играть",
['useleafblower'] = "Нажмите ~y~G~w~ для использование воздуходувки.",
['camera'] = "Нажмите ~y~G~w~ для вспышки.",
['makeitrain'] = "Нажмите ~y~G~w~ для дождя.",
['pee'] = "Удерживайте ~y~G~w~ чтоб писать.",
['spraychamp'] = "Удерживайте ~y~G~w~ для спрея шампанского",
['stun'] = "Нажмите ~y~G~w~ ,чтобы 'использовать' шокер.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Нажмите ~y~G~w~ чтобы вейпить.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Связать (~y~%s~w~) для ~g~%s~w~",
['currentlyboundemotes'] = " Текущие привязанные эмоции:",
['notvalidkey'] = "недопустимая клавиша.",
['keybinds'] = "🔢 Бинды клавиш",
['keybindsinfo'] = "Использовать",
['searchemotes'] = "~h~~y~ 🔍 Поиск эмоции",
['searchinputtitle'] = "Поиск:",
['searchmenudesc'] = "результат(ы) для",
['searchnoresult'] = "Нет результатов по поиску",
['invalidvariation'] = "Недопустимая вариация текстуры. Допустимые варианты: %s",
['firework'] = "Нажмите ~y~G~w~, чтобы запустить фейерверк.",
['poop'] = "Нажмите ~y~G~w~, чтобы какать",
['puke'] = "Нажмите ~y~G~w~ для рвоты",
['cut'] = "Нажмите ~y~G~w~ для резки",
['btn_select'] = "Выбрать",
['btn_back'] = "Назад",
['btn_switch'] = "Движение",
['btn_increment'] = "Приращение",
['dead'] = "Вы не можете использовать эмоции, когда умерли!",
['swimming'] = "Вы не можете использовать эмоции во время плавания.",
['notvalidpet'] = "ГАВ ГАВ! Эмоции для 4-ногих друзей 🐕!",
['animaldisabled'] = "Извините! Эмоции животных отключены на сервере",
['adultemotedisabled'] = "Бонк! Эмоции взрослых отлючены 🔞",
['toggle_instructions'] = "Переключение подсказок",
['exit_binoculars'] = "Выйти из бинокля",
['toggle_binoculars_vision'] = "Переключение между режимами бинокля",
['exit_news'] = "Выход из камеры новостей",
['toggle_news_vision'] = "Переключение между режимами камеры",
['edit_values_newscam'] = "Редактировать текст новости",
['not_in_a_vehicle'] = "Вы не можете проигрывать эту эмоцию в машине",
['in_a_vehicle'] = "Вы можете проигрывать эту эмоцию в машине",
['no_anim_crawling'] = "Вы не можете воиспроизвести анимацию во время ползания",
['no_anim_right_now'] = "Вы не можете воспроизвести анимацию прямо сейчас",
-- Key maps
['register_cancel_emote'] = "Отменить текущую эмоцию",
['register_open_menu'] = "Открыть меню анимации",
['register_handsup'] = "Поднимите руки вверх",
['register_crouch'] = "В приседи",
['register_crawl'] = "Ползти",
['register_pointing'] = "Указать пальцем",
['register_ragdoll'] = "Переключить рэгдолл",
-- Commands descriptions
['cancel_emote'] = "Отменить текущую эмоцию",
['crouch'] = "В приседи",
['crawl'] = "Ползти",
['pointing'] = "Указывать пальцем"
}

View file

@ -0,0 +1,78 @@
Locales['sl'] = {
-- Slovenia
['emotes'] = '~h~~p~ Emote 🎬',
['danceemotes'] = "~h~~p~ 🕺 Plesi",
['animalemotes'] = "~h~~p~ 🐩 Emote živali",
['propemotes'] = "~h~~p~ 📦 Emote pripomočkov",
['prop2info'] = "❓ Emote pripomočki se nahajajo na koncu",
['set'] = "Nastavi (",
['newsetemote'] = "~w~ je sedaj vaš vezan emote, pritisnite ~g~CapsLock~w~, da ga uporabite.",
['cancelemote'] = "~h~~r~ Prekliči Emote 🚷",
['cancelemoteinfo'] = "~r~X~w~ Prekliče trenutno predvajani emote",
['walkingstyles'] = "~h~~p~ Sprehajalni stili 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Ponastavi na privzeto",
['normalreset'] = "~h~~r~ Normalno (Ponastavi)",
['moods'] = "~h~~p~ Počutja 😒",
['infoupdate'] = "~h~~g~ Krediti 🤝🏻",
['infoupdateav'] = "Informacije (Na voljo je posodobitev)",
['infoupdateavtext'] = "Na voljo je posodobitev, pridobite najnovejšo različico s spletne strani ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Predlogi?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ na forumih FiveM za kakršne koli predloge za funkcije/emote! ✉️",
['notvaliddance'] = "ni veljaven ples.",
['notvalidemote'] = "ni veljaven emote.",
['nocancel'] = "Ni emote za preklic.",
['maleonly'] = "Ta emote je na voljo samo za moške, žal!",
['emotemenucmd'] = "Uporabite ukaz /emotemenu, da odprete meni za animacije.",
['shareemotes'] = "~h~~p~ 👫 Deljeni Emotes",
['shareemotesinfo'] = "Povabite osebo v bližini, da naredi emote",
['sharedanceemotes'] = "~h~~p~ 🕺 Deljeni Plesi",
['notvalidsharedemote'] = "ni veljaven deljeni emote.",
['sentrequestto'] = "Poslano povpraševanje ~y~",
['nobodyclose'] = "Nihče ni dovolj ~r~blizu~w~.",
['doyouwanna'] = "~y~Y~w~ za sprejem, ~r~L~w~ za zavrnitev (~g~",
['refuseemote'] = "Emote zavrnjen.",
['makenearby'] = "naredi, da se bližnji igralec predvaja",
['useleafblower'] = "Pritisnite ~y~G~w~, da uporabite pihalnik za liste.",
['camera'] = "Pritisnite ~y~G~w~, da uporabite bliskavico kamere.",
['makeitrain'] = "Pritisnite ~y~G~w~, da povzročite dež.",
['pee'] = "Držite ~y~G~w~, da se olajšate.",
['spraychamp'] = "Držite ~y~G~w~, da popršite šampanjec",
['stun'] = "Pritisnite ~y~G~w~, da 'uporabite' električni šoker.",
['smoke'] = "Pritisnite ~y~G~w~, da kadite.",
['vape'] = "Pritisnite ~y~G~w~, da vape-ate.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Vezan (~y~%s~w~) na ~g~%s~w~",
['currentlyboundemotes'] = "Trenutno vezani emote:",
['notvalidkey'] = "ni veljavna tipka.",
['keybinds'] = "🔢 Tipke",
['keybindsinfo'] = "Uporabite",
['searchemotes'] = "~h~~y~ 🔍 Iskanje emotes",
['searchinputtitle'] = "Iskanje:",
['searchmenudesc'] = "rezultat(ov) za",
['searchnoresult'] = "Ni rezultatov za iskanje",
['invalidvariation'] = "Neveljavna teksturna variacija. Veljavne izbire so: %s",
['firework'] = "Pritisnite ~y~G~w~, da uporabite ognjemet",
['poop'] = "Pritisnite ~y~G~w~, da opravite veliko potrebo",
['puke'] = "Pritisnite ~y~G~w~, da bruhati",
['cut'] = "Pritisnite ~y~G~w~ za rezanje",
['btn_select'] = "Izberi",
['btn_back'] = "Nazaj",
['btn_switch'] = "Gibanje",
['btn_increment'] = "Povečaj",
['dead'] = "Medtem ko ste mrtvi, ne morete uporabljati emotes!",
['swimming'] = "Med plavanjem ne morete uporabljati emotes",
['notvalidpet'] = "RUH ROH! Zaznan napačen model ped 🐕!",
['animaldisabled'] = "Oprostite! Emote živali so onemogočeni na tem strežniku",
['adultemotedisabled'] = "Bonk! Odrasli emotes so onemogočeni 🔞",
['toggle_instructions'] = "Preklopite navodila",
['exit_binoculars'] = "Izhod iz daljnogleda",
['toggle_binoculars_vision'] = "Preklopite med načini gledanja",
['exit_news'] = "Izhod iz kamere za novice",
['toggle_news_vision'] = "Preklopite med načini gledanja",
['edit_values_newscam'] = "Uredite besedilo novic",
['not_in_a_vehicle'] = "Te animacije ne morete predvajati med vožnjo",
['in_a_vehicle'] = "To animacijo lahko predvajate samo med vožnjo 🚷",
['no_anim_crawling'] = "Med plazenjem ne morete predvajati animacij",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['sq'] = {
-- Albanian
['emotes'] = "~h~~p~ Emotet 🎬",
['danceemotes'] = "~h~~p~ 🕺 Emotet e Kërcimit",
['animalemotes'] = "~h~~p~ 🐩 Emotet e Kafshëve",
['propemotes'] = "~h~~p~ 📦 Emotet e Përparave",
['prop2info'] = "❓ Emotet e Përparave mund të gjenden në fund",
['set'] = "Vendos (",
['newsetemote'] = "~w~ është tani emota e lidhur, shtyp ~g~CapsLock~w~ për ta përdorur.",
['cancelemote'] = "~h~~r~ Anulo Emoten 🚷",
['cancelemoteinfo'] = "~r~X~w~ Anulon emoten që është duke u luajtur momentalisht",
['walkingstyles'] = "~h~~p~ Stilet e ecjes 🚶🏻‍♂️",
['resetdef'] = "Rivendos në parazgjedhje",
['normalreset'] = "~h~~r~ Normale (Rivendos)",
['moods'] = "~h~~p~ Gjendjet 😒",
['infoupdate'] = "~h~~g~ Kredite 🤝🏻",
['infoupdateav'] = "Informacion (Përditësim i disponueshëm)",
['infoupdateavtext'] = "Ka një përditësim të disponueshëm, merrni versionin e fundit nga ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Sugjerime?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ në forumet e FiveM për çdo sugjerim për karakteristika/emote! ✉️",
['notvaliddance'] = "nuk është një kërcim i vlefshëm.",
['notvalidemote'] = "nuk është një emote i vlefshëm.",
['nocancel'] = "Nuk ka emote për të anuluar.",
['maleonly'] = "Ky emote është vetëm për meshkuj, na fal!",
['emotemenucmd'] = "Përdor komandën /emotemenu për të hapur menunë e animacioneve.",
['shareemotes'] = "~h~~p~ 👫 Emotet e Ndara",
['shareemotesinfo'] = "Ftoj një person të afërt për të emotuar",
['sharedanceemotes'] = "~h~~p~ 🕺 Kërcime të Ndara",
['notvalidsharedemote'] = "nuk është një emote i ndarë i vlefshëm.",
['sentrequestto'] = "U dërgua kërkesa te ~y~",
['nobodyclose'] = "Askush ~r~afër~w~ mjaftueshëm.",
['doyouwanna'] = "~y~Y~w~ për të pranuar, ~r~L~w~ për të refuzuar (~g~",
['refuseemote'] = "Emota u refuzua.",
['makenearby'] = "bën që lojtari i afërt të luajë",
['useleafblower'] = "Shtyp ~y~G~w~ për të përdorur erërrënë.",
['camera'] = "Shtyp ~y~G~w~ për të përdorur flakën e kamerës.",
['makeitrain'] = "Shtyp ~y~G~w~ për të bërë që të bjerë shi.",
['pee'] = "Mbaj ~y~G~w~ për të ujitur.",
['spraychamp'] = "Mbaj ~y~G~w~ për të stërshpërndarë shampanjë",
['stun'] = "Shtyp ~y~G~w~ për të 'përdorur' armën qetësuese.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Shtyp ~y~G~w~ për të vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "I lidhur (~y~%s~w~) me ~g~%s~w~",
['currentlyboundemotes'] = " Emotet momentalisht të lidhura:",
['notvalidkey'] = "nuk është një çelës i vlefshëm.",
['keybinds'] = "🔢 Çelësat",
['keybindsinfo'] = "Përdor",
['searchemotes'] = "~h~~y~ 🔍 Kërko Emote",
['searchinputtitle'] = "Kërko:",
['searchmenudesc'] = "rezultat(e) për",
['searchnoresult'] = "Asnjë rezultat për kërkimin",
['invalidvariation'] = "Variacioni i teksturës i pavlefshëm. Zgjedhjet e vlefshme janë: %s",
['firework'] = "Shtyp ~y~G~w~ për të përdorur fenerin",
['poop'] = "Shtyp ~y~G~w~ për të bërë që të defekosh",
['puke'] = "Shtyp ~y~G~w~ për të vjellë",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Zgjidh",
['btn_back'] = "Prapa",
['btn_switch'] = "Lëvizje",
['btn_increment'] = "Rrit",
['dead'] = "Nuk mund të përdorësh emotet kur je i vdekur!",
['swimming'] = "Nuk mund të përdorësh emotet gjatë notit",
['notvalidpet'] = "RUH ROH! U zbulua një model ped i gabuar 🐕!",
['animaldisabled'] = "Na vjen keq! Emotet e kafshëve janë të çaktivizuara në këtë server",
['adultemotedisabled'] = "Bonk! Emotet e rritura janë të çaktivizuara 🔞",
['toggle_instructions'] = "Aktivizo/inaktivizo udhëzimet",
['exit_binoculars'] = "Dalje nga binokularët",
['toggle_binoculars_vision'] = "Ndërro mes mënyrave të shikimit",
['exit_news'] = "Dalje nga kamera e lajmeve",
['toggle_news_vision'] = "Ndërro mes mënyrave të shikimit",
['edit_values_newscam'] = "Ndrysho tekstin e lajmeve",
['not_in_a_vehicle'] = "Nuk mund të luash këtë animacion në këndin e një mjete",
['in_a_vehicle'] = "Mund të luash këtë animacion vetëm në këndin e një mjete 🚷",
['no_anim_crawling'] = "Nuk mund të luash animacione ndërsa shtrihesh",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,77 @@
Locales['sr'] = {
-- Serbian
['emotes'] = 'Animacije 🎬',
['danceemotes'] = "🕺 Plesovi",
['animalemotes'] = "🐩 Životinjske Animacije",
['propemotes'] = "📦 Animacije Sa Predmetima",
['prop2info'] = "❓ Animacije sa predmetima se mogu naći na kraju",
['set'] = "Postavi (",
['newsetemote'] = "~w~ je sada tvoja bound-ana animacija, pritisni ~g~CapsLock~w~ da je uradiš.",
['cancelemote'] = "Prekini Animaciju 🚷",
['cancelemoteinfo'] = "~r~X~w~ Prekine animaciju koju trenutno radiš",
['walkingstyles'] = "Stilovi Hodanja 🚶🏻‍♂️",
['resetdef'] = "Restartuj na podrazumevano",
['normalreset'] = "Normalan (Reset)",
['moods'] = "Raspoloženja 😒",
['infoupdate'] = "Zasluge i Sugestije 🙏🏻",
['infoupdateav'] = "Informacija (Ažuriranje Dostupno)",
['infoupdateavtext'] = "Ažuriranje je dostupno, skini zadnju verziju sa ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Sugestije?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ na FiveM forumima za bilo koje sugestije za funkcije/animacije! ✉️",
['notvaliddance'] = "nije validan ples.",
['notvalidemote'] = "nije validna animacija.",
['nocancel'] = "Ne radite animaciju.",
['maleonly'] = "Izvini, ova animacija je samo za muškarce!",
['emotemenucmd'] = "Koristi komandu /emotemenu da otvoris meni animacija.",
['shareemotes'] = "👫 Društvene Animacije",
['shareemotesinfo'] = "Pozovite obliznju osobu na animaciju",
['sharedanceemotes'] = "🕺 Društveni Plesovi",
['notvalidsharedemote'] = "nije validna društvena animacija.",
['sentrequestto'] = "Zahtjev je poslat ~y~",
['nobodyclose'] = "Niko ~r~close~w~ dovoljno.",
['doyouwanna'] = "~y~Y~w~ da prihvatiš, ~r~L~w~ da odbiješ (~g~",
['refuseemote'] = "Animacija odbijena.",
['makenearby'] = "Natera bliskog igrača da igra",
['useleafblower'] = "Pritisni ~y~G~w~ da koristiš puhač lišća.",
['camera'] = "Pritisni ~y~G~w~ da koristiš blic kamere.",
['makeitrain'] = "Pritisni ~y~G~w~ da napraviš da kiša pada.",
['pee'] = "Drži ~y~G~w~ da pišaš.",
['spraychamp'] = "Drži ~y~G~w~ da pršćeš šampanjac",
['stun'] = "Pritisni ~y~G~w~ da 'koristiš' tejzer.",
['vape'] = "Pritisni ~y~G~w~ da vejpuješ.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Bound-ano (~y~%s~w~) na ~g~%s~w~",
['currentlyboundemotes'] = " Trenutne bound-ane animacije:",
['notvalidkey'] = "nije validan ključ.",
['keybinds'] = "🔢 Keybind-ovi",
['keybindsinfo'] = "Koristi",
['searchemotes'] = "🔍 Pretraži animacije",
['searchinputtitle'] = "Pretraži:",
['searchmenudesc'] = "rezultat(a) za",
['searchnoresult'] = "Nema rezultata za pretraživanje",
['invalidvariation'] = "Nevažeća varijacija teksture. Važeće selekcije su: %s",
['firework'] = "Pritisni ~y~G~w~ da koristiš vatromet",
['poop'] = "Pritisni ~y~G~w~ da kakiš",
['puke'] = "Pritisni ~y~G~w~ da povratiš",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Izaberi",
['btn_back'] = "Nazad",
['btn_switch'] = "Kretanje",
['btn_increment'] = "Inkrement",
['dead'] = "Ne možeš koristiti animacije dok si mrtav!",
['swimming'] = "Ne možeš koristiti animacije dok plivaš",
['notvalidpet'] = "AV AV! Detektovan je netačan model (Ped) 🐕!",
['animaldisabled'] = "Izvini! Životinjske animacije su ugašene na ovom serveru",
['adultemotedisabled'] = "Ups! Odrasle animacije su ugašene 🔞",
['toggle_instructions'] = "Uključi/Isključi instrukcije",
['exit_binoculars'] = "Izađi iz dvogleda",
['toggle_binoculars_vision'] = "Prebaci između režima vida",
['exit_news'] = "Izađi iz kamere za vesti",
['toggle_news_vision'] = "Prebaci između režima vida",
['edit_values_newscam'] = "Mjenjaj tekst vesti",
['not_in_a_vehicle'] = "Ne možeš raditi ovu animaciju dok si u vozilu",
['in_a_vehicle'] = "Ovu animaciju možeš raditi samo dok si u vozilu 🚷",
['no_anim_crawling'] = "Ne možeš raditi animacije dok pužeš",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,78 @@
Locales['sv'] = {
-- Swedish 🇸🇪
['emotes'] = "~h~~p~ Emotes 🎬",
['danceemotes'] = "~h~~p~ 🕺 Dans Emotes",
['animalemotes'] = "~h~~p~ 🐩 Djur Emotes",
['propemotes'] = "~h~~p~ 📦 Objekt Emotes",
['prop2info'] = "❓ Objekt Emotes finns längst ner i listan.",
['set'] = "Sätt (",
['newsetemote'] = "~w~ är nu din favorit emote, tryck ~g~CapsLock~w~ för att använda den.",
['cancelemote'] = "~h~~r~ Avbryt Emote 🚷",
['cancelemoteinfo'] = "~r~X~w~ avbryter nuvarande spelande emote.",
['walkingstyles'] = "~h~~p~ Gångstil 🚶🏻‍♂️",
['resetdef'] = "Återställ till standard",
['normalreset'] = "~h~~r~ Normal (Återställ)",
['moods'] = "~h~~p~ Humör 😒",
['infoupdate'] = "~h~~g~ Krediter 🤝🏻",
['infoupdateav'] = "Information (Uppdatering tillgänglig)",
['infoupdateavtext'] = "En uppdatering är tillgänglig ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Förslag?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ på FiveM-forum för förslag på funktioner/emotes! ✉️",
['notvaliddance'] = "är inte en giltig dans",
['notvalidemote'] = "är inte en giltig emote",
['nocancel'] = "Ingen emote att avbryta",
['maleonly'] = "Den här emoten är endast för män.",
['emotemenucmd'] = "Använd /emotemenu för att öppna animationsmenyn",
['shareemotes'] = "👫 Delade Emotes",
['shareemotesinfo'] = "Bjud in en närliggande person till en emote",
['sharedanceemotes'] = "🕺 Delade Danser",
['notvalidsharedemote'] = "är inte en giltig delad emote.",
['sentrequestto'] = "Skickad förfrågan till ~g~",
['nobodyclose'] = "Ingen ~r~närliggande~w~ person hittades.",
['doyouwanna'] = "~y~Y~w~ för att acceptera, ~r~L~w~ för att avböja (~g~",
['refuseemote'] = "Emote avvisats.",
['makenearby'] = "får spelaren i närheten att spela",
['useleafblower'] = "Tryck ~y~G~w~ för att blåsa.",
['camera'] = "Tryck ~y~G~w~ för att använda kamera blixt.",
['makeitrain'] = "Tryck ~y~G~w~ för att låta det regna pengar.",
['pee'] = "Håll ~y~G~w~ att kissa.",
['spraychamp'] = "Håll ~y~G~w~ för att spraya champagne.",
['stun'] = "Tryck ~y~G~w~ för att \"änvända\" elpistol",
['vape'] = "Tryck ~y~G~w~ för att puffa på din vape.",
['candle'] = "press ~y~G~w~ to light candle.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['boundto'] = "Bunden (~y~%s~w~) till ~g~%s~w~",
['currentlyboundemotes'] = " För närvarande bundna emotes:",
['notvalidkey'] = "är inte en giltig tangent.",
['keybinds'] = "🔢 Keybinds",
['keybindsinfo'] = "Använd",
['searchemotes'] = "~h~~y~ 🔍 Sök Emotes",
['searchinputtitle'] = "Sök:",
['searchmenudesc'] = "resultat på",
['searchnoresult'] = "Inga resultat hittades på",
['invalidvariation'] = "Ogiltig texturvariation. Giltiga val är: %s",
['firework'] = "Tryck ~y~G~w~ för att avfyra dina fyrverkerier",
['poop'] = "Tryck ~y~G~w~ för att bajsa", -- Translated using smodin.io
['puke'] = "Tryck ~y~G~w~ För att Spy",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Välj",
['btn_back'] = "Tillbaka",
['btn_switch'] = "Rörelse",
['btn_increment'] = "Increment",
['dead'] = "Du kan inte använda animationer när du är död!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "RUH ROH! Felaktig ped-model hittad! 🐕",
['animaldisabled'] = "Tyvärr! Djuremotes är inaktiverade på denna server",
['adultemotedisabled'] = "Bonk! Vuxna emotes inaktiverade 🔞",
['toggle_instructions'] = "Toggle the instructions",
['exit_binoculars'] = "Avsluta kikare",
['toggle_binoculars_vision'] = "Växla mellan synlägen",
['exit_news'] = "Avsluta nyhetskamera",
['toggle_news_vision'] = "Växla mellan visionlägen",
['edit_values_newscam'] = "Redigera nyhetstexten",
['not_in_a_vehicle'] = "Du kan inte använda den här animationen när du är i ett fordon",
['in_a_vehicle'] = "Du kan bara använda den här animationen när du är i ett fordon",
['no_anim_crawling'] = "Du kan inte andända animationer när du säker genom",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,98 @@
Locales['tr'] = {
-- Turkish 🇹🇷
['emotes'] = 'Animasyonlar 🎬',
['danceemotes'] = "🕺 Dans Animasyonları",
['animalemotes'] = "🐩 Hayvan Animasyonları",
['propemotes'] = "📦 Eşyaları Animasyonlar",
['prop2info'] = "❓ Eşyalı animasyonlar sonda bulunur",
['set'] = "Set (",
['newsetemote'] = "~w~ animasyonu bağlandı, kullanmak için ~g~CapsLock~w~ tuşuna basın",
['cancelemote'] = "Animasyonu iptal et 🚷",
['cancelemoteinfo'] = "~r~X~w~ Şu anki animasyonu iptal eder",
['walkingstyles'] = "Yürüyüş Stilleri 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ Sıfırla",
['normalreset'] = "~h~~r~ Normal (Reset)",
['moods'] = "Haller 😒",
['infoupdate'] = "Emeği Geçenler 🤝🏻",
['remove_emote_keybind'] = 'Tuşlara atanmış bir animasyonu siler',
['show_emote_keybind'] = 'tuşlara atanmış animasyonların listesini gör',
['play_emote'] = 'animasyona gir',
['open_menu_emote'] = 'Animasyon menüsünü aç',
['show_list_emote'] = 'Animasyon listesini gör',
['link_emote_keybind'] = 'Animasyonu tuşa bağla',
['help_command'] = 'herhangi bir animasyon',
['help_variation'] = '(Opsiyonel) Animasyon içerisinde kullanılan eşyaların dokusunu değiştirir. Animasyonun tüm dokularını görmek için -1 yazın',
['infoupdateav'] = "Bilgilendirme (Güncelleme Mevcut)",
['infoupdateavtext'] = "Güncelleme mevcut, son versiyonu buradan alabilirsiniz ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "Tavsiyeler?",
['suggestionsinfo'] = "Tavsiye için FiveM forum üzerinde ~r~Noor_Nahas~s~'a ulaşın!S ✉️",
['notvaliddance'] = "animasyonu mevcut değil",
['notvalidemote'] = "animasyonu mevcut değil",
['nocancel'] = "İptal edilecek bir animasyon bulunamadı",
['maleonly'] = "Bu animasyon sadece erkekler için",
['emotemenucmd'] = "Animasyon menüsünü açmak için /emotemenu komudunu kullanın",
['shareemotes'] = "👫 Ortak Animasyonlar",
['shareemotesinfo'] = "Yakın bir oyuncuyu animasyona davet edin",
['sharedanceemotes'] = "🕺 Ortak Danslar",
['notvalidsharedemote'] = "animasyonu mevcut değil",
['sentrequestto'] = "~y~ oyuncusuna istek gönderildi",
['nobodyclose'] = "Kimse yeterince ~r~yakın~w~ değil",
['doyouwanna'] = "kabul etmek için ~y~Y~w~, reddetmek için ~r~L~w~ (~g~",
['refuseemote'] = "Animasyon kabul edilmedi",
['makenearby'] = "en yakın oyuncuyu animasyona sokar",
['useleafblower'] = "Yaprak temizleyicisini kullanmak için ~y~G~w~ tuşuna basın",
['camera'] = "Kamera flaşını kullanmak için ~y~G~w~ tuşuna baısn",
['makeitrain'] = "Yağmur yağdırmak için ~y~G~w~ tuşuna basın",
['pee'] = "İşemek için ~y~G~w~ tuşuna basılı tutun",
['spraychamp'] = "Şampanya patlatmak için ~y~G~w~ tuşuna basılı tutun",
['stun'] = "Şok tabancasını kullanmak için ~y~G~w~ tuşuna basın",
['smoke'] = "Sigara içmek için ~y~G~w~ tuşuna basın",
['vape'] = "Puff çekmek için ~y~G~w~ tuşuna basın",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "(~y~%s~w~) animasyonu ~g~%s~w~ animasyonuna bağlandı",
['handsup'] = "Ellerini kaldır",
['currentlyboundemotes'] = "Bağlı animasyonlar:",
['notvalidkey'] = "geçerli bir tuş değil",
['keybinds'] = "🔢 Tuşlar",
['keybindsinfo'] = "Kullan",
['searchemotes'] = "🔍 Animasyon Ara",
['searchinputtitle'] = "Ara:",
['searchmenudesc'] = "sonuçlar:",
['searchnoresult'] = "Animasyon bulunamadı",
['invalidvariation'] = "Geçersiz doku. Geçerli dokular: %s",
['firework'] = "Havai fişeği kullanmak için ~y~G~w~ tuşuna basın",
['poop'] = "Kaka yapmak için ~y~G~w~ tuşuna basın",
['puke'] = "Kusmak için ~y~G~w~ tuşuna basın",
['cut'] = "Kesmek için ~y~G~w~ tuşuna basın",
['btn_select'] = "Seç",
['btn_back'] = "Geri",
['btn_increment'] = "Arttır",
['dead'] = "Ölüyken animasyona giremezsiniz",
['swimming'] = "Yüzerken animasyona giremezsiniz",
['notvalidpet'] = "Uygunsuz ped modeli 🐕",
['animaldisabled'] = "Hayvan animasyonları bu sunucuda kullanıma açık değil",
['adultemotedisabled'] = "Yetişkin animasyonları 🔞",
['toggle_instructions'] = "Kullanım kılavuzunu kapat",
['exit_binoculars'] = "Dürbünü bırak",
['toggle_binoculars_vision'] = "Görüş ayarlarını değiştir",
['exit_news'] = "Haber kamerasından çık",
['toggle_news_vision'] = "Görüş ayarlarını değiştir",
['edit_values_newscam'] = "Haber yazısını değiştir",
['not_in_a_vehicle'] = "Bu animasyona bir araç içerisindeyken giremezsiniz",
['in_a_vehicle'] = "Bu animasyona sadece bir araç içerisindeyken girebilirsiniz 🚷",
['no_anim_crawling'] = "Bu animasyona sürünürken giremezsiniz",
['no_anim_right_now'] = "Şu an animasyona giremezsiniz",
-- Key maps
['register_cancel_emote'] = "Şu anki animasyonu iptal et",
['register_open_menu'] = "Animasyon menüsünü aç",
['register_handsup'] = "Ellerini kaldır",
['register_crouch'] = "Eğil",
['register_crawl'] = "Sürün",
['register_pointing'] = "Parmakla Göster",
['register_ragdoll'] = "Toggle ragdoll",
-- Commands descriptions
['cancel_emote'] = "Şu anki animasyonu iptal et",
['crouch'] = "Eğil",
['crawl'] = "Sürün",
['pointing'] = "Parmakla göster"
}

View file

@ -0,0 +1,78 @@
Locales['vi'] = {
-- Tiếng việt
['emotes'] = "~h~~p~ Hành động 🎬",
['danceemotes'] = "~h~~p~ 🕺 Nhảy nhót",
['animalemotes'] = "~h~~p~ 🐩 Thú cưng",
['propemotes'] = "~h~~p~ 📦 Đồ vật",
['prop2info'] = "❓ Hành động liên quan đến đồ vật sẽ ở cuối.",
['set'] = "Đặt (",
['newsetemote'] = "~w~ đã được đặt, Bấm ~g~CapsLock~w~ để sử dụng.",
['cancelemote'] = "~h~~r~ Hủy hành động 🚷",
['cancelemoteinfo'] = "~r~X~w~ để hủy hành động",
['walkingstyles'] = "~h~~p~ Dáng đi 🚶🏻‍♂️",
['resetdef'] = "Đặt về mặc định",
['normalreset'] = "~h~~r~ Bình thường (Mặc định)",
['moods'] = "~h~~p~ Biểu cảm 😒",
['infoupdate'] = "~h~~g~ Thông tin 🤝🏻",
['infoupdateav'] = "Thông tin (cập nhật)",
['infoupdateavtext'] = "Đang cập nhật",
['suggestions'] = "Đề xuất?",
['suggestionsinfo'] = "~r~RDCodename~s~ Trong diễn đàn tìm thấy bất kỳ đề xuất tài nguyên/emote nào! ✉️",
['notvaliddance'] = "Không khả dụng.",
['notvalidemote'] = "Không khả dụng.",
['nocancel'] = "Không có hành động để hủy.",
['maleonly'] = "Hành động chỉ dành cho nhân vật Nam.",
['emotemenucmd'] = "Sử dụng lệnh /emotemenu để mở danh mục hành động.",
['shareemotes'] = "~h~~p~ 👫 Hành động chung",
['shareemotesinfo'] = "Mời người ở gần tham gia hành động.",
['sharedanceemotes'] = "~h~~p~ 🕺 Nhảy nhót chung",
['notvalidsharedemote'] = "không khả dụng.",
['sentrequestto'] = "Đã gửi yêu cầu tới ~y~",
['nobodyclose'] = "Không có ai ~r~ở gần~w~.",
['doyouwanna'] = "~y~Y~w~ Đồng ý, ~r~L~w~ Từ chối (~g~",
['refuseemote'] = "Từ chối hành dộng",
['makenearby'] = "mời người ở gần cùng hành động",
['useleafblower'] = "Nhấn ~y~G~w~ để sử dụng máy thổi lá",
['camera'] = "Nhấn ~y~G~w~ để sử dụng đèn flash",
['makeitrain'] = "Nhấn ~y~G~w~ để làm cho trời mưa.",
['pee'] = "Tiếp tục nhấn ~y~G~w~ đi tiểu.",
['spraychamp'] = "Tiếp tục nhấn ~y~G~w~ để súc rượu sâm banh",
['stun'] = "Nhấn ~y~G~w~ Để 'sử dụng' súng gây choáng.",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "Nhấn ~y~G~w~ để sử dụng thuốc lá điện tử.",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "Đặt (~y~%s~w~) thành ~g~%s~w~",
['currentlyboundemotes'] = "Hành động đã gắn: ",
['notvalidkey'] = "không khả dụng.",
['keybinds'] = "🔢 Phím tắt",
['keybindsinfo'] = "Sử dụng",
['searchemotes'] = "~h~~y~ 🔍 Tìm kiếm hành động",
['searchinputtitle'] = "Tìm kiếm:",
['searchmenudesc'] = "Kết quả cho",
['searchnoresult'] = "Không có kết quả",
['invalidvariation'] = "Biến thể kết cấu không hợp lệ.Các lựa chọn hợp lệ là: %s",
['firework'] = "Nhấn ~y~G~w~ Để sử dụng pháo hoa",
['poop'] = "Nhấn ~y~G~w~ để ị", -- Translated using smodin.io
['puke'] = "Nhấn ~y~G~w~ để nôn",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "Chọn",
['btn_back'] = "Trở lại",
['btn_switch'] = "Chuyển động",
['btn_increment'] = "Tăng",
['dead'] = "Bạn không thể sử dụng hành động khi bất tỉnh!",
['swimming'] = "You can't use emotes while swimming",
['notvalidpet'] = "Ruh Roh!Mô hình PED không chính xác được phát hiện 🐕!",
['animaldisabled'] = "Lấy làm tiếc!Các biểu cảm động vật bị vô hiệu hóa trên máy chủ này",
['adultemotedisabled'] = "Bonk!Emotes người lớn bị vô hiệu hóa 🔞",
['toggle_instructions'] = "Chuyển đổi các hướng dẫn",
['exit_binoculars'] = "Thoát ống nhòm",
['toggle_binoculars_vision'] = "Chuyển đổi giữa các chế độ tầm nhìn",
['exit_news'] = "Thoát khỏi camera tin tức",
['toggle_news_vision'] = "Chuyển đổi giữa các chế độ tầm nhìn",
['edit_values_newscam'] = "Chỉnh sửa văn bản tin tức",
['not_in_a_vehicle'] = "Bạn không thể hành động này khi đang ở trong xe",
['in_a_vehicle'] = "Bạn chỉ có thể hành động này khi ở trong xe 🚷",
['no_anim_crawling'] = "Bạn không thể chơi hình ảnh động trong khi bò",
['no_anim_right_now'] = "You can't play an animation right now",
}

View file

@ -0,0 +1,98 @@
Locales['zhcn'] = {
-- Chinese simplified
['emotes'] = '动作 🎬',
['danceemotes'] = "🕺 舞蹈动作",
['animalemotes'] = "🐩 动物动作",
['propemotes'] = "📦 道具动作",
['prop2info'] = "❓ 道具动作位于末尾",
['set'] = "设置 (",
['newsetemote'] = "~w~ 现在是你的绑定动作,按 ~g~CapsLock~w~ 使用它。",
['cancelemote'] = "取消动作 🚷",
['cancelemoteinfo'] = "~r~X~w~ 取消当前的动作",
['walkingstyles'] = "行走风格 🚶🏻‍♂️",
['resetdef'] = "~h~~y~ 重置为默认",
['normalreset'] = "~h~~r~ 正常 (重置)",
['moods'] = "情绪 😒",
['infoupdate'] = "鸣谢 🤝🏻",
['remove_emote_keybind'] = '删除绑定的动作',
['show_emote_keybind'] = '查看绑定的动作',
['play_emote'] = '使用一个动作',
['open_menu_emote'] = '打开动作菜单',
['show_list_emote'] = '查看可用动作列表',
['link_emote_keybind'] = '将动作绑定到按键',
['help_command'] = '跳舞、拍照、坐下或其他动作',
['help_variation'] = '(可选) 1, 2, 3 或其他数字。将更改某些动作中使用的配件纹理,例如电话的颜色。输入 -1 以查看变体列表',
['infoupdateav'] = "信息 (有更新可用)",
['infoupdateavtext'] = "有更新可用,获取最新版本 ~y~https://github.com/alberttheprince/rpemotes-reborn~w~",
['suggestions'] = "建议?",
['suggestionsinfo'] = "~r~Noor_Nahas~s~ 在 FiveM 论坛上接受任何功能/动作建议! ✉️",
['notvaliddance'] = "不是有效的舞蹈。",
['notvalidemote'] = "不是有效的动作。",
['nocancel'] = "没有动作可取消。",
['maleonly'] = "这个动作仅限男性,抱歉!",
['emotemenucmd'] = "使用命令 /emotemenu 打开动作菜单。",
['shareemotes'] = "👫 共享动作",
['shareemotesinfo'] = "邀请附近的人一起动作",
['sharedanceemotes'] = "🕺 共享舞蹈",
['notvalidsharedemote'] = "不是有效的共享动作。",
['sentrequestto'] = "发送请求给 ~y~",
['nobodyclose'] = "附近没有人 ~r~足够近~w~。",
['doyouwanna'] = "~y~Y~w~ 接受, ~r~L~w~ 拒绝 (~g~",
['refuseemote'] = "动作被拒绝。",
['makenearby'] = "使附近的玩家使用动作",
['useleafblower'] = "按 ~y~G~w~ 使用吹叶机。",
['camera'] = "按 ~y~G~w~ 使用相机闪光灯。",
['makeitrain'] = "按 ~y~G~w~ 撒钱。",
['pee'] = "按住 ~y~G~w~ 小便。",
['spraychamp'] = "按住 ~y~G~w~ 喷香槟",
['stun'] = "按 ~y~G~w~ '使用'电击枪。",
['smoke'] = "按 ~y~G~w~ 吸烟。",
['vape'] = "按 ~y~G~w~ 吸电子烟。",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "绑定 (~y~%s~w~) 到 ~g~%s~w~",
['handsup'] = "举手",
['currentlyboundemotes'] = "当前绑定的动作:",
['notvalidkey'] = "不是有效的按键。",
['keybinds'] = "🔢 按键绑定",
['keybindsinfo'] = "使用",
['searchemotes'] = "🔍 搜索动作",
['searchinputtitle'] = "搜索:",
['searchmenudesc'] = "搜索结果",
['searchnoresult'] = "没有搜索结果",
['invalidvariation'] = "无效的纹理变体。有效选择为: %s",
['firework'] = "按 ~y~G~w~ 使用烟花",
['poop'] = "按 ~y~G~w~ 大便",
['puke'] = "按 ~y~G~w~ 呕吐",
['cut'] = "按 ~y~G~w~ 切割",
['btn_select'] = "选择",
['btn_back'] = "返回",
['btn_increment'] = "增加",
['dead'] = "你不能在死亡时使用动作!",
['swimming'] = "你不能在游泳时使用动作",
['notvalidpet'] = "RUH ROH! 检测到错误的宠物模型 🐕!",
['animaldisabled'] = "抱歉! 服务器禁用了动物动作",
['adultemotedisabled'] = "Bonk! 禁用了成人动作 🔞",
['toggle_instructions'] = "切换说明",
['exit_binoculars'] = "退出双筒望远镜",
['toggle_binoculars_vision'] = "切换视野模式",
['exit_news'] = "退出新闻相机",
['toggle_news_vision'] = "切换视野模式",
['edit_values_newscam'] = "编辑新闻文本",
['not_in_a_vehicle'] = "你不能在车辆中使用这个动作",
['in_a_vehicle'] = "你只能在车辆中使用这个动作 🚷",
['no_anim_crawling'] = "你不能在爬行时使用动作",
['no_anim_right_now'] = "你现在不能使用动作",
-- 按键映射
['register_cancel_emote'] = "取消当前动作",
['register_open_menu'] = "打开动作菜单",
['register_handsup'] = "举手",
['register_crouch'] = "蹲下",
['register_crawl'] = "爬行",
['register_pointing'] = "用手指指向",
['register_ragdoll'] = "切换布娃娃模式",
-- 命令描述
['cancel_emote'] = "取消当前动作",
['crouch'] = "蹲下",
['crawl'] = "爬行",
['pointing'] = "用手指指向"
}

View file

@ -0,0 +1,78 @@
Locales['zhtw'] = {
-- Chinese Traditional
['emotes'] = "~h~~p~ 動作 🎬",
['danceemotes'] = "~h~~p~ 🕺 舞蹈動作",
['animalemotes'] = "~h~~p~ 🐩 動物動作",
['propemotes'] = "~h~~p~ 📦 物品動作",
['prop2info'] = "❓ 物品動作在最後面",
['set'] = "設置 (",
['newsetemote'] = "~w~ 已設置為妳的綁定動作,按 ~g~CapsLock~w~ 使用。",
['cancelemote'] = "~h~~r~ 取消動作 🚷",
['cancelemoteinfo'] = "~r~X~w~ 取消當前動作",
['walkingstyles'] = "~h~~p~ 行走風格 🚶🏻‍♂️",
['resetdef'] = "重置為默認",
['normalreset'] = "~h~~r~ 正常 (重置)",
['moods'] = "~h~~p~ 情緒 😒",
['infoupdate'] = "致謝 🤝🏻",
['infoupdateav'] = "信息 (有更新)",
['infoupdateavtext'] = "已有新版本可用,請前往 ~y~https://github.com/alberttheprince/rpemotes-reborn~w~ 獲取最新版。",
['suggestions'] = "想提出建議?",
['suggestionsinfo'] = "請在 FiveM 論壇上聯系 ~r~Noor_Nahas~s~ 提出功能 / 動作建議! ✉️",
['notvaliddance'] = "不是有效的舞蹈動作。",
['notvalidemote'] = "不是有效的動作。",
['nocancel'] = "沒有要取消的動作。",
['maleonly'] = "抱歉,此動作僅適用於男性!",
['emotemenucmd'] = "使用命令 /emotemenu 打開動作菜單。",
['shareemotes'] = "~h~~p~ 👫 共享動作",
['shareemotesinfo'] = "邀請附近的人動作",
['sharedanceemotes'] = "🕺 共享舞蹈動作",
['notvalidsharedemote'] = "不是有效的共享動作。",
['sentrequestto'] = "已向此人發送請求 ~y~",
['nobodyclose'] = "沒有人 ~r~靠近~w~。",
['doyouwanna'] = "按 ~y~Y~w~ 接受,按 ~r~L~w~ 拒絕 (~g~",
['refuseemote'] = "已拒絕動作。",
['makenearby'] = "讓附近的玩家播放",
['useleafblower'] = "按 ~y~G~w~ 使用吹葉機。",
['camera'] = "按 ~y~G~w~ 使用閃光燈。",
['makeitrain'] = "按 ~y~G~w~ 撒出。",
['pee'] = "按住 ~y~G~w~ 尿尿。",
['spraychamp'] = "按住 ~y~G~w~ 噴灑香檳",
['stun'] = "按 ~y~G~w~ '使用' 麻醉槍。",
['smoke'] = "Press ~y~G~w~ to smoke.",
['vape'] = "按 ~y~G~w~ 使用電子煙。",
['candle'] = "press ~y~G~w~ to light candle.",
['boundto'] = "綁定 (~y~%s~w~) 到 ~g~%s~w~",
['currentlyboundemotes'] = " 當前綁定的動作:",
['notvalidkey'] = "不是有效的按鍵。",
['keybinds'] = "🔢 按鍵設置",
['keybindsinfo'] = "使用",
['searchemotes'] = "~h~~y~ 🔍 搜索動作",
['searchinputtitle'] = "搜索:",
['searchmenudesc'] = " 有 %s 個結果:",
['searchnoresult'] = " 沒有搜索結果。",
['invalidvariation'] = "紋理顏色無效。有效選擇為: %s",
['firework'] = "按 ~y~G~w~ 放煙花",
['poop'] = "按 ~y~G~w~ 排便",
['puke'] = "按 ~y~G~w~ 嘔吐",
['cut'] = "Press ~y~G~w~ to cut",
['btn_select'] = "選擇",
['btn_back'] = "返回",
['btn_switch'] = "移動",
['btn_increment'] = "移動量",
['dead'] = "您無法在死亡狀態下使用此動作!",
['swimming'] = "您無法在游泳時使用此動作!",
['notvalidpet'] = "哎呀! 檢測到非動物角色 🐕!",
['animaldisabled'] = "不好意思! 動物動作在此伺服器上已禁用",
['adultemotedisabled'] = "Bonk! 成人動作已禁用 🔞",
['toggle_instructions'] = "切換操作説明",
['exit_binoculars'] = "退出望遠鏡",
['toggle_binoculars_vision'] = "切換視覺模式",
['exit_news'] = "退出新聞攝像機",
['toggle_news_vision'] = "切換視覺模式",
['edit_values_newscam'] = "編輯新聞文本",
['not_in_a_vehicle'] = "您無法在車輛中使用此動作",
['in_a_vehicle'] = "您只能在車輛中使用此動作 🚷",
['no_anim_crawling'] = "您無法在爬行時使用此動作",
['no_anim_right_now'] = "You can't play an animation right now",
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View file

@ -0,0 +1,164 @@
RegisterNetEvent("rpemotes:server:requestEmote", function(target, emotename, etype)
local source = source
if not Player(source).state.canEmote then return end
if target == -1 then
return
end
local distance = #(GetEntityCoords(GetPlayerPed(source)) - GetEntityCoords(GetPlayerPed(target)))
if distance > 3 then
return
end
TriggerClientEvent("rpemotes:client:requestEmote", target, emotename, etype, source)
end)
RegisterNetEvent("rpemotes:server:confirmEmote", function(target, requestedemote, otheremote)
local source = source
if target == -1 then
return
end
local distance = #(GetEntityCoords(GetPlayerPed(source)) - GetEntityCoords(GetPlayerPed(target)))
if distance > 3 then
return
end
TriggerClientEvent("rpemotes:client:syncEmote", source, otheremote, target)
TriggerClientEvent("rpemotes:client:syncEmoteSource", target, requestedemote, source)
end)
RegisterNetEvent("rpemotes:server:cancelEmote", function(target)
TriggerClientEvent("rpemotes:client:cancelEmote", target, source)
end)
RegisterNetEvent("rpemotes:ptfx:sync", function(asset, name, offset, rot, bone, scale, color)
assert(type(asset) == "string", "[rpemotes] ptfx:sync: invalid asset for source: " .. tostring(source))
assert(type(name) == "string", "[rpemotes] ptfx:sync: invalid name for source: " .. tostring(source))
assert(type(offset) == "vector3", "[rpemotes] ptfx:sync: invalid offset for source: " .. tostring(source))
assert(type(rot) == "vector3", "[rpemotes] ptfx:sync: invalid rot for source: " .. tostring(source))
local state = Player(source).state
state:set("ptfxAsset", asset, true)
state:set("ptfxName", name, true)
state:set("ptfxOffset", offset, true)
state:set("ptfxRot", rot, true)
state:set("ptfxBone", bone, true)
state:set("ptfxScale", scale, true)
state:set("ptfxColor", color, true)
state:set("ptfxPropNet", nil, true)
state:set("ptfx", nil, true)
end)
RegisterNetEvent("rpemotes:ptfx:syncProp", function(propNet)
local state = Player(source).state
if propNet then
local entity
local maxAttempts = 100
local attempt = 0
repeat
entity = NetworkGetEntityFromNetworkId(propNet)
if entity and DoesEntityExist(entity) then
state:set("ptfxPropNet", propNet, true)
return
end
attempt = attempt + 1
Wait(10)
until attempt >= maxAttempts
print(("[rpemotes] Warning: Failed to find entity for propNet %s after %d attempts (source: %s)"):format(tostring(propNet), maxAttempts, tostring(source)))
end
state:set("ptfxPropNet", nil, true)
end)
local function ExtractEmoteProps(format)
format = tonumber(format)
local xt, c, total = '', '', 0
if format == 1 then
print("Selected format: ^2'prop_name',")
xt = "'"; c = ","
elseif format == 2 then
print("Selected format: ^2\"prop_name\",")
xt = "\""; c = ","
elseif format == 3 then
print("Selected format: ^2prop_name,")
elseif format == 4 then
print("Selected to calculate ^2total amount of emotes^0.")
else
print(
"\n### RPEmotes - Props Extractor ###\n\n^3Select output format^0\nAvailable formats:\n^11^0 - ^2'prop_name',\n^12^0 - ^2\"prop_name\",\n^13^0 - ^2prop_name\n^14^0 - ^2calculate total emotes\n\n^0Command usage example: ^5emoteextract 1^0\n")
return
end
local animationFile = LoadResourceFile(GetCurrentResourceName(), "client/AnimationList.lua")
if not animationFile then return nil end
local f, err = load(animationFile .. " return RP")
if err then return nil end
local success, res = pcall(f)
if not success then return nil end
if format == 4 then
local emoteTypes = { "Shared", "Dances", "AnimalEmotes", "Emotes", "PropEmotes", "Expressions", "Walks" }
local expressionAndWalkCount = 0
local otherEmotesCount = 0
for _, emoteType in ipairs(emoteTypes) do
local count = 0
for _ in pairs(res[emoteType]) do
count = count + 1
end
if emoteType == "Expressions" or emoteType == "Walks" then
expressionAndWalkCount = expressionAndWalkCount + count
else
otherEmotesCount = otherEmotesCount + count
end
end
local totalEmotes = expressionAndWalkCount + otherEmotesCount
print("Total Expressions and Walks: ^3" .. expressionAndWalkCount .. "^0")
print("Total Emotes without Expressions and Walks: ^3" .. otherEmotesCount .. "^0")
print("Total Emotes: ^3" .. totalEmotes .. "^0")
else
local file = io.open(GetResourcePath(GetCurrentResourceName()) .. "/prop_list.lua", "w+")
if not file then
print("Failed to open file for writing.")
return
end
local uniqueProps = {}
for _, value in pairs(res.PropEmotes) do
if type(value) == "table" and value.AnimationOptions then
local prop = value.AnimationOptions.Prop
local secondProp = value.AnimationOptions.SecondProp
if prop then uniqueProps[prop] = true end
if secondProp then uniqueProps[secondProp] = true end
end
end
-- Write all unique props to file
for propName in pairs(uniqueProps) do
file:write(xt .. propName .. xt .. c .. "\n")
total = total + 1
end
file:close()
print("Exported " .. total .. " props to ^2prop_list.lua^0")
end
end
RegisterCommand("emoteextract", function(source, args)
if source > 0 then return end
ExtractEmoteProps(args[1])
end, true)

View file

@ -0,0 +1,48 @@
if Config.CheckForUpdates then
local function VersionLog(_type, log)
local color = _type == 'success' and '^2' or '^1'
print(('%s%s^7'):format(color, log))
end
local function versionCheck()
local currentVersion = GetResourceMetadata(GetInvokingResource() or GetCurrentResourceName(), 'version', 0)
if currentVersion then
currentVersion = currentVersion:match('%d+%.%d+%.%d+')
end
if not currentVersion then
VersionLog('error', 'Currently unable to run a version check.')
return
end
SetTimeout(1000, function()
PerformHttpRequest('https://api.github.com/repos/alberttheprince/rpemotes-reborn/releases/latest', function(statusCode, responseBody)
if statusCode ~= 200 then return end
local releaseInfo = json.decode(responseBody)
if releaseInfo.prerelease then return end
local latestVersion = releaseInfo.tag_name:match('%d+%.%d+%.%d+')
if not latestVersion or latestVersion == currentVersion then return end
local currentVerParts = {string.match(currentVersion, '(%d+)%.(%d+)%.(%d+)')}
local latestVerParts = {string.match(latestVersion, '(%d+)%.(%d+)%.(%d+)')}
for i = 1, #currentVerParts do
local currPart = tonumber(currentVerParts[i])
local latestPart = tonumber(latestVerParts[i])
if currPart < latestPart then
VersionLog('info', ('Currently running an outdated version (%s)\r\nUpdate: %s^0'):format(currentVersion, releaseInfo.html_url))
return
elseif currPart > latestPart then
break
end
end
end, 'GET')
end)
end
versionCheck()
end

Some files were not shown because too many files have changed in this diff Show more