fixes etc
47
resources/[standalone]/rpemotes-reborn/.github/CONTRIBUTING.md
vendored
Normal 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!
|
||||
|
14
resources/[standalone]/rpemotes-reborn/.github/FUNDING.yml
vendored
Normal 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']
|
24
resources/[standalone]/rpemotes-reborn/.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal 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.
|
16
resources/[standalone]/rpemotes-reborn/.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal 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.
|
3930
resources/[standalone]/rpemotes-reborn/NativeUI.lua
Normal file
516
resources/[standalone]/rpemotes-reborn/README.md
Normal file
|
@ -0,0 +1,516 @@
|
|||

|
||||
|
||||
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:
|
||||

|
||||
|
||||
**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 you’re 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
|
||||
```
|
||||
|
||||

|
||||
|
||||
# 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)
|
14
resources/[standalone]/rpemotes-reborn/animals.lua
Normal 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",
|
||||
}
|
25356
resources/[standalone]/rpemotes-reborn/client/AnimationList.lua
Normal 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
|
168
resources/[standalone]/rpemotes-reborn/client/Binoculars.lua
Normal 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
|
107
resources/[standalone]/rpemotes-reborn/client/Bridge.lua
Normal 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)
|
501
resources/[standalone]/rpemotes-reborn/client/Crouch.lua
Normal 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)
|
895
resources/[standalone]/rpemotes-reborn/client/Emote.lua
Normal 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)
|
521
resources/[standalone]/rpemotes-reborn/client/EmoteMenu.lua
Normal 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)
|
|
@ -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
|
86
resources/[standalone]/rpemotes-reborn/client/Handsup.lua
Normal 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
|
96
resources/[standalone]/rpemotes-reborn/client/Keybinds.lua
Normal 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
|
245
resources/[standalone]/rpemotes-reborn/client/NewsCam.lua
Normal 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
|
35
resources/[standalone]/rpemotes-reborn/client/NoIdleCam.lua
Normal 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)
|
65
resources/[standalone]/rpemotes-reborn/client/PTFX.lua
Normal 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)
|
124
resources/[standalone]/rpemotes-reborn/client/Pointing.lua
Normal 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)
|
33
resources/[standalone]/rpemotes-reborn/client/Ragdoll.lua
Normal 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
|
164
resources/[standalone]/rpemotes-reborn/client/Syncing.lua
Normal 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)
|
395
resources/[standalone]/rpemotes-reborn/client/Utils.lua
Normal 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
|
124
resources/[standalone]/rpemotes-reborn/client/Walk.lua
Normal 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)
|
17322
resources/[standalone]/rpemotes-reborn/conditionalanims.meta
Normal file
164
resources/[standalone]/rpemotes-reborn/config.lua
Normal 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" },
|
||||
}
|
88
resources/[standalone]/rpemotes-reborn/fxmanifest.lua
Normal 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'
|
BIN
resources/[standalone]/rpemotes-reborn/header.png
Normal file
After Width: | Height: | Size: 96 KiB |
674
resources/[standalone]/rpemotes-reborn/license
Normal 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>.
|
28
resources/[standalone]/rpemotes-reborn/locale.lua
Normal 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
|
62
resources/[standalone]/rpemotes-reborn/locales/ar.lua
Normal 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'] = "زيادة"
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/cs.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/da.lua
Normal 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",
|
||||
|
||||
}
|
99
resources/[standalone]/rpemotes-reborn/locales/de.lua
Normal 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"
|
||||
}
|
||||
|
78
resources/[standalone]/rpemotes-reborn/locales/el.lua
Normal 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",
|
||||
|
||||
}
|
99
resources/[standalone]/rpemotes-reborn/locales/en.lua
Normal 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"
|
||||
}
|
77
resources/[standalone]/rpemotes-reborn/locales/es.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/fa.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/fi.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/fr.lua
Normal 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",
|
||||
|
||||
}
|
77
resources/[standalone]/rpemotes-reborn/locales/hu.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/id.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/it.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/lk.lua
Normal 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",
|
||||
|
||||
}
|
99
resources/[standalone]/rpemotes-reborn/locales/lt.lua
Normal 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"
|
||||
}
|
98
resources/[standalone]/rpemotes-reborn/locales/nl.lua
Normal 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"
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/no.lua
Normal 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",
|
||||
|
||||
}
|
77
resources/[standalone]/rpemotes-reborn/locales/pl.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/pt.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/ro.lua
Normal 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",
|
||||
|
||||
}
|
98
resources/[standalone]/rpemotes-reborn/locales/ru.lua
Normal 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'] = "Указывать пальцем"
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/sl.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/sq.lua
Normal 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",
|
||||
|
||||
}
|
77
resources/[standalone]/rpemotes-reborn/locales/sr.lua
Normal 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",
|
||||
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/sv.lua
Normal 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",
|
||||
|
||||
}
|
98
resources/[standalone]/rpemotes-reborn/locales/tr.lua
Normal 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"
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/vi.lua
Normal 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",
|
||||
|
||||
}
|
98
resources/[standalone]/rpemotes-reborn/locales/zhcn.lua
Normal 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'] = "用手指指向"
|
||||
}
|
78
resources/[standalone]/rpemotes-reborn/locales/zhtw.lua
Normal 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",
|
||||
|
||||
}
|
BIN
resources/[standalone]/rpemotes-reborn/screenshots/001.png
Normal file
After Width: | Height: | Size: 4.1 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/002.png
Normal file
After Width: | Height: | Size: 4.2 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/003.png
Normal file
After Width: | Height: | Size: 4 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/004.jpeg
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/005.jpg
Normal file
After Width: | Height: | Size: 267 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/006.jpeg
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/007.jpeg
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/008.png
Normal file
After Width: | Height: | Size: 3.1 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/009.jpeg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/010.png
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/011.png
Normal file
After Width: | Height: | Size: 3.4 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/012.png
Normal file
After Width: | Height: | Size: 4.1 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/013.png
Normal file
After Width: | Height: | Size: 3.3 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/014.png
Normal file
After Width: | Height: | Size: 4.2 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/015.png
Normal file
After Width: | Height: | Size: 4 MiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/016.png
Normal file
After Width: | Height: | Size: 3.7 MiB |
After Width: | Height: | Size: 183 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/extractor.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
resources/[standalone]/rpemotes-reborn/screenshots/pfxcoords.png
Normal file
After Width: | Height: | Size: 1.5 MiB |
164
resources/[standalone]/rpemotes-reborn/server/Server.lua
Normal 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)
|
48
resources/[standalone]/rpemotes-reborn/server/Updates.lua
Normal 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
|