Merge branch 'nightly' into organizing

This commit is contained in:
Vortrex
2022-06-14 05:56:46 -05:00
145 changed files with 33748 additions and 15824 deletions

2
.gitignore vendored
View File

@@ -3,3 +3,5 @@
*.code-workspace
config/database.json
config/email.json
config/discord.json
locale/*

View File

@@ -374,3 +374,8 @@ Obviously this would still be using slashes for commands still. The way this wor
* Place item on ground (crate)
* Take second beer from crate
* Store second beer in trunk
---
### Animation/emote, action, and message menu wheels
So with new Steam Deck being available now, and all the other attempts to use mobile devices that either emulate or stream the older GTA PC games, I figure we'd need a way for players to interact with each other using them. Roleplay is usually a very chat-oriented gamemode, but I can probably make things easier with simple controls. Also customizable messages, animations, and actions for each menu/wheel slot
The inventory system is already planned to use a hotbar/wheel but I don't have all the images for it yet
---

24
TODO.md
View File

@@ -1,5 +1,23 @@
* Finish auto-translate
* Add /autotranslate to enable/disable automatic chat translations for all languages, or specific ones by short code (RU, ES, etc)
* Finish working on the new job route system
== TODO
* Finish auto-translator
* Add ways to acquire drugs. Pot/coke plants, meth labs, etc
* Finish setting up the persistent NPC system
* Add yes/no prompts for some important things like
* (Business owner) Setting item sell price below order price. Will result in losing money.
* Giving house, biz, or vehicle to clan. Clan leaders can revoke permissions and you may be screwed and not able to change it!
* Deleting character
* Make game messages (big message, small message) into array of types
* Array of message types in shared
* Font, text, duration, etc arrays in client, indexed by type
* Fix the item take/put system for items in vehicle trunks, other items, etc
---
== Planned Features
* Named and scripted NPCs
* Racing
* Fishing
* Stock Market
* Mapped interiors for GTA 3
* Drug growing/manufacturing
---
== Bug Fixes
* Check natives for if player is console (getPlayerPosition, etc)

View File

@@ -22,5 +22,6 @@
"Estonian",
"Sicilian",
"Indian",
"Rough"
"Rough",
"Swedish"
]

112
config/client/locale.json Normal file
View File

@@ -0,0 +1,112 @@
[
{
"id": 0,
"englishName": "English",
"stringsFile": "english.json",
"isoCode": "en",
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex"
},
{
"id": 1,
"englishName": "Russian",
"stringsFile": "russian.json",
"isoCode": "ru",
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS"
},
{
"id": 2,
"englishName": "Polish",
"stringsFile": "polish.json",
"isoCode": "pl",
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444"
},
{
"id": 3,
"englishName": "Spanish",
"stringsFile": "spanish.json",
"isoCode": "es",
"flagImageFile": "es.png",
"countries": ["es", "ar", "bo", "cl", "co", "cr", "do", "ec", "sv", "gt", "hn", "mx", "ni", "pa", "py", "pe", "pr", "uy", "ve"],
"requiresUnicode": false,
"contributor": "PerikiyoXD"
},
{
"id": 4,
"englishName": "Chinese",
"stringsFile": "chinese.json",
"isoCode": "zh",
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone"
},
{
"id": 5,
"englishName": "Arabic",
"stringsFile": "arabic.json",
"isoCode": "ar",
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR"
},
{
"id": 6,
"englishName": "Slovak",
"stringsFile": "slovak.json",
"isoCode": "sk",
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS"
},
{
"id": 7,
"englishName": "German",
"stringsFile": "german.json",
"isoCode": "de",
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo"
},
{
"id": 8,
"englishName": "French",
"stringsFile": "french.json",
"isoCode": "fr",
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam"
},
{
"id": 9,
"englishName": "Japanese",
"stringsFile": "japanese.json",
"isoCode": "jp",
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam"
},
{
"id": 10,
"englishName": "Finnish",
"stringsFile": "finnish.json",
"isoCode": "fi",
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW"
}
]

View File

@@ -1,8 +0,0 @@
{
"host": "localhost",
"user": "",
"pass": "",
"name": "",
"port": 3306,
"usePersistentConnection": true
}

13
config/discord.json Normal file
View File

@@ -0,0 +1,13 @@
{
"sendChat": false,
"sendEvents": false,
"sendConnectEvents": false,
"sendVehicleEvents": false,
"sendDeathEvents": false,
"sendAdmin": false,
"webhook": {
"enabled": false,
"webhookBaseURL": "http://127.0.0.1:8090/discord.php?message={0}&server={1}&type={2}&pass={3}",
"pass": "LWb7T3ZyCam7Nzen"
}
}

View File

@@ -1,22 +0,0 @@
{
"enabled": "false",
"smtp": {
"host":"",
"port":"",
"username":"",
"password":"",
"from":"",
"fromName":"",
"useTLS":"true"
},
"bodyContent": {
"confirmEmail": "Welcome to {SERVERNAME}!\nPlease confirm your email by using the command /verifyemail in-game.\n\nYour verification code is: {VERIFICATIONCODE}",
"emailConfirmed": "Your email has been confirmed on {SERVERNAME}!\nYou may now use this email to reset your password, require two-factor authentication on login, receive offline notifications, and more!",
"twoFactorAuthentication": "Please enter the following code to continue on {SERVERNAME} for {GAMENAME}: {2FACODE}",
"accountAuthSuccessAlert": "You or someone else has successfully logged in to your account on {SERVERNAME} for {GAMENAME}.\n\nIP Address: {IPADDRESS}\nLocation: {LOCATION}\nTimestamp: {TIMESTAMP}\n\nIf you have two-factor authentication enabled (Using /2fa in-game), your account can't be accessed unless a correct 2FA code is entered.",
"accountAuthFailAlert": "You or someone else has failed to login to your account on {SERVERNAME} for {GAMENAME}.\nIP Address: {IPADDRESS}\nLocation: {LOCATION}\nTimestamp: {TIMESTAMP}",
"offlineMessageAlert": "You have received a private message on {SERVERNAME} for {GAMENAME}. \nYou are receiving this notification because you enabled email message notifications when you're not connected to the server.\nFrom: {FROMNAME}\nTimestamp: {TIMESTAMP}\nMessage: {MESSAGE}",
"confirmPasswordReset": "You (or someone else) requested to reset your password on {SERVERNAME}!\nPlease confirm this request by entering the code below into the password reset window in-game.\n\nYour verification code is: {VERIFICATIONCODE}\n\n\nIf you did not request a password reset, then there's nothing to worry about since your password can only be reset with the code above.",
"passwordChanged": "Your password on {SERVERNAME} has been changed successfully!"
}
}

View File

@@ -1,10 +1,117 @@
{
"apiEmail": "example@example.com",
"defaultLanguage": "en",
"defaultLanguageId": 0,
"translateURL": "http://api.mymemory.translated.net/get?de={3}&q={0}&langpair={1}|{2}",
"locales": [
["English", "english", "en"],
["Russian", "russian", "ru"],
["Polish", "polish", "pl"],
["Spanish", "spanish", "es"]
{
"id": 0,
"englishName": "English",
"stringsFile": "english.json",
"isoCode": "en",
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex"
},
{
"id": 1,
"englishName": "Russian",
"stringsFile": "russian.json",
"isoCode": "ru",
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS"
},
{
"id": 2,
"englishName": "Polish",
"stringsFile": "polish.json",
"isoCode": "pl",
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444"
},
{
"id": 3,
"englishName": "Spanish",
"stringsFile": "spanish.json",
"isoCode": "es",
"flagImageFile": "es.png",
"countries": ["es", "ar", "bo", "cl", "co", "cr", "do", "ec", "sv", "gt", "hn", "mx", "ni", "pa", "py", "pe", "pr", "uy", "ve"],
"requiresUnicode": false,
"contributor": "PerikiyoXD"
},
{
"id": 4,
"englishName": "Chinese",
"stringsFile": "chinese.json",
"isoCode": "zh",
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone"
},
{
"id": 5,
"englishName": "Arabic",
"stringsFile": "arabic.json",
"isoCode": "ar",
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR"
},
{
"id": 6,
"englishName": "Slovak",
"stringsFile": "slovak.json",
"isoCode": "sk",
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS"
},
{
"id": 7,
"englishName": "German",
"stringsFile": "german.json",
"isoCode": "de",
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo"
},
{
"id": 8,
"englishName": "French",
"stringsFile": "french.json",
"isoCode": "fr",
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam"
},
{
"id": 9,
"englishName": "Japanese",
"stringsFile": "japanese.json",
"isoCode": "jp",
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam"
},
{
"id": 10,
"englishName": "Finnish",
"stringsFile": "finnish.json",
"isoCode": "fi",
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW"
}
]
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" ?>
<Commands>
<Command Name="gamestats" Hash="3782704029" />
<Command Name="say" Hash="4241071205" />
<Command Name="exit" Hash="2483651598" />
<Command Name="quit" Hash="1135269781" />
<Command Name="clear" Hash="3853644038" />
<Command Name="connect" Hash="1959786783" />
<Command Name="reconnect" Hash="1240758083" />
<Command Name="console" Hash="906219446" />
<Command Name="cvar" Hash="2588334565" />
<Command Name="netstats" Hash="2015089090" />
<Command Name="q" Hash="4110462503" />
<Command Name="disconnect" Hash="3820433" />
<Command Name="fpscounter" Hash="2973827809" />
<Command Name="dumpdoc" Hash="3404143852" />
<Command Name="chatscale" Hash="402639070" />
</Commands>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,95 @@
<?xml version="1.0" ?>
<EventTypes>
<!---->
<EventType Name="OnLocalPlayerEnterSphere" Hash="3890156725" Arguments="1" CanPreventDefault="false" />
<!--**UNUSED**-->
<EventType Name="OnBeforeProcessCamera" Hash="1763657124" Arguments="0" CanPreventDefault="false" />
<!--Called right before the hud is drawn, you should draw your HUD here if you want it under the hud-->
<EventType Name="OnDrawHUD" Hash="2504546524" Arguments="0" CanPreventDefault="true" />
<!--Called when a mouse moves-->
<EventType Name="OnMouseMove" Hash="1865196431" Arguments="3" CanPreventDefault="false" />
<!--Called before the hud is drawn-->
<EventType Name="OnBeforeDrawHUD" Hash="3008683449" Arguments="0" CanPreventDefault="true" />
<!--Called when a keyboard key is down-->
<EventType Name="OnKeyDown" Hash="3091440445" Arguments="3" CanPreventDefault="false" />
<!--Called when a resource starts-->
<EventType Name="OnResourceStart" Hash="1143708828" Arguments="1" CanPreventDefault="true" />
<!--Called when an element is about to stream in-->
<EventType Name="OnElementStreamIn" Hash="2759455221" Arguments="2" CanPreventDefault="true" />
<!--Called when a resource stops-->
<EventType Name="OnResourceStop" Hash="1347867548" Arguments="2" CanPreventDefault="true" />
<!--Called after all the hud is drawn, you should draw your HUD here if you want it over the hud-->
<EventType Name="OnDrawnHUD" Hash="1969344644" Arguments="0" CanPreventDefault="false" />
<!--Called after OnRender2D, usually post processing would be done here-->
<EventType Name="OnPostRender2D" Hash="1025891209" Arguments="0" CanPreventDefault="false" />
<!--Called when all the files are downloaded-->
<EventType Name="OnResourceReady" Hash="4089924796" Arguments="1" CanPreventDefault="false" />
<!--Called whenever an entity is processed-->
<EventType Name="OnEntityProcess" Hash="850679850" Arguments="1" CanPreventDefault="true" />
<!--Called when a ped is created/spawned-->
<EventType Name="OnPedSpawn" Hash="3880839897" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped finished dying or is instantly killed-->
<EventType Name="OnPedDead" Hash="3023102245" Arguments="1" CanPreventDefault="false" />
<!--Called when the camera is about to be processed-->
<EventType Name="OnCameraProcess" Hash="4077277522" Arguments="0" CanPreventDefault="true" />
<!--Called when a ped is damaged-->
<EventType Name="OnPedInflictDamage" Hash="1391854299" Arguments="5" CanPreventDefault="true" />
<!--Called when a ped dies-->
<EventType Name="OnPedWasted" Hash="3129373940" Arguments="4" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerExitSphere" Hash="105319985" Arguments="1" CanPreventDefault="false" />
<!--Called when a GUIElement is clicked on-->
<EventType Name="OnGUIClick" Hash="1620463676" Arguments="1" CanPreventDefault="false" />
<!--Called when dodo flight time ends-->
<EventType Name="OnRegisterDodoFlightTime" Hash="3998584707" Arguments="1" CanPreventDefault="true" />
<!--Called when an element is about to be destroyed-->
<EventType Name="OnElementDestroy" Hash="696839637" Arguments="1" CanPreventDefault="true" />
<!--Called when anchor tags are clicked in a GUIHtmlView-->
<EventType Name="OnGUIAnchorClick" Hash="1882824246" Arguments="3" CanPreventDefault="true" />
<!--Called when the mouse leaves the window-->
<EventType Name="OnMouseLeave" Hash="3102340603" Arguments="0" CanPreventDefault="false" />
<!--Called when a cursor button is up-->
<EventType Name="OnCursorUp" Hash="2031527000" Arguments="1" CanPreventDefault="false" />
<!--Called every process-->
<EventType Name="OnProcess" Hash="3150131130" Arguments="1" CanPreventDefault="false" />
<!--Called every prerender-->
<EventType Name="OnPreRender" Hash="2235820386" Arguments="0" CanPreventDefault="false" />
<!--Called every render-->
<EventType Name="OnRender" Hash="2466144783" Arguments="0" CanPreventDefault="false" />
<!--Called when 2D shit should be rendered-->
<EventType Name="OnRender2D" Hash="3260181898" Arguments="0" CanPreventDefault="false" />
<!--Called when a line will be output to the chatbox-->
<EventType Name="OnChatOutput" Hash="2275472839" Arguments="2" CanPreventDefault="true" />
<!--Called when a mouse button is down-->
<EventType Name="OnMouseDown" Hash="2632778956" Arguments="2" CanPreventDefault="false" />
<!--Called when a mouse button is up-->
<EventType Name="OnMouseUp" Hash="3080252785" Arguments="2" CanPreventDefault="false" />
<!--Called when a cursor button is down-->
<EventType Name="OnCursorDown" Hash="3618352285" Arguments="1" CanPreventDefault="false" />
<!--Called when the cursor moves-->
<EventType Name="OnCursorMove" Hash="610929630" Arguments="1" CanPreventDefault="false" />
<!--Called when the mouse scrolls-->
<EventType Name="OnMouseWheel" Hash="1116330591" Arguments="3" CanPreventDefault="false" />
<!--Called when a mouse is connected-->
<EventType Name="OnMouseConnected" Hash="4137684318" Arguments="1" CanPreventDefault="false" />
<!--Called when a mouse is disconnected-->
<EventType Name="OnMouseDisconnected" Hash="2332645211" Arguments="1" CanPreventDefault="false" />
<!--Called when the window is focused-->
<EventType Name="OnFocus" Hash="1989030060" Arguments="0" CanPreventDefault="false" />
<!--Called when the window is defocused-->
<EventType Name="OnLostFocus" Hash="1036525539" Arguments="0" CanPreventDefault="false" />
<!--Called when a keyboard key is up-->
<EventType Name="OnKeyUp" Hash="1763402597" Arguments="3" CanPreventDefault="false" />
<!--Called when a key is typed-->
<EventType Name="OnCharacter" Hash="318128971" Arguments="1" CanPreventDefault="false" />
<!--Called when an element is about to stream out-->
<EventType Name="OnElementStreamOut" Hash="3852636898" Arguments="2" CanPreventDefault="true" />
<!--Called when disconnected from the server-->
<EventType Name="OnDisconnect" Hash="3221334991" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerEnteredVehicle" Hash="3395021369" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerExitedVehicle" Hash="1654569001" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerSwitchWeapon" Hash="3670373318" Arguments="2" CanPreventDefault="false" />
</EventTypes>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" ?>
<Commands>
<Command Name="dumpdoc" Hash="3404143852" />
<Command Name="refresh" Hash="1619108091" />
<Command Name="restart" Hash="3891864071" />
<Command Name="stop" Hash="3109426870" />
<Command Name="cmd" Hash="794565824" />
<Command Name="start" Hash="2675529103" />
<Command Name="stopall" Hash="1683731152" />
<Command Name="exit" Hash="2483651598" />
<Command Name="quit" Hash="1135269781" />
<Command Name="help" Hash="143088812" />
<Command Name="say" Hash="4241071205" />
</Commands>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,439 @@
<?xml version="1.0" ?>
<Documentation>
<!--
Mask Values
b - bool
i - int32
f - float
s - string
c - function/callback
x - class/instance
z - vector2D
v - vector3D
t - thiscall
| - optional arguments
* - infinite arguments
. - any type
-->
<Namespace Name="global">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="thisResource" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localClient" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localPlayer" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="toColour" Mask="iii|i" RequiredArguments="3" Obsolete="false" />
<Function Name="collectAllGarbage" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="inPoly" Mask="z*" RequiredArguments="1" Obsolete="false" />
<Function Name="addEvent" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="addEventHandler" Mask="sf" RequiredArguments="2" Obsolete="false" />
<Function Name="removeEventHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="bindEventHandler" Mask="sxf" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindEventHandler" Mask="sx" RequiredArguments="2" Obsolete="false" />
<Function Name="triggerEvent" Mask="s|x*" RequiredArguments="1" Obsolete="false" />
<Function Name="addCommandHandler" Mask="sc|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeCommandHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="consoleCommand" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="setTimeout" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setInterval" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setImmediate" Mask="c*" RequiredArguments="1" Obsolete="false" />
<Function Name="clearTimeout" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearInterval" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearImmediate" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="bindKey" Mask="iic" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindKey" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="unbindAllKeys" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="findResourceByName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="getResources" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="exportFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="openFile" Mask="s|b" RequiredArguments="1" Obsolete="false" />
<Function Name="createFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="loadTextFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="saveTextFile" Mask="ss" RequiredArguments="2" Obsolete="false" />
<Function Name="addNetworkHandler" Mask="sc" RequiredArguments="2" Obsolete="false" />
<Function Name="removeNetworkHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="httpGet" Mask="sscc" RequiredArguments="4" Obsolete="false" />
<Function Name="message" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="messageClient" Mask="sx|i" RequiredArguments="2" Obsolete="false" />
<Function Name="messageAllExcept" Mask="sx|i" RequiredArguments="2" Obsolete="false" />
<Function Name="getConsole" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClients" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClient" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="destroyElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getClientFromPlayerElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementsByType" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromId" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="addToWorld" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="triggerNetworkEvent" Mask="sx*" RequiredArguments="2" Obsolete="false" />
<Function Name="fadeCamera" Mask="xb|fi" RequiredArguments="2" Obsolete="false" />
<Function Name="spawnPlayer" Mask="xv|fiii" RequiredArguments="2" Obsolete="false" />
<Class Name="Stream">
<Property Name="length" ReadOnly="true" Obsolete="false" Type="int64" />
<Property Name="position" ReadOnly="true" Obsolete="false" Type="int64" />
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readBytes" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="readString" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="true" />
<Function Name="writeBytes" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="writeString" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="readInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readFloat" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readDouble" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="writeInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeFloat" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="writeDouble" Mask="tf" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="TextReader">
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="loadText" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readCharacter" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Matrix4x4">
<Property Name="m11" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m12" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m13" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m14" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m21" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m22" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m23" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m24" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m31" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m32" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m33" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m34" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m41" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m42" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m43" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m44" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="setIdentity" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setTranslate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setScale" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateX" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateY" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateZ" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setMultiply" Mask="txx*" RequiredArguments="2" Obsolete="false" />
<Function Name="multiply" Mask="tx*" RequiredArguments="1" Obsolete="false" />
<Function Name="setInverse" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="transformCoordinate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="getElement" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="setElement" Mask="tif" RequiredArguments="2" Obsolete="false" />
<Function Name="getVector3" Mask="ti" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Vec2">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="interpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Vec3">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="z" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="length" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="squaredLength" ReadOnly="true" Obsolete="false" Type="number" />
<Function Name="distance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="squaredDistance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="dotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="absDotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="normalise" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="crossProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="midPoint" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="addSpherical" Mask="tfff" RequiredArguments="3" Obsolete="false" />
<Function Name="interpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="cartesianToSpherical" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Event">
<Class Name="CancellableEvent">
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
<Class Name="Timer" />
<Class Name="KeyEvent">
<Property Name="keyCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="scanCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="mod" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="repeat" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="down" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="XmlElement">
<Property Name="childrenCount" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="parent" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="text" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="attributes" ReadOnly="true" Obsolete="false" />
<Function Name="clear" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getStringAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getBoolAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getIntegerAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getFloatAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="XmlDocument">
<Property Name="rootElement" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="load" Mask="tx" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Resource">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="isStarted" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isStarting" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="exports" ReadOnly="true" Obsolete="false" />
<Function Name="start" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="stop" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="restart" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getExport" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Client">
<Property Name="index" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="gameVersion" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="player" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="administrator" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="console" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="ip" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ping" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="despawnPlayer" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="disconnect" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Element">
<Property Name="id" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="type" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="isLocal" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isSyncer" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isOwner" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="syncer" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="owner" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="dimension" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="onAllDimensions" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="parent" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="resource" ReadOnly="false" Obsolete="false" Type="Object" />
<Function Name="isType" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setSyncer" Mask="ti|b" RequiredArguments="1" Obsolete="false" />
<Class Name="Transformable">
<Property Name="position" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="streamInDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="streamOutDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="getRotation" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setRotation" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Class Name="Entity">
<Property Name="modelIndex" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="interior" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="matrix" ReadOnly="false" Obsolete="false" Type="Matrix4x4" />
<Property Name="heading" ReadOnly="false" Obsolete="false" Type="number" />
<Class Name="Physical">
<Property Name="velocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="turnVelocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Class Name="Ped">
<Property Name="vehicle" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="seat" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="health" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="armour" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="weapon" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="weaponAmmunition" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="weaponClipAmmunition" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="weaponState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="isEnteringVehicle" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isExitingVehicle" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="warpIntoVehicle" Mask="txi" RequiredArguments="2" Obsolete="false" />
<Class Name="Player" />
</Class>
<Class Name="Vehicle">
<Property Name="locked" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="carLock" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="engine" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="colour1" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="colour2" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="colour3" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="colour4" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="strongGrip" ReadOnly="false" Obsolete="false" Type="bool" />
<Function Name="setColours" Mask="tii" RequiredArguments="2" Obsolete="false" />
<Function Name="setRGBColours" Mask="tii" RequiredArguments="2" Obsolete="false" />
<Function Name="randomiseColours" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="fix" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getOccupant" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getOccupants" Mask="t" RequiredArguments="0" Obsolete="false" />
<Class Name="Train">
<Property Name="track" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="trackPosition" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="speed" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="derailed" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="headlights" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="taillights" ReadOnly="false" Obsolete="false" Type="bool" />
</Class>
</Class>
<Class Name="Object" />
</Class>
<Class Name="Building" />
</Class>
<Class Name="Blip" />
<Class Name="Pickup" />
<Class Name="Marker" />
<Class Name="CarGenerator" />
</Class>
</Class>
<Namespace Name="reflection">
<Function Name="clone" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="move" Mask="xx" RequiredArguments="2" Obsolete="false" />
<Function Name="tostring" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="createFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="call" Mask="x" RequiredArguments="1" Obsolete="false" />
<Class Name="Function" />
</Namespace>
<Namespace Name="module">
<Namespace Name="hashing">
<Function Name="encodeBase64" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="decodeBase64" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="md5" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha1" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha224" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha256" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha384" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha512" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd128" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd160" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd256" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd320" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="whirlpool" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="geoip">
<Function Name="getCountryName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCountryISO" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getContinentName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getContinentCode" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCityName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getPostalCode" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getSubdivisionName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getSubdivisionISO" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getTimeZoneName" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="mysql">
<Function Name="connect" Mask="" RequiredArguments="0" Obsolete="false" />
<Class Name="Connection">
<Property Name="ping" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="insertId" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="affectedRows" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="warningCount" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="errorNum" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="error" ReadOnly="true" Obsolete="false" Type="void" />
<Function Name="query" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="close" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="escapeString" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="selectDatabase" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="changeUser" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="info" Mask="" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Result">
<Property Name="numRows" ReadOnly="true" Obsolete="false" Type="void" />
<Function Name="free" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchAssoc" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchAssoc" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchRow" Mask="" RequiredArguments="0" Obsolete="false" />
</Class>
</Namespace>
<Namespace Name="smtp">
<Function Name="send" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
</Namespace>
<Namespace Name="sdl">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="getModState" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="platform">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="modState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
</Namespace>
<Namespace Name="server">
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="gameMode" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="port" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="maxClients" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="rcon" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="rconPort" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="listed" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="httpServer" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="httpPort" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="minClientVersion" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="syncInterval" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="syncMethod" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="duplicateNames" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="streamInDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="streamOutDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="pickupStreamInDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="pickupStreamOutDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="logPath" ReadOnly="true" Obsolete="false" Type="string" />
<Function Name="setRule" Mask="ss" RequiredArguments="2" Obsolete="false" />
<Function Name="getRule" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="banIP" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="unbanIP" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="unbanAllIPs" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="isIPBanned" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="shutdown" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCVar" Mask="s" RequiredArguments="1" Obsolete="false" />
</Namespace>
<Namespace Name="gta">
<Property Name="weather" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="ssvBridgeEnabled" ReadOnly="false" Obsolete="false" Type="bool" />
<Function Name="forceWeather" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="createVehicle" Mask="i|v" RequiredArguments="1" Obsolete="false" />
<Function Name="createBlipAttachedTo" Mask="xi|iibb" RequiredArguments="2" Obsolete="false" />
<Function Name="createBuilding" Mask="i|v" RequiredArguments="1" Obsolete="false" />
<Function Name="createObject" Mask="i|v" RequiredArguments="1" Obsolete="false" />
<Function Name="createBlip" Mask="iv|ii" RequiredArguments="2" Obsolete="false" />
<Function Name="createPickup" Mask="i|vi" RequiredArguments="1" Obsolete="false" />
<Function Name="createSphere" Mask="v|f" RequiredArguments="1" Obsolete="false" />
<Function Name="createPlayer" Mask="i|v" RequiredArguments="1" Obsolete="false" />
<Function Name="createCivilian" Mask="i|v" RequiredArguments="1" Obsolete="false" />
<Function Name="hostSession" Mask="xii" RequiredArguments="3" Obsolete="false" />
<Function Name="joinSession" Mask="xx" RequiredArguments="2" Obsolete="false" />
<Class Name="World" />
<Namespace Name="time">
<Property Name="minuteDuration" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="hour" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="minute" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="second" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="day" ReadOnly="false" Obsolete="false" Type="number" />
</Namespace>
</Namespace>
</Namespace>
</Documentation>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" ?>
<EventTypes>
<!--Called when a pickup is collected-->
<EventType Name="OnPickupCollected" Hash="4105239817" Arguments="2" CanPreventDefault="false" />
<!--Called when a ped starts uncrouching-->
<EventType Name="OnPedUncrouch" Hash="561660263" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped starts jumping-->
<EventType Name="OnPedJump" Hash="4272336407" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped starts falling to floor-->
<EventType Name="OnPedFall" Hash="2722461453" Arguments="4" CanPreventDefault="false" />
<!--Called when a ped starts crouching-->
<EventType Name="OnPedCrouch" Hash="1096855702" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped is spawned.-->
<EventType Name="OnPedSpawn" Hash="3880839897" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped is wasted (from attacker client).-->
<EventType Name="OnWastePed" Hash="1462492871" Arguments="4" CanPreventDefault="false" />
<!--Called when a ped is exiting a vehicle.-->
<EventType Name="OnPedExitVehicle" Hash="3163626874" Arguments="2" CanPreventDefault="false" />
<!--Called when a resource starts-->
<EventType Name="OnResourceStart" Hash="1143708828" Arguments="1" CanPreventDefault="true" />
<!--Called when a player types a command-->
<EventType Name="OnPlayerCommand" Hash="1638826555" Arguments="3" CanPreventDefault="true" />
<!--Called every process-->
<EventType Name="OnProcess" Hash="3150131130" Arguments="1" CanPreventDefault="false" />
<!--Called when a resource stops-->
<EventType Name="OnResourceStop" Hash="1347867548" Arguments="2" CanPreventDefault="true" />
<!--Called when an element is about to stream in-->
<EventType Name="OnElementStreamIn" Hash="2759455221" Arguments="2" CanPreventDefault="true" />
<!--Called when a player has connected and is joining-->
<EventType Name="OnPlayerJoin" Hash="3624951888" Arguments="1" CanPreventDefault="false" />
<!--Called when the player has joined the game-->
<EventType Name="OnPlayerJoined" Hash="3833973824" Arguments="1" CanPreventDefault="false" />
<!--Called when a player disconnects-->
<EventType Name="OnPlayerQuit" Hash="3017502482" Arguments="2" CanPreventDefault="false" />
<!--Called when a player is attempting to connect-->
<EventType Name="OnPlayerConnect" Hash="2611712496" Arguments="1" CanPreventDefault="true" />
<!--Called when the server finished the start sequence-->
<EventType Name="OnServerStart" Hash="3318682471" Arguments="0" CanPreventDefault="false" />
<!--Called when a player chats-->
<EventType Name="OnPlayerChat" Hash="2515290669" Arguments="2" CanPreventDefault="true" />
<!--Called when an element is about to be destroyed-->
<EventType Name="OnElementDestroy" Hash="696839637" Arguments="1" CanPreventDefault="true" />
<!--Called when a ped is wasted.-->
<EventType Name="OnPedWasted" Hash="3129373940" Arguments="4" CanPreventDefault="false" />
<!--Called when a ped is entering a vehicle.-->
<EventType Name="OnPedEnterVehicle" Hash="2529136464" Arguments="3" CanPreventDefault="false" />
</EventTypes>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" ?>
<Commands>
<Command Name="gamestats" Hash="3782704029" />
<Command Name="say" Hash="4241071205" />
<Command Name="exit" Hash="2483651598" />
<Command Name="quit" Hash="1135269781" />
<Command Name="clear" Hash="3853644038" />
<Command Name="connect" Hash="1959786783" />
<Command Name="reconnect" Hash="1240758083" />
<Command Name="console" Hash="906219446" />
<Command Name="cvar" Hash="2588334565" />
<Command Name="q" Hash="4110462503" />
<Command Name="disconnect" Hash="3820433" />
<Command Name="fpscounter" Hash="2973827809" />
<Command Name="dumpdoc" Hash="3404143852" />
<Command Name="chatscale" Hash="402639070" />
<Command Name="help" Hash="143088812" />
</Commands>

View File

@@ -0,0 +1,577 @@
<?xml version="1.0" ?>
<Defines>
<Define Name="KEYSTATE_UP" Value="0" />
<Define Name="KEYSTATE_DOWN" Value="1" />
<Define Name="KEYSTATE_BOTH" Value="2" />
<Define Name="SDL_SCANCODE_UNKNOWN" Value="0" />
<Define Name="SDL_SCANCODE_A" Value="4" />
<Define Name="SDL_SCANCODE_B" Value="5" />
<Define Name="SDL_SCANCODE_C" Value="6" />
<Define Name="SDL_SCANCODE_D" Value="7" />
<Define Name="SDL_SCANCODE_E" Value="8" />
<Define Name="SDL_SCANCODE_F" Value="9" />
<Define Name="SDL_SCANCODE_G" Value="10" />
<Define Name="SDL_SCANCODE_H" Value="11" />
<Define Name="SDL_SCANCODE_I" Value="12" />
<Define Name="SDL_SCANCODE_J" Value="13" />
<Define Name="SDL_SCANCODE_K" Value="14" />
<Define Name="SDL_SCANCODE_L" Value="15" />
<Define Name="SDL_SCANCODE_M" Value="16" />
<Define Name="SDL_SCANCODE_N" Value="17" />
<Define Name="SDL_SCANCODE_O" Value="18" />
<Define Name="SDL_SCANCODE_P" Value="19" />
<Define Name="SDL_SCANCODE_Q" Value="20" />
<Define Name="SDL_SCANCODE_R" Value="21" />
<Define Name="SDL_SCANCODE_S" Value="22" />
<Define Name="SDL_SCANCODE_T" Value="23" />
<Define Name="SDL_SCANCODE_U" Value="24" />
<Define Name="SDL_SCANCODE_V" Value="25" />
<Define Name="SDL_SCANCODE_W" Value="26" />
<Define Name="SDL_SCANCODE_X" Value="27" />
<Define Name="SDL_SCANCODE_Y" Value="28" />
<Define Name="SDL_SCANCODE_Z" Value="29" />
<Define Name="SDL_SCANCODE_1" Value="30" />
<Define Name="SDL_SCANCODE_2" Value="31" />
<Define Name="SDL_SCANCODE_3" Value="32" />
<Define Name="SDL_SCANCODE_4" Value="33" />
<Define Name="SDL_SCANCODE_5" Value="34" />
<Define Name="SDL_SCANCODE_6" Value="35" />
<Define Name="SDL_SCANCODE_7" Value="36" />
<Define Name="SDL_SCANCODE_8" Value="37" />
<Define Name="SDL_SCANCODE_9" Value="38" />
<Define Name="SDL_SCANCODE_0" Value="39" />
<Define Name="SDL_SCANCODE_RETURN" Value="40" />
<Define Name="SDL_SCANCODE_ESCAPE" Value="41" />
<Define Name="SDL_SCANCODE_BACKSPACE" Value="42" />
<Define Name="SDL_SCANCODE_TAB" Value="43" />
<Define Name="SDL_SCANCODE_SPACE" Value="44" />
<Define Name="SDL_SCANCODE_MINUS" Value="45" />
<Define Name="SDL_SCANCODE_EQUALS" Value="46" />
<Define Name="SDL_SCANCODE_LEFTBRACKET" Value="47" />
<Define Name="SDL_SCANCODE_RIGHTBRACKET" Value="48" />
<Define Name="SDL_SCANCODE_BACKSLASH" Value="49" />
<Define Name="SDL_SCANCODE_NONUSHASH" Value="50" />
<Define Name="SDL_SCANCODE_SEMICOLON" Value="51" />
<Define Name="SDL_SCANCODE_APOSTROPHE" Value="52" />
<Define Name="SDL_SCANCODE_GRAVE" Value="53" />
<Define Name="SDL_SCANCODE_COMMA" Value="54" />
<Define Name="SDL_SCANCODE_PERIOD" Value="55" />
<Define Name="SDL_SCANCODE_SLASH" Value="56" />
<Define Name="SDL_SCANCODE_CAPSLOCK" Value="57" />
<Define Name="SDL_SCANCODE_F1" Value="58" />
<Define Name="SDL_SCANCODE_F2" Value="59" />
<Define Name="SDL_SCANCODE_F3" Value="60" />
<Define Name="SDL_SCANCODE_F4" Value="61" />
<Define Name="SDL_SCANCODE_F5" Value="62" />
<Define Name="SDL_SCANCODE_F6" Value="63" />
<Define Name="SDL_SCANCODE_F7" Value="64" />
<Define Name="SDL_SCANCODE_F8" Value="65" />
<Define Name="SDL_SCANCODE_F9" Value="66" />
<Define Name="SDL_SCANCODE_F10" Value="67" />
<Define Name="SDL_SCANCODE_F11" Value="68" />
<Define Name="SDL_SCANCODE_F12" Value="69" />
<Define Name="SDL_SCANCODE_PRINTSCREEN" Value="70" />
<Define Name="SDL_SCANCODE_SCROLLLOCK" Value="71" />
<Define Name="SDL_SCANCODE_PAUSE" Value="72" />
<Define Name="SDL_SCANCODE_INSERT" Value="73" />
<Define Name="SDL_SCANCODE_HOME" Value="74" />
<Define Name="SDL_SCANCODE_PAGEUP" Value="75" />
<Define Name="SDL_SCANCODE_DELETE" Value="76" />
<Define Name="SDL_SCANCODE_END" Value="77" />
<Define Name="SDL_SCANCODE_PAGEDOWN" Value="78" />
<Define Name="SDL_SCANCODE_RIGHT" Value="79" />
<Define Name="SDL_SCANCODE_LEFT" Value="80" />
<Define Name="SDL_SCANCODE_DOWN" Value="81" />
<Define Name="SDL_SCANCODE_UP" Value="82" />
<Define Name="SDL_SCANCODE_NUMLOCKCLEAR" Value="83" />
<Define Name="SDL_SCANCODE_KP_DIVIDE" Value="84" />
<Define Name="SDL_SCANCODE_KP_MULTIPLY" Value="85" />
<Define Name="SDL_SCANCODE_KP_MINUS" Value="86" />
<Define Name="SDL_SCANCODE_KP_PLUS" Value="87" />
<Define Name="SDL_SCANCODE_KP_ENTER" Value="88" />
<Define Name="SDL_SCANCODE_KP_1" Value="89" />
<Define Name="SDL_SCANCODE_KP_2" Value="90" />
<Define Name="SDL_SCANCODE_KP_3" Value="91" />
<Define Name="SDL_SCANCODE_KP_4" Value="92" />
<Define Name="SDL_SCANCODE_KP_5" Value="93" />
<Define Name="SDL_SCANCODE_KP_6" Value="94" />
<Define Name="SDL_SCANCODE_KP_7" Value="95" />
<Define Name="SDL_SCANCODE_KP_8" Value="96" />
<Define Name="SDL_SCANCODE_KP_9" Value="97" />
<Define Name="SDL_SCANCODE_KP_0" Value="98" />
<Define Name="SDL_SCANCODE_KP_PERIOD" Value="99" />
<Define Name="SDL_SCANCODE_NONUSBACKSLASH" Value="100" />
<Define Name="SDL_SCANCODE_APPLICATION" Value="101" />
<Define Name="SDL_SCANCODE_POWER" Value="102" />
<Define Name="SDL_SCANCODE_KP_EQUALS" Value="103" />
<Define Name="SDL_SCANCODE_F13" Value="104" />
<Define Name="SDL_SCANCODE_F14" Value="105" />
<Define Name="SDL_SCANCODE_F15" Value="106" />
<Define Name="SDL_SCANCODE_F16" Value="107" />
<Define Name="SDL_SCANCODE_F17" Value="108" />
<Define Name="SDL_SCANCODE_F18" Value="109" />
<Define Name="SDL_SCANCODE_F19" Value="110" />
<Define Name="SDL_SCANCODE_F20" Value="111" />
<Define Name="SDL_SCANCODE_F21" Value="112" />
<Define Name="SDL_SCANCODE_F22" Value="113" />
<Define Name="SDL_SCANCODE_F23" Value="114" />
<Define Name="SDL_SCANCODE_F24" Value="115" />
<Define Name="SDL_SCANCODE_EXECUTE" Value="116" />
<Define Name="SDL_SCANCODE_HELP" Value="117" />
<Define Name="SDL_SCANCODE_MENU" Value="118" />
<Define Name="SDL_SCANCODE_SELECT" Value="119" />
<Define Name="SDL_SCANCODE_STOP" Value="120" />
<Define Name="SDL_SCANCODE_AGAIN" Value="121" />
<Define Name="SDL_SCANCODE_UNDO" Value="122" />
<Define Name="SDL_SCANCODE_CUT" Value="123" />
<Define Name="SDL_SCANCODE_COPY" Value="124" />
<Define Name="SDL_SCANCODE_PASTE" Value="125" />
<Define Name="SDL_SCANCODE_FIND" Value="126" />
<Define Name="SDL_SCANCODE_MUTE" Value="127" />
<Define Name="SDL_SCANCODE_VOLUMEUP" Value="128" />
<Define Name="SDL_SCANCODE_VOLUMEDOWN" Value="129" />
<Define Name="SDL_SCANCODE_KP_COMMA" Value="133" />
<Define Name="SDL_SCANCODE_KP_EQUALSAS400" Value="134" />
<Define Name="SDL_SCANCODE_INTERNATIONAL1" Value="135" />
<Define Name="SDL_SCANCODE_INTERNATIONAL2" Value="136" />
<Define Name="SDL_SCANCODE_INTERNATIONAL3" Value="137" />
<Define Name="SDL_SCANCODE_INTERNATIONAL4" Value="138" />
<Define Name="SDL_SCANCODE_INTERNATIONAL5" Value="139" />
<Define Name="SDL_SCANCODE_INTERNATIONAL6" Value="140" />
<Define Name="SDL_SCANCODE_INTERNATIONAL7" Value="141" />
<Define Name="SDL_SCANCODE_INTERNATIONAL8" Value="142" />
<Define Name="SDL_SCANCODE_INTERNATIONAL9" Value="143" />
<Define Name="SDL_SCANCODE_LANG1" Value="144" />
<Define Name="SDL_SCANCODE_LANG2" Value="145" />
<Define Name="SDL_SCANCODE_LANG3" Value="146" />
<Define Name="SDL_SCANCODE_LANG4" Value="147" />
<Define Name="SDL_SCANCODE_LANG5" Value="148" />
<Define Name="SDL_SCANCODE_LANG6" Value="149" />
<Define Name="SDL_SCANCODE_LANG7" Value="150" />
<Define Name="SDL_SCANCODE_LANG8" Value="151" />
<Define Name="SDL_SCANCODE_LANG9" Value="152" />
<Define Name="SDL_SCANCODE_ALTERASE" Value="153" />
<Define Name="SDL_SCANCODE_SYSREQ" Value="154" />
<Define Name="SDL_SCANCODE_CANCEL" Value="155" />
<Define Name="SDL_SCANCODE_CLEAR" Value="156" />
<Define Name="SDL_SCANCODE_PRIOR" Value="157" />
<Define Name="SDL_SCANCODE_RETURN2" Value="158" />
<Define Name="SDL_SCANCODE_SEPARATOR" Value="159" />
<Define Name="SDL_SCANCODE_OUT" Value="160" />
<Define Name="SDL_SCANCODE_OPER" Value="161" />
<Define Name="SDL_SCANCODE_CLEARAGAIN" Value="162" />
<Define Name="SDL_SCANCODE_CRSEL" Value="163" />
<Define Name="SDL_SCANCODE_EXSEL" Value="164" />
<Define Name="SDL_SCANCODE_KP_00" Value="176" />
<Define Name="SDL_SCANCODE_KP_000" Value="177" />
<Define Name="SDL_SCANCODE_THOUSANDSSEPARATOR" Value="178" />
<Define Name="SDL_SCANCODE_DECIMALSEPARATOR" Value="179" />
<Define Name="SDL_SCANCODE_CURRENCYUNIT" Value="180" />
<Define Name="SDL_SCANCODE_CURRENCYSUBUNIT" Value="181" />
<Define Name="SDL_SCANCODE_KP_LEFTPAREN" Value="182" />
<Define Name="SDL_SCANCODE_KP_RIGHTPAREN" Value="183" />
<Define Name="SDL_SCANCODE_KP_LEFTBRACE" Value="184" />
<Define Name="SDL_SCANCODE_KP_RIGHTBRACE" Value="185" />
<Define Name="SDL_SCANCODE_KP_TAB" Value="186" />
<Define Name="SDL_SCANCODE_KP_BACKSPACE" Value="187" />
<Define Name="SDL_SCANCODE_KP_A" Value="188" />
<Define Name="SDL_SCANCODE_KP_B" Value="189" />
<Define Name="SDL_SCANCODE_KP_C" Value="190" />
<Define Name="SDL_SCANCODE_KP_D" Value="191" />
<Define Name="SDL_SCANCODE_KP_E" Value="192" />
<Define Name="SDL_SCANCODE_KP_F" Value="193" />
<Define Name="SDL_SCANCODE_KP_XOR" Value="194" />
<Define Name="SDL_SCANCODE_KP_POWER" Value="195" />
<Define Name="SDL_SCANCODE_KP_PERCENT" Value="196" />
<Define Name="SDL_SCANCODE_KP_LESS" Value="197" />
<Define Name="SDL_SCANCODE_KP_GREATER" Value="198" />
<Define Name="SDL_SCANCODE_KP_AMPERSAND" Value="199" />
<Define Name="SDL_SCANCODE_KP_DBLAMPERSAND" Value="200" />
<Define Name="SDL_SCANCODE_KP_VERTICALBAR" Value="201" />
<Define Name="SDL_SCANCODE_KP_DBLVERTICALBAR" Value="202" />
<Define Name="SDL_SCANCODE_KP_COLON" Value="203" />
<Define Name="SDL_SCANCODE_KP_HASH" Value="204" />
<Define Name="SDL_SCANCODE_KP_SPACE" Value="205" />
<Define Name="SDL_SCANCODE_KP_AT" Value="206" />
<Define Name="SDL_SCANCODE_KP_EXCLAM" Value="207" />
<Define Name="SDL_SCANCODE_KP_MEMSTORE" Value="208" />
<Define Name="SDL_SCANCODE_KP_MEMRECALL" Value="209" />
<Define Name="SDL_SCANCODE_KP_MEMCLEAR" Value="210" />
<Define Name="SDL_SCANCODE_KP_MEMADD" Value="211" />
<Define Name="SDL_SCANCODE_KP_MEMSUBTRACT" Value="212" />
<Define Name="SDL_SCANCODE_KP_MEMMULTIPLY" Value="213" />
<Define Name="SDL_SCANCODE_KP_MEMDIVIDE" Value="214" />
<Define Name="SDL_SCANCODE_KP_PLUSMINUS" Value="215" />
<Define Name="SDL_SCANCODE_KP_CLEAR" Value="216" />
<Define Name="SDL_SCANCODE_KP_CLEARENTRY" Value="217" />
<Define Name="SDL_SCANCODE_KP_BINARY" Value="218" />
<Define Name="SDL_SCANCODE_KP_OCTAL" Value="219" />
<Define Name="SDL_SCANCODE_KP_DECIMAL" Value="220" />
<Define Name="SDL_SCANCODE_KP_HEXADECIMAL" Value="221" />
<Define Name="SDL_SCANCODE_LCTRL" Value="224" />
<Define Name="SDL_SCANCODE_LSHIFT" Value="225" />
<Define Name="SDL_SCANCODE_LALT" Value="226" />
<Define Name="SDL_SCANCODE_LGUI" Value="227" />
<Define Name="SDL_SCANCODE_RCTRL" Value="228" />
<Define Name="SDL_SCANCODE_RSHIFT" Value="229" />
<Define Name="SDL_SCANCODE_RALT" Value="230" />
<Define Name="SDL_SCANCODE_RGUI" Value="231" />
<Define Name="SDL_SCANCODE_MODE" Value="257" />
<Define Name="SDL_SCANCODE_AUDIONEXT" Value="258" />
<Define Name="SDL_SCANCODE_AUDIOPREV" Value="259" />
<Define Name="SDL_SCANCODE_AUDIOSTOP" Value="260" />
<Define Name="SDL_SCANCODE_AUDIOPLAY" Value="261" />
<Define Name="SDL_SCANCODE_AUDIOMUTE" Value="262" />
<Define Name="SDL_SCANCODE_MEDIASELECT" Value="263" />
<Define Name="SDL_SCANCODE_WWW" Value="264" />
<Define Name="SDL_SCANCODE_MAIL" Value="265" />
<Define Name="SDL_SCANCODE_CALCULATOR" Value="266" />
<Define Name="SDL_SCANCODE_COMPUTER" Value="267" />
<Define Name="SDL_SCANCODE_AC_SEARCH" Value="268" />
<Define Name="SDL_SCANCODE_AC_HOME" Value="269" />
<Define Name="SDL_SCANCODE_AC_BACK" Value="270" />
<Define Name="SDL_SCANCODE_AC_FORWARD" Value="271" />
<Define Name="SDL_SCANCODE_AC_STOP" Value="272" />
<Define Name="SDL_SCANCODE_AC_REFRESH" Value="273" />
<Define Name="SDL_SCANCODE_AC_BOOKMARKS" Value="274" />
<Define Name="SDL_SCANCODE_BRIGHTNESSDOWN" Value="275" />
<Define Name="SDL_SCANCODE_BRIGHTNESSUP" Value="276" />
<Define Name="SDL_SCANCODE_DISPLAYSWITCH" Value="277" />
<Define Name="SDL_SCANCODE_KBDILLUMTOGGLE" Value="278" />
<Define Name="SDL_SCANCODE_KBDILLUMDOWN" Value="279" />
<Define Name="SDL_SCANCODE_KBDILLUMUP" Value="280" />
<Define Name="SDL_SCANCODE_EJECT" Value="281" />
<Define Name="SDL_SCANCODE_SLEEP" Value="282" />
<Define Name="SDL_SCANCODE_APP1" Value="283" />
<Define Name="SDL_SCANCODE_APP2" Value="284" />
<Define Name="SDL_SCANCODE_AUDIOREWIND" Value="285" />
<Define Name="SDL_SCANCODE_AUDIOFASTFORWARD" Value="286" />
<Define Name="SDL_NUM_SCANCODES" Value="512" />
<Define Name="SDLK_UNKNOWN" Value="0" />
<Define Name="SDLK_RETURN" Value="13" />
<Define Name="SDLK_ESCAPE" Value="27" />
<Define Name="SDLK_BACKSPACE" Value="8" />
<Define Name="SDLK_TAB" Value="9" />
<Define Name="SDLK_SPACE" Value="32" />
<Define Name="SDLK_EXCLAIM" Value="33" />
<Define Name="SDLK_QUOTEDBL" Value="34" />
<Define Name="SDLK_HASH" Value="35" />
<Define Name="SDLK_PERCENT" Value="37" />
<Define Name="SDLK_DOLLAR" Value="36" />
<Define Name="SDLK_AMPERSAND" Value="38" />
<Define Name="SDLK_QUOTE" Value="39" />
<Define Name="SDLK_LEFTPAREN" Value="40" />
<Define Name="SDLK_RIGHTPAREN" Value="41" />
<Define Name="SDLK_ASTERISK" Value="42" />
<Define Name="SDLK_PLUS" Value="43" />
<Define Name="SDLK_COMMA" Value="44" />
<Define Name="SDLK_MINUS" Value="45" />
<Define Name="SDLK_PERIOD" Value="46" />
<Define Name="SDLK_SLASH" Value="47" />
<Define Name="SDLK_0" Value="48" />
<Define Name="SDLK_1" Value="49" />
<Define Name="SDLK_2" Value="50" />
<Define Name="SDLK_3" Value="51" />
<Define Name="SDLK_4" Value="52" />
<Define Name="SDLK_5" Value="53" />
<Define Name="SDLK_6" Value="54" />
<Define Name="SDLK_7" Value="55" />
<Define Name="SDLK_8" Value="56" />
<Define Name="SDLK_9" Value="57" />
<Define Name="SDLK_COLON" Value="58" />
<Define Name="SDLK_SEMICOLON" Value="59" />
<Define Name="SDLK_LESS" Value="60" />
<Define Name="SDLK_EQUALS" Value="61" />
<Define Name="SDLK_GREATER" Value="62" />
<Define Name="SDLK_QUESTION" Value="63" />
<Define Name="SDLK_AT" Value="64" />
<Define Name="SDLK_LEFTBRACKET" Value="91" />
<Define Name="SDLK_BACKSLASH" Value="92" />
<Define Name="SDLK_RIGHTBRACKET" Value="93" />
<Define Name="SDLK_CARET" Value="94" />
<Define Name="SDLK_UNDERSCORE" Value="95" />
<Define Name="SDLK_BACKQUOTE" Value="96" />
<Define Name="SDLK_a" Value="97" />
<Define Name="SDLK_b" Value="98" />
<Define Name="SDLK_c" Value="99" />
<Define Name="SDLK_d" Value="100" />
<Define Name="SDLK_e" Value="101" />
<Define Name="SDLK_f" Value="102" />
<Define Name="SDLK_g" Value="103" />
<Define Name="SDLK_h" Value="104" />
<Define Name="SDLK_i" Value="105" />
<Define Name="SDLK_j" Value="106" />
<Define Name="SDLK_k" Value="107" />
<Define Name="SDLK_l" Value="108" />
<Define Name="SDLK_m" Value="109" />
<Define Name="SDLK_n" Value="110" />
<Define Name="SDLK_o" Value="111" />
<Define Name="SDLK_p" Value="112" />
<Define Name="SDLK_q" Value="113" />
<Define Name="SDLK_r" Value="114" />
<Define Name="SDLK_s" Value="115" />
<Define Name="SDLK_t" Value="116" />
<Define Name="SDLK_u" Value="117" />
<Define Name="SDLK_v" Value="118" />
<Define Name="SDLK_w" Value="119" />
<Define Name="SDLK_x" Value="120" />
<Define Name="SDLK_y" Value="121" />
<Define Name="SDLK_z" Value="122" />
<Define Name="SDLK_CAPSLOCK" Value="1073741881" />
<Define Name="SDLK_F1" Value="1073741882" />
<Define Name="SDLK_F2" Value="1073741883" />
<Define Name="SDLK_F3" Value="1073741884" />
<Define Name="SDLK_F4" Value="1073741885" />
<Define Name="SDLK_F5" Value="1073741886" />
<Define Name="SDLK_F6" Value="1073741887" />
<Define Name="SDLK_F7" Value="1073741888" />
<Define Name="SDLK_F8" Value="1073741889" />
<Define Name="SDLK_F9" Value="1073741890" />
<Define Name="SDLK_F10" Value="1073741891" />
<Define Name="SDLK_F11" Value="1073741892" />
<Define Name="SDLK_F12" Value="1073741893" />
<Define Name="SDLK_PRINTSCREEN" Value="1073741894" />
<Define Name="SDLK_SCROLLLOCK" Value="1073741895" />
<Define Name="SDLK_PAUSE" Value="1073741896" />
<Define Name="SDLK_INSERT" Value="1073741897" />
<Define Name="SDLK_HOME" Value="1073741898" />
<Define Name="SDLK_PAGEUP" Value="1073741899" />
<Define Name="SDLK_DELETE" Value="127" />
<Define Name="SDLK_END" Value="1073741901" />
<Define Name="SDLK_PAGEDOWN" Value="1073741902" />
<Define Name="SDLK_RIGHT" Value="1073741903" />
<Define Name="SDLK_LEFT" Value="1073741904" />
<Define Name="SDLK_DOWN" Value="1073741905" />
<Define Name="SDLK_UP" Value="1073741906" />
<Define Name="SDLK_NUMLOCKCLEAR" Value="1073741907" />
<Define Name="SDLK_KP_DIVIDE" Value="1073741908" />
<Define Name="SDLK_KP_MULTIPLY" Value="1073741909" />
<Define Name="SDLK_KP_MINUS" Value="1073741910" />
<Define Name="SDLK_KP_PLUS" Value="1073741911" />
<Define Name="SDLK_KP_ENTER" Value="1073741912" />
<Define Name="SDLK_KP_1" Value="1073741913" />
<Define Name="SDLK_KP_2" Value="1073741914" />
<Define Name="SDLK_KP_3" Value="1073741915" />
<Define Name="SDLK_KP_4" Value="1073741916" />
<Define Name="SDLK_KP_5" Value="1073741917" />
<Define Name="SDLK_KP_6" Value="1073741918" />
<Define Name="SDLK_KP_7" Value="1073741919" />
<Define Name="SDLK_KP_8" Value="1073741920" />
<Define Name="SDLK_KP_9" Value="1073741921" />
<Define Name="SDLK_KP_0" Value="1073741922" />
<Define Name="SDLK_KP_PERIOD" Value="1073741923" />
<Define Name="SDLK_APPLICATION" Value="1073741925" />
<Define Name="SDLK_POWER" Value="1073741926" />
<Define Name="SDLK_KP_EQUALS" Value="1073741927" />
<Define Name="SDLK_F13" Value="1073741928" />
<Define Name="SDLK_F14" Value="1073741929" />
<Define Name="SDLK_F15" Value="1073741930" />
<Define Name="SDLK_F16" Value="1073741931" />
<Define Name="SDLK_F17" Value="1073741932" />
<Define Name="SDLK_F18" Value="1073741933" />
<Define Name="SDLK_F19" Value="1073741934" />
<Define Name="SDLK_F20" Value="1073741935" />
<Define Name="SDLK_F21" Value="1073741936" />
<Define Name="SDLK_F22" Value="1073741937" />
<Define Name="SDLK_F23" Value="1073741938" />
<Define Name="SDLK_F24" Value="1073741939" />
<Define Name="SDLK_EXECUTE" Value="1073741940" />
<Define Name="SDLK_HELP" Value="1073741941" />
<Define Name="SDLK_MENU" Value="1073741942" />
<Define Name="SDLK_SELECT" Value="1073741943" />
<Define Name="SDLK_STOP" Value="1073741944" />
<Define Name="SDLK_AGAIN" Value="1073741945" />
<Define Name="SDLK_UNDO" Value="1073741946" />
<Define Name="SDLK_CUT" Value="1073741947" />
<Define Name="SDLK_COPY" Value="1073741948" />
<Define Name="SDLK_PASTE" Value="1073741949" />
<Define Name="SDLK_FIND" Value="1073741950" />
<Define Name="SDLK_MUTE" Value="1073741951" />
<Define Name="SDLK_VOLUMEUP" Value="1073741952" />
<Define Name="SDLK_VOLUMEDOWN" Value="1073741953" />
<Define Name="SDLK_KP_COMMA" Value="1073741957" />
<Define Name="SDLK_KP_EQUALSAS400" Value="1073741958" />
<Define Name="SDLK_ALTERASE" Value="1073741977" />
<Define Name="SDLK_SYSREQ" Value="1073741978" />
<Define Name="SDLK_CANCEL" Value="1073741979" />
<Define Name="SDLK_CLEAR" Value="1073741980" />
<Define Name="SDLK_PRIOR" Value="1073741981" />
<Define Name="SDLK_RETURN2" Value="1073741982" />
<Define Name="SDLK_SEPARATOR" Value="1073741983" />
<Define Name="SDLK_OUT" Value="1073741984" />
<Define Name="SDLK_OPER" Value="1073741985" />
<Define Name="SDLK_CLEARAGAIN" Value="1073741986" />
<Define Name="SDLK_CRSEL" Value="1073741987" />
<Define Name="SDLK_EXSEL" Value="1073741988" />
<Define Name="SDLK_KP_00" Value="1073742000" />
<Define Name="SDLK_KP_000" Value="1073742001" />
<Define Name="SDLK_THOUSANDSSEPARATOR" Value="1073742002" />
<Define Name="SDLK_DECIMALSEPARATOR" Value="1073742003" />
<Define Name="SDLK_CURRENCYUNIT" Value="1073742004" />
<Define Name="SDLK_CURRENCYSUBUNIT" Value="1073742005" />
<Define Name="SDLK_KP_LEFTPAREN" Value="1073742006" />
<Define Name="SDLK_KP_RIGHTPAREN" Value="1073742007" />
<Define Name="SDLK_KP_LEFTBRACE" Value="1073742008" />
<Define Name="SDLK_KP_RIGHTBRACE" Value="1073742009" />
<Define Name="SDLK_KP_TAB" Value="1073742010" />
<Define Name="SDLK_KP_BACKSPACE" Value="1073742011" />
<Define Name="SDLK_KP_A" Value="1073742012" />
<Define Name="SDLK_KP_B" Value="1073742013" />
<Define Name="SDLK_KP_C" Value="1073742014" />
<Define Name="SDLK_KP_D" Value="1073742015" />
<Define Name="SDLK_KP_E" Value="1073742016" />
<Define Name="SDLK_KP_F" Value="1073742017" />
<Define Name="SDLK_KP_XOR" Value="1073742018" />
<Define Name="SDLK_KP_POWER" Value="1073742019" />
<Define Name="SDLK_KP_PERCENT" Value="1073742020" />
<Define Name="SDLK_KP_LESS" Value="1073742021" />
<Define Name="SDLK_KP_GREATER" Value="1073742022" />
<Define Name="SDLK_KP_AMPERSAND" Value="1073742023" />
<Define Name="SDLK_KP_DBLAMPERSAND" Value="1073742024" />
<Define Name="SDLK_KP_VERTICALBAR" Value="1073742025" />
<Define Name="SDLK_KP_DBLVERTICALBAR" Value="1073742026" />
<Define Name="SDLK_KP_COLON" Value="1073742027" />
<Define Name="SDLK_KP_HASH" Value="1073742028" />
<Define Name="SDLK_KP_SPACE" Value="1073742029" />
<Define Name="SDLK_KP_AT" Value="1073742030" />
<Define Name="SDLK_KP_EXCLAM" Value="1073742031" />
<Define Name="SDLK_KP_MEMSTORE" Value="1073742032" />
<Define Name="SDLK_KP_MEMRECALL" Value="1073742033" />
<Define Name="SDLK_KP_MEMCLEAR" Value="1073742034" />
<Define Name="SDLK_KP_MEMADD" Value="1073742035" />
<Define Name="SDLK_KP_MEMSUBTRACT" Value="1073742036" />
<Define Name="SDLK_KP_MEMMULTIPLY" Value="1073742037" />
<Define Name="SDLK_KP_MEMDIVIDE" Value="1073742038" />
<Define Name="SDLK_KP_PLUSMINUS" Value="1073742039" />
<Define Name="SDLK_KP_CLEAR" Value="1073742040" />
<Define Name="SDLK_KP_CLEARENTRY" Value="1073742041" />
<Define Name="SDLK_KP_BINARY" Value="1073742042" />
<Define Name="SDLK_KP_OCTAL" Value="1073742043" />
<Define Name="SDLK_KP_DECIMAL" Value="1073742044" />
<Define Name="SDLK_KP_HEXADECIMAL" Value="1073742045" />
<Define Name="SDLK_LCTRL" Value="1073742048" />
<Define Name="SDLK_LSHIFT" Value="1073742049" />
<Define Name="SDLK_LALT" Value="1073742050" />
<Define Name="SDLK_LGUI" Value="1073742051" />
<Define Name="SDLK_RCTRL" Value="1073742052" />
<Define Name="SDLK_RSHIFT" Value="1073742053" />
<Define Name="SDLK_RALT" Value="1073742054" />
<Define Name="SDLK_RGUI" Value="1073742055" />
<Define Name="SDLK_MODE" Value="1073742081" />
<Define Name="SDLK_AUDIONEXT" Value="1073742082" />
<Define Name="SDLK_AUDIOPREV" Value="1073742083" />
<Define Name="SDLK_AUDIOSTOP" Value="1073742084" />
<Define Name="SDLK_AUDIOPLAY" Value="1073742085" />
<Define Name="SDLK_AUDIOMUTE" Value="1073742086" />
<Define Name="SDLK_MEDIASELECT" Value="1073742087" />
<Define Name="SDLK_WWW" Value="1073742088" />
<Define Name="SDLK_MAIL" Value="1073742089" />
<Define Name="SDLK_CALCULATOR" Value="1073742090" />
<Define Name="SDLK_COMPUTER" Value="1073742091" />
<Define Name="SDLK_AC_SEARCH" Value="1073742092" />
<Define Name="SDLK_AC_HOME" Value="1073742093" />
<Define Name="SDLK_AC_BACK" Value="1073742094" />
<Define Name="SDLK_AC_FORWARD" Value="1073742095" />
<Define Name="SDLK_AC_STOP" Value="1073742096" />
<Define Name="SDLK_AC_REFRESH" Value="1073742097" />
<Define Name="SDLK_AC_BOOKMARKS" Value="1073742098" />
<Define Name="SDLK_BRIGHTNESSDOWN" Value="1073742099" />
<Define Name="SDLK_BRIGHTNESSUP" Value="1073742100" />
<Define Name="SDLK_DISPLAYSWITCH" Value="1073742101" />
<Define Name="SDLK_KBDILLUMTOGGLE" Value="1073742102" />
<Define Name="SDLK_KBDILLUMDOWN" Value="1073742103" />
<Define Name="SDLK_KBDILLUMUP" Value="1073742104" />
<Define Name="SDLK_EJECT" Value="1073742105" />
<Define Name="SDLK_SLEEP" Value="1073742106" />
<Define Name="KMOD_NONE" Value="0" />
<Define Name="KMOD_LSHIFT" Value="1" />
<Define Name="KMOD_RSHIFT" Value="2" />
<Define Name="KMOD_LCTRL" Value="64" />
<Define Name="KMOD_RCTRL" Value="128" />
<Define Name="KMOD_LALT" Value="256" />
<Define Name="KMOD_RALT" Value="512" />
<Define Name="KMOD_LGUI" Value="1024" />
<Define Name="KMOD_RGUI" Value="2048" />
<Define Name="KMOD_NUM" Value="4096" />
<Define Name="KMOD_CAPS" Value="8192" />
<Define Name="KMOD_MODE" Value="16384" />
<Define Name="KMOD_RESERVED" Value="32768" />
<Define Name="KMOD_CTRL" Value="192" />
<Define Name="KMOD_SHIFT" Value="3" />
<Define Name="KMOD_ALT" Value="768" />
<Define Name="KMOD_GUI" Value="3072" />
<Define Name="SEEK_SET" Value="0" />
<Define Name="SEEK_CUR" Value="1" />
<Define Name="SEEK_END" Value="2" />
<Define Name="LOGTYPE_NONE" Value="0" />
<Define Name="LOGTYPE_VERBOSE" Value="1" />
<Define Name="LOGTYPE_DEBUG" Value="2" />
<Define Name="LOGTYPE_INFO" Value="3" />
<Define Name="LOGTYPE_WARN" Value="4" />
<Define Name="LOGTYPE_ERROR" Value="5" />
<Define Name="LOGTYPE_CRITICAL" Value="6" />
<Define Name="COLOUR_TRANSPARENT" Value="0" />
<Define Name="COLOUR_WHITE" Value="4294967295" />
<Define Name="COLOUR_BLACK" Value="4278190080" />
<Define Name="COLOUR_RED" Value="4294901760" />
<Define Name="COLOUR_LIME" Value="4278255360" />
<Define Name="COLOUR_BLUE" Value="4278190335" />
<Define Name="COLOUR_YELLOW" Value="4294967040" />
<Define Name="COLOUR_AQUA" Value="4278255615" />
<Define Name="COLOUR_FUCHSIA" Value="4294902015" />
<Define Name="COLOUR_SKYBLUE" Value="4284927231" />
<Define Name="COLOUR_SILVER" Value="4291019715" />
<Define Name="COLOUR_GREEN" Value="4278222592" />
<Define Name="COLOUR_ORANGE" Value="4294934272" />
<Define Name="INVALID_NETWORK_ID" Value="-1" />
<Define Name="INVALID_CLIENT_ID" Value="-1" />
<Define Name="CHAT_TYPE_NONE" Value="0" />
<Define Name="CHAT_TYPE_CHAT" Value="1" />
<Define Name="CHAT_TYPE_INFO" Value="2" />
<Define Name="CHAT_TYPE_DEBUG" Value="3" />
<Define Name="NONE" Value="0" />
<Define Name="MAX_PEDS" Value="128" />
<Define Name="MAX_VEHICLES" Value="128" />
<Define Name="ELEMENT_ELEMENT" Value="0" />
<Define Name="ELEMENT_ENTITY" Value="6" />
<Define Name="ELEMENT_PED" Value="14" />
<Define Name="ELEMENT_PLAYER" Value="30" />
<Define Name="ELEMENT_VEHICLE" Value="38" />
<Define Name="GAME_UNKNOWN" Value="0" />
<Define Name="GAME_MAFIA_ONE" Value="10" />
<Define Name="GAME_MAFIA_TWO" Value="11" />
<Define Name="GAME_MAFIA_THREE" Value="12" />
<Define Name="GAME_MAFIA_ONE_DE" Value="13" />
<Define Name="WEAPON_KNUCKLEDUSTER" Value="2" />
<Define Name="WEAPON_KNIFE" Value="3" />
<Define Name="WEAPON_BASEBALLBAT" Value="4" />
<Define Name="WEAPON_MOLOTOV" Value="5" />
<Define Name="WEAPON_COLTDETECTIVESPECIAL" Value="6" />
<Define Name="WEAPON_SW_MAGNUM" Value="7" />
<Define Name="WEAPON_SW_MP" Value="8" />
<Define Name="WEAPON_COLT1911" Value="9" />
<Define Name="WEAPON_TOMMYGUN" Value="10" />
<Define Name="WEAPON_PUMPSHOTGUN" Value="11" />
<Define Name="WEAPON_SAWEDOFF" Value="12" />
<Define Name="WEAPON_SPRINGFIELD" Value="13" />
<Define Name="WEAPON_MOSINNAGANT" Value="13" />
<Define Name="WEAPON_GRENADE" Value="15" />
<Define Name="WEAPON_BUCKET" Value="17" />
<Define Name="WEAPON_STEELBAR" Value="20" />
<Define Name="WEAPON_CROWBAR" Value="25" />
<Define Name="WEAPON_WOODENPLANK" Value="28" />
<Define Name="WEAPON_BOTTLE" Value="29" />
<Define Name="WEAPON_SWORD" Value="31" />
<Define Name="WEAPON_DOGSHEAD" Value="32" />
<Define Name="PEDBEHAVIOR_NOREACT" Value="4" />
<Define Name="PEDBEHAVIOR_NOREACT_GUARDPLAYER" Value="2" />
<Define Name="PEDBEHAVIOR_REACTALL" Value="0" />
<Define Name="PEDBEHAVIOR_REACTTOATTACKS_ATTACK" Value="64" />
<Define Name="PEDBEHAVIOR_REACTTOATTACKS_AWAYORATTACK" Value="32" />
<Define Name="PEDBEHAVIOR_REACTTOPLAYER_AWAY" Value="16" />
<Define Name="PEDBEHAVIOR_REACTTOPLAYERHIT_ATTACK" Value="8" />
<Define Name="CLIENT_VERSION_MAJOR" Value="1" />
<Define Name="CLIENT_VERSION_MINOR" Value="0" />
<Define Name="CLIENT_VERSION_PATCH" Value="0" />
<Define Name="CLIENT_VERSION_BUILD" Value="0" />
</Defines>

View File

@@ -0,0 +1,459 @@
<?xml version="1.0" ?>
<Documentation>
<!--
Mask Values
b - bool
i - int32
f - float
s - string
c - function/callback
x - class/instance
z - vector2D
v - vector3D
t - thiscall
| - optional arguments
* - infinite arguments
. - any type
-->
<Namespace Name="global">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="thisResource" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localClient" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localPlayer" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="isConnected" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isConnecting" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="toColour" Mask="iii|i" RequiredArguments="3" Obsolete="false" />
<Function Name="collectAllGarbage" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="inPoly" Mask="z*" RequiredArguments="1" Obsolete="false" />
<Function Name="addEvent" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="addEventHandler" Mask="sf" RequiredArguments="2" Obsolete="false" />
<Function Name="removeEventHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="bindEventHandler" Mask="sxf" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindEventHandler" Mask="sx" RequiredArguments="2" Obsolete="false" />
<Function Name="triggerEvent" Mask="s|x*" RequiredArguments="1" Obsolete="false" />
<Function Name="addCommandHandler" Mask="sc|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeCommandHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="hasCommandHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="consoleCommand" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="setTimeout" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setInterval" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setImmediate" Mask="c*" RequiredArguments="1" Obsolete="false" />
<Function Name="clearTimeout" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearInterval" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearImmediate" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="bindKey" Mask="iic" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindKey" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="unbindAllKeys" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="findResourceByName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="getResources" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="exportFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="openFile" Mask="s|b" RequiredArguments="1" Obsolete="false" />
<Function Name="createFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="loadTextFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="saveTextFile" Mask="ss" RequiredArguments="2" Obsolete="false" />
<Function Name="addNetworkHandler" Mask="sc" RequiredArguments="2" Obsolete="false" />
<Function Name="removeNetworkHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="getConsole" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClients" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClient" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="destroyElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getClientFromPlayerElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementsByType" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromId" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="addToWorld" Mask="x" RequiredArguments="1" Obsolete="true" />
<Function Name="registerNetObject" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="connect" Mask="si|s" RequiredArguments="2" Obsolete="false" />
<Function Name="disconnect" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="message" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="triggerNetworkEvent" Mask="s*" RequiredArguments="1" Obsolete="false" />
<Function Name="setChatWindowEnabled" Mask="b" RequiredArguments="1" Obsolete="false" />
<Function Name="isScancodePressed" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="isKeyDown" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getPeds" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getPlayers" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getVehicles" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getScreenFromWorldPosition" Mask="v" RequiredArguments="1" Obsolete="false" />
<Class Name="Stream">
<Property Name="length" ReadOnly="true" Obsolete="false" Type="int64" />
<Property Name="position" ReadOnly="true" Obsolete="false" Type="int64" />
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readBytes" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="readString" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="true" />
<Function Name="writeBytes" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="writeString" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="readInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readFloat" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readDouble" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="writeInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeFloat" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="writeDouble" Mask="tf" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="TextReader">
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="loadText" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readCharacter" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Matrix4x4">
<Property Name="m11" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m12" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m13" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m14" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m21" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m22" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m23" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m24" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m31" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m32" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m33" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m34" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m41" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m42" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m43" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m44" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="setIdentity" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setTranslate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setScale" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateX" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateY" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateZ" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setMultiply" Mask="txx*" RequiredArguments="2" Obsolete="false" />
<Function Name="multiply" Mask="tx*" RequiredArguments="1" Obsolete="false" />
<Function Name="setInverse" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="transformCoordinate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="getElement" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="setElement" Mask="tif" RequiredArguments="2" Obsolete="false" />
<Function Name="getVector3" Mask="ti" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Vec2">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="interpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Vec3">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="z" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="length" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="squaredLength" ReadOnly="true" Obsolete="false" Type="number" />
<Function Name="distance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="squaredDistance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="dotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="absDotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="normalise" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="crossProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="midPoint" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="addSpherical" Mask="tfff" RequiredArguments="3" Obsolete="false" />
<Function Name="interpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="cartesianToSpherical" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Event">
<Class Name="CancellableEvent">
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
<Class Name="Timer" />
<Class Name="KeyEvent">
<Property Name="keyCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="scanCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="mod" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="repeat" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="down" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="XmlElement">
<Property Name="childrenCount" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="parent" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="text" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="attributes" ReadOnly="true" Obsolete="false" />
<Function Name="clear" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getStringAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getBoolAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getIntegerAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getFloatAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="XmlDocument">
<Property Name="rootElement" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="load" Mask="tx" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Resource">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="isStarted" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isStarting" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="exports" ReadOnly="true" Obsolete="false" />
<Property Name="isReady" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="start" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="stop" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="restart" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getExport" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="GUIElement">
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="left" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="top" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="right" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="bottom" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="width" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="height" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="focusBringsToTop" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="visible" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="useClip" ReadOnly="false" Obsolete="false" Type="bool" />
<Function Name="bringToTop" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="invalidate" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setDocked" Mask="t" RequiredArguments="0" Obsolete="false" />
<Class Name="GUIPage">
<Function Name="addElement" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromName" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Class Name="GUIWindow">
<Property Name="title" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="text" ReadOnly="false" Obsolete="false" Type="string" />
<Function Name="addClientElement" Mask="tx" RequiredArguments="1" Obsolete="false" />
</Class>
</Class>
<Class Name="GUIButton" />
<Class Name="GUIRectangle" />
<Class Name="GUIText" />
<Class Name="GUIHtmlView">
<Property Name="offset" ReadOnly="true" Obsolete="false" Type="Vector2D" />
<Property Name="maxOffset" ReadOnly="true" Obsolete="false" Type="Vector2D" />
<Property Name="document" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="open" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="addOffset" Mask="tz" RequiredArguments="1" Obsolete="false" />
<Function Name="updateLayout" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
<Class Name="GUIHtmlElement">
<Property Name="text" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="parent" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="getChild" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="select" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="selectAll" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="clear" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="orphan" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setInnerHtml" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Client">
<Property Name="index" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="gameVersion" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="player" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="administrator" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="console" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="ip" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ping" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="despawnPlayer" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="disconnect" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Element">
<Property Name="id" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="type" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="netFlags" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="isLocal" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isSyncer" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isOwner" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="syncer" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="syncerId" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="dimension" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="parent" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="resource" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="streamInDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="streamOutDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="position" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="rotation" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Function Name="isType" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setSyncer" Mask="tx|b" RequiredArguments="1" Obsolete="false" />
<Function Name="isCreatedFor" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="clearExistsFor" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setExistsFor" Mask="txb" RequiredArguments="2" Obsolete="false" />
<Function Name="existsFor" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="getRotation" Mask="t" RequiredArguments="0" Obsolete="true" />
<Function Name="setRotation" Mask="tv" RequiredArguments="1" Obsolete="true" />
<Class Name="Entity">
<Property Name="position" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="rotation" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="heading" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="model" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="modelIndex" ReadOnly="false" Obsolete="false" Type="string" />
<Class Name="Ped">
<Property Name="vehicle" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="skin" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="health" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="animationState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="animationStateLocal" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="kill" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="respawn" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="clearWeapons" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="giveWeapon" Mask="tiii" RequiredArguments="3" Obsolete="false" />
<Function Name="hasWeapon" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="takeWeapon" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="dropWeapon" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="warpIntoVehicle" Mask="tvi" RequiredArguments="2" Obsolete="false" />
<Function Name="removeFromVehicle" Mask="tvi" RequiredArguments="2" Obsolete="false" />
<Function Name="addAnimation" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setBehavior" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Class Name="Player" />
</Class>
<Class Name="Vehicle">
<Property Name="siren" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="lights" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="engine" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="speedLimit" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="gear" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="wheelAngle" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="fuel" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="speed" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="turnVelocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="velocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="engineHealth" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="health" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="engineRPM" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="explode" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="repair" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getOccupant" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getOccupants" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
</Class>
<Class Name="NetObjectFlags">
<Property Name="registered" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="deleting" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="onAllDimensions" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="forcedSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="findSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="sendSync" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="distanceStreaming" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="alwaysExistForSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="defaultExistance" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="transient" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="onlySyncIfDetached" ReadOnly="false" Obsolete="false" Type="bool" />
</Class>
<Class Name="Surface">
<Class Name="Texture" />
</Class>
<Namespace Name="reflection">
<Function Name="clone" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="move" Mask="xx" RequiredArguments="2" Obsolete="false" />
<Function Name="tostring" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="createFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="call" Mask="x" RequiredArguments="1" Obsolete="false" />
<Class Name="Function" />
</Namespace>
<Namespace Name="module" />
<Namespace Name="sdl">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="getModState" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="platform">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="modState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
</Namespace>
<Namespace Name="audio">
<Function Name="createSound" Mask="xb" RequiredArguments="2" Obsolete="false" />
<Function Name="createSoundFromURL" Mask="s" RequiredArguments="1" Obsolete="false" />
<Class Name="Sound">
<Property Name="position" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="volume" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="play" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="stop" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Namespace>
<Namespace Name="lucasFont">
<Function Name="createFont" Mask="xf" RequiredArguments="2" Obsolete="false" />
<Function Name="createDefaultFont" Mask="fs|s" RequiredArguments="2" Obsolete="false" />
<Function Name="enumFontFamilies" Mask="c" RequiredArguments="1" Obsolete="false" />
<Class Name="Font">
<Property Name="size" ReadOnly="true" Obsolete="false" Type="number" />
<Function Name="render" Mask="tszffffi|bbbb" RequiredArguments="7" Obsolete="false" />
<Function Name="measure" Mask="tsffff|bb" RequiredArguments="5" Obsolete="false" />
</Class>
</Namespace>
<Namespace Name="gui">
<Property Name="cursorPosition" ReadOnly="true" Obsolete="false" Type="Vector2D" />
<Property Name="cursorEnabled" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="addElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="destroyElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="destroyElements" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getElementFromName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="showCursor" Mask="b|b" RequiredArguments="1" Obsolete="false" />
</Namespace>
<Namespace Name="elements" />
<Namespace Name="mafia">
<Property Name="mapName" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="width" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="height" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="aspectRatio" ReadOnly="true" Obsolete="false" Type="number" />
<Function Name="createPed" Mask="svf" RequiredArguments="3" Obsolete="false" />
<Function Name="createVehicle" Mask="svf" RequiredArguments="3" Obsolete="false" />
<Function Name="createExplosion" Mask="vff" RequiredArguments="3" Obsolete="false" />
<Function Name="fadeCamera" Mask="bf|i" RequiredArguments="2" Obsolete="false" />
<Function Name="setPlayerControl" Mask="b" RequiredArguments="1" Obsolete="false" />
<Function Name="setTrafficEnabled" Mask="b" RequiredArguments="1" Obsolete="false" />
<Function Name="changeMap" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="createPlayer" Mask="svf" RequiredArguments="3" Obsolete="false" />
<Function Name="setLocalPlayer" Mask="x" RequiredArguments="1" Obsolete="false" />
<Namespace Name="hud">
<Function Name="message" Mask="si" RequiredArguments="2" Obsolete="false" />
<Function Name="enableMap" Mask="b" RequiredArguments="1" Obsolete="false" />
<Function Name="announce" Mask="sf" RequiredArguments="2" Obsolete="false" />
<Function Name="showCountdown" Mask="i" RequiredArguments="1" Obsolete="false" />
</Namespace>
</Namespace>
<Namespace Name="camera">
<Property Name="position" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="lookAtPosition" ReadOnly="false" Obsolete="false" Type="Vector3D" />
</Namespace>
<Namespace Name="graphics">
<Function Name="loadBMP" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="loadPNG" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="drawRectangle" Mask="xzz|iiiifzzzz" RequiredArguments="3" Obsolete="false" />
</Namespace>
</Namespace>
</Documentation>

View File

@@ -0,0 +1,103 @@
<?xml version="1.0" ?>
<EventTypes>
<!--Called right before the hud is drawn, you should draw your HUD here if you want it under the hud-->
<EventType Name="OnDrawHUD" Hash="2504546524" Arguments="0" CanPreventDefault="true" />
<!--Called when a keyboard key is down-->
<EventType Name="OnKeyDown" Hash="3091440445" Arguments="3" CanPreventDefault="false" />
<!--Called when a resource starts-->
<EventType Name="OnResourceStart" Hash="1143708828" Arguments="1" CanPreventDefault="true" />
<!--Called when an element is about to stream in-->
<EventType Name="OnElementStreamIn" Hash="2759455221" Arguments="2" CanPreventDefault="true" />
<!--Called when a resource stops-->
<EventType Name="OnResourceStop" Hash="1347867548" Arguments="2" CanPreventDefault="true" />
<!---->
<EventType Name="OnLocalPlayerExitSphere" Hash="105319985" Arguments="1" CanPreventDefault="false" />
<!--Called when a GUIElement is clicked on-->
<EventType Name="OnGUIClick" Hash="1620463676" Arguments="1" CanPreventDefault="false" />
<!--Called when the camera is about to be processed-->
<EventType Name="OnCameraProcess" Hash="4077277522" Arguments="0" CanPreventDefault="true" />
<!--Called whenever a ped jacks a vehicle-->
<EventType Name="OnPedJackVehicle" Hash="3295144583" Arguments="0" CanPreventDefault="false" />
<!--Called after all the hud is drawn, you should draw your HUD here if you want it over the hud-->
<EventType Name="OnDrawnHUD" Hash="1969344644" Arguments="0" CanPreventDefault="false" />
<!--Called after OnRender2D, usually post processing would be done here-->
<EventType Name="OnPostRender2D" Hash="1025891209" Arguments="0" CanPreventDefault="false" />
<!--Called when all the files are downloaded-->
<EventType Name="OnResourceReady" Hash="4089924796" Arguments="1" CanPreventDefault="false" />
<!--Called whenever an entity is processed-->
<EventType Name="OnEntityProcess" Hash="850679850" Arguments="1" CanPreventDefault="true" />
<!--Called when an element is about to be destroyed-->
<EventType Name="OnElementDestroy" Hash="696839637" Arguments="1" CanPreventDefault="true" />
<!--Called when anchor tags are clicked in a GUIHtmlView-->
<EventType Name="OnGUIAnchorClick" Hash="1882824246" Arguments="3" CanPreventDefault="true" />
<!--Called when a key is typed-->
<EventType Name="OnCharacter" Hash="318128971" Arguments="1" CanPreventDefault="false" />
<!--Called whenever something happens-->
<EventType Name="OnExampleEvent" Hash="3708674487" Arguments="1" CanPreventDefault="true" />
<!--Called whenever the map/mission is fully loaded and ready to play-->
<EventType Name="OnMapLoaded" Hash="3234142120" Arguments="0" CanPreventDefault="false" />
<!--Called whenever the key is pressed-->
<EventType Name="OnKeyPressed" Hash="694509307" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped has been hit-->
<EventType Name="OnPedInflictDamage" Hash="1391854299" Arguments="0" CanPreventDefault="false" />
<!--Called every render-->
<EventType Name="OnRender" Hash="2466144783" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped dies-->
<EventType Name="OnPedDeath" Hash="2417618960" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped spawns-->
<EventType Name="OnPedSpawn" Hash="3880839897" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped starts entering a vehicle-->
<EventType Name="OnPedEnteringVehicle" Hash="3211811326" Arguments="0" CanPreventDefault="false" />
<!--Called when a cursor button is down-->
<EventType Name="OnCursorDown" Hash="3618352285" Arguments="1" CanPreventDefault="false" />
<!--Called whenever a ped finishes entering a vehicle-->
<EventType Name="OnPedEnteredVehicle" Hash="800199306" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped starts exiting a vehicle-->
<EventType Name="OnPedExitingVehicle" Hash="353075125" Arguments="0" CanPreventDefault="false" />
<!--Called when the window is focused-->
<EventType Name="OnFocus" Hash="1989030060" Arguments="0" CanPreventDefault="false" />
<!--Called whenever a ped finishes exited a vehicle-->
<EventType Name="OnPedExitedVehicle" Hash="1591215844" Arguments="0" CanPreventDefault="false" />
<!--Called when the mouse leaves the window-->
<EventType Name="OnMouseLeave" Hash="3102340603" Arguments="0" CanPreventDefault="false" />
<!--Called when a cursor button is up-->
<EventType Name="OnCursorUp" Hash="2031527000" Arguments="1" CanPreventDefault="false" />
<!--Called every process-->
<EventType Name="OnProcess" Hash="3150131130" Arguments="1" CanPreventDefault="false" />
<!--Called every prerender-->
<EventType Name="OnPreRender" Hash="2235820386" Arguments="0" CanPreventDefault="false" />
<!--Called when 2D shit should be rendered-->
<EventType Name="OnRender2D" Hash="3260181898" Arguments="0" CanPreventDefault="false" />
<!--Called when a line will be output to the chatbox-->
<EventType Name="OnChatOutput" Hash="2275472839" Arguments="2" CanPreventDefault="true" />
<!--Called when a mouse button is down-->
<EventType Name="OnMouseDown" Hash="2632778956" Arguments="2" CanPreventDefault="false" />
<!--Called when a mouse button is up-->
<EventType Name="OnMouseUp" Hash="3080252785" Arguments="2" CanPreventDefault="false" />
<!--Called when the cursor moves-->
<EventType Name="OnCursorMove" Hash="610929630" Arguments="1" CanPreventDefault="false" />
<!--Called when the mouse scrolls-->
<EventType Name="OnMouseWheel" Hash="1116330591" Arguments="3" CanPreventDefault="false" />
<!--Called when a mouse moves-->
<EventType Name="OnMouseMove" Hash="1865196431" Arguments="3" CanPreventDefault="false" />
<!--Called when a mouse is connected-->
<EventType Name="OnMouseConnected" Hash="4137684318" Arguments="1" CanPreventDefault="false" />
<!--Called when a mouse is disconnected-->
<EventType Name="OnMouseDisconnected" Hash="2332645211" Arguments="1" CanPreventDefault="false" />
<!--Called when the window is defocused-->
<EventType Name="OnLostFocus" Hash="1036525539" Arguments="0" CanPreventDefault="false" />
<!--Called when a keyboard key is up-->
<EventType Name="OnKeyUp" Hash="1763402597" Arguments="3" CanPreventDefault="false" />
<!--Called when an element is about to stream out-->
<EventType Name="OnElementStreamOut" Hash="3852636898" Arguments="2" CanPreventDefault="true" />
<!--Called when disconnected from the server-->
<EventType Name="OnDisconnect" Hash="3221334991" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerEnterSphere" Hash="3890156725" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerEnteredVehicle" Hash="3395021369" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerExitedVehicle" Hash="1654569001" Arguments="1" CanPreventDefault="false" />
<!---->
<EventType Name="OnLocalPlayerSwitchWeapon" Hash="3670373318" Arguments="2" CanPreventDefault="false" />
</EventTypes>

View File

@@ -0,0 +1,399 @@
<?xml version="1.0" ?>
<Commands>
<Command Name="jobwhitelist" Hash="2189523071" />
<Command Name="bizdelflooritems" Hash="158748106" />
<Command Name="bizpublic" Hash="2572551879" />
<Command Name="returnplr" Hash="2563135004" />
<Command Name="additemtype" Hash="1625056830" />
<Command Name="say" Hash="4241071205" />
<Command Name="freq" Hash="1475614133" />
<Command Name="items" Hash="3776899405" />
<Command Name="iplogin" Hash="3830114180" />
<Command Name="exit" Hash="2483651598" />
<Command Name="addjobrouteloc" Hash="2057882151" />
<Command Name="houseentrance" Hash="1732577001" />
<Command Name="houseclan" Hash="3573514699" />
<Command Name="aban" Hash="1063339661" />
<Command Name="vw" Hash="4141688848" />
<Command Name="autolastchar" Hash="3186897000" />
<Command Name="quit" Hash="1135269781" />
<Command Name="notips" Hash="3711348993" />
<Command Name="help" Hash="143088812" />
<Command Name="equip" Hash="4067673008" />
<Command Name="ccode" Hash="1323373828" />
<Command Name="start" Hash="2675529103" />
<Command Name="locale" Hash="1098958488" />
<Command Name="restart" Hash="3891864071" />
<Command Name="carrespawnclan" Hash="1840990743" />
<Command Name="deljobroute" Hash="3139178648" />
<Command Name="setemail" Hash="795930342" />
<Command Name="reloadcfg" Hash="2937436470" />
<Command Name="cmd" Hash="794565824" />
<Command Name="vehreloadall" Hash="1958007921" />
<Command Name="stopall" Hash="1683731152" />
<Command Name="stop" Hash="3109426870" />
<Command Name="refresh" Hash="1619108091" />
<Command Name="bizjob" Hash="1623679964" />
<Command Name="jobcolour" Hash="1906062370" />
<Command Name="subnetban" Hash="3446702509" />
<Command Name="bizdefaultitems" Hash="492108129" />
<Command Name="dumpdoc" Hash="3404143852" />
<Command Name="bizclan" Hash="2741917790" />
<Command Name="bizdeposit" Hash="4085204187" />
<Command Name="accent" Hash="1734464235" />
<Command Name="streamnameall" Hash="257040269" />
<Command Name="accents" Hash="749835561" />
<Command Name="bizfloor" Hash="991723021" />
<Command Name="bizowner" Hash="1245269599" />
<Command Name="jobrouteenabled" Hash="2783446125" />
<Command Name="bizreloadall" Hash="1391182304" />
<Command Name="accentlist" Hash="1686860130" />
<Command Name="login" Hash="2852702992" />
<Command Name="mute" Hash="3434705756" />
<Command Name="drop" Hash="1880425762" />
<Command Name="register" Hash="1610170388" />
<Command Name="bizstore" Hash="2047799380" />
<Command Name="gotoveh" Hash="1314378666" />
<Command Name="bizname" Hash="1656456532" />
<Command Name="changepass" Hash="1379839939" />
<Command Name="bizorder" Hash="1886403515" />
<Command Name="anims" Hash="3889228819" />
<Command Name="scrolllines" Hash="1527443730" />
<Command Name="gui" Hash="3573502200" />
<Command Name="2fa" Hash="3518788867" />
<Command Name="verifyemail" Hash="3201570836" />
<Command Name="loginalert" Hash="2359999903" />
<Command Name="siren" Hash="3683367432" />
<Command Name="mousecam" Hash="3206767913" />
<Command Name="bizbuyprice" Hash="655960419" />
<Command Name="delstaffflag" Hash="1313026715" />
<Command Name="bizexit" Hash="2828107612" />
<Command Name="chatautohide" Hash="4051244712" />
<Command Name="newchar" Hash="4170498675" />
<Command Name="anim" Hash="1739285595" />
<Command Name="lights" Hash="951890664" />
<Command Name="charban" Hash="994982700" />
<Command Name="biztill" Hash="869001970" />
<Command Name="an" Hash="2536834118" />
<Command Name="e" Hash="4024072794" />
<Command Name="addstaffflag" Hash="79289023" />
<Command Name="animlist" Hash="2302640798" />
<Command Name="vehjob" Hash="3344978244" />
<Command Name="clanchat" Hash="3592644293" />
<Command Name="stopanim" Hash="423975717" />
<Command Name="houseexit" Hash="3741361865" />
<Command Name="spawnveh" Hash="4087978827" />
<Command Name="acctban" Hash="2579355258" />
<Command Name="cban" Hash="2506657286" />
<Command Name="delplritem" Hash="2217077700" />
<Command Name="saban" Hash="1719006355" />
<Command Name="ipban" Hash="2759871306" />
<Command Name="delloglevel" Hash="3046139078" />
<Command Name="addbiz" Hash="3844119303" />
<Command Name="delbiz" Hash="1295584235" />
<Command Name="bizlock" Hash="3138871388" />
<Command Name="bizlights" Hash="2589891122" />
<Command Name="bizbuy" Hash="1419510099" />
<Command Name="addtrigresp" Hash="2942770628" />
<Command Name="bizfee" Hash="223799185" />
<Command Name="bizitemprice" Hash="3432680323" />
<Command Name="bizbalance" Hash="3394291228" />
<Command Name="bizstock" Hash="3463446083" />
<Command Name="bizwithdraw" Hash="4223432723" />
<Command Name="buy" Hash="3481502327" />
<Command Name="bizdelowner" Hash="3491490727" />
<Command Name="bizrank" Hash="3034649527" />
<Command Name="bizblip" Hash="688162896" />
<Command Name="bizpickup" Hash="3816558887" />
<Command Name="bizinfo" Hash="4145138181" />
<Command Name="cmdenabletype" Hash="3401887628" />
<Command Name="bizflooritems" Hash="3152039807" />
<Command Name="bizentrance" Hash="3384296964" />
<Command Name="nosave" Hash="3967601367" />
<Command Name="bizinttype" Hash="1993387962" />
<Command Name="vehrespawnclan" Hash="2839312157" />
<Command Name="bizdelstorageitems" Hash="640974901" />
<Command Name="bizdealership" Hash="1448970834" />
<Command Name="deljobrouteloc" Hash="630262577" />
<Command Name="me" Hash="2891092674" />
<Command Name="setgui" Hash="2722470096" />
<Command Name="do" Hash="2638594197" />
<Command Name="radioreloadall" Hash="240903479" />
<Command Name="s" Hash="453955339" />
<Command Name="shout" Hash="3228108389" />
<Command Name="lock" Hash="2274335502" />
<Command Name="setjobblips" Hash="3692573588" />
<Command Name="talk" Hash="2669991355" />
<Command Name="local" Hash="2346092776" />
<Command Name="l" Hash="2517025534" />
<Command Name="setlang" Hash="80385616" />
<Command Name="testguiprompt" Hash="1276898732" />
<Command Name="reloademailcfg" Hash="3863532754" />
<Command Name="w" Hash="476252946" />
<Command Name="gotobiz" Hash="175433282" />
<Command Name="whisper" Hash="1339834624" />
<Command Name="clan" Hash="2683740940" />
<Command Name="jobroutestartmsg" Hash="3050645607" />
<Command Name="addclan" Hash="4056447230" />
<Command Name="c" Hash="112844655" />
<Command Name="adminchat" Hash="1592899621" />
<Command Name="admins" Hash="2732594447" />
<Command Name="a" Hash="3904355907" />
<Command Name="gotospawn" Hash="1617509273" />
<Command Name="achat" Hash="648643670" />
<Command Name="houseowner" Hash="3391862861" />
<Command Name="m" Hash="3775001192" />
<Command Name="clans" Hash="304575875" />
<Command Name="testguierror" Hash="491890956" />
<Command Name="clanranks" Hash="374891081" />
<Command Name="clanflags" Hash="3602613223" />
<Command Name="clearstaffflags" Hash="1933688633" />
<Command Name="delclan" Hash="1490865981" />
<Command Name="oldveh" Hash="2876867678" />
<Command Name="nearveh" Hash="1881612975" />
<Command Name="clanaddrank" Hash="2620943916" />
<Command Name="stoproute" Hash="3037172349" />
<Command Name="clandelrank" Hash="892131823" />
<Command Name="clansetrank" Hash="3351619564" />
<Command Name="clanowner" Hash="316548129" />
<Command Name="clantag" Hash="3681023611" />
<Command Name="clanranktag" Hash="1772177415" />
<Command Name="clanmembertag" Hash="959912259" />
<Command Name="clanrankname" Hash="3030127040" />
<Command Name="clanranklevel" Hash="3892778233" />
<Command Name="clanmembertitle" Hash="3517062004" />
<Command Name="getplrveh" Hash="3278782420" />
<Command Name="clanaddrankflag" Hash="2541715106" />
<Command Name="clanrankflags" Hash="2045286736" />
<Command Name="clandelrankflag" Hash="2989628358" />
<Command Name="clanaddmemberflag" Hash="2650664065" />
<Command Name="clandelmemberflag" Hash="2712990392" />
<Command Name="armour" Hash="2549936275" />
<Command Name="cmddisabletype" Hash="3293268402" />
<Command Name="bindkey" Hash="1227425763" />
<Command Name="cmdenable" Hash="4119993794" />
<Command Name="cmddisable" Hash="4076768664" />
<Command Name="jobblip" Hash="2619537769" />
<Command Name="settime" Hash="1515686519" />
<Command Name="setminuteduration" Hash="3347405783" />
<Command Name="jobroutelocarrivemsg" Hash="2806715855" />
<Command Name="setweather" Hash="296092028" />
<Command Name="setsnow" Hash="54572929" />
<Command Name="setlogo" Hash="3511519265" />
<Command Name="setguicolours" Hash="1253001477" />
<Command Name="newcharspawn" Hash="3561425132" />
<Command Name="newcharcash" Hash="1263771093" />
<Command Name="addgrounditem" Hash="766381040" />
<Command Name="newcharskin" Hash="1335038066" />
<Command Name="vehrespawnempty" Hash="37869538" />
<Command Name="reloaddbcfg" Hash="2688744694" />
<Command Name="reloadlocalecfg" Hash="3323883086" />
<Command Name="reloadaccentcfg" Hash="1762311642" />
<Command Name="setbizblips" Hash="2208865773" />
<Command Name="docmdall" Hash="3550628791" />
<Command Name="sethouseblips" Hash="3851708594" />
<Command Name="bizstorage" Hash="853459670" />
<Command Name="setbizpickups" Hash="2871853734" />
<Command Name="sethousepickups" Hash="1540957074" />
<Command Name="kick" Hash="517332741" />
<Command Name="setjobpickups" Hash="1690177862" />
<Command Name="dbquery" Hash="1161190191" />
<Command Name="scode" Hash="771850886" />
<Command Name="gmx" Hash="1012197459" />
<Command Name="rt" Hash="196656302" />
<Command Name="saveall" Hash="1031238566" />
<Command Name="docmd" Hash="432538647" />
<Command Name="addloglevel" Hash="2430402978" />
<Command Name="loglevel" Hash="3600896637" />
<Command Name="streamurlall" Hash="432433149" />
<Command Name="forceresetpass" Hash="2586824369" />
<Command Name="fixblips" Hash="3117299078" />
<Command Name="fixpickups" Hash="4113146230" />
<Command Name="carrespawnbiz" Hash="2668944323" />
<Command Name="cars" Hash="2512854292" />
<Command Name="resetambience" Hash="2196473743" />
<Command Name="testguiinfo" Hash="2560043709" />
<Command Name="jobroutefinishmsg" Hash="4059033309" />
<Command Name="tax" Hash="2390866550" />
<Command Name="wealth" Hash="1012568925" />
<Command Name="givemoney" Hash="3084115026" />
<Command Name="forcepayday" Hash="152293771" />
<Command Name="speak" Hash="4227147363" />
<Command Name="testemail" Hash="3217958560" />
<Command Name="commands" Hash="2587759404" />
<Command Name="enter" Hash="3111174254" />
<Command Name="cmds" Hash="2152026535" />
<Command Name="info" Hash="3414765911" />
<Command Name="pos" Hash="2161764012" />
<Command Name="veh" Hash="4108237688" />
<Command Name="warpinveh" Hash="1511727410" />
<Command Name="v" Hash="1801730948" />
<Command Name="car" Hash="2000545437" />
<Command Name="spawncar" Hash="1883948718" />
<Command Name="skin" Hash="41510942" />
<Command Name="vehdelowner" Hash="1446958743" />
<Command Name="trigresp" Hash="3910880795" />
<Command Name="skins" Hash="3775105792" />
<Command Name="addjobloc" Hash="3531129112" />
<Command Name="clothes" Hash="813282444" />
<Command Name="changeskin" Hash="2654409721" />
<Command Name="addhouse" Hash="872977526" />
<Command Name="delhouse" Hash="919344075" />
<Command Name="take" Hash="937258619" />
<Command Name="housereloadall" Hash="2365497957" />
<Command Name="getveh" Hash="438514653" />
<Command Name="quitjob" Hash="4168778638" />
<Command Name="houseinfo" Hash="2155877264" />
<Command Name="engine" Hash="3903330957" />
<Command Name="addtrigcond" Hash="2950893705" />
<Command Name="geoip" Hash="1182365374" />
<Command Name="housebuy" Hash="3262448210" />
<Command Name="addveh" Hash="2701373167" />
<Command Name="housedesc" Hash="1086099091" />
<Command Name="cursor" Hash="3313461902" />
<Command Name="houselock" Hash="3431381449" />
<Command Name="houselights" Hash="1768421772" />
<Command Name="drag" Hash="1833282923" />
<Command Name="housebuyprice" Hash="2313447822" />
<Command Name="up" Hash="1133833840" />
<Command Name="houserentprice" Hash="2866086582" />
<Command Name="houseblip" Hash="1586844101" />
<Command Name="gps" Hash="1424645575" />
<Command Name="housepickup" Hash="272986777" />
<Command Name="houseinttype" Hash="1526335570" />
<Command Name="i" Hash="3865851505" />
<Command Name="item" Hash="521872670" />
<Command Name="additem" Hash="1898315500" />
<Command Name="delgrounditem" Hash="300357065" />
<Command Name="delplritems" Hash="2273569865" />
<Command Name="itemtypeuseval" Hash="4115341070" />
<Command Name="pickup" Hash="1100888573" />
<Command Name="put" Hash="2928708052" />
<Command Name="inventory" Hash="2972535350" />
<Command Name="use" Hash="2494680139" />
<Command Name="inv" Hash="4200577949" />
<Command Name="houseitems" Hash="3830822780" />
<Command Name="buylist" Hash="1273281402" />
<Command Name="vehbuyprice" Hash="2705069139" />
<Command Name="power" Hash="2877948320" />
<Command Name="radio" Hash="3762690831" />
<Command Name="r" Hash="1812594589" />
<Command Name="itemtypeusetype" Hash="1457290076" />
<Command Name="itemtypeorderprice" Hash="1622827053" />
<Command Name="itemtyperiskmult" Hash="298256682" />
<Command Name="itemtypeenabled" Hash="1424486221" />
<Command Name="jobaddplayerbl" Hash="3037502154" />
<Command Name="takejob" Hash="2690682686" />
<Command Name="startwork" Hash="307130076" />
<Command Name="setstars" Hash="3388953278" />
<Command Name="stopwork" Hash="765483006" />
<Command Name="health" Hash="3470402323" />
<Command Name="startjob" Hash="4288994387" />
<Command Name="stopjob" Hash="2761630709" />
<Command Name="uniform" Hash="4130109879" />
<Command Name="passenger" Hash="1005578461" />
<Command Name="department" Hash="3441287562" />
<Command Name="d" Hash="2564639436" />
<Command Name="delveh" Hash="152714755" />
<Command Name="fare" Hash="1456298103" />
<Command Name="detain" Hash="3221757631" />
<Command Name="search" Hash="3035683751" />
<Command Name="startroute" Hash="1616395680" />
<Command Name="jobbl" Hash="779699388" />
<Command Name="addjob" Hash="2919626095" />
<Command Name="deljobloc" Hash="1739246254" />
<Command Name="addjobroute" Hash="2656138748" />
<Command Name="jobtoggle" Hash="2928606311" />
<Command Name="jobroutename" Hash="2017870989" />
<Command Name="jobroutepay" Hash="1116013836" />
<Command Name="jobroutelocnextmsg" Hash="1672851411" />
<Command Name="jobroutevehcolours" Hash="1488821428" />
<Command Name="jobroutedelays" Hash="1645912336" />
<Command Name="jobpickup" Hash="3405408273" />
<Command Name="jobwl" Hash="432841384" />
<Command Name="jobblacklist" Hash="1922085790" />
<Command Name="freeze" Hash="1183970330" />
<Command Name="radiostations" Hash="3940254175" />
<Command Name="jobaddplayerwl" Hash="2193194206" />
<Command Name="jobdelplayerbl" Hash="2420244398" />
<Command Name="jobreloadall" Hash="2284567617" />
<Command Name="jobinfo" Hash="1110948668" />
<Command Name="vehpublic" Hash="3482619154" />
<Command Name="joblocinfo" Hash="3048238516" />
<Command Name="unbindkey" Hash="1293547552" />
<Command Name="keybinds" Hash="839428196" />
<Command Name="lang" Hash="822707298" />
<Command Name="language" Hash="3571151285" />
<Command Name="idea" Hash="176933445" />
<Command Name="bug" Hash="898416404" />
<Command Name="yes" Hash="1978086825" />
<Command Name="no" Hash="1739204639" />
<Command Name="stuck" Hash="1518825670" />
<Command Name="radiostation" Hash="28088017" />
<Command Name="radiovolume" Hash="1214320345" />
<Command Name="unmute" Hash="567433405" />
<Command Name="infiniterun" Hash="872561642" />
<Command Name="unfreeze" Hash="2907185820" />
<Command Name="goto" Hash="1382046848" />
<Command Name="gethere" Hash="390671735" />
<Command Name="vehinfo" Hash="157447745" />
<Command Name="gotopos" Hash="978357886" />
<Command Name="lastveh" Hash="1130556078" />
<Command Name="gotohouse" Hash="2545077731" />
<Command Name="gotojob" Hash="1095862314" />
<Command Name="gotoloc" Hash="853263374" />
<Command Name="fr" Hash="3430272718" />
<Command Name="ba" Hash="749160980" />
<Command Name="lt" Hash="3757671281" />
<Command Name="vehrentprice" Hash="1386181794" />
<Command Name="dn" Hash="3930255363" />
<Command Name="int" Hash="340908721" />
<Command Name="staffflags" Hash="3021358894" />
<Command Name="getstaffflags" Hash="3580006325" />
<Command Name="nonrpname" Hash="1622484520" />
<Command Name="setskin" Hash="934967852" />
<Command Name="setname" Hash="1809869876" />
<Command Name="setaccent" Hash="2041102865" />
<Command Name="plrinfo" Hash="1743625616" />
<Command Name="getplrhouse" Hash="2410855153" />
<Command Name="getplrbiz" Hash="2269973052" />
<Command Name="ip" Hash="2783163181" />
<Command Name="plrsync" Hash="2152683965" />
<Command Name="switchchar" Hash="925728418" />
<Command Name="usechar" Hash="1390554915" />
<Command Name="addtrig" Hash="2612767502" />
<Command Name="deltrig" Hash="850336973" />
<Command Name="deltrigcond" Hash="2326689261" />
<Command Name="deltrigresp" Hash="2318039200" />
<Command Name="triggers" Hash="248416589" />
<Command Name="trigcond" Hash="3919528790" />
<Command Name="trigtoggle" Hash="3621806868" />
<Command Name="tempveh" Hash="3698377893" />
<Command Name="oldcar" Hash="681236923" />
<Command Name="lastcar" Hash="3229726539" />
<Command Name="unlock" Hash="1793372399" />
<Command Name="vehrespawnpublic" Hash="3922930954" />
<Command Name="vehowner" Hash="997636202" />
<Command Name="vehclan" Hash="1562240026" />
<Command Name="vehbiz" Hash="2353348396" />
<Command Name="vehrank" Hash="1251127283" />
<Command Name="vehpark" Hash="116144677" />
<Command Name="vehrespawnall" Hash="4068906615" />
<Command Name="vehrespawnjob" Hash="843450194" />
<Command Name="vehrespawnplr" Hash="359490131" />
<Command Name="vehrespawnbiz" Hash="2036558138" />
<Command Name="vehrespawn" Hash="2026210653" />
<Command Name="carrespawnall" Hash="351347854" />
<Command Name="carrespawnempty" Hash="3796941249" />
<Command Name="carrespawnjob" Hash="3560027563" />
<Command Name="carrespawnplr" Hash="4078620842" />
<Command Name="carrespawnpublic" Hash="1263815958" />
<Command Name="carrespawn" Hash="164999966" />
<Command Name="carreloadall" Hash="1616522302" />
<Command Name="vehrent" Hash="3230862042" />
<Command Name="vehstoprent" Hash="3033622543" />
<Command Name="vehbuy" Hash="4080743371" />
<Command Name="vehcolour" Hash="249087681" />
<Command Name="vehlivery" Hash="2590964950" />
<Command Name="vehrepair" Hash="2059704110" />
</Commands>

View File

@@ -0,0 +1,545 @@
<?xml version="1.0" ?>
<Defines>
<Define Name="KEYSTATE_UP" Value="0" />
<Define Name="KEYSTATE_DOWN" Value="1" />
<Define Name="KEYSTATE_BOTH" Value="2" />
<Define Name="SDL_SCANCODE_UNKNOWN" Value="0" />
<Define Name="SDL_SCANCODE_A" Value="4" />
<Define Name="SDL_SCANCODE_B" Value="5" />
<Define Name="SDL_SCANCODE_C" Value="6" />
<Define Name="SDL_SCANCODE_D" Value="7" />
<Define Name="SDL_SCANCODE_E" Value="8" />
<Define Name="SDL_SCANCODE_F" Value="9" />
<Define Name="SDL_SCANCODE_G" Value="10" />
<Define Name="SDL_SCANCODE_H" Value="11" />
<Define Name="SDL_SCANCODE_I" Value="12" />
<Define Name="SDL_SCANCODE_J" Value="13" />
<Define Name="SDL_SCANCODE_K" Value="14" />
<Define Name="SDL_SCANCODE_L" Value="15" />
<Define Name="SDL_SCANCODE_M" Value="16" />
<Define Name="SDL_SCANCODE_N" Value="17" />
<Define Name="SDL_SCANCODE_O" Value="18" />
<Define Name="SDL_SCANCODE_P" Value="19" />
<Define Name="SDL_SCANCODE_Q" Value="20" />
<Define Name="SDL_SCANCODE_R" Value="21" />
<Define Name="SDL_SCANCODE_S" Value="22" />
<Define Name="SDL_SCANCODE_T" Value="23" />
<Define Name="SDL_SCANCODE_U" Value="24" />
<Define Name="SDL_SCANCODE_V" Value="25" />
<Define Name="SDL_SCANCODE_W" Value="26" />
<Define Name="SDL_SCANCODE_X" Value="27" />
<Define Name="SDL_SCANCODE_Y" Value="28" />
<Define Name="SDL_SCANCODE_Z" Value="29" />
<Define Name="SDL_SCANCODE_1" Value="30" />
<Define Name="SDL_SCANCODE_2" Value="31" />
<Define Name="SDL_SCANCODE_3" Value="32" />
<Define Name="SDL_SCANCODE_4" Value="33" />
<Define Name="SDL_SCANCODE_5" Value="34" />
<Define Name="SDL_SCANCODE_6" Value="35" />
<Define Name="SDL_SCANCODE_7" Value="36" />
<Define Name="SDL_SCANCODE_8" Value="37" />
<Define Name="SDL_SCANCODE_9" Value="38" />
<Define Name="SDL_SCANCODE_0" Value="39" />
<Define Name="SDL_SCANCODE_RETURN" Value="40" />
<Define Name="SDL_SCANCODE_ESCAPE" Value="41" />
<Define Name="SDL_SCANCODE_BACKSPACE" Value="42" />
<Define Name="SDL_SCANCODE_TAB" Value="43" />
<Define Name="SDL_SCANCODE_SPACE" Value="44" />
<Define Name="SDL_SCANCODE_MINUS" Value="45" />
<Define Name="SDL_SCANCODE_EQUALS" Value="46" />
<Define Name="SDL_SCANCODE_LEFTBRACKET" Value="47" />
<Define Name="SDL_SCANCODE_RIGHTBRACKET" Value="48" />
<Define Name="SDL_SCANCODE_BACKSLASH" Value="49" />
<Define Name="SDL_SCANCODE_NONUSHASH" Value="50" />
<Define Name="SDL_SCANCODE_SEMICOLON" Value="51" />
<Define Name="SDL_SCANCODE_APOSTROPHE" Value="52" />
<Define Name="SDL_SCANCODE_GRAVE" Value="53" />
<Define Name="SDL_SCANCODE_COMMA" Value="54" />
<Define Name="SDL_SCANCODE_PERIOD" Value="55" />
<Define Name="SDL_SCANCODE_SLASH" Value="56" />
<Define Name="SDL_SCANCODE_CAPSLOCK" Value="57" />
<Define Name="SDL_SCANCODE_F1" Value="58" />
<Define Name="SDL_SCANCODE_F2" Value="59" />
<Define Name="SDL_SCANCODE_F3" Value="60" />
<Define Name="SDL_SCANCODE_F4" Value="61" />
<Define Name="SDL_SCANCODE_F5" Value="62" />
<Define Name="SDL_SCANCODE_F6" Value="63" />
<Define Name="SDL_SCANCODE_F7" Value="64" />
<Define Name="SDL_SCANCODE_F8" Value="65" />
<Define Name="SDL_SCANCODE_F9" Value="66" />
<Define Name="SDL_SCANCODE_F10" Value="67" />
<Define Name="SDL_SCANCODE_F11" Value="68" />
<Define Name="SDL_SCANCODE_F12" Value="69" />
<Define Name="SDL_SCANCODE_PRINTSCREEN" Value="70" />
<Define Name="SDL_SCANCODE_SCROLLLOCK" Value="71" />
<Define Name="SDL_SCANCODE_PAUSE" Value="72" />
<Define Name="SDL_SCANCODE_INSERT" Value="73" />
<Define Name="SDL_SCANCODE_HOME" Value="74" />
<Define Name="SDL_SCANCODE_PAGEUP" Value="75" />
<Define Name="SDL_SCANCODE_DELETE" Value="76" />
<Define Name="SDL_SCANCODE_END" Value="77" />
<Define Name="SDL_SCANCODE_PAGEDOWN" Value="78" />
<Define Name="SDL_SCANCODE_RIGHT" Value="79" />
<Define Name="SDL_SCANCODE_LEFT" Value="80" />
<Define Name="SDL_SCANCODE_DOWN" Value="81" />
<Define Name="SDL_SCANCODE_UP" Value="82" />
<Define Name="SDL_SCANCODE_NUMLOCKCLEAR" Value="83" />
<Define Name="SDL_SCANCODE_KP_DIVIDE" Value="84" />
<Define Name="SDL_SCANCODE_KP_MULTIPLY" Value="85" />
<Define Name="SDL_SCANCODE_KP_MINUS" Value="86" />
<Define Name="SDL_SCANCODE_KP_PLUS" Value="87" />
<Define Name="SDL_SCANCODE_KP_ENTER" Value="88" />
<Define Name="SDL_SCANCODE_KP_1" Value="89" />
<Define Name="SDL_SCANCODE_KP_2" Value="90" />
<Define Name="SDL_SCANCODE_KP_3" Value="91" />
<Define Name="SDL_SCANCODE_KP_4" Value="92" />
<Define Name="SDL_SCANCODE_KP_5" Value="93" />
<Define Name="SDL_SCANCODE_KP_6" Value="94" />
<Define Name="SDL_SCANCODE_KP_7" Value="95" />
<Define Name="SDL_SCANCODE_KP_8" Value="96" />
<Define Name="SDL_SCANCODE_KP_9" Value="97" />
<Define Name="SDL_SCANCODE_KP_0" Value="98" />
<Define Name="SDL_SCANCODE_KP_PERIOD" Value="99" />
<Define Name="SDL_SCANCODE_NONUSBACKSLASH" Value="100" />
<Define Name="SDL_SCANCODE_APPLICATION" Value="101" />
<Define Name="SDL_SCANCODE_POWER" Value="102" />
<Define Name="SDL_SCANCODE_KP_EQUALS" Value="103" />
<Define Name="SDL_SCANCODE_F13" Value="104" />
<Define Name="SDL_SCANCODE_F14" Value="105" />
<Define Name="SDL_SCANCODE_F15" Value="106" />
<Define Name="SDL_SCANCODE_F16" Value="107" />
<Define Name="SDL_SCANCODE_F17" Value="108" />
<Define Name="SDL_SCANCODE_F18" Value="109" />
<Define Name="SDL_SCANCODE_F19" Value="110" />
<Define Name="SDL_SCANCODE_F20" Value="111" />
<Define Name="SDL_SCANCODE_F21" Value="112" />
<Define Name="SDL_SCANCODE_F22" Value="113" />
<Define Name="SDL_SCANCODE_F23" Value="114" />
<Define Name="SDL_SCANCODE_F24" Value="115" />
<Define Name="SDL_SCANCODE_EXECUTE" Value="116" />
<Define Name="SDL_SCANCODE_HELP" Value="117" />
<Define Name="SDL_SCANCODE_MENU" Value="118" />
<Define Name="SDL_SCANCODE_SELECT" Value="119" />
<Define Name="SDL_SCANCODE_STOP" Value="120" />
<Define Name="SDL_SCANCODE_AGAIN" Value="121" />
<Define Name="SDL_SCANCODE_UNDO" Value="122" />
<Define Name="SDL_SCANCODE_CUT" Value="123" />
<Define Name="SDL_SCANCODE_COPY" Value="124" />
<Define Name="SDL_SCANCODE_PASTE" Value="125" />
<Define Name="SDL_SCANCODE_FIND" Value="126" />
<Define Name="SDL_SCANCODE_MUTE" Value="127" />
<Define Name="SDL_SCANCODE_VOLUMEUP" Value="128" />
<Define Name="SDL_SCANCODE_VOLUMEDOWN" Value="129" />
<Define Name="SDL_SCANCODE_KP_COMMA" Value="133" />
<Define Name="SDL_SCANCODE_KP_EQUALSAS400" Value="134" />
<Define Name="SDL_SCANCODE_INTERNATIONAL1" Value="135" />
<Define Name="SDL_SCANCODE_INTERNATIONAL2" Value="136" />
<Define Name="SDL_SCANCODE_INTERNATIONAL3" Value="137" />
<Define Name="SDL_SCANCODE_INTERNATIONAL4" Value="138" />
<Define Name="SDL_SCANCODE_INTERNATIONAL5" Value="139" />
<Define Name="SDL_SCANCODE_INTERNATIONAL6" Value="140" />
<Define Name="SDL_SCANCODE_INTERNATIONAL7" Value="141" />
<Define Name="SDL_SCANCODE_INTERNATIONAL8" Value="142" />
<Define Name="SDL_SCANCODE_INTERNATIONAL9" Value="143" />
<Define Name="SDL_SCANCODE_LANG1" Value="144" />
<Define Name="SDL_SCANCODE_LANG2" Value="145" />
<Define Name="SDL_SCANCODE_LANG3" Value="146" />
<Define Name="SDL_SCANCODE_LANG4" Value="147" />
<Define Name="SDL_SCANCODE_LANG5" Value="148" />
<Define Name="SDL_SCANCODE_LANG6" Value="149" />
<Define Name="SDL_SCANCODE_LANG7" Value="150" />
<Define Name="SDL_SCANCODE_LANG8" Value="151" />
<Define Name="SDL_SCANCODE_LANG9" Value="152" />
<Define Name="SDL_SCANCODE_ALTERASE" Value="153" />
<Define Name="SDL_SCANCODE_SYSREQ" Value="154" />
<Define Name="SDL_SCANCODE_CANCEL" Value="155" />
<Define Name="SDL_SCANCODE_CLEAR" Value="156" />
<Define Name="SDL_SCANCODE_PRIOR" Value="157" />
<Define Name="SDL_SCANCODE_RETURN2" Value="158" />
<Define Name="SDL_SCANCODE_SEPARATOR" Value="159" />
<Define Name="SDL_SCANCODE_OUT" Value="160" />
<Define Name="SDL_SCANCODE_OPER" Value="161" />
<Define Name="SDL_SCANCODE_CLEARAGAIN" Value="162" />
<Define Name="SDL_SCANCODE_CRSEL" Value="163" />
<Define Name="SDL_SCANCODE_EXSEL" Value="164" />
<Define Name="SDL_SCANCODE_KP_00" Value="176" />
<Define Name="SDL_SCANCODE_KP_000" Value="177" />
<Define Name="SDL_SCANCODE_THOUSANDSSEPARATOR" Value="178" />
<Define Name="SDL_SCANCODE_DECIMALSEPARATOR" Value="179" />
<Define Name="SDL_SCANCODE_CURRENCYUNIT" Value="180" />
<Define Name="SDL_SCANCODE_CURRENCYSUBUNIT" Value="181" />
<Define Name="SDL_SCANCODE_KP_LEFTPAREN" Value="182" />
<Define Name="SDL_SCANCODE_KP_RIGHTPAREN" Value="183" />
<Define Name="SDL_SCANCODE_KP_LEFTBRACE" Value="184" />
<Define Name="SDL_SCANCODE_KP_RIGHTBRACE" Value="185" />
<Define Name="SDL_SCANCODE_KP_TAB" Value="186" />
<Define Name="SDL_SCANCODE_KP_BACKSPACE" Value="187" />
<Define Name="SDL_SCANCODE_KP_A" Value="188" />
<Define Name="SDL_SCANCODE_KP_B" Value="189" />
<Define Name="SDL_SCANCODE_KP_C" Value="190" />
<Define Name="SDL_SCANCODE_KP_D" Value="191" />
<Define Name="SDL_SCANCODE_KP_E" Value="192" />
<Define Name="SDL_SCANCODE_KP_F" Value="193" />
<Define Name="SDL_SCANCODE_KP_XOR" Value="194" />
<Define Name="SDL_SCANCODE_KP_POWER" Value="195" />
<Define Name="SDL_SCANCODE_KP_PERCENT" Value="196" />
<Define Name="SDL_SCANCODE_KP_LESS" Value="197" />
<Define Name="SDL_SCANCODE_KP_GREATER" Value="198" />
<Define Name="SDL_SCANCODE_KP_AMPERSAND" Value="199" />
<Define Name="SDL_SCANCODE_KP_DBLAMPERSAND" Value="200" />
<Define Name="SDL_SCANCODE_KP_VERTICALBAR" Value="201" />
<Define Name="SDL_SCANCODE_KP_DBLVERTICALBAR" Value="202" />
<Define Name="SDL_SCANCODE_KP_COLON" Value="203" />
<Define Name="SDL_SCANCODE_KP_HASH" Value="204" />
<Define Name="SDL_SCANCODE_KP_SPACE" Value="205" />
<Define Name="SDL_SCANCODE_KP_AT" Value="206" />
<Define Name="SDL_SCANCODE_KP_EXCLAM" Value="207" />
<Define Name="SDL_SCANCODE_KP_MEMSTORE" Value="208" />
<Define Name="SDL_SCANCODE_KP_MEMRECALL" Value="209" />
<Define Name="SDL_SCANCODE_KP_MEMCLEAR" Value="210" />
<Define Name="SDL_SCANCODE_KP_MEMADD" Value="211" />
<Define Name="SDL_SCANCODE_KP_MEMSUBTRACT" Value="212" />
<Define Name="SDL_SCANCODE_KP_MEMMULTIPLY" Value="213" />
<Define Name="SDL_SCANCODE_KP_MEMDIVIDE" Value="214" />
<Define Name="SDL_SCANCODE_KP_PLUSMINUS" Value="215" />
<Define Name="SDL_SCANCODE_KP_CLEAR" Value="216" />
<Define Name="SDL_SCANCODE_KP_CLEARENTRY" Value="217" />
<Define Name="SDL_SCANCODE_KP_BINARY" Value="218" />
<Define Name="SDL_SCANCODE_KP_OCTAL" Value="219" />
<Define Name="SDL_SCANCODE_KP_DECIMAL" Value="220" />
<Define Name="SDL_SCANCODE_KP_HEXADECIMAL" Value="221" />
<Define Name="SDL_SCANCODE_LCTRL" Value="224" />
<Define Name="SDL_SCANCODE_LSHIFT" Value="225" />
<Define Name="SDL_SCANCODE_LALT" Value="226" />
<Define Name="SDL_SCANCODE_LGUI" Value="227" />
<Define Name="SDL_SCANCODE_RCTRL" Value="228" />
<Define Name="SDL_SCANCODE_RSHIFT" Value="229" />
<Define Name="SDL_SCANCODE_RALT" Value="230" />
<Define Name="SDL_SCANCODE_RGUI" Value="231" />
<Define Name="SDL_SCANCODE_MODE" Value="257" />
<Define Name="SDL_SCANCODE_AUDIONEXT" Value="258" />
<Define Name="SDL_SCANCODE_AUDIOPREV" Value="259" />
<Define Name="SDL_SCANCODE_AUDIOSTOP" Value="260" />
<Define Name="SDL_SCANCODE_AUDIOPLAY" Value="261" />
<Define Name="SDL_SCANCODE_AUDIOMUTE" Value="262" />
<Define Name="SDL_SCANCODE_MEDIASELECT" Value="263" />
<Define Name="SDL_SCANCODE_WWW" Value="264" />
<Define Name="SDL_SCANCODE_MAIL" Value="265" />
<Define Name="SDL_SCANCODE_CALCULATOR" Value="266" />
<Define Name="SDL_SCANCODE_COMPUTER" Value="267" />
<Define Name="SDL_SCANCODE_AC_SEARCH" Value="268" />
<Define Name="SDL_SCANCODE_AC_HOME" Value="269" />
<Define Name="SDL_SCANCODE_AC_BACK" Value="270" />
<Define Name="SDL_SCANCODE_AC_FORWARD" Value="271" />
<Define Name="SDL_SCANCODE_AC_STOP" Value="272" />
<Define Name="SDL_SCANCODE_AC_REFRESH" Value="273" />
<Define Name="SDL_SCANCODE_AC_BOOKMARKS" Value="274" />
<Define Name="SDL_SCANCODE_BRIGHTNESSDOWN" Value="275" />
<Define Name="SDL_SCANCODE_BRIGHTNESSUP" Value="276" />
<Define Name="SDL_SCANCODE_DISPLAYSWITCH" Value="277" />
<Define Name="SDL_SCANCODE_KBDILLUMTOGGLE" Value="278" />
<Define Name="SDL_SCANCODE_KBDILLUMDOWN" Value="279" />
<Define Name="SDL_SCANCODE_KBDILLUMUP" Value="280" />
<Define Name="SDL_SCANCODE_EJECT" Value="281" />
<Define Name="SDL_SCANCODE_SLEEP" Value="282" />
<Define Name="SDL_SCANCODE_APP1" Value="283" />
<Define Name="SDL_SCANCODE_APP2" Value="284" />
<Define Name="SDL_SCANCODE_AUDIOREWIND" Value="285" />
<Define Name="SDL_SCANCODE_AUDIOFASTFORWARD" Value="286" />
<Define Name="SDL_NUM_SCANCODES" Value="512" />
<Define Name="SDLK_UNKNOWN" Value="0" />
<Define Name="SDLK_RETURN" Value="13" />
<Define Name="SDLK_ESCAPE" Value="27" />
<Define Name="SDLK_BACKSPACE" Value="8" />
<Define Name="SDLK_TAB" Value="9" />
<Define Name="SDLK_SPACE" Value="32" />
<Define Name="SDLK_EXCLAIM" Value="33" />
<Define Name="SDLK_QUOTEDBL" Value="34" />
<Define Name="SDLK_HASH" Value="35" />
<Define Name="SDLK_PERCENT" Value="37" />
<Define Name="SDLK_DOLLAR" Value="36" />
<Define Name="SDLK_AMPERSAND" Value="38" />
<Define Name="SDLK_QUOTE" Value="39" />
<Define Name="SDLK_LEFTPAREN" Value="40" />
<Define Name="SDLK_RIGHTPAREN" Value="41" />
<Define Name="SDLK_ASTERISK" Value="42" />
<Define Name="SDLK_PLUS" Value="43" />
<Define Name="SDLK_COMMA" Value="44" />
<Define Name="SDLK_MINUS" Value="45" />
<Define Name="SDLK_PERIOD" Value="46" />
<Define Name="SDLK_SLASH" Value="47" />
<Define Name="SDLK_0" Value="48" />
<Define Name="SDLK_1" Value="49" />
<Define Name="SDLK_2" Value="50" />
<Define Name="SDLK_3" Value="51" />
<Define Name="SDLK_4" Value="52" />
<Define Name="SDLK_5" Value="53" />
<Define Name="SDLK_6" Value="54" />
<Define Name="SDLK_7" Value="55" />
<Define Name="SDLK_8" Value="56" />
<Define Name="SDLK_9" Value="57" />
<Define Name="SDLK_COLON" Value="58" />
<Define Name="SDLK_SEMICOLON" Value="59" />
<Define Name="SDLK_LESS" Value="60" />
<Define Name="SDLK_EQUALS" Value="61" />
<Define Name="SDLK_GREATER" Value="62" />
<Define Name="SDLK_QUESTION" Value="63" />
<Define Name="SDLK_AT" Value="64" />
<Define Name="SDLK_LEFTBRACKET" Value="91" />
<Define Name="SDLK_BACKSLASH" Value="92" />
<Define Name="SDLK_RIGHTBRACKET" Value="93" />
<Define Name="SDLK_CARET" Value="94" />
<Define Name="SDLK_UNDERSCORE" Value="95" />
<Define Name="SDLK_BACKQUOTE" Value="96" />
<Define Name="SDLK_a" Value="97" />
<Define Name="SDLK_b" Value="98" />
<Define Name="SDLK_c" Value="99" />
<Define Name="SDLK_d" Value="100" />
<Define Name="SDLK_e" Value="101" />
<Define Name="SDLK_f" Value="102" />
<Define Name="SDLK_g" Value="103" />
<Define Name="SDLK_h" Value="104" />
<Define Name="SDLK_i" Value="105" />
<Define Name="SDLK_j" Value="106" />
<Define Name="SDLK_k" Value="107" />
<Define Name="SDLK_l" Value="108" />
<Define Name="SDLK_m" Value="109" />
<Define Name="SDLK_n" Value="110" />
<Define Name="SDLK_o" Value="111" />
<Define Name="SDLK_p" Value="112" />
<Define Name="SDLK_q" Value="113" />
<Define Name="SDLK_r" Value="114" />
<Define Name="SDLK_s" Value="115" />
<Define Name="SDLK_t" Value="116" />
<Define Name="SDLK_u" Value="117" />
<Define Name="SDLK_v" Value="118" />
<Define Name="SDLK_w" Value="119" />
<Define Name="SDLK_x" Value="120" />
<Define Name="SDLK_y" Value="121" />
<Define Name="SDLK_z" Value="122" />
<Define Name="SDLK_CAPSLOCK" Value="1073741881" />
<Define Name="SDLK_F1" Value="1073741882" />
<Define Name="SDLK_F2" Value="1073741883" />
<Define Name="SDLK_F3" Value="1073741884" />
<Define Name="SDLK_F4" Value="1073741885" />
<Define Name="SDLK_F5" Value="1073741886" />
<Define Name="SDLK_F6" Value="1073741887" />
<Define Name="SDLK_F7" Value="1073741888" />
<Define Name="SDLK_F8" Value="1073741889" />
<Define Name="SDLK_F9" Value="1073741890" />
<Define Name="SDLK_F10" Value="1073741891" />
<Define Name="SDLK_F11" Value="1073741892" />
<Define Name="SDLK_F12" Value="1073741893" />
<Define Name="SDLK_PRINTSCREEN" Value="1073741894" />
<Define Name="SDLK_SCROLLLOCK" Value="1073741895" />
<Define Name="SDLK_PAUSE" Value="1073741896" />
<Define Name="SDLK_INSERT" Value="1073741897" />
<Define Name="SDLK_HOME" Value="1073741898" />
<Define Name="SDLK_PAGEUP" Value="1073741899" />
<Define Name="SDLK_DELETE" Value="127" />
<Define Name="SDLK_END" Value="1073741901" />
<Define Name="SDLK_PAGEDOWN" Value="1073741902" />
<Define Name="SDLK_RIGHT" Value="1073741903" />
<Define Name="SDLK_LEFT" Value="1073741904" />
<Define Name="SDLK_DOWN" Value="1073741905" />
<Define Name="SDLK_UP" Value="1073741906" />
<Define Name="SDLK_NUMLOCKCLEAR" Value="1073741907" />
<Define Name="SDLK_KP_DIVIDE" Value="1073741908" />
<Define Name="SDLK_KP_MULTIPLY" Value="1073741909" />
<Define Name="SDLK_KP_MINUS" Value="1073741910" />
<Define Name="SDLK_KP_PLUS" Value="1073741911" />
<Define Name="SDLK_KP_ENTER" Value="1073741912" />
<Define Name="SDLK_KP_1" Value="1073741913" />
<Define Name="SDLK_KP_2" Value="1073741914" />
<Define Name="SDLK_KP_3" Value="1073741915" />
<Define Name="SDLK_KP_4" Value="1073741916" />
<Define Name="SDLK_KP_5" Value="1073741917" />
<Define Name="SDLK_KP_6" Value="1073741918" />
<Define Name="SDLK_KP_7" Value="1073741919" />
<Define Name="SDLK_KP_8" Value="1073741920" />
<Define Name="SDLK_KP_9" Value="1073741921" />
<Define Name="SDLK_KP_0" Value="1073741922" />
<Define Name="SDLK_KP_PERIOD" Value="1073741923" />
<Define Name="SDLK_APPLICATION" Value="1073741925" />
<Define Name="SDLK_POWER" Value="1073741926" />
<Define Name="SDLK_KP_EQUALS" Value="1073741927" />
<Define Name="SDLK_F13" Value="1073741928" />
<Define Name="SDLK_F14" Value="1073741929" />
<Define Name="SDLK_F15" Value="1073741930" />
<Define Name="SDLK_F16" Value="1073741931" />
<Define Name="SDLK_F17" Value="1073741932" />
<Define Name="SDLK_F18" Value="1073741933" />
<Define Name="SDLK_F19" Value="1073741934" />
<Define Name="SDLK_F20" Value="1073741935" />
<Define Name="SDLK_F21" Value="1073741936" />
<Define Name="SDLK_F22" Value="1073741937" />
<Define Name="SDLK_F23" Value="1073741938" />
<Define Name="SDLK_F24" Value="1073741939" />
<Define Name="SDLK_EXECUTE" Value="1073741940" />
<Define Name="SDLK_HELP" Value="1073741941" />
<Define Name="SDLK_MENU" Value="1073741942" />
<Define Name="SDLK_SELECT" Value="1073741943" />
<Define Name="SDLK_STOP" Value="1073741944" />
<Define Name="SDLK_AGAIN" Value="1073741945" />
<Define Name="SDLK_UNDO" Value="1073741946" />
<Define Name="SDLK_CUT" Value="1073741947" />
<Define Name="SDLK_COPY" Value="1073741948" />
<Define Name="SDLK_PASTE" Value="1073741949" />
<Define Name="SDLK_FIND" Value="1073741950" />
<Define Name="SDLK_MUTE" Value="1073741951" />
<Define Name="SDLK_VOLUMEUP" Value="1073741952" />
<Define Name="SDLK_VOLUMEDOWN" Value="1073741953" />
<Define Name="SDLK_KP_COMMA" Value="1073741957" />
<Define Name="SDLK_KP_EQUALSAS400" Value="1073741958" />
<Define Name="SDLK_ALTERASE" Value="1073741977" />
<Define Name="SDLK_SYSREQ" Value="1073741978" />
<Define Name="SDLK_CANCEL" Value="1073741979" />
<Define Name="SDLK_CLEAR" Value="1073741980" />
<Define Name="SDLK_PRIOR" Value="1073741981" />
<Define Name="SDLK_RETURN2" Value="1073741982" />
<Define Name="SDLK_SEPARATOR" Value="1073741983" />
<Define Name="SDLK_OUT" Value="1073741984" />
<Define Name="SDLK_OPER" Value="1073741985" />
<Define Name="SDLK_CLEARAGAIN" Value="1073741986" />
<Define Name="SDLK_CRSEL" Value="1073741987" />
<Define Name="SDLK_EXSEL" Value="1073741988" />
<Define Name="SDLK_KP_00" Value="1073742000" />
<Define Name="SDLK_KP_000" Value="1073742001" />
<Define Name="SDLK_THOUSANDSSEPARATOR" Value="1073742002" />
<Define Name="SDLK_DECIMALSEPARATOR" Value="1073742003" />
<Define Name="SDLK_CURRENCYUNIT" Value="1073742004" />
<Define Name="SDLK_CURRENCYSUBUNIT" Value="1073742005" />
<Define Name="SDLK_KP_LEFTPAREN" Value="1073742006" />
<Define Name="SDLK_KP_RIGHTPAREN" Value="1073742007" />
<Define Name="SDLK_KP_LEFTBRACE" Value="1073742008" />
<Define Name="SDLK_KP_RIGHTBRACE" Value="1073742009" />
<Define Name="SDLK_KP_TAB" Value="1073742010" />
<Define Name="SDLK_KP_BACKSPACE" Value="1073742011" />
<Define Name="SDLK_KP_A" Value="1073742012" />
<Define Name="SDLK_KP_B" Value="1073742013" />
<Define Name="SDLK_KP_C" Value="1073742014" />
<Define Name="SDLK_KP_D" Value="1073742015" />
<Define Name="SDLK_KP_E" Value="1073742016" />
<Define Name="SDLK_KP_F" Value="1073742017" />
<Define Name="SDLK_KP_XOR" Value="1073742018" />
<Define Name="SDLK_KP_POWER" Value="1073742019" />
<Define Name="SDLK_KP_PERCENT" Value="1073742020" />
<Define Name="SDLK_KP_LESS" Value="1073742021" />
<Define Name="SDLK_KP_GREATER" Value="1073742022" />
<Define Name="SDLK_KP_AMPERSAND" Value="1073742023" />
<Define Name="SDLK_KP_DBLAMPERSAND" Value="1073742024" />
<Define Name="SDLK_KP_VERTICALBAR" Value="1073742025" />
<Define Name="SDLK_KP_DBLVERTICALBAR" Value="1073742026" />
<Define Name="SDLK_KP_COLON" Value="1073742027" />
<Define Name="SDLK_KP_HASH" Value="1073742028" />
<Define Name="SDLK_KP_SPACE" Value="1073742029" />
<Define Name="SDLK_KP_AT" Value="1073742030" />
<Define Name="SDLK_KP_EXCLAM" Value="1073742031" />
<Define Name="SDLK_KP_MEMSTORE" Value="1073742032" />
<Define Name="SDLK_KP_MEMRECALL" Value="1073742033" />
<Define Name="SDLK_KP_MEMCLEAR" Value="1073742034" />
<Define Name="SDLK_KP_MEMADD" Value="1073742035" />
<Define Name="SDLK_KP_MEMSUBTRACT" Value="1073742036" />
<Define Name="SDLK_KP_MEMMULTIPLY" Value="1073742037" />
<Define Name="SDLK_KP_MEMDIVIDE" Value="1073742038" />
<Define Name="SDLK_KP_PLUSMINUS" Value="1073742039" />
<Define Name="SDLK_KP_CLEAR" Value="1073742040" />
<Define Name="SDLK_KP_CLEARENTRY" Value="1073742041" />
<Define Name="SDLK_KP_BINARY" Value="1073742042" />
<Define Name="SDLK_KP_OCTAL" Value="1073742043" />
<Define Name="SDLK_KP_DECIMAL" Value="1073742044" />
<Define Name="SDLK_KP_HEXADECIMAL" Value="1073742045" />
<Define Name="SDLK_LCTRL" Value="1073742048" />
<Define Name="SDLK_LSHIFT" Value="1073742049" />
<Define Name="SDLK_LALT" Value="1073742050" />
<Define Name="SDLK_LGUI" Value="1073742051" />
<Define Name="SDLK_RCTRL" Value="1073742052" />
<Define Name="SDLK_RSHIFT" Value="1073742053" />
<Define Name="SDLK_RALT" Value="1073742054" />
<Define Name="SDLK_RGUI" Value="1073742055" />
<Define Name="SDLK_MODE" Value="1073742081" />
<Define Name="SDLK_AUDIONEXT" Value="1073742082" />
<Define Name="SDLK_AUDIOPREV" Value="1073742083" />
<Define Name="SDLK_AUDIOSTOP" Value="1073742084" />
<Define Name="SDLK_AUDIOPLAY" Value="1073742085" />
<Define Name="SDLK_AUDIOMUTE" Value="1073742086" />
<Define Name="SDLK_MEDIASELECT" Value="1073742087" />
<Define Name="SDLK_WWW" Value="1073742088" />
<Define Name="SDLK_MAIL" Value="1073742089" />
<Define Name="SDLK_CALCULATOR" Value="1073742090" />
<Define Name="SDLK_COMPUTER" Value="1073742091" />
<Define Name="SDLK_AC_SEARCH" Value="1073742092" />
<Define Name="SDLK_AC_HOME" Value="1073742093" />
<Define Name="SDLK_AC_BACK" Value="1073742094" />
<Define Name="SDLK_AC_FORWARD" Value="1073742095" />
<Define Name="SDLK_AC_STOP" Value="1073742096" />
<Define Name="SDLK_AC_REFRESH" Value="1073742097" />
<Define Name="SDLK_AC_BOOKMARKS" Value="1073742098" />
<Define Name="SDLK_BRIGHTNESSDOWN" Value="1073742099" />
<Define Name="SDLK_BRIGHTNESSUP" Value="1073742100" />
<Define Name="SDLK_DISPLAYSWITCH" Value="1073742101" />
<Define Name="SDLK_KBDILLUMTOGGLE" Value="1073742102" />
<Define Name="SDLK_KBDILLUMDOWN" Value="1073742103" />
<Define Name="SDLK_KBDILLUMUP" Value="1073742104" />
<Define Name="SDLK_EJECT" Value="1073742105" />
<Define Name="SDLK_SLEEP" Value="1073742106" />
<Define Name="KMOD_NONE" Value="0" />
<Define Name="KMOD_LSHIFT" Value="1" />
<Define Name="KMOD_RSHIFT" Value="2" />
<Define Name="KMOD_LCTRL" Value="64" />
<Define Name="KMOD_RCTRL" Value="128" />
<Define Name="KMOD_LALT" Value="256" />
<Define Name="KMOD_RALT" Value="512" />
<Define Name="KMOD_LGUI" Value="1024" />
<Define Name="KMOD_RGUI" Value="2048" />
<Define Name="KMOD_NUM" Value="4096" />
<Define Name="KMOD_CAPS" Value="8192" />
<Define Name="KMOD_MODE" Value="16384" />
<Define Name="KMOD_RESERVED" Value="32768" />
<Define Name="KMOD_CTRL" Value="192" />
<Define Name="KMOD_SHIFT" Value="3" />
<Define Name="KMOD_ALT" Value="768" />
<Define Name="KMOD_GUI" Value="3072" />
<Define Name="SEEK_SET" Value="0" />
<Define Name="SEEK_CUR" Value="1" />
<Define Name="SEEK_END" Value="2" />
<Define Name="LOGTYPE_NONE" Value="0" />
<Define Name="LOGTYPE_VERBOSE" Value="1" />
<Define Name="LOGTYPE_DEBUG" Value="2" />
<Define Name="LOGTYPE_INFO" Value="3" />
<Define Name="LOGTYPE_WARN" Value="4" />
<Define Name="LOGTYPE_ERROR" Value="5" />
<Define Name="LOGTYPE_CRITICAL" Value="6" />
<Define Name="COLOUR_TRANSPARENT" Value="0" />
<Define Name="COLOUR_WHITE" Value="4294967295" />
<Define Name="COLOUR_BLACK" Value="4278190080" />
<Define Name="COLOUR_RED" Value="4294901760" />
<Define Name="COLOUR_LIME" Value="4278255360" />
<Define Name="COLOUR_BLUE" Value="4278190335" />
<Define Name="COLOUR_YELLOW" Value="4294967040" />
<Define Name="COLOUR_AQUA" Value="4278255615" />
<Define Name="COLOUR_FUCHSIA" Value="4294902015" />
<Define Name="COLOUR_SKYBLUE" Value="4284927231" />
<Define Name="COLOUR_SILVER" Value="4291019715" />
<Define Name="COLOUR_GREEN" Value="4278222592" />
<Define Name="COLOUR_ORANGE" Value="4294934272" />
<Define Name="INVALID_NETWORK_ID" Value="-1" />
<Define Name="INVALID_CLIENT_ID" Value="-1" />
<Define Name="CHAT_TYPE_NONE" Value="0" />
<Define Name="CHAT_TYPE_CHAT" Value="1" />
<Define Name="CHAT_TYPE_INFO" Value="2" />
<Define Name="CHAT_TYPE_DEBUG" Value="3" />
<Define Name="SERVER_VERSION_MAJOR" Value="0" />
<Define Name="SERVER_VERSION_MINOR" Value="0" />
<Define Name="SERVER_VERSION_PATCH" Value="1" />
<Define Name="GAME_UNKNOWN" Value="0" />
<Define Name="GAME_MAFIA_ONE" Value="10" />
<Define Name="GAME_MAFIA_TWO" Value="11" />
<Define Name="GAME_MAFIA_THREE" Value="12" />
<Define Name="GAME_MAFIA_ONE_DE" Value="13" />
<Define Name="ELEMENT_ELEMENT" Value="0" />
<Define Name="ELEMENT_ENTITY" Value="6" />
<Define Name="ELEMENT_PED" Value="14" />
<Define Name="ELEMENT_PLAYER" Value="30" />
<Define Name="ELEMENT_VEHICLE" Value="38" />
</Defines>

View File

@@ -0,0 +1,424 @@
<?xml version="1.0" ?>
<Documentation>
<!--
Mask Values
b - bool
i - int32
f - float
s - string
c - function/callback
x - class/instance
z - vector2D
v - vector3D
t - thiscall
| - optional arguments
* - infinite arguments
. - any type
-->
<Namespace Name="global">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="thisResource" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localClient" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="localPlayer" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="toColour" Mask="iii|i" RequiredArguments="3" Obsolete="false" />
<Function Name="collectAllGarbage" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="inPoly" Mask="z*" RequiredArguments="1" Obsolete="false" />
<Function Name="addEvent" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="addEventHandler" Mask="sf" RequiredArguments="2" Obsolete="false" />
<Function Name="removeEventHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="bindEventHandler" Mask="sxf" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindEventHandler" Mask="sx" RequiredArguments="2" Obsolete="false" />
<Function Name="triggerEvent" Mask="s|x*" RequiredArguments="1" Obsolete="false" />
<Function Name="addCommandHandler" Mask="sc|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeCommandHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="hasCommandHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="consoleCommand" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="setTimeout" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setInterval" Mask="ci*" RequiredArguments="2" Obsolete="false" />
<Function Name="setImmediate" Mask="c*" RequiredArguments="1" Obsolete="false" />
<Function Name="clearTimeout" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearInterval" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="clearImmediate" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="bindKey" Mask="iic" RequiredArguments="3" Obsolete="false" />
<Function Name="unbindKey" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="unbindAllKeys" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="findResourceByName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="getResources" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="exportFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="openFile" Mask="s|b" RequiredArguments="1" Obsolete="false" />
<Function Name="createFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="loadTextFile" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="saveTextFile" Mask="ss" RequiredArguments="2" Obsolete="false" />
<Function Name="addNetworkHandler" Mask="sc" RequiredArguments="2" Obsolete="false" />
<Function Name="removeNetworkHandler" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="httpGet" Mask="sscc" RequiredArguments="4" Obsolete="false" />
<Function Name="message" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="messageClient" Mask="sx|i" RequiredArguments="2" Obsolete="false" />
<Function Name="messageAllExcept" Mask="sx|i" RequiredArguments="2" Obsolete="false" />
<Function Name="getConsole" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClients" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getClient" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="destroyElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getClientFromPlayerElement" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementsByType" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromId" Mask="i" RequiredArguments="1" Obsolete="false" />
<Function Name="getElementFromName" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="addToWorld" Mask="x" RequiredArguments="1" Obsolete="true" />
<Function Name="registerNetObject" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="triggerNetworkEvent" Mask="sx*" RequiredArguments="2" Obsolete="false" />
<Function Name="spawnPlayer" Mask="xsv|f" RequiredArguments="3" Obsolete="false" />
<Class Name="Stream">
<Property Name="length" ReadOnly="true" Obsolete="false" Type="int64" />
<Property Name="position" ReadOnly="true" Obsolete="false" Type="int64" />
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readBytes" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="readString" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="true" />
<Function Name="writeBytes" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="writeString" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="readInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt8" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt16" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt32" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readUInt64" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readFloat" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readDouble" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="writeInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt8" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt16" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt32" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeUInt64" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="writeFloat" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="writeDouble" Mask="tf" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="TextReader">
<Function Name="close" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="loadText" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readLine" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="readCharacter" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Matrix4x4">
<Property Name="m11" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m12" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m13" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m14" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m21" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m22" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m23" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m24" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m31" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m32" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m33" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m34" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m41" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m42" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m43" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="m44" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="setIdentity" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setTranslate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setScale" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateX" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateY" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotateZ" Mask="tf" RequiredArguments="1" Obsolete="false" />
<Function Name="setRotate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="setMultiply" Mask="txx*" RequiredArguments="2" Obsolete="false" />
<Function Name="multiply" Mask="tx*" RequiredArguments="1" Obsolete="false" />
<Function Name="setInverse" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="transformCoordinate" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="getElement" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="setElement" Mask="tif" RequiredArguments="2" Obsolete="false" />
<Function Name="getVector3" Mask="ti" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Vec2">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="interpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tzf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Vec3">
<Property Name="x" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="y" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="z" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="length" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="squaredLength" ReadOnly="true" Obsolete="false" Type="number" />
<Function Name="distance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="squaredDistance" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="dotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="absDotProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="normalise" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="crossProduct" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="midPoint" Mask="tv" RequiredArguments="1" Obsolete="false" />
<Function Name="addPolar" Mask="tff" RequiredArguments="2" Obsolete="false" />
<Function Name="addSpherical" Mask="tfff" RequiredArguments="3" Obsolete="false" />
<Function Name="interpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="extrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalInterpolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="sphericalExtrapolate" Mask="tvf" RequiredArguments="2" Obsolete="false" />
<Function Name="cartesianToPolar" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="cartesianToSpherical" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Event">
<Class Name="CancellableEvent">
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
<Class Name="Timer" />
<Class Name="KeyEvent">
<Property Name="keyCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="scanCode" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="mod" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="repeat" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="down" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="preventDefault" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="isDefaultPrevented" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="XmlElement">
<Property Name="childrenCount" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="parent" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="text" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="attributes" ReadOnly="true" Obsolete="false" />
<Function Name="clear" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getStringAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getBoolAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getIntegerAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="getFloatAttribute" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="XmlDocument">
<Property Name="rootElement" ReadOnly="true" Obsolete="false" Type="Object" />
<Function Name="load" Mask="tx" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Resource">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="isStarted" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isStarting" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="exports" ReadOnly="true" Obsolete="false" />
<Function Name="start" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="stop" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="restart" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getExport" Mask="ts" RequiredArguments="1" Obsolete="false" />
</Class>
<Class Name="Client">
<Property Name="index" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="gameVersion" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="player" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="administrator" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="console" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="ip" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ping" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="despawnPlayer" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="disconnect" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Element">
<Property Name="id" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="type" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="netFlags" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="isLocal" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isSyncer" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isOwner" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="syncer" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="syncerId" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="dimension" ReadOnly="false" Obsolete="false" Type="int" />
<Property Name="parent" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="children" ReadOnly="true" Obsolete="false" />
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="resource" ReadOnly="false" Obsolete="false" Type="Object" />
<Property Name="streamInDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="streamOutDistance" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="position" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="rotation" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Function Name="isType" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="setData" Mask="ts.|b" RequiredArguments="2" Obsolete="false" />
<Function Name="removeData" Mask="ts" RequiredArguments="1" Obsolete="false" />
<Function Name="removeAllData" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setSyncer" Mask="tx|b" RequiredArguments="1" Obsolete="false" />
<Function Name="isCreatedFor" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="clearExistsFor" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="setExistsFor" Mask="txb" RequiredArguments="2" Obsolete="false" />
<Function Name="existsFor" Mask="tx" RequiredArguments="1" Obsolete="false" />
<Function Name="getRotation" Mask="t" RequiredArguments="0" Obsolete="true" />
<Function Name="setRotation" Mask="tv" RequiredArguments="1" Obsolete="true" />
<Class Name="Entity">
<Property Name="model" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="heading" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="modelIndex" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="velocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="turnVelocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Property Name="rotationVelocity" ReadOnly="false" Obsolete="false" Type="Vector3D" />
<Class Name="Ped">
<Property Name="skin" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="vehicle" ReadOnly="true" Obsolete="false" Type="Object" />
<Property Name="seat" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="health" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="animationState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="isEnteringVehicle" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="isExitingVehicle" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="giveWeapon" Mask="ti|ii" RequiredArguments="1" Obsolete="false" />
<Class Name="Player" />
</Class>
<Class Name="Vehicle">
<Property Name="siren" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="engine" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="lights" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="fuel" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="wheelAngle" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="speedLimit" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="engineRPM" ReadOnly="false" Obsolete="false" Type="number" />
<Property Name="engineHealth" ReadOnly="false" Obsolete="false" Type="number" />
<Function Name="fix" Mask="t" RequiredArguments="0" Obsolete="false" />
<Function Name="getOccupant" Mask="ti" RequiredArguments="1" Obsolete="false" />
<Function Name="getOccupants" Mask="t" RequiredArguments="0" Obsolete="false" />
</Class>
</Class>
</Class>
<Class Name="NetObjectFlags">
<Property Name="registered" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="deleting" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="onAllDimensions" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="forcedSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="findSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="sendSync" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="distanceStreaming" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="alwaysExistForSyncer" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="defaultExistance" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="transient" ReadOnly="false" Obsolete="false" Type="bool" />
<Property Name="onlySyncIfDetached" ReadOnly="false" Obsolete="false" Type="bool" />
</Class>
<Namespace Name="reflection">
<Function Name="clone" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="move" Mask="xx" RequiredArguments="2" Obsolete="false" />
<Function Name="tostring" Mask="x" RequiredArguments="1" Obsolete="false" />
<Function Name="createFunction" Mask="c" RequiredArguments="1" Obsolete="false" />
<Function Name="call" Mask="x" RequiredArguments="1" Obsolete="false" />
<Class Name="Function" />
</Namespace>
<Namespace Name="module">
<Namespace Name="hashing">
<Function Name="encodeBase64" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="decodeBase64" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="md5" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha1" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha224" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha256" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha384" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="sha512" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd128" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd160" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd256" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="ripemd320" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="whirlpool" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="geoip">
<Function Name="getCountryName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCountryISO" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getContinentName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getContinentCode" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCityName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getPostalCode" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getSubdivisionName" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getSubdivisionISO" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getTimeZoneName" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="mysql">
<Function Name="connect" Mask="" RequiredArguments="0" Obsolete="false" />
<Class Name="Connection">
<Property Name="ping" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="insertId" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="affectedRows" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="warningCount" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="errorNum" ReadOnly="true" Obsolete="false" Type="void" />
<Property Name="error" ReadOnly="true" Obsolete="false" Type="void" />
<Function Name="query" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="close" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="escapeString" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="selectDatabase" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="changeUser" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="info" Mask="" RequiredArguments="0" Obsolete="false" />
</Class>
<Class Name="Result">
<Property Name="numRows" ReadOnly="true" Obsolete="false" Type="void" />
<Function Name="free" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchAssoc" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchAssoc" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="fetchRow" Mask="" RequiredArguments="0" Obsolete="false" />
</Class>
</Namespace>
</Namespace>
<Namespace Name="sdl">
<Property Name="platform" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
<Function Name="getModState" Mask="" RequiredArguments="0" Obsolete="false" />
</Namespace>
<Namespace Name="platform">
<Property Name="name" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="modState" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="ticks" ReadOnly="true" Obsolete="false" Type="int" />
</Namespace>
<Namespace Name="server">
<Property Name="game" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="name" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="gameMode" ReadOnly="false" Obsolete="false" Type="string" />
<Property Name="port" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="maxClients" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="rcon" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="rconPort" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="listed" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="httpServer" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="httpPort" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="minClientVersion" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="syncInterval" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="syncMethod" ReadOnly="true" Obsolete="false" Type="int" />
<Property Name="duplicateNames" ReadOnly="true" Obsolete="false" Type="bool" />
<Property Name="streamInDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="streamOutDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="pickupStreamInDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="pickupStreamOutDistance" ReadOnly="true" Obsolete="false" Type="number" />
<Property Name="logPath" ReadOnly="true" Obsolete="false" Type="string" />
<Property Name="syncLocalEntities" ReadOnly="true" Obsolete="false" Type="bool" />
<Function Name="setRule" Mask="ss" RequiredArguments="2" Obsolete="false" />
<Function Name="getRule" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="banIP" Mask="s|i" RequiredArguments="1" Obsolete="false" />
<Function Name="unbanIP" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="unbanAllIPs" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="isIPBanned" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="shutdown" Mask="" RequiredArguments="0" Obsolete="false" />
<Function Name="getCVar" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="setPassword" Mask="s" RequiredArguments="1" Obsolete="false" />
</Namespace>
<Namespace Name="mafia">
<Property Name="mapName" ReadOnly="true" Obsolete="false" Type="string" />
<Function Name="changeMap" Mask="s" RequiredArguments="1" Obsolete="false" />
<Function Name="createExplosion" Mask="vff" RequiredArguments="3" Obsolete="false" />
<Function Name="createVehicle" Mask="sv|f" RequiredArguments="2" Obsolete="false" />
<Function Name="createPlayer" Mask="sv|f" RequiredArguments="2" Obsolete="false" />
<Function Name="createPed" Mask="sv|f" RequiredArguments="2" Obsolete="false" />
<Function Name="fadeScreen" Mask="xbf|i" RequiredArguments="3" Obsolete="false" />
<Namespace Name="hud">
<Function Name="message" Mask="xsi" RequiredArguments="3" Obsolete="false" />
<Function Name="enableMap" Mask="xb" RequiredArguments="2" Obsolete="false" />
<Function Name="announce" Mask="xsf" RequiredArguments="3" Obsolete="false" />
<Function Name="showCountdown" Mask="xi" RequiredArguments="2" Obsolete="false" />
</Namespace>
</Namespace>
</Namespace>
</Documentation>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" ?>
<EventTypes>
<!--Called when a resource starts-->
<EventType Name="OnResourceStart" Hash="1143708828" Arguments="1" CanPreventDefault="true" />
<!--Called when an element is about to stream in-->
<EventType Name="OnElementStreamIn" Hash="2759455221" Arguments="2" CanPreventDefault="true" />
<!--Called when a resource stops-->
<EventType Name="OnResourceStop" Hash="1347867548" Arguments="2" CanPreventDefault="true" />
<!--Called when the player has joined the game-->
<EventType Name="OnPlayerJoined" Hash="3833973824" Arguments="1" CanPreventDefault="false" />
<!--Called when a player is attempting to connect-->
<EventType Name="OnPlayerConnect" Hash="2611712496" Arguments="1" CanPreventDefault="true" />
<!--Called when a player has connected and is joining-->
<EventType Name="OnPlayerJoin" Hash="3624951888" Arguments="1" CanPreventDefault="false" />
<!--Called every process-->
<EventType Name="OnProcess" Hash="3150131130" Arguments="1" CanPreventDefault="false" />
<!--Called when a player disconnects-->
<EventType Name="OnPlayerQuit" Hash="3017502482" Arguments="2" CanPreventDefault="false" />
<!--Called when a player types a command-->
<EventType Name="OnPlayerCommand" Hash="1638826555" Arguments="3" CanPreventDefault="true" />
<!--Called when a player chats-->
<EventType Name="OnPlayerChat" Hash="2515290669" Arguments="2" CanPreventDefault="true" />
<!--Called when the server finished the start sequence-->
<EventType Name="OnServerStart" Hash="3318682471" Arguments="0" CanPreventDefault="false" />
<!--Called when an element is about to stream out-->
<EventType Name="OnElementStreamOut" Hash="3852636898" Arguments="2" CanPreventDefault="true" />
<!--Called when an element is about to be destroyed-->
<EventType Name="OnElementDestroy" Hash="696839637" Arguments="1" CanPreventDefault="true" />
<!--Called when a ped is finished entering a vehicle.-->
<EventType Name="OnPedEnteredVehicle" Hash="800199306" Arguments="3" CanPreventDefault="false" />
<!--Called when a ped has finished exiting a vehicle.-->
<EventType Name="OnPedExitedVehicle" Hash="1591215844" Arguments="3" CanPreventDefault="false" />
<!--Called when a ped is started entering a vehicle.-->
<EventType Name="OnPedEnteringVehicle" Hash="3211811326" Arguments="3" CanPreventDefault="false" />
<!--Called when a ped has started exiting a vehicle.-->
<EventType Name="OnPedExitingVehicle" Hash="353075125" Arguments="3" CanPreventDefault="false" />
<!--Called when a ped dies.-->
<EventType Name="OnPedDeath" Hash="2417618960" Arguments="4" CanPreventDefault="false" />
<!--Called when a ped is spawned.-->
<EventType Name="OnPedSpawn" Hash="3880839897" Arguments="1" CanPreventDefault="false" />
<!--Called when a ped falls.-->
<EventType Name="OnPedFall" Hash="2722461453" Arguments="1" CanPreventDefault="false" />
</EventTypes>

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
files/images/flags/cn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
files/images/flags/de.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

BIN
files/images/flags/fi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/fr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
files/images/flags/jp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
files/images/flags/pl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/ru.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
files/images/flags/sa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
files/images/flags/sk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
files/images/flags/uk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -1,8 +0,0 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}

View File

@@ -1,397 +0,0 @@
{
"TranslationProvidedBy": "Renzuka Ctone",
"LocaleEnglishName": "Chinese",
"LocaleNativeName": "Chinese",
"LocaleOffer": "This server is available in English. Use {1} to use it.",
"LocaleChanged1": "Your language is now set to {1}",
"LocaleChanged2": "The server will now display messages in {1}",
"LocaleChangedNote": "This does not change messages from other players",
"AccentsListHeader": "Accents",
"HeaderHelpMainList": "Help Categories",
"AccentNotFound": "Accent not found",
"AccentSet": "You set your accent to {1}",
"AnimationNotFound": "That animation doesn't exist",
"AnimationCommandTip": "Use {1} to see a list of valid animations",
"AnimationInvalidDistance": "The distance must be between 0 and 3",
"AnimationStopCommandTip": "Use {1} to stop your animation",
"CantBanClient": "You cannot ban this person",
"PlayerAccountBanned": "{1} has been account banned",
"ClanNotFound": "Clan not found",
"ClanNameTaken": "A clan with that name already exists",
"PlayerNotFound": "Player not found",
"ClanCantRemoveRanks": "You can't remove clan ranks",
"ClanCantAddRanks": "You can't add clan ranks",
"ClanRankNotFound": "Clan rank not found",
"ClanCantChangeMemberTag": "You can not change clan member's tags",
"ClanPlayerNotInSameClan": "That player is not in your clan",
"ClanCantChangeRankLevel": "You can not change clan rank's level",
"ClanCantChangeRankTag": "You can not change clan rank's tags",
"NameNotRegistered": "Your name is not registered! Use {1} to make an account.",
"AutomaticLoginIPToggle": "Automatic login by IP is now {1}",
"CouldNotRegisterAccount": "There was a problem creating your account. Please contact an admin.",
"RandomTipsToggle": "Random tips are now {1}",
"ActionTipsToggle": "Action tips are now {1}",
"AutoSpawnLastCharToggle": "Automatic spawn as last used character is {1}",
"AccountGUISettingToggle": "GUI is now {1}",
"On": "On",
"Off": "Off",
"Yes": "Yes",
"No": "No",
"True": "True",
"False": "False",
"Locked": "Locked",
"Unlocked": "Unlocked",
"PasswordNotGoodEnough": "The new password must meet the requirements!",
"PasswordNeedsBase": "Passwords must have at least {1}",
"PasswordNeedsCapitals": "{1} capital letters",
"PasswordNeedsNumbers": "{1} numbers",
"PasswordNeedsSymbols": "{1} symbols",
"PasswordsDontMatch": "The new password and confirm new password aren't the same!",
"PasswordChanged": "Your password has been changed!",
"AutoLoggedInIP": "You have been automatically logged in by IP!",
"WelcomeBack": "Welcome back to {1}, {2}! Please {3} to continue.",
"WelcomeNewPlayer": "Welcome to {1}, {2}! Please {3} to play.",
"InvalidPlayer": "Player not found!",
"InvalidBusiness": "Business not found!",
"InvalidHouse": "House not found!",
"InvalidVehicle": "Vehicle not found!",
"InvalidClan": "Clan not found!",
"InvalidClanRank": "Clan rank not found!",
"InvalidJob": "Job not found!",
"InvalidItem": "Item not found!",
"InvalidItemType": "Item type not found!",
"InvalidRadioStation": "Radio station not found!",
"InvalidGate": "Gate not found!",
"EntersProperty": "opens the door and enters the {1}",
"ExitsProperty": "opens the door and exits the {1}",
"EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked",
"PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.",
"NoBusinessWithItemType": "There is no business with that item available",
"HeaderKeyBinds": "Key Binds",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealershipHelp": "Vehicle Dealership Help",
"HeaderJobHelp": "Job Help",
"HeaderChatHelp": "Chat Help",
"HeaderServerRules": "Server Rules",
"HeaderWebsiteInfo": "Website",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animation List",
"HeaderPayAndSprayHelp": "Pay and Spray Help",
"HeaderAmmunationHelp": "Ammunation Help",
"HeaderVehicleTuneupHelp": "Vehicle Tune Help",
"HeaderBindableKeysHelp": "Bindable Keys",
"HeaderSkinHelp": "Clothes/Skin Help",
"HeaderBusinessHelp": "Business Help",
"HeaderClanHelp": "Clan Help",
"HeaderPlayerVehiclesList": "Player Vehicles ({1})",
"HeaderPlayerBusinessesList": "Player Businesses ({1})",
"HeaderClansList": "Clan List",
"HeaderAdminsList": "Admin List",
"HeaderBadgeInfo": "Badge Information",
"HeaderAccentsList": "Accent List",
"HeaderPlayerInfo": "Player Information ({1})",
"HeaderWealthandTaxHelp": "Wealth and Tax Information",
"HeaderCommandInfo": "Command Information ({1})",
"HeaderRadioHelp": "Radio Help",
"HeaderRadioStationsList": "Radio Stations",
"HeaderKeyBindsList": "Key Binds List",
"RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%",
"VolumeLevelNotNumber": "The volume level must be a number",
"RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!",
"ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})",
"ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})",
"ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})",
"ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})",
"RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.",
"HouseDoorLock": "House {1} {2}!",
"BusinessDoorLock": "Business {1} {2}!",
"ServerGameModeRestarting": "The server game mode is restarting!",
"HeaderSelfItemList": "Your Inventory",
"HeaderPlayerItemList": "Player Inventory ({1})",
"HeaderHouseItemList": "House Inventory",
"HeaderBusinessFloorItemList": "Business Inventory (For Sale)",
"HeaderBusinessStorageItemList": "Business Inventory (Storage)",
"HeaderItemItemList": "{1}'s Inventory",
"ItemSlotNotNumber": "The item slot must be a number",
"ItemSlotMustBeBetween": "The item slot must be between {1} and {2}!",
"UseItemBugged": "The item you're trying to use is bugged. A bug report has been sent to the server developers.",
"PickupItemBugged": "The item you're trying to pickup is bugged. A bug report has been sent to the server developers.",
"DropItemBugged": "The item you're trying to drop is bugged. A bug report has been sent to the server developers.",
"HandsBusy": "Your hands are busy",
"CantUseItemInSkinChange": "You can't use an item while customizing your appearance",
"CantDropItemInSkinChange": "You can't drop an item while customizing your appearance",
"CantPickupItemInSkinChange": "You can't pickup an item while customizing your appearance",
"CantSwitchItemInSkinChange": "You can't switch an item while customizing your appearance",
"CantGiveItemInSkinChange": "You can't give an item while customizing your appearance",
"CantTakeItemInSkinChange": "You can't take an item while customizing your appearance",
"ItemUnequippableNoAmmo": "The {1} in slot {2} has no ammo, and can't be equipped!",
"NoSpaceSelfInventory": "You don't have any more space in your inventory",
"Business": "business",
"House": "house",
"Clan": "clan",
"Vehicle": "vehicle",
"Item": "item",
"ItemType": "item type",
"Gate": "gate",
"Door": "door",
"ClanRank": "clan rank",
"JobRank": "job rank",
"RadioStation": "radio station",
"Months": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"WeekDays": [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"CardinalDirections": [
"North",
"Northeast",
"East",
"Southeast",
"South",
"Southwest",
"West",
"Northwest"
],
"NewPlayerReadyToPlay": [
"You have been given some cash. Use {1} to find places to buy items.",
"If you need money, jobs are the yellow dots on the radar.",
"For a car, visit the car dealership. You can also use a rental vehicle near spawn or take the train",
"Be sure to read the {1} and use {2} for info."
],
"YourCurrentVehicleDeleted": "The vehicle you were in was deleted.",
"Distance": "Distance",
"Meters": "Meters",
"Feet": "Feet",
"Kilometers": "Kilometers",
"Miles": "Miles",
"MustBeVehicleDriver": "You must be the driver of the vehicle!",
"PlayerJoinedServer": "{1} has joined the game from {1}!",
"PlayerLeftServer": "{1} has left the game! ({1})",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed"
],
"TakeItemFromHouse": "takes a {1} from the house",
"TakeItemFromBusinessStorage": "takes a {1} from the business storage",
"TakeItemFromBusiness": "takes a {1} from the business",
"TakeItemFromItem": "takes a {1} from the {2}",
"TakeItemFromVehicleTrunk": "takes a {1} from the trunk",
"TakeItemFromVehicleDash": "takes a {1} from the glove compartment",
"JobEquipmentInventoryKeyBindTip": "The job equipment is in your inventory. Press {1} to see them.",
"JobEquipmentInventoryCommandTip": "The job equipment is in your inventory. Use {1} to see them.",
"AccountHelp": [
"Do NOT share your password with anybody else. {1} staff will never ask you for your password",
"Use {1} to change your password, and {2} if you forgot it",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Your personal vehicles will save wherever you or somebody else leaves them!",
"Visit dealerships to buy new vehicles (Use {1} for more information)",
"Some commands: {1}",
"Visit a mechanic garage to repair, colour, and tune up your car! {1} for info"
],
"VehicleDealershipHelp": [
"Visit a vehicle dealer to buy new vehicles. Use {1} to find one.",
"At the dealer, enter a car you want to buy, and the price will be shown to you",
"If you want to buy the vehicle, use {1} and you will be given keys to test drive it around the parking lot.",
"Drive away from the dealership with the new vehicle to confirm the purchase."
],
"JobHelp": [
"Visit job locations to get a job and earn money. Look for yellow spots on the map",
"At a job location, use {1} to get the job. Use {2} to quit your job",
"Use {1} to begin working. You can also get a job {2} and {3}",
"Most job vehicles are locked. Use {1} near one to enter it.",
"When entering a job vehicle, information on how to do the job will be shown to you."
],
"ChatHelp": [
"There are two main types of chat: out-of-character (OOC) and in-character (IC)",
"Mixing these two types is not proper roleplay. See {1} for info.",
"Some chat commands: {1}",
"Some have shorter names available ({1} to talk, {2} to shout, etc)"
],
"ServerRulesHelp": [
"Unrealistic actions (powergaming) are not allowed. You aren't superman.",
"No terrorist or terrorism roleplay is allowed.",
"Always follow instructions given by moderators and admins.",
"Do not mix the chats (metagaming). You can't use info in IC that was received OOC",
"Keep English in main chats. If you aren't good at English, use {1}"
],
"AnimationHelp": [
"Animations allow you to enhance roleplay with visual actions",
"Use {1} or {2} with a name to use an animation.",
"To see a list of animations, use {1}"
],
"WeaponHelp": [
"Visit an gun store to buy weapons. Use {1} to find one.",
"Buying a weapon requires a weapon license.",
"Weapon licenses are managed by the police department. Apply there to get one.",
"Weapons can also be purchased illegally from some businesses, weapon dealers, and clans."
],
"SkinHelp": [
"At a clothing store, use {1} to purchase clothes",
"When you have a clothing item, equip and use it like any other item to show the skin selection (check {1} to learn how to use items)",
"Some skins are restricted to jobs, clans, or for other reasons."
],
"KeyBindHelp": [
"You can set your own key binds. Use {1} to see your binded keys.",
"Use {1} to add a new keybind and {2} to remove one.",
"Default keys are: {1} for vehicle engine, {1} for lights, and {3} for lock/unlock",
"Press {1} to see your items and {2} to equip an item or {3} to unequip all.",
"Press {1} to use the item you're holding, press {2} to drop it, or press {3} to pickup an item from the ground."
],
"BusinessHelp": [
"Use {1} to purchase items or {2} to see a list of what's for sale at any business",
"Businesses are shown with blue names above the icon at their entrance.",
"Business owner commands: {1}",
"A new car for sale will appear when you drive away from the dealer."
],
"ClanHelp": [
"Ask an administrator to create a clan (Similar to factions/groups/families)",
"Clan owners have full control over their clan once it's created",
"Clan commands: {1}",
"More clan commands: {1}"
],
"RadioStationHelp": [
"Use {1} to set the station for your vehicle, house, or business",
"Use {2} to see a list of stations",
"You can change your radio streaming volume using {1} with 0-100 as the percent"
],
"WealthAndTaxHelp": [
"Your taxes on payday are {1} percent of your calculated wealth.",
"Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.",
"Each vehicle is {1}, each house is {2}, and each business is {3}",
"Use {1} to see your current wealth, and {2} to see how much you'll pay in tax each payday"
],
"MustBeInAVehicle": "You need to be in a vehicle!",
"MustBeInOrNearVehicle": "You need to be in or near a vehicle!",
"MustBeInVehicleFrontSeat": "You need to be in the vehicle front seats!",
"MustBeInVehicleDriverSeat": "You need to be the driver!",
"DontHaveVehicleKey": "You don't have a key for this vehicle!",
"NoGateAccess": "You don't have access to this gate!",
"GateBroken": "This gate is broken!",
"GateHacked": "The gate does not respond!",
"RadioJammed": "You hear only static from the radio.",
"VehicleNotForSale": "This vehicle is not for sale!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "This business is not for sale!",
"BusinessNotForRent": "This business is not for rent!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "This house is not for rent!",
"DealershipPurchaseTestDrive": "Drive the vehicle away from the dealership to buy it, or get out to cancel.",
"DealershipPurchaseExitedVehicle": "You canceled the vehicle purchase by exiting the vehicle!",
"VehiclePurchaseComplete": "This vehicle is now yours! It will save wherever you leave it.",
"VehiclePurchaseNotEnoughMoney": "You don't have enough money to buy this vehicle!",
"HousePurchaseNotEnoughMoney": "You don't have enough money to buy this house!",
"BusinessPurchaseNotEnoughMoney": "You don't have enough money to buy this business!",
"Locales": {
"English": "English",
"Russian": "Russian",
"Spanish": "Spanish",
"German": "German",
"Dutch": "Dutch",
"Polish": "Polish"
},
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items"
}

View File

@@ -1,397 +0,0 @@
{
"TranslationProvidedBy": "Vortrex",
"LocaleEnglishName": "English",
"LocaleNativeName": "English",
"LocaleOffer": "This server is available in English. Use {1} to use it.",
"LocaleChanged1": "Your language is now set to {1}",
"LocaleChanged2": "The server will now display messages in {1}",
"LocaleChangedNote": "This does not change messages from other players",
"AccentsListHeader": "Accents",
"HeaderHelpMainList": "Help Categories",
"AccentNotFound": "Accent not found",
"AccentSet": "You set your accent to {1}",
"AnimationNotFound": "That animation doesn't exist",
"AnimationCommandTip": "Use {1} to see a list of valid animations",
"AnimationInvalidDistance": "The distance must be between 0 and 3",
"AnimationStopCommandTip": "Use {1} to stop your animation",
"CantBanClient": "You cannot ban this person",
"PlayerAccountBanned": "{1} has been account banned",
"ClanNotFound": "Clan not found",
"ClanNameTaken": "A clan with that name already exists",
"PlayerNotFound": "Player not found",
"ClanCantRemoveRanks": "You can't remove clan ranks",
"ClanCantAddRanks": "You can't add clan ranks",
"ClanRankNotFound": "Clan rank not found",
"ClanCantChangeMemberTag": "You can not change clan member's tags",
"ClanPlayerNotInSameClan": "That player is not in your clan",
"ClanCantChangeRankLevel": "You can not change clan rank's level",
"ClanCantChangeRankTag": "You can not change clan rank's tags",
"NameNotRegistered": "Your name is not registered! Use {1} to make an account.",
"AutomaticLoginIPToggle": "Automatic login by IP is now {1}",
"CouldNotRegisterAccount": "There was a problem creating your account. Please contact an admin.",
"RandomTipsToggle": "Random tips are now {1}",
"ActionTipsToggle": "Action tips are now {1}",
"AutoSpawnLastCharToggle": "Automatic spawn as last used character is {1}",
"AccountGUISettingToggle": "GUI is now {1}",
"On": "On",
"Off": "Off",
"Yes": "Yes",
"No": "No",
"True": "True",
"False": "False",
"Locked": "Locked",
"Unlocked": "Unlocked",
"PasswordNotGoodEnough": "The new password must meet the requirements!",
"PasswordNeedsBase": "Passwords must have at least {1}",
"PasswordNeedsCapitals": "{1} capital letters",
"PasswordNeedsNumbers": "{1} numbers",
"PasswordNeedsSymbols": "{1} symbols",
"PasswordsDontMatch": "The new password and confirm new password aren't the same!",
"PasswordChanged": "Your password has been changed!",
"AutoLoggedInIP": "You have been automatically logged in by IP!",
"WelcomeBack": "Welcome back to {1}, {2}! Please {3} to continue.",
"WelcomeNewPlayer": "Welcome to {1}, {2}! Please {3} to play.",
"InvalidPlayer": "Player not found!",
"InvalidBusiness": "Business not found!",
"InvalidHouse": "House not found!",
"InvalidVehicle": "Vehicle not found!",
"InvalidClan": "Clan not found!",
"InvalidClanRank": "Clan rank not found!",
"InvalidJob": "Job not found!",
"InvalidItem": "Item not found!",
"InvalidItemType": "Item type not found!",
"InvalidRadioStation": "Radio station not found!",
"InvalidGate": "Gate not found!",
"EntersProperty": "opens the door and enters the {1}",
"ExitsProperty": "opens the door and exits the {1}",
"EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked",
"PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.",
"NoBusinessWithItemType": "There is no business with that item available",
"HeaderKeyBinds": "Key Binds",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealershipHelp": "Vehicle Dealership Help",
"HeaderJobHelp": "Job Help",
"HeaderChatHelp": "Chat Help",
"HeaderServerRules": "Server Rules",
"HeaderWebsiteInfo": "Website",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animation List",
"HeaderPayAndSprayHelp": "Pay and Spray Help",
"HeaderAmmunationHelp": "Ammunation Help",
"HeaderVehicleTuneupHelp": "Vehicle Tune Help",
"HeaderBindableKeysHelp": "Bindable Keys",
"HeaderSkinHelp": "Clothes/Skin Help",
"HeaderBusinessHelp": "Business Help",
"HeaderClanHelp": "Clan Help",
"HeaderPlayerVehiclesList": "Player Vehicles ({1})",
"HeaderPlayerBusinessesList": "Player Businesses ({1})",
"HeaderClansList": "Clan List",
"HeaderAdminsList": "Admin List",
"HeaderBadgeInfo": "Badge Information",
"HeaderAccentsList": "Accent List",
"HeaderPlayerInfo": "Player Information ({1})",
"HeaderWealthandTaxHelp": "Wealth and Tax Information",
"HeaderCommandInfo": "Command Information ({1})",
"HeaderRadioHelp": "Radio Help",
"HeaderRadioStationsList": "Radio Stations",
"HeaderKeyBindsList": "Key Binds List",
"RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%",
"VolumeLevelNotNumber": "The volume level must be a number",
"RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!",
"ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})",
"ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})",
"ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})",
"ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})",
"RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.",
"HouseDoorLock": "House {1} {2}!",
"BusinessDoorLock": "Business {1} {2}!",
"ServerGameModeRestarting": "The server game mode is restarting!",
"HeaderSelfItemList": "Your Inventory",
"HeaderPlayerItemList": "Player Inventory ({1})",
"HeaderHouseItemList": "House Inventory",
"HeaderBusinessFloorItemList": "Business Inventory (For Sale)",
"HeaderBusinessStorageItemList": "Business Inventory (Storage)",
"HeaderItemItemList": "{1}'s Inventory",
"ItemSlotNotNumber": "The item slot must be a number",
"ItemSlotMustBeBetween": "The item slot must be between {1} and {2}!",
"UseItemBugged": "The item you're trying to use is bugged. A bug report has been sent to the server developers.",
"PickupItemBugged": "The item you're trying to pickup is bugged. A bug report has been sent to the server developers.",
"DropItemBugged": "The item you're trying to drop is bugged. A bug report has been sent to the server developers.",
"HandsBusy": "Your hands are busy",
"CantUseItemInSkinChange": "You can't use an item while customizing your appearance",
"CantDropItemInSkinChange": "You can't drop an item while customizing your appearance",
"CantPickupItemInSkinChange": "You can't pickup an item while customizing your appearance",
"CantSwitchItemInSkinChange": "You can't switch an item while customizing your appearance",
"CantGiveItemInSkinChange": "You can't give an item while customizing your appearance",
"CantTakeItemInSkinChange": "You can't take an item while customizing your appearance",
"ItemUnequippableNoAmmo": "The {1} in slot {2} has no ammo, and can't be equipped!",
"NoSpaceSelfInventory": "You don't have any more space in your inventory",
"Business": "business",
"House": "house",
"Clan": "clan",
"Vehicle": "vehicle",
"Item": "item",
"ItemType": "item type",
"Gate": "gate",
"Door": "door",
"ClanRank": "clan rank",
"JobRank": "job rank",
"RadioStation": "radio station",
"Months": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"WeekDays": [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"CardinalDirections": [
"North",
"Northeast",
"East",
"Southeast",
"South",
"Southwest",
"West",
"Northwest"
],
"NewPlayerReadyToPlay": [
"You have been given some cash. Use {1} to find places to buy items.",
"If you need money, jobs are the yellow dots on the radar.",
"For a car, visit the car dealership. You can also use a rental vehicle near spawn or take the train",
"Be sure to read the {1} and use {2} for info."
],
"YourCurrentVehicleDeleted": "The vehicle you were in was deleted.",
"Distance": "Distance",
"Meters": "Meters",
"Feet": "Feet",
"Kilometers": "Kilometers",
"Miles": "Miles",
"MustBeVehicleDriver": "You must be the driver of the vehicle!",
"PlayerJoinedServer": "{1} has joined the game from {1}!",
"PlayerLeftServer": "{1} has left the game! ({1})",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed"
],
"TakeItemFromHouse": "takes a {1} from the house",
"TakeItemFromBusinessStorage": "takes a {1} from the business storage",
"TakeItemFromBusiness": "takes a {1} from the business",
"TakeItemFromItem": "takes a {1} from the {2}",
"TakeItemFromVehicleTrunk": "takes a {1} from the trunk",
"TakeItemFromVehicleDash": "takes a {1} from the glove compartment",
"JobEquipmentInventoryKeyBindTip": "The job equipment is in your inventory. Press {1} to see them.",
"JobEquipmentInventoryCommandTip": "The job equipment is in your inventory. Use {1} to see them.",
"AccountHelp": [
"Do NOT share your password with anybody else. {1} staff will never ask you for your password",
"Use {1} to change your password, and {2} if you forgot it",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Your personal vehicles will save wherever you or somebody else leaves them!",
"Visit dealerships to buy new vehicles (Use {1} for more information)",
"Some commands: {1}",
"Visit a mechanic garage to repair, colour, and tune up your car! {1} for info"
],
"VehicleDealershipHelp": [
"Visit a vehicle dealer to buy new vehicles. Use {1} to find one.",
"At the dealer, enter a car you want to buy, and the price will be shown to you",
"If you want to buy the vehicle, use {1} and you will be given keys to test drive it around the parking lot.",
"Drive away from the dealership with the new vehicle to confirm the purchase."
],
"JobHelp": [
"Visit job locations to get a job and earn money. Look for yellow spots on the map",
"At a job location, use {1} to get the job. Use {2} to quit your job",
"Use {1} to begin working. You can also get a job {2} and {3}",
"Most job vehicles are locked. Use {1} near one to enter it.",
"When entering a job vehicle, information on how to do the job will be shown to you."
],
"ChatHelp": [
"There are two main types of chat: out-of-character (OOC) and in-character (IC)",
"Mixing these two types is not proper roleplay. See {1} for info.",
"Some chat commands: {1}",
"Some have shorter names available ({1} to talk, {2} to shout, etc)"
],
"ServerRulesHelp": [
"Unrealistic actions (powergaming) are not allowed. You aren't superman.",
"No terrorist or terrorism roleplay is allowed.",
"Always follow instructions given by moderators and admins.",
"Do not mix the chats (metagaming). You can't use info in IC that was received OOC",
"Keep English in main chats. If you aren't good at English, use {1}"
],
"AnimationHelp": [
"Animations allow you to enhance roleplay with visual actions",
"Use {1} or {2} with a name to use an animation.",
"To see a list of animations, use {1}"
],
"WeaponHelp": [
"Visit an gun store to buy weapons. Use {1} to find one.",
"Buying a weapon requires a weapon license.",
"Weapon licenses are managed by the police department. Apply there to get one.",
"Weapons can also be purchased illegally from some businesses, weapon dealers, and clans."
],
"SkinHelp": [
"At a clothing store, use {1} to purchase clothes",
"When you have a clothing item, equip and use it like any other item to show the skin selection (check {1} to learn how to use items)",
"Some skins are restricted to jobs, clans, or for other reasons."
],
"KeyBindHelp": [
"You can set your own key binds. Use {1} to see your binded keys.",
"Use {1} to add a new keybind and {2} to remove one.",
"Default keys are: {1} for vehicle engine, {1} for lights, and {3} for lock/unlock",
"Press {1} to see your items and {2} to equip an item or {3} to unequip all.",
"Press {1} to use the item you're holding, press {2} to drop it, or press {3} to pickup an item from the ground."
],
"BusinessHelp": [
"Use {1} to purchase items or {2} to see a list of what's for sale at any business",
"Businesses are shown with blue names above the icon at their entrance.",
"Business owner commands: {1}",
"A new car for sale will appear when you drive away from the dealer."
],
"ClanHelp": [
"Ask an administrator to create a clan (Similar to factions/groups/families)",
"Clan owners have full control over their clan once it's created",
"Clan commands: {1}",
"More clan commands: {1}"
],
"RadioStationHelp": [
"Use {1} to set the station for your vehicle, house, or business",
"Use {2} to see a list of stations",
"You can change your radio streaming volume using {1} with 0-100 as the percent"
],
"WealthAndTaxHelp": [
"Your taxes on payday are {1} percent of your calculated wealth.",
"Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.",
"Each vehicle is {1}, each house is {2}, and each business is {3}",
"Use {1} to see your current wealth, and {2} to see how much you'll pay in tax each payday"
],
"MustBeInAVehicle": "You need to be in a vehicle!",
"MustBeInOrNearVehicle": "You need to be in or near a vehicle!",
"MustBeInVehicleFrontSeat": "You need to be in the vehicle front seats!",
"MustBeInVehicleDriverSeat": "You need to be the driver!",
"DontHaveVehicleKey": "You don't have a key for this vehicle!",
"NoGateAccess": "You don't have access to this gate!",
"GateBroken": "This gate is broken!",
"GateHacked": "The gate does not respond!",
"RadioJammed": "You hear only static from the radio.",
"VehicleNotForSale": "This vehicle is not for sale!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "This business is not for sale!",
"BusinessNotForRent": "This business is not for rent!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "This house is not for rent!",
"DealershipPurchaseTestDrive": "Drive the vehicle away from the dealership to buy it, or get out to cancel.",
"DealershipPurchaseExitedVehicle": "You canceled the vehicle purchase by exiting the vehicle!",
"VehiclePurchaseComplete": "This vehicle is now yours! It will save wherever you leave it.",
"VehiclePurchaseNotEnoughMoney": "You don't have enough money to buy this vehicle!",
"HousePurchaseNotEnoughMoney": "You don't have enough money to buy this house!",
"BusinessPurchaseNotEnoughMoney": "You don't have enough money to buy this business!",
"Locales": {
"English": "English",
"Russian": "Russian",
"Spanish": "Spanish",
"German": "German",
"Dutch": "Dutch",
"Polish": "Polish"
},
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items"
}

View File

@@ -1,397 +0,0 @@
{
"TranslationProvidedBy": "Suprise444",
"LocaleEnglishName": "Polish",
"LocaleNativeName": "Polski",
"LocaleOffer": "Ten serwer jest dostępny w języku Polskim. Użyj {1} aby go użyć.",
"LocaleChanged1": "Twój język jest ustawiony na {1}",
"LocaleChanged2": "Serwer będzie teraz pokazywał wiadomości w języku {1}",
"LocaleChangedNote": "To nie zmienia wiadomości od innych graczy",
"AccentsListHeader": "Akcenty",
"HeaderHelpMainList": "Pomoc - Kategorie",
"AccentNotFound": "Akcent nie znaleziony",
"AccentSet": "Ustawiłeś swój akcent na {1}",
"AnimationNotFound": "Ta animcja nie istnieje",
"AnimationCommandTip": "Użyj {1} aby zobaczyć listę działających animacji",
"AnimationInvalidDistance": "Dystans musi być między 0 i 3",
"AnimationStopCommandTip": "Użyj {1} aby zatrzymać swoją animacje",
"CantBanClient": "Nie możesz zbanować tej osoby",
"PlayerAccountBanned": "{1} został zbanowany",
"ClanNotFound": "Nie znaleziono klanu",
"ClanNameTaken": "Klan z taką nazwą już istnieje",
"PlayerNotFound": "Nie znaleziono gracza",
"ClanCantRemoveRanks": "Nie możesz usuwać rang klanu",
"ClanCantAddRanks": "Nie możesz dodawać rang klanu",
"ClanRankNotFound": "Nie znaleziono rangi klanu",
"ClanCantChangeMemberTag": "Nie możesz zmienić tagu członka klanu",
"ClanPlayerNotInSameClan": "Ten gracz nie jest w twoim klanie",
"ClanCantChangeRankLevel": "Nie możesz zmienić poziomu rangi klanu",
"ClanCantChangeRankTag": "Nie możesz zmienić tagu rangi klanu",
"NameNotRegistered": "Twoja nazwa nie jest zarejestrowana! Użyj {1} aby stworzyć konto.",
"AutomaticLoginIPToggle": "Automatyczny login przez IP jest teraz {1}",
"CouldNotRegisterAccount": "Napotkano problem podczas tworzenia twojego konta. Proszę skontaktuj się z administratorem.",
"RandomTipsToggle": "Losowe wskazówki są teraz {1}",
"ActionTipsToggle": "Wskazówki akcji są teraz {1}",
"AutoSpawnLastCharToggle": "Automatyczny spawn jako ostatnia postać jest teraz {1}",
"AccountGUISettingToggle": "GUI jest teraz {1}",
"On": "Włączony",
"Off": "Wyłączony",
"Yes": "Tak",
"No": "Nie",
"True": "Prawda",
"False": "Fałsz",
"Locked": "Zamknięty",
"Unlocked": "Otwarty",
"PasswordNotGoodEnough": "Nowe hasło musi spełniać wymagania!",
"PasswordNeedsBase": "Hasło musi mieć przynajmniej {1}",
"PasswordNeedsCapitals": "{1} dużych liter",
"PasswordNeedsNumbers": "{1} numerów",
"PasswordNeedsSymbols": "{1} symboli",
"PasswordsDontMatch": "Hasła nie są takie same!",
"PasswordChanged": "Twoje hasło zostało zmienione!",
"AutoLoggedInIP": "Zostałeś automatycznie zalogowany przez IP!",
"WelcomeBack": "Witaj ponownie w {1}, {2}! Użyj {3} aby kontynuować.",
"WelcomeNewPlayer": "Witaj w {1}, {2}! Użyj {3} aby zagrać.",
"InvalidPlayer": "Praca nie znaleziona!",
"InvalidBusiness": "Biznes nie znaleziony!",
"InvalidHouse": "Mieszkanie nie znalezione!",
"InvalidVehicle": "Pojazd nie znaleziony!",
"InvalidClan": "Klan nie znaleziony!",
"InvalidClanRank": "Ranga klanu nie znaleziona!",
"InvalidJob": "Gracz nie znaleziony!",
"InvalidItem": "Przedmiot nie znaleziony!",
"InvalidItemType": "Rodzaj przedmiot nie znaleziony!",
"InvalidRadioStation": "Stacja radiowa nie znaleziona!",
"InvalidGate": "Brama nie znaleziona!",
"EntersProperty": "otwiera drzwi i wchodzi do {1}",
"ExitsProperty": "otwiera drzwi i wychodzi z {1}",
"EnterExitPropertyDoorLocked": "próbuje otworzyć {1} drzwi, ale nie udaje się, ponieważ są zamknięte",
"PropertyNoInterior": "Ten {1} nie ma wnętrza, ale dalej możesz używaj komend przy ikonie drzwi.",
"NoBusinessWithItemType": "Nie ma biznesu, który posiada ten przedmiot",
"HeaderKeyBinds": "Przypisania klawiszy",
"HeaderAccountHelp": "Pomoc - Konto",
"HeaderVehicleHelp": "Pomoc - Pojazd",
"HeaderVehicleDealershipHelp": "Pomoc - Dealer Samochodów",
"HeaderJobHelp": "Pomoc - Praca",
"HeaderChatHelp": "Pomoc - Czat",
"HeaderServerRules": "Zasady serwera",
"HeaderWebsiteInfo": "Strona",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Lista Animacji",
"HeaderPayAndSprayHelp": "Pomoc - Pay and Spray",
"HeaderAmmunationHelp": "Pomoc - Ammunation",
"HeaderVehicleTuneupHelp": "Pomoc - Ulepszanie Aut",
"HeaderBindableKeysHelp": "Przypisywalne klawisze",
"HeaderSkinHelp": "Pomoc - Ubrania/Skóra",
"HeaderBusinessHelp": "Pomoc - Biznes",
"HeaderClanHelp": "Pomoc - Klan",
"HeaderPlayerVehiclesList": "Pojazdy Gracza ({1})",
"HeaderPlayerBusinessesList": "Biznesy Gracza ({1})",
"HeaderClansList": "Lista Klanów",
"HeaderAdminsList": "Lista Administracji",
"HeaderBadgeInfo": "Informacje o Odznace",
"HeaderAccentsList": "Lista Akcentów",
"HeaderPlayerInfo": "Informacje o Graczu ({1})",
"HeaderWealthandTaxHelp": "Informacje o Bogactwach i Podatkach",
"HeaderCommandInfo": "Informacje o Komendzie ({1})",
"HeaderRadioHelp": "Pomoc - Radio",
"HeaderRadioStationsList": "Stacje Radiowe",
"HeaderKeyBindsList": "Lista przypisań klawiszy",
"RadioVolumeChanged": "{1} Zmieniłeś głośność swojego radia na {2}%",
"VolumeLevelNotNumber": "Poziom głośności musi być liczbą",
"RadioStationLocationInvalid": "Musisz być w aucie, domu, biznesie lub mieć osobite urządzenie by zmienić stacje radiową!",
"ActionBusinessRadioStationChange": "zmienia biznesową stacje radiową na {1} ({2})",
"ActionHouseRadioStationChange": "zmienia domową stacje radiową na {1} ({2})",
"ActionVehicleRadioStationChange": "zmienia samochodową stacje radiową na {1} ({2})",
"ActionItemRadioStationChange": "zmienia stacje {1} na {2} ({3})",
"RandomVehicleCommandsDisabled": "To losowy pojazd uliczny i komendy nie mogą być na nim użyte.",
"HouseDoorLock": "Mieszkanie {1} {2}!",
"BusinessDoorLock": "Biznes {1} {2}!",
"ServerGameModeRestarting": "Tryb gry serwera się restartuje!",
"HeaderSelfItemList": "Twój ekwipunek",
"HeaderPlayerItemList": "Ekwipunek gracza ({1})",
"HeaderHouseItemList": "Ekwipunek mieszkania",
"HeaderBusinessFloorItemList": "Ekwipunek Bizneus (Na sprzedaż)",
"HeaderBusinessStorageItemList": "Ekwipunek Bizenus (Magazyn)",
"HeaderItemItemList": "Ekwipunek {1}",
"ItemSlotNotNumber": "Slot przedmiotu musi być liczbą",
"ItemSlotMustBeBetween": "Slot itemu musi być liczbą między {1} i {2}!",
"UseItemBugged": "Przedmiot, który próbujesz użyć jest popsuty. Zgłoszenie zostało wysłane do deweloperów serwera.",
"PickupItemBugged": "Przedmiot, który próbujesz podnieść jest popsuty. Zgłoszenie zostało wysłane do deweloperów serwera.",
"DropItemBugged": "Przedmiot, który próbujesz upuścić jest popsuty. Zgłoszenie zostało wysłane do deweloperów serwera.",
"HandsBusy": "Twoje ręce są zajęte",
"CantUseItemInSkinChange": "Nie możesz użyć przedmiotu podczas zmieniania swojego wizerunku",
"CantDropItemInSkinChange": "Nie możesz upuścić przedmiotu podczas zmieniania swojego wizerunku",
"CantPickupItemInSkinChange": "Nie możesz podnieść przedmiotu podczas zmieniania swojego wizerunku",
"CantSwitchItemInSkinChange": "Nie możesz zmienić przedmiotu podczas zmieniania swojego wizerunku",
"CantGiveItemInSkinChange": "Nie możesz dać przedmiotu podczas zmieniania swojego wizerunku",
"CantTakeItemInSkinChange": "Nie możesz wziąć przedmiotu podczas zmieniania swojego wizerunku",
"ItemUnequippableNoAmmo": "{1} w slocie {2} nie ma amunicji i nie może zostać użyty!",
"NoSpaceSelfInventory": "Nie masz już miesca w ekwipunku",
"Business": "biznes",
"House": "mieszkanie",
"Clan": "klan",
"Vehicle": "pojazd",
"Item": "przedmiot",
"ItemType": "rodzaj przedmiotu",
"Gate": "brama",
"Door": "drzwi",
"ClanRank": "ranga klanu",
"JobRank": "praca rangi",
"RadioStation": "stacja radiowa",
"Months": [
"Styczeń",
"Luty",
"Marzec",
"Kwiecień",
"Maj",
"Czerwiec",
"Lipiec",
"Sierpień",
"Wrzesień",
"Październik",
"Listopad",
"Grudzień"
],
"WeekDays": [
"Niedziela",
"Poniedziałek",
"Wtorek",
"Środa",
"Czwartek",
"Piątek",
"Sobota"
],
"CardinalDirections": [
"Północ",
"Północny wschód",
"Wschód",
"Południowy zachód",
"Południe",
"Południowy wschód",
"Zachód",
"Północny zachód"
],
"NewPlayerReadyToPlay": [
"Dostałeś trochę pieniędzy. Użyj {1} aby znaleść miejsca do kupowania przedmiotów.",
"Jeżeli potrzebujesz pieniędzy, żółte kropki na mapie to miejsca pracy.",
"Aby zdobyć auto musisz odwiedzić dealera samochodów. Możesz też wypożyczyć samochód przy spawnie lub użyć pociągu",
"Pamiętaj aby przeczytać {1} i użyć {2} aby zdobyć więcej informacji."
],
"YourCurrentVehicleDeleted": "Samochód w którym przebywałeś został usunięty.",
"Distance": "Odległość",
"Meters": "Metry",
"Feet": "Stopy",
"Kilometers": "Kilometry",
"Miles": "Mile",
"MustBeVehicleDriver": "Musisz być kierowcą tego pojazdu!",
"PlayerJoinedServer": "{1} dołączył do gry z {1}!",
"PlayerLeftServer": "{1} wyszedł z gry! ({1})",
"DisconnectReasons": [
"Utracenie Połączenia",
"Odłączenie",
"Niewspierana Wersja",
"Nieprawidłowa Gra",
"Błędne Hasło",
"Niewspierany Plik Wykonalny",
"Odłączenie",
"Zbanowany",
"Nie udane",
"Nieprawidłowa Nazwa",
"Crashed"
],
"TakeItemFromHouse": "bierze {1} z mieszkania",
"TakeItemFromBusinessStorage": "bierze {1} z magazynu biznesu",
"TakeItemFromBusiness": "bierze {1} z biznesu",
"TakeItemFromItem": "bierze {1} z {2}",
"TakeItemFromVehicleTrunk": "bierze {1} z bagażnika",
"TakeItemFromVehicleDash": "bierze {1} ze schowka",
"JobEquipmentInventoryKeyBindTip": "Wyposażenie służbowe jest w twoim ekwipunku. Naciśnij {1} aby je zobaczyć.",
"JobEquipmentInventoryCommandTip": "Wyposażenie służbowe jest w twoim ekwipunku. Użyj {1} aby je zobaczyć.",
"AccountHelp": [
"NIE PODAWAJ nikomu swojego hasła. {1} nigdy nie zapyta cię o twoje hasło",
"Użyj {1} aby zmienić swoje hasło i {2} jeżeli je zapomniałeś",
"Kilka ustawień które możesz użyć: {1}"
],
"VehicleHelp": [
"Twoje osobiste auta zapisują się za każdym razem jak ktoś wyjdzie z gry!",
"Odwiedź dealera samochodów, aby zakupić pojazd (Użyj {1} po więcej informacji)",
"Kilka komend: {1}",
"Odwiedź warsztat mechanika aby naprawić, pokolorować i/lub ulepszyć swój pojazd! {1} po więcej informacji"
],
"VehicleDealershipHelp": [
"Odwiedź dealera samochodów, aby zakupić nowy pojazd. Użyj {1} aby jednego zlokalizować.",
"Przy dealerze samochodów, wejdź do auta, które chcesz kupić i ukaże ci się jego cena.",
"Jeśli chcesz kupić pojazd, użyj {1} i dostanie kluczyki by przetestować je na parkingu.",
"Odjedź od dealera samochodów, aby potwierdzić zakup pojazdu."
],
"JobHelp": [
"Odwiedzaj miejsca pracy aby zarabiać pieniądze. Szkuaj zółtych punktów na mapie",
"Przy miejscu pracy, użyj {1} aby zdobyć prace. Użyj {2} by opuścić swoją pracę",
"Użyj {1} aby zacząć pracę. Możesz też dostać pracę {2} i {3}",
"Większość pojazdów służbowych jest zamknięta. Użyj {1} obok niego aby do niego wsiąść.",
"Przy wsiadaniu do pojazdu służbowego, dostaniesz informacje jak wykonać podjętą pracę."
],
"ChatHelp": [
"Są 2 główne rodzaje chatów: Poza postacią (OOC) i w postaci (IC)",
"Mieszanie tych 2 rodzajów jest nieprawidłowym roleplay'em. Zobacz {1} po więcej informacji.",
"Kilka komend na chacie: {1}",
"Niektóre mają dostępne krótsze nazwy ({1} by rozmawiać, {2} by krzyczeć, itp.)"
],
"ServerRulesHelp": [
"Nierealistyczne akcje (powergaming) są niedozwolone. Nie jesteś superman'em.",
"Roleplay na tle terrorystycznym jest niedozowolony.",
"Zawszę słuchaj się administracji.",
"Nie mieszaj czatów (metagaming). Nie możesz używać informacji w postaci, jeżeli uzyskałeś je poza nią.",
"Używaj języka angielskiego na głównych chatach. Jeżeli nie jestes dobry z angielskiego, użyj {1}"
],
"AnimationHelp": [
"Animacje pozwalają ci bardziej wczuć się w swoją role.",
"Używaj {1} lub {2} z nazwą by użyć animacji.",
"By zobaczyć liste animacji, użyj {1}"
],
"WeaponHelp": [
"Odwiedź sklep z bronią, aby kupić nową broń. Użyj {1} by znaleźć taki sklep.",
"Musisz posiadać licenje na broń, aby takową kupić.",
"Licencje broni są wydawanie przez policję. Zaaplikuj się tam, aby taką zdobyć.",
"Bronie mogą być też kupowane nielegalnie od niektórych bizensów, dealerów broni i klanów."
],
"SkinHelp": [
"W sklepie z ubraniami, użyj {1} aby kupić ubrania.",
"Kiedy masz ubrania, wyposaż się w nie i użyj je jak każdy inny przedmiot by ukazać modyfikacje postaci (sprawdź {1} aby zobaczyć jak używać itemy)",
"Niektóre skiny są dostępne tylko dla niektórych osób, klanów lub z innych powodów."
],
"KeyBindHelp": [
"Możesz zmienić przypisania klawiszy. Użyj {1} aby zobaczyć twoje przypisane klawisze.",
"Użyj {1} aby dodać nowe przypisanie i {2} aby je usunąć.",
"Domyślnymi przyciskami są: {1} aby uruchomić pojazd, {1} aby użyć świateł, and {3} aby otworzyć/zamknąć pojazd",
"Naciśnij {1} aby zobaczyć swoje itemy i {2} aby wyposażyć się w jakiś przedmiot lub {3} aby go schować.",
"Naciśnij {1} aby użyć przedmiot, który trzymasz, naciśnij {2} aby go upuścić lub naciśnij {3} aby podnieść jakiś przedmiot z ziemi."
],
"BusinessHelp": [
"Użyj {1} aby kupować przedmioty lub {2} aby zobaczyć listę co jest na sprzedaż w jakimkolwiek bizensie.",
"Biznesy mają niebieskie nazwy nad ikoną przy ich wejściu.",
"Komendy właściciela biznesu: {1}",
"Nowe auto na sprzedaż pojawi się po odjechaniu od dealera samochodów."
],
"ClanHelp": [
"Zapytaj administratora o stworzenie klanu (Podobne do fakcji/grup/rodzin)",
"Właściciele klanu mają pełną kontrole over nad ich klanem od momentu gdy jest stworzony",
"Komendy klanu: {1}",
"Więcej komend klanu: {1}"
],
"RadioStationHelp": [
"Użyj {1} by ustawić stację twojego auta, mieszkania lub biznesu",
"Użyj {2} by zobaczyć listę stacji",
"Możesz zmienić głośność swojego radia używając {1} i liczbą od 0 do 100 jako procenty"
],
"WealthAndTaxHelp": [
"Twoje podatki przy wypłacie są {1} procentami twojego przeliczonego bogactwa.",
"Twoja przeliczone bogactwo jest obliczone wliczając twoje pojazdy, mieszkania i biznesy, które posiadasz.",
"Każdy pojazd jest {1}, każde mieszkanie jest {2} i każdy biznes jest {3}",
"Użyj {1} aby zobaczyć swoje bogactow i {2} zobaczyć ile będziesz musiał zapłacić przy następnej wypłacie"
],
"MustBeInAVehicle": "Musisz być w pojeździe!",
"MustBeInOrNearVehicle": "Musisz być w lub obok pojazdu!",
"MustBeInVehicleFrontSeat": "Musisz być w przednim siedzeniu pojazdu!",
"MustBeInVehicleDriverSeat": "Musisz być kierowcą pojazdu!",
"DontHaveVehicleKey": "Nie masz klucza do tego pojazdu!",
"NoGateAccess": "Nie masz dostępu do tej bramy!",
"GateBroken": "Ta brama jest popsuta!",
"GateHacked": "Ta brama nie odpowiada!",
"RadioJammed": "Słysysz tylko szumy z radia.",
"VehicleNotForSale": "To auto nie jest na sprzedaż!",
"VehicleNotForRent": "Tego pojazdu nie można wypożyczyć!",
"BusinessNotForSale": "Ten biznes nie jest na sprzedaż!",
"BusinessNotForRent": "Tego biznesu nie można wypożyczyć!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "Tego biznesu nie można wypożyczyć!",
"DealershipPurchaseTestDrive": "Odjedź pojazdem od dealera samochodów aby go kupić, lub wysiądź aby anulować zakup.",
"DealershipPurchaseExitedVehicle": "Anulowałeś kupno pojazdu, ponieważ wysiadłeś z pojazdu!",
"VehiclePurchaseComplete": "Ten pojazd jest teraz twój, zapiszę się nieważne gdzie jest.",
"VehiclePurchaseNotEnoughMoney": "Nie masz wystarczająco dużo funduszy aby kupić to auto!",
"HousePurchaseNotEnoughMoney": "Nie masz wystarczająco dużo funduszy aby kupić to mieszkanie!",
"BusinessPurchaseNotEnoughMoney": "Nie masz wystarczająco dużo funduszy aby kupić ten biznes!",
"Locales": {
"English": "Angielski",
"Russian": "Rosyjski",
"Spanish": "Hiszpański",
"German": "Niemiecki",
"Dutch": "Holenderski",
"Polish": "Polski"
},
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Mieszkania Gracza ({1})",
"HeaderPlayerStaffFlagsList": "Flagi Administracji ({1})",
"HeaderStaffFlagsList": "Flagi Administracji",
"NonRPName": "Nieprawidłowa nazwa roleplay! Wybierz nową:",
"InvalidStaffFlag": "Flaga administracji nie znaleziona!",
"InvalidClanFlag": "Flaga klanu nie znaleziona!",
"InvalidLocale": "Język nie znaleziony!",
"HeaderJobUniformList": "Mundury robocze ({1})",
"HeaderJobEquipmentList": "Wyposażenie robocze ({1})",
"InvalidJobUniform": "Mundur roboczy nie znaleziony!",
"InvalidJobEquipment": "Wyposażenie robocze nie znalezione!",
"HeaderVehiclesInRangeList": "Pojazdy w {1}",
"NoVehiclesWithInRange": "Nie ma pojazdów w {1}",
"AmountNotNumber": "Ilość musi być liczbą!",
"NeedToBeWorking": "Musisz być w pracy! Użyj {1} w punkcie pracy lub obok pojazdu służbowego.",
"NeedToBeOnJobRoute": "Musisz być w trasie! Użyj {1} w pojeździe służbowym",
"CurrentJobRouteDeleted": "Trasa służbowa, którą jechałeś została usunięta przez Administratora",
"CurrentJobRouteVehicleColoursChanged": "Kolory pojazdów na twojej trasie zostały zmienione przez Administratora.",
"NotYourJob": "To nie twoja praca!",
"JobPoints": "Możesz zdobyć pracę udając się do żółtych punktów na mapie.",
"QuitJobToTakeAnother": "Jeżeli chcesz tą prace, użyj {1} aby opuścić swoją dotychczasową pracę.",
"NotAJobVehicle": "To nie jest pojazd służbowy!",
"NotYourJobVehicle": "To nie jest twój pojazd służbowy!",
"JobRouteDisabled": "Trasa służbowa, którą jechałeś została usunięta przed Administratora",
"HeaderPickupTypes": "Rodzaję Pickup'ów",
"HeaderBlipTypes": "Rodzaje Ikon Mapy",
"InvalidGPSLocation": "Nie ma lokalizacji z taką nazwą lub rodzajem",
"HeaderBusinessList": "Biznesy",
"VehicleForSale": "Ten {1} jest do kupienia za {2}! Użyj {3} jeżeli chcesz go kupić",
"VehicleForRent": "Ten {1} jest do wynajęcia za {2}! Użyj {3} jeżeli chcesz go wynająć",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items"
}

View File

@@ -1,396 +0,0 @@
{
"TranslationProvidedBy": "VNDTTS",
"LocaleEnglishName": "Russian",
"LocaleNativeName": "Русский",
"LocaleOffer": "Этот сервер доступен на русском. Используйте {1} чтобы его использовать.",
"LocaleChanged1": "Ваш язык был установлен на {1}",
"LocaleChanged2": "Этот сервер теперь будет показывать сообщения в {1}",
"LocaleChangedNote": "Это не влияет на сообщения других игроков",
"AccentsListHeader": "Акценты",
"HeaderHelpMainList": "Помощь Категории",
"AccentNotFound": "Не удалось найти акцент",
"AccentSet": "Вы установили свой акцент на {1}",
"AnimationNotFound": "Такой анимации не существует",
"AnimationCommandTip": "Используйте {1} чтобы просмотреть список доступных анимаций",
"AnimationInvalidDistance": "Дистанция должна быть между 0 и 3",
"AnimationStopCommandTip": "Используйте {1} чтобы остановить анимацию",
"CantBanClient": "Вы не можете забанить этого игрока",
"PlayerAccountBanned": "Аккаунт {1} был заблокирован ",
"ClanNotFound": "Не удалось найти клан",
"ClanNameTaken": "Клан с таким именем уже существует",
"PlayerNotFound": "Не удалось найти игрока",
"ClanCantRemoveRanks": "Вы не можете убрать ранги клана",
"ClanCantAddRanks": "Вы не можете добавить новые ранги клана",
"ClanRankNotFound": "Не удалось найти ранг клана",
"ClanCantChangeMemberTag": "Вы не можете изменить теги членов клана",
"ClanPlayerNotInSameClan": "Игрок не в вашем клане",
"ClanCantChangeRankLevel": "Вы не можете изменить уровень ранга клана",
"ClanCantChangeRankTag": "Вы не можете изменить теги ранга клана",
"NameNotRegistered": "Ваше имя не зарегестрировано! Используйте {1} чтобы создать аккаунт.",
"AutomaticLoginIPToggle": "Автоматический вход по IP теперь {1}",
"CouldNotRegisterAccount": "Возникла проблема при создании аккаунта. Пожалуйста свяжитесь с администратором.",
"RandomTipsToggle": "Случайные подсказки теперь {1}",
"ActionTipsToggle": "Местные подсказки теперь {1}",
"AutoSpawnLastCharToggle": "Автоматическое возрождение как последний выбраный персонаж теперь {1}",
"AccountGUISettingToggle": "GUI теперь {1}",
"On": "Включен",
"Off": "Выключен",
"Yes": "Да",
"No": "Нет",
"True": "Верно",
"False": "Неверно",
"Locked": "Закрыто",
"Unlocked": "Открыто",
"PasswordNotGoodEnough": "Новый пароль должен соответсвовать требованиям !",
"PasswordNeedsBase": "Пароль должен местить не меншьше {1}",
"PasswordNeedsCapitals": "{1} Заглавные буквы",
"PasswordNeedsNumbers": "{1} цифры",
"PasswordNeedsSymbols": "{1} символы",
"PasswordsDontMatch": "Новый пароль и его подтверджение не совпадают!",
"PasswordChanged": "Ваш пароль был изменен!",
"AutoLoggedInIP": "Вы автоматически войшли по IP!",
"WelcomeBack": "Добро пожаловать {1}, {2}! Используйте {3} чтобы продолжить.",
"WelcomeNewPlayer": "Добро пожаловать в {1}, {2}! Используйте {3} чтобы начать играть.",
"InvalidPlayer": "Не удалось найти игрока!",
"InvalidBusiness": "Не удалось найти бизнес!",
"InvalidHouse": "Не удалось найти дом!",
"InvalidVehicle": "Не удалось найти транспорт!",
"InvalidClan": "Не удалось найти клан!",
"InvalidClanRank": "Не удалось найти ранг клана!",
"InvalidJob": "Не удалось найти работу!",
"InvalidItem": "Не удалось найти предмет!",
"InvalidItemType": "Не удалось найти предмет!",
"InvalidRadioStation": "Не удалось найти радиостанцию!",
"InvalidGate": "Не удалось найти ворота!",
"EntersProperty": "открывает дверь и входит в {1}",
"ExitsProperty": "открывает дверь и покидает {1}",
"EnterExitPropertyDoorLocked": "пытаеться открыть двери {1} но у него не выходить потому-что двери закрыты",
"PropertyNoInterior": "У {1} нет доступного интерьера, но вы все еще можете использовать комманды стоя на значке возле входа.",
"NoBusinessWithItemType": "Нет бизнесов в которых этот предмет доступен",
"HeaderKeyBinds": "Привязки",
"HeaderAccountHelp": "Помощь Аккаунт",
"HeaderVehicleHelp": "Помощь Транспорт",
"HeaderVehicleDealershipHelp": "Помощь Автосалон",
"HeaderJobHelp": "Помощь Работа",
"HeaderChatHelp": "Помощь Чат",
"HeaderServerRules": "Правила Сервера",
"HeaderWebsiteInfo": "Сайт",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Список Анимаций",
"HeaderPayAndSprayHelp": "Помощь Pay 'n' Spray",
"HeaderAmmunationHelp": "Помощь Аммунация",
"HeaderVehicleTuneupHelp": "Помощь Тюнинг Автомобиля",
"HeaderBindableKeysHelp": "Кнопки которые можно привязать",
"HeaderSkinHelp": "Помощь Одежда/Облик",
"HeaderBusinessHelp": "Помощь Бизнес",
"HeaderClanHelp": "Помощь Клан",
"HeaderPlayerVehiclesList": "Транспорт Игрока ({1})",
"HeaderPlayerBusinessesList": "Бизнесы Игрока ({1})",
"HeaderClansList": "Список кланов",
"HeaderAdminsList": "Список администраторов",
"HeaderBadgeInfo": "Информация значка",
"HeaderAccentsList": "Список акцентов",
"HeaderPlayerInfo": "Информация об игроке ({1})",
"HeaderWealthandTaxHelp": "Информация о достатке и налогах",
"HeaderCommandInfo": "Информация о команде ({1})",
"HeaderRadioHelp": "Помощь Радио",
"HeaderRadioStationsList": "Радиостанции",
"HeaderKeyBindsList": "Список привязок",
"RadioVolumeChanged": "{1} Вы сменили громкость звука на {2}%",
"VolumeLevelNotNumber": "Уровень звука должен быть в цифрах",
"RadioStationLocationInvalid": "Вы должны находится в транспорте, доме, или бизнесе или иметь устройство чтобы сменить радиостанцию!",
"ActionBusinessRadioStationChange": "меняет радиостанцию бизнеса на {1} ({2})",
"ActionHouseRadioStationChange": "меняет радиостанцию дома на {1} ({2})",
"ActionVehicleRadioStationChange": "меняет радиостанцию транспорта на {1} ({2})",
"ActionItemRadioStationChange": "переключает станцию {1} на станцию {2} ({3})",
"RandomVehicleCommandsDisabled": "Это случайная машина трафика, команды на нее не работают.",
"HouseDoorLock": "Дом {1} {2}!",
"BusinessDoorLock": "Бизнес {1} {2}!",
"ServerGameModeRestarting": "Режим игры сервера перезапускается!",
"HeaderSelfItemList": "Ваш инвентарь",
"HeaderPlayerItemList": "Инвентарь игрока ({1})",
"HeaderHouseItemList": "Инвентарь дома",
"HeaderBusinessFloorItemList": "Инвентарь бизнеса (Продажа)",
"HeaderBusinessStorageItemList": "Инвертарь бизнеса (Хранилище)",
"HeaderItemItemList": "Инвентарь {1}",
"ItemSlotNotNumber": "Слот предмета должен быть цифрой",
"ItemSlotMustBeBetween": "Слот этого предмета должен находиться между {1} и {2}!",
"UseItemBugged": "Предмет который вы пытаетесь использовать забагован. Баг репорт был послан разработчикам сервера.",
"PickupItemBugged": "Предмет который вы пытаетесь поднять забагован. Баг репорт был послан разработчикам сервера.",
"DropItemBugged": "Предмет который вы пытаетесь выкинуть забагован. Баг репорт был послан разработчикам сервера.",
"HandsBusy": "Ваши руки заняты",
"CantUseItemInSkinChange": "Вы не можете использовать предметы когда вы меняете свой облик",
"CantDropItemInSkinChange": "Вы не можете кидать предметы когда вы меняете свой облик",
"CantPickupItemInSkinChange": "Вы не можете подбирать предметы когда вы меняете свой облик",
"CantSwitchItemInSkinChange": "Вы не можете переключать предметы когда вы меняете свой облик",
"CantGiveItemInSkinChange": "Вы не можете давать предметы когда вы меняете свой облик",
"CantTakeItemInSkinChange": "Вы не можете брать предметы когда вы меняете свой облик",
"ItemUnequippableNoAmmo": "{1} на слоте {2} не имеет патронов и не может быть экипирован!",
"NoSpaceSelfInventory": "У вас не осталось места в инвентаре",
"Business": "бизнес",
"House": "дом",
"Clan": "клан",
"Vehicle": "транспорт",
"Item": "предмет",
"ItemType": "тип предмета",
"Gate": "ворота",
"Door": "двери",
"ClanRank": "Ранг клана",
"JobRank": "Ранг работы",
"RadioStation": "радиостанция",
"Months": [
"Январь",
"Февраль",
"Март",
"Апрель",
"Май",
"Июнь",
"Июль",
"Август",
"Сентябрь",
"Октябрь",
"Ноябрь",
"Декабрь"
],
"WeekDays": [
"Воскресенье",
"Понедельник",
"Вторник",
"Среда",
"Четверг",
"Пятница",
"Субота"
],
"CardinalDirections": [
"Север",
"Северо-восток",
"Восток",
"Юго-восток",
"Юг",
"Юго-запад",
"Запад",
"Северо-запад"
],
"NewPlayerReadyToPlay": [
"Вам было надано немного денег. Используйте {1} чтобы найти места в которых можно купить предметы.",
"Если вам нужны деньги, желтые точки это места работы на карте.",
"Если вам нужен транспорт, посетите автосалон. Вы также можете использовать орендовочный транспорт возле начальной зоны или сесть на поезд",
"Не забудьте ознакомиться с {1} и использовать {2} для информации."
],
"YourCurrentVehicleDeleted": "Транспорт в котором вы находились было удалено.",
"Distance": "Дистанция",
"Meters": "Метров",
"Feet": "Футов",
"Kilometers": "Километры",
"Miles": "Мили",
"MustBeVehicleDriver": "Вы можете быть только водителем!",
"PlayerJoinedServer": "{1} присоеденился к игре из {1}!",
"PlayerLeftServer": "{1} покинул игру! ({1})",
"DisconnectReasons": [
"Потеряно соединение",
"Отключен",
"Неподерживаемый клинт",
"Неправильная игра",
"Неправильный пароль",
"Неподдерживаемый Exe",
"Disconnected",
"Забанен",
"Не удалось",
"Не правильное имя",
"Вылетел"
],
"TakeItemFromHouse": "Берет {1} из дома",
"TakeItemFromBusinessStorage": "Берет {1} из хранилища",
"TakeItemFromBusiness": "Берет {1} из бизнеса",
"TakeItemFromItem": "Достает {1} из {2}",
"TakeItemFromVehicleTrunk": "Достает {1} из багажника",
"TakeItemFromVehicleDash": "Достает {1} из бардачка",
"JobEquipmentInventoryKeyBindTip": "Рабочее снаряжение у вас в инвентаре. Нажмите {1} чтобы его просмотреть.",
"JobEquipmentInventoryCommandTip": "Рабочее снаряжение у вас в инвентаре. Используйте {1} чтобы его просмотреть.",
"AccountHelp": [
"Не предоставляйте свой пароль никому. {1} персонал никогда не будет спрашивать у вас пароль ",
"Используйте {1} чтобы изменить ваш пароль, и {2} если вы его забыли",
"Некоторые опции: {1}"
],
"VehicleHelp": [
"Ваш личный транспорт будет сохранен в любом месте где вы, или кто-либо другой его оставит!",
"Посетите автосалон чтобы приобрести новый транспорт (Используйте {1} чтобы увидеть больше информации)",
"Некоторые комманды: {1}",
"Посетите гараж механика чтобы починить, изменить цвет, и затюнинговать ваш автомобиль! {1} для информации"
],
"VehicleDealershipHelp": [
"Посетите автосалон чтобы приобрести новый транспорт. Используйте {1} чтобы найти его.",
"Ввойдите в транспорт который вы хотите приобрести, и цена на него будет вам показана",
"Если хотите приобрести транспорт, используйте {1} и вам дадут ключи чтобы провести тест-драйв на парковке.",
"Покиньте автосалон на вашем новом транспорте чтобы подвердить покупку."
],
"JobHelp": [
"Посетите места работы, получите работу и зарабатывайте деньги. Ищите желтые точки на карте",
"На месте работы, используйте {1} чтобы получить работу. Используйте {2} чтобы оставить работу",
"Используйте {1} чтобы начать работать. Вы также можете получить работу {2} и {3}",
"Большинство рабочего транспорта изначально закрыто. Используйте {1} находясь возле него чтобы войти.",
"Во время входа в рабочий транспорт, информация о том, как работать будет вам предоставлена."
],
"ChatHelp": [
"Существуют два основных типов чата: внутри персонажа и вне его",
"Смешивать их не считается полноценной ролевой игрой. Просмотрите {1} для информации.",
"Некоторые комманды чата: {1}",
"Некоторые имеют укороченые версии ({1} чтобы говорить, {2} чтобы выкрикивать, и так далее)"
],
"ServerRulesHelp": [
"Нереалистичные действия запрещены. Вы не супермен.",
"Ролевая игра за террориста и терроризм запрещены.",
"Всегда следуйте соблюдайте инструкии даные модератором или администратором.",
"Вам не позволяется использовать информацию полученую вне персонажа, персонажем ",
"Пожалуйста придерживаетесь английского в главном чате, если вы плохо знаете английский, используйте {1}"
],
"AnimationHelp": [
"Анимации позволяют вам улучшить составляющую ролевой игры с помощью визуальных действий",
"Используте {1} или {2} с названием тобы применить анимацию.",
"Чтобы просмотреть список доступных анимаций, используйте {1}"
],
"WeaponHelp": [
"Посетите магазин оружия что-бы приобрести оружие. Используйте {1} чтобы найти.",
"Оружие невозможно купить без лицензии.",
"Лицензиями на оружие занимается отделение полиции. Обратитесь туда чтобы заполучить лицензию.",
"Оружие также может быть приобретено нелегально от некоторых бизнесов, торговцев оружием, и кланов."
],
"SkinHelp": [
"В магазине одежды используйте {1} чтобы купить одежду",
"Когда у вас есть предмет одежды, экипируйте его и используйте его как любой другой предмет чтобы просмотреть меню выбора облика персонажа (Просмотрите {1} чтобы научиться использовать предметы)",
"Некоторые облики ограничены только для некоторых работ, кланов, или по каким-то другим причинам."
],
"KeyBindHelp": [
"Вы можете сами создавать ваши привязки на кнопки. Используйте {1} чтобы просмотреть ваши привязки.",
"Используйте {1} чтобы добавить новую приязку или {2} чтобы убрать ее.",
"Стандартные привязки: {1} для мотора, {1} для фар, и {3} для открытия/закрытия",
"Используйте {1} чтобы просмотреть ваши предметы {2} чтобы экипировать предмет или {3} чтобы убрать.",
"Используйте {1} чтобы использвать предмет который вы держите в руках, используйте {2} чтобы его выбростить, или используйте {3} чтобы подобрать предмет."
],
"BusinessHelp": [
"Используйте {1} чтобы покупать предметы или {2} чтобы просмотреть список того, что продаеться в любом бизнесе",
"Бизнесы имеют их названия синим цветом над иконкой возле входа.",
"Комманды владельца бизнеса: {1}",
"Новый автомобиль появится после того как вы уедете из автосалона."
],
"ClanHelp": [
"Попросите администратора чтобы основать клан",
"Владельцы клана имеют полный контроль над ихним кланом после его основания",
"Комманды клана: {1}",
"Больше комманд клана: {1}"
],
"RadioStationHelp": [
"Используйте {1} чтобы выбрать радиостанцию для вашего траспорта, дома, или бизнеса",
"Используйте {2} чтобы просмотреть список радиостанций",
"Вы можете изменить громкость радио используя {1} с 0-100 в качестве процентов"
],
"WealthAndTaxHelp": [
"Вы платите {1} процентов от вашего расчетного уровня достатка.",
"Ваш расчетный уровень достатка зависит от того, сколько вам принадлежит транспорта, домов и бизнесов.",
"Каждый транспорт это {1}, каждый дом это {2}, И каждый бизнес это {3}",
"Используйте {1} чтобы просмотреть ваш текущий достаток, и {2} чтобы просмотреть сколько вы платите налогов с каждой зарплаты"
],
"MustBeInAVehicle": "Вы должны быть внутри транспорта!",
"MustBeInOrNearVehicle": "Вы должны быть возле транспорта!",
"MustBeInVehicleFrontSeat": "Вы можете сидеть только спереди!",
"MustBeInVehicleDriverSeat": "Вы можете быть только водителем!",
"DontHaveVehicleKey": "У вас нет ключей к этому транспорту!",
"NoGateAccess": "У вас нет доступа к воротам!",
"GateBroken": "Эти ворота сломаны!",
"GateHacked": "Ворота не отвечают!",
"RadioJammed": "Из радио доносится лишь шум.",
"VehicleNotForSale": "Этот транспорт не продается!",
"VehicleNotForRent": "Этот транспорт не сдается в оренду! ",
"BusinessNotForSale": "Этот бизнес не продается!",
"BusinessNotForRent": "Этот бизнес не сдается в оренду!",
"HouseNotForSale": "Этот дом не продаеться!",
"HouseNotForRent": "Этот дом не сдаеться в оренду!",
"DealershipPurchaseTestDrive": "Уедьте из автосалона чтобы подтвердить покупку транспорта, или выйдете из него чтобы отменить.",
"DealershipPurchaseExitedVehicle": "Вы отменили покупку транспорта покинув его!",
"VehiclePurchaseComplete": "Этот транспорт теперь принадлежит вам! Он останется там где вы его оставили.",
"VehiclePurchaseNotEnoughMoney": "у вас недостаточно денег для покупки этого транспорта!",
"HousePurchaseNotEnoughMoney": "У вас недостаточно денег для покупки этого дома!",
"BusinessPurchaseNotEnoughMoney": "У вас недостаточно денег для покупки этого бизнеса!",
"Locales": {
"English": "Английский",
"Russian": "Русский",
"Spanish": "Испанский",
"German": "Немецкий",
"Dutch": "Нидерландский"
},
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Дома Игрока ({1})",
"HeaderPlayerStaffFlagsList": "Флаги игрока персонала ({1})",
"HeaderStaffFlagsList": "Флаги персонала",
"NonRPName": "Ваше имя не подходит для ролевой игры! Выберете другое:",
"InvalidStaffFlag": "Не удалось найти флаг персонала!",
"InvalidClanFlag": "Не удалось найти флаг клана!",
"InvalidLocale": "Не удалось найти язык!",
"HeaderJobUniformList": "Рабочие униформы ({1})",
"HeaderJobEquipmentList": "Рабочие снаряжение ({1})",
"InvalidJobUniform": "Не удалось найти рабочую униформу!",
"InvalidJobEquipment": "Не удалось найти рабочее снаряжение!",
"HeaderVehiclesInRangeList": "Транспорт в пределах {1}",
"NoVehiclesWithInRange": "Нет транспорта в пределах {1}",
"AmountNotNumber": "Количество должно быть введено цифрой!",
"NeedToBeWorking": "Вы должны быть на работе! Используйте {1} на месте работы или возле рабочего транспорта.",
"NeedToBeOnJobRoute": "Вы должны быть на рабочем маршруте! Используйте {1} в рабочем транспорте",
"CurrentJobRouteDeleted": "Рабочий маршрут на котором вы находились был удален администратором",
"CurrentJobRouteVehicleColoursChanged": "Цвет транспорта на маршруте был изменен администратором",
"NotYourJob": "Это работа пренадлежит не вам!",
"JobPoints": "Вы можете устроиться на работу ориентируясь по желтым значкам на карте.",
"QuitJobToTakeAnother": "Если хотите покинуть работу, ипользуйте {1}.",
"NotAJobVehicle": "Это не рабочий транспорт!",
"NotYourJobVehicle": "Этот транспорт пренадлежит не вашей работе!",
"JobRouteDisabled": "Рабочий маршрут на котором вы были был удален администратором",
"HeaderPickupTypes": "Типы подбираемых предметов",
"HeaderBlipTypes": "Типы иконок карты",
"InvalidGPSLocation": "Не существует локаций с таки именем или такого типа",
"HeaderBusinessList": "Бизнесы",
"VehicleForSale": "Этот {1} можно купить за {2}! Используйте {3} если хотите его купить",
"VehicleForRent": "Этот {1} может быть орендован за {2}! Используйте {3} если хотите его орендовать",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Неправельный пароль! Осталось {1} попыток",
"LoginFailedNoPassword": "Вы должны ввести пароль! Осталось {1} попыток",
"RegistrationFailedNoPassword": "Вы должны ввести пароль!",
"RegistrationFailedNoPasswordConfirm": "Вы должны подтвердить пароль!",
"RegistrationFailedNoEmail": "Вы должны ввести адрес электронной почты!",
"AccountNameAlreadyRegistered": "Ваше имя уже зарегистрировано!",
"AlreadyLoggedIn": "Вы уже вошли!",
"RegistrationFailedInvalidEmail": "Такого адреса не существует!",
"RegistrationFailedPasswordMismatch": "Пароли не совпадают!",
"RegistrationFailedCreateError": "Не удалось создать аккаунт!",
"RegistrationSuccess": "Ваш аккаунт был успешно создан!",
"RegistrationEmailVerifyReminder": "Не забудьте подтвердить ваш электронный адрес, код подверждения был послан вам на электронную почту.",
"RegistrationCreateCharReminder": "Чтобы играть на сервере, вам нужно будет создать персонажа.",
"NoCharactersGUIMessage": "У вас нет персонажей. Не хотите создать?",
"NoCharactersGUIWindowTitle": "Нет персонажей",
"NoCharactersChatMessage": "У вас нет персонажей. Используйте {1} чтобы создать.",
"NeedEmailFor2FA": "Вам нужно добавить ваш адрес электронной почты чтобы использовать двухфакторную аунтентификацию.",
"NeedEmailVerifiedFor2FA": "Вам нужно подтвердить вашу электронную почту чтобы использовать двухфакторную аунтентификацию.",
"SetEmailHelpTip": "Используйте {1} чтобы установить ваш адрес электронной почты.",
"VerifyEmailHelpTip": "Используйте {1} чтобы подтвердить ваш адрес электронной почты.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Ближайшее радио",
"FromRadio": "Из радио",
"ToRadio": "В радио",
"NeedToEnterPropertyCommand": "Вам нужно сначало ввести {1}! Используйте {2} чтобы выйти",
"NeedToEnterPropertyKeyPress": "Вам нужно сначало ввести {1}! Используйте {2} чтобы выйти",
"InventoryFullCantCarry": "У вас недостаточно места в инвентаре(Инвентарь заполнен)!",
"NotEnoughCashNeedAmountMore": "У вас недостаточно денег! У вас не хватает {1}!",
"AmountMustBeMoreThan": "Количество должно быть больше {1}!",
"WeaponBanned": "Вам нельзя покупать оружие!",
"TimeNotNumber": "Время должно быть назначено цифрой",
"HeaderDefaultBusinessItemTypes": "Шаблоны предметов бизнеса",
"FixingStuck": "Исправляет вашу текущую позицию и виртуальный мир ...",
"CantUseCommandYet": "Подождите некоторое время перед тем как использовать комманду снова!",
"NotATester": "Вы не тестировщик!",
"AccessDenied": "Доступ запрещен",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items"
}

View File

@@ -1,401 +0,0 @@
{
"TranslationProvidedBy": "PerikiyoXD",
"LocaleEnglishName": "Español",
"LocaleNativeName": "Inglés",
"LocaleOffer": "Este servidor se encuentra disponible en Español. Utilice {1} para usarlo",
"LocaleChanged1": "El idioma se ha configurado a {1}",
"LocaleChanged2": "El servidor mostrará los mensajes en {1}",
"LocaleChangedNote": "Esto no cambia los mensajes de otros jugadores",
"AccentsListHeader": "Acentos",
"HelpListHeader": "Categorías de ayuda",
"HelpSkinHeader": "Ayuda de personajes",
"HelpVehicleHeader": "Ayuda de vehículos",
"HelpBusinessHeader": "Ayuda de negocios",
"HelpHouseHeader": "Ayuda de casas",
"HelpRadioHeader": "Ayuda de radio",
"HelpAnimationHeader": "Ayuda de animaciones",
"AccentNotFound": "Acento no encontrado",
"AccentSet": "Acento establecido como {1}",
"AnimationNotFound": "Esa animación no existe",
"AnimationCommandTip": "Usa {1} para ver la lista de animaciones",
"AnimationInvalidDistance": "La distancia debe ser un numero entre el 0 y el 3",
"AnimationStopCommandTip": "Usa {1} para detener la animación actual",
"CantBanClient": "No se puede vetar a esta persona",
"PlayerAccountBanned": "La cuenta de {1} ha sido vetada",
"ClanNotFound": "Clan no encontrado",
"ClanNameTaken": "Ya existe un clan con ese nombre",
"PlayerNotFound": "Jugador no encontrado",
"ClanCantRemoveRanks": "No puedes eliminar rangos del clan",
"ClanCantAddRanks": "No puedes añadir rangos del clan",
"ClanRankNotFound": "No se encontró el rango del clan indicado",
"ClanCantChangeMemberTag": "No puedes cambiar las etiquetas del miembro del clan",
"ClanPlayerNotInSameClan": "El jugador indicado no está en tu clan",
"ClanCantChangeRankLevel": "No puedes cambiar el nivel del rango del clan",
"ClanCantChangeRankTag": "No puedes cambiar la etiqueta del rango del clan",
"NameNotRegistered": "¡Tu nombre no está registrado! Usa {1} para crear una cuenta",
"AutomaticLoginIPToggle": "Se ha {1} el inicio de sesión automático por IP",
"CouldNotRegisterAccount": "Hubo un problema al crear su cuenta. Por favor, póngase en contacto con un administrador",
"RandomTipsToggle": "Se han {1} los Consejos aleatorios",
"ActionTipsToggle": "Se han {1} los Consejos de acción",
"AutoSpawnLastCharToggle": "Se ha {1} reaparecer con el ultimo personaje usado",
"AccountGUISettingToggle": "Se ha {1} la Interfaz de Usuario",
"On": "Encendido",
"Off": "Apagado",
"Yes": "Si",
"No": "No",
"True": "True",
"False": "False",
"Locked": "Locked",
"Unlocked": "Unlocked",
"PasswordNotGoodEnough": "La nueva contraseña debe cumplir los requisitos",
"PasswordNeedsBase": "Las contraseñas deben tener al menos {1}",
"PasswordNeedsCapitals": "{1} letras mayúsculas",
"PasswordNeedsNumbers": "{1} números",
"PasswordNeedsSymbols": "{1} símbolos",
"PasswordsDontMatch": "La nueva contraseña y la confirmación de la nueva contraseña no son iguales.",
"PasswordChanged": "Su contraseña ha sido cambiada",
"AutoLoggedInIP": "Ha iniciado la sesion automáticamente por su IP",
"WelcomeBack": "¡Bienvenidos de nuevo a {1}, {2}! Por favor, {3} para continuar",
"WelcomeNewPlayer": "¡Bienvenido a {1}, {2}! Por favor, {3} para jugar",
"InvalidPlayer": "Jugador no encontrado",
"InvalidBusiness": "Negocio no encontrada",
"InvalidHouse": "Casa no encontrada",
"InvalidVehicle": "Vehículo no encontrado",
"InvalidClan": "Clan no encontrado",
"InvalidClanRank": "Rango del clan no encontrado",
"InvalidJob": "Trabajo no encontrado",
"InvalidItem": "Objeto no encontrado",
"InvalidItemType": "Tipo de objeto no encontrado",
"InvalidRadioStation": "Estación de radio no encontrada",
"InvalidGate": "Puerta no encontrada",
"EntersProperty": "abre la puerta y entra en el {1}",
"ExitsProperty": "abre la puerta y sale del {1}",
"EnterExitPropertyDoorLocked": "intenta abrir la puerta {1} pero no lo consigue porque está cerrada",
"PropertyNoInterior": "Este {1} no tiene un interior, pero todavía puede utilizar los comandos en el icono de la puerta",
"NoBusinessWithItemType": "No hay ningun negocio con ese objeto disponible",
"HeaderKeyBinds": "Atajos de teclado",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealerships": "Ayuda del Concesionario de Vehiculos",
"HeaderJobHelp": "Ayuda del Trabajo",
"HeaderChatHelp": "Ayuda del Chat",
"HeaderServerRules": "Reglas del Servidor",
"HeaderWebsiteInfo": "Sitio Web",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Lista de animaciones",
"HeaderPayAndSprayHelp": "Ayuda de 'Pay and Spray'",
"HeaderAmmunationHelp": "Ayuda de 'Ammunation'",
"HeaderVehicleTuneupHelp": "Ayuda de Puesta a punto del vehículo",
"HeaderBindableKeysHelp": "Atajos de teclado",
"HeaderSkinHelp": "Ayuda de Ropa/Personaje",
"HeaderBusinessHelp": "Ayuda del negocio",
"HeaderClanHelp": "Ayuda del clan",
"HeaderPlayerVehiclesList": "Vehiculos del jugador ({1})",
"HeaderPlayerBusinessesList": "Negocios del jugador ({1})",
"HeaderClansList": "Lista de clanes",
"HeaderAdminsList": "Lista de administradores",
"HeaderBadgeInfo": "Información de la placa",
"HeaderAccentsList": "Lista de acentos",
"HeaderPlayerInfo": "Información del jugador ({1})",
"HeaderWealthandTaxHelp": "Información sobre el patrimonio y los impuestos",
"HeaderCommandInfo": "Información de comando ({1})",
"HeaderRadioHelp": "Ayuda para la radio",
"HeaderRadioStationsList": "Emisoras de radio",
"HeaderKeyBindsList": "Lista de atajos de teclado",
"RadioVolumeChanged": "{1} Has cambiado el volumen de tu radio en directo a {2}%",
"VolumeLevelNotNumber": "El volumen debe ser un número",
"RadioStationLocationInvalid": "Debe estar en un vehículo, casa o negocio o tener un dispositivo personal para cambiar la emisora",
"ActionBusinessRadioStationChange": "cambia la emisora de la radio del negocio a {1} ({2})",
"ActionHouseRadioStationChange": "cambia la emisora de la radio de la casa a {1} ({2})",
"ActionVehicleRadioStationChange": "cambia la emisora de la radio del vehículo a {1} ({2})",
"ActionItemRadioStationChange": "cambia la estación de {1} a {2} ({3})",
"RandomVehicleCommandsDisabled": "Este es un vehículo de tráfico aleatorio y los comandos no se pueden utilizar en él",
"HouseDoorLock": "Casa {1} {2}!",
"BusinessDoorLock": "Negocio {1} {2}!",
"ServerGameModeRestarting": "El modo de juego del servidor se reinicia",
"HeaderSelfItemList": "Su inventario",
"HeaderPlayerItemList": "Inventario del jugador ({1})",
"HeaderHouseItemList": "Inventario de la casa",
"HeaderBusinessFloorItemList": "Inventario del negocio (En venta)",
"HeaderBusinessStorageItemList": "Inventario del negocio (Almacén)",
"HeaderItemItemList": "Inventario de {1}",
"ItemSlotNotNumber": "La ranura del objeto debe ser un número",
"ItemSlotMustBeBetween": "La ranura del objeto debe ser un número entre {1} y {2}!",
"UseItemBugged": "El objeto que intentas utilizar tiene un error. Se ha enviado un informe de error a los desarrolladores del servidor",
"PickupItemBugged": "El objeto que intentas recoger tiene un error. Se ha enviado un informe de error a los desarrolladores del servidor",
"DropItemBugged": "El objeto que intentas soltar tiene un error. Se ha enviado un informe de error a los desarrolladores del servidor",
"HandsBusy": "Tus manos están ocupadas",
"CantUseItemInSkinChange": "No puedes usar un objeto mientras personalizas tu apariencia",
"CantDropItemInSkinChange": "No puedes soltar un objeto mientras personalizas tu apariencia",
"CantPickupItemInSkinChange": "No puedes recoger un objeto mientras personalizas tu apariencia",
"CantSwitchItemInSkinChange": "No puedes cambiar de objeto mientras se personaliza la apariencia",
"CantGiveItemInSkinChange": "No puedes dar un objeto mientras personalizas tu apariencia",
"CantTakeItemInSkinChange": "No puedes coger un objeto mientras personalizas tu apariencia",
"ItemUnequippableNoAmmo": "{1} (ranura {2}) no tiene munición y no puede equiparse",
"NoSpaceSelfInventory": "No tienes más espacio en tu inventario",
"Business": "negocio",
"House": "casa",
"Clan": "clan",
"Vehicle": "vehiculo",
"Item": "objeto",
"ItemType": "tipo de objeto",
"Gate": "portón",
"Door": "puerta",
"ClanRank": "rango del clan",
"JobRank": "rango del trabajo",
"RadioStation": "estación de radio",
"Months": [
"Enero",
"Febrero",
"Marzo",
"Abril",
"Mayo",
"Junio",
"Julio",
"Agosto",
"Septiembre",
"Octubre",
"Noviembre",
"Diciembre"
],
"WeekDays": [
"Domingo",
"Lunes",
"Martes",
"Miércoles",
"Jueves",
"Viernes",
"Sábado"
],
"CardinalDirections": [
"Norte",
"Noreste",
"Este",
"Sureste",
"Sur",
"Suroeste",
"Oeste",
"Noroeste"
],
"NewPlayerReadyToPlay": [
"Te han dado algo de dinero. Usa {1} para encontrar lugares donde comprar artículos",
"Si necesitas dinero, los trabajos son los puntos amarillos del radar",
"Para conseguir un coche, visita el concesionario de coches. También puedes utilizar un vehículo de alquiler cerca del punto de aparición o tomar el tren",
"Asegúrese de leer el {1} y utilizar el {2} para obtener información"
],
"YourCurrentVehicleDeleted": "El vehículo en el que estabas fue eliminado",
"Distance": "Distancia",
"Meters": "Metros",
"Feet": "Pies",
"Kilometers": "Kilómetros",
"Miles": "Millas",
"MustBeVehicleDriver": "¡Debes ser el conductor del vehículo!",
"PlayerJoinedServer": "¡{1} se unió al juego desde {1}!",
"PlayerLeftServer": "¡{1} ha abandonado el juego! ({1})",
"DisconnectReasons": [
"Conexión perdida",
"Desconectado",
"Cliente no admitido",
"Juego incorrecto",
"Contraseña incorrecta",
"Ejecutable no admitidos",
"Desconectado",
"Vetado",
"Fallido",
"Nombre inválido",
"Fallo del programa"
],
"TakeItemFromHouse": "saca {1} de la casa",
"TakeItemFromBusinessStorage": "saca {1} del almacén del negocio",
"TakeItemFromBusiness": "saca {1} del negocio",
"TakeItemFromItem": "saca {1} del {2}",
"TakeItemFromVehicleTrunk": "saca {1} del maletero",
"TakeItemFromVehicleDash": "saca {1} de la guantera",
"JobEquipmentInventoryKeyBindTip": "El equipo de trabajo está en su inventario. Pulse {1} para verlas",
"JobEquipmentInventoryCommandTip": "El equipo de trabajo está en su inventario. Utilice {1} para verlos",
"AccountHelp": [
"NO comparta su contraseña con nadie más. El personal de {1} nunca le pedirá su contraseña",
"Utilice {1} para cambiar su contraseña, y {2} si la ha olvidado",
"Algunos comandos: {1}"
],
"VehicleHelp": [
"Sus vehículos personales se guardarán donde usted u otra persona los deje",
"Visite un concesionario para comprar vehículos nuevos. {1} para más información)",
"Algunos comandos: {1}",
"Visita un taller mecánico para reparar, colorear y poner a punto tu coche. {1} para más información"
],
"VehicleDealershipHelp": [
"Visite un concesionario para comprar vehículos nuevos. {1} para encontrar uno",
"En el concesionario, introduce el coche que quieres comprar, y se te mostrará el precio",
"Si quieres comprar el vehículo, utiliza {1} y te darán las llaves para que lo pruebes en el aparcamiento",
"Salga del concesionario con el vehículo nuevo para confirmar la compra"
],
"JobHelp": [
"Visita los lugares de trabajo para conseguir un empleo y ganar dinero. Busca puntos amarillos en el mapa",
"En un lugar de trabajo, usa {1} para conseguir el trabajo. Utiliza {2} para dejar el trabajo",
"Usa {1} para empezar a trabajar. También puedes conseguir un trabajo {2} y {3}",
"La mayoría de los vehículos de trabajo están cerrados. Usa {1} cerca de uno para entrar en él",
"Al entrar en un vehículo de trabajo, se le mostrará información sobre cómo hacer el trabajo"
],
"ChatHelp": [
"Hay dos tipos principales de chat: fuera del personaje (OOC) y dentro del personaje (IC)",
"Mezclar estos dos tipos no resulta en un juego de rol apropiado. Vea {1} para más información",
"Algunos comandos del chat: {1}",
"Algunos tienen nombres más cortos disponibles ({1} para hablar, {2} para gritar, etc)"
],
"ServerRulesHelp": [
"Las acciones irreales (powergaming) no están permitidas. No eres Superman",
"No se permite ningún juego de rol terrorista o de terrorismo",
"Siga siempre las instrucciones de los moderadores y administradores",
"No mezcles los chats (metagaming). No puedes usar información en IC que fue recibida OOC",
"Mantén el inglés en los chats principales. Si no se te da bien el inglés, utiliza {1}"
],
"AnimationHelp": [
"Las animaciones permiten mejorar el juego de rol con acciones visuales",
"Utilice {1} o {2} con un nombre para utilizar una animación",
"Para ver una lista de animaciones, utilice {1}"
],
"WeaponHelp": [
"Visita una armería para comprar armas. Usa {1} para encontrar una",
"La compra de un arma requiere una licencia de armas",
"Las licencias de armas son gestionadas por el departamento de policía. Solicítela allí para obtenerla",
"Las armas también pueden comprarse ilegalmente en algunos negocios, vendedores de armas y clanes"
],
"SkinHelp": [
"En una tienda de ropa, usa {1} para comprar ropa",
"Cuando tengas un objeto de ropa, equípalo y úsalo como cualquier otro objeto para mostrar la selección de personajes (revisa {1} para aprender a usar objetos)",
"Algunas pieles están restringidas a trabajos, clanes o por otras razones"
],
"KeyBindHelp": [
"Puedes establecer tus propias combinaciones de teclas. Utilice {1} para ver sus teclas vinculadas",
"Utilice {1} para añadir una nueva combinación de teclas y {2} para eliminar una",
"Las teclas por defecto son: {1} para el motor del vehículo, {1} para las luces y {3} para el bloqueo/desbloqueo",
"Pulsa {1} para ver tus objetos y {2} para equipar un objeto o {3} para desequipar todos",
"Pulsa {1} para usar el objeto que tienes en la mano, pulsa {2} para dejarlo caer o pulsa {3} para recoger un objeto del suelo"
],
"BusinessHelp": [
"Utilice {1} para comprar artículos o {2} para ver una lista de lo que está a la venta en cualquier negocio",
"Las empresas aparecen con nombres azules sobre el icono de su entrada",
"Comandos del dueño del negocio: {1}",
"Un coche nuevo en venta aparecerá cuando salgas del concesionario"
],
"ClanHelp": [
"Pedir a un administrador que cree un clan (similar a las facciones/grupos/familias)",
"Los propietarios de clanes tienen pleno control sobre su clan una vez creado",
"Comandos de clan: {1}",
"Más comandos del clan: {1}"
],
"RadioStationHelp": [
"Utilice {1} para fijar la estación de su vehículo, casa o negocio",
"Utilice {2} para ver una lista de estaciones",
"Puedes cambiar el volumen de tu radio usando {1} con 0-100 como porcentaje"
],
"WealthAndTaxHelp": [
"Sus impuestos en el día de pago son el {1} por ciento de su riqueza calculada",
"Su riqueza calculada es una suma total basada en cuántos vehículos, casas y negocios tiene",
"Cada vehículo es {1}, cada casa es {2}, y cada negocio es {3}",
"Utilice {1} para ver su patrimonio actual, y {2} para ver cuánto pagará de impuestos cada día de pago"
],
"MustBeInAVehicle": "Necesitas estar en un vehículo",
"MustBeInOrNearVehicle": "Tienes que estar dentro o cerca de un vehículo",
"MustBeInVehicleFrontSeat": "Tienes que estar en los asientos delanteros del vehículo",
"MustBeInVehicleDriverSeat": "Tienes que ser el conductor",
"DontHaveVehicleKey": "No tiene una llave para este vehículo",
"NoGateAccess": "No tienes acceso a esta puerta",
"GateBroken": "Esta puerta está rota",
"GateHacked": "La puerta no funciona",
"RadioJammed": "Sólo se oye la estática de la radio",
"VehicleNotForSale": "Este vehículo no está en venta",
"VehicleNotForRent": "Este vehículo no se alquila",
"BusinessNotForSale": "Este negocio no está en venta",
"BusinessNotForRent": "Este negocio no se alquila",
"HouseNotForSale": "Esta casa no está en venta",
"HouseNotForRent": "Esta casa no está en alquiler",
"DealershipPurchaseTestDrive": "Conduzca fuera del concesionario para comprar el vehículo, o salga del vehículo para cancelar",
"DealershipPurchaseExitedVehicle": "Has cancelado la compra del vehículo al salir de él",
"VehiclePurchaseComplete": "¡Este vehículo es ahora tuyo! Se guardará donde quiera que lo dejes",
"VehiclePurchaseNotEnoughMoney": "No tienes suficiente dinero para comprar este vehículo",
"HousePurchaseNotEnoughMoney": "No tienes suficiente dinero para comprar esta casa",
"BusinessPurchaseNotEnoughMoney": "No tienes suficiente dinero para comprar este negocio",
"Locales": {
"English": "Inglés",
"Russian": "Ruso",
"Spanish": "Español",
"German": "Alemán",
"Dutch": "Holandés",
"Polish": "Polaco"
},
"HeaderPlayerHousesList": "Casas del jugador ({1})",
"HeaderPlayerStaffFlagsList": "Banderas administrativas del jugador ({1})",
"HeaderStaffFlagsList": "Banderas administrativas",
"NonRPName": "¡Nombre no RP! Elige uno nuevo:",
"InvalidStaffFlag": "Bandera administrativa no encontrada",
"InvalidClanFlag": "Bandera del clan no encontrada",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items"
}

View File

@@ -9,8 +9,8 @@
<script src="scripts/shared/gamedata.js" type="server" language="javascript" />
<script src="scripts/shared/gamedata.js" type="client" language="javascript" />
<!-- Multiplayer Mod (Wrapped Natives) -->
<!-- The goal is to just swap only these out when I port the script to a new mod, like Oakwood -->
<script src="scripts/server/native/connected.js" type="server" language="javascript" />
<script src="scripts/client/native/connected.js" type="client" language="javascript" />
@@ -47,9 +47,11 @@
<script src="scripts/server/messaging.js" type="server" language="javascript" />
<script src="scripts/server/misc.js" type="server" language="javascript" />
<script src="scripts/server/npc.js" type="server" language="javascript" />
<script src="scripts/server/staff.js" type="server" language="javascript" />
<script src="scripts/server/race.js" type="server" language="javascript" />
<script src="scripts/server/radio.js" type="server" language="javascript" />
<script src="scripts/server/radio.js" type="server" language="javascript" />
<script src="scripts/server/security.js" type="server" language="javascript" />
<script src="scripts/server/staff.js" type="server" language="javascript" />
<script src="scripts/server/subaccount.js" type="server" language="javascript" />
<script src="scripts/server/timers.js" type="server" language="javascript" />
<script src="scripts/server/trigger.js" type="server" language="javascript" />
@@ -82,8 +84,6 @@
<file type="client" src="files/fonts/roboto-regular.ttf" />
<file type="client" src="files/fonts/pricedown.ttf" />
<file type="client" src="files/images/skins/none.png" />
<!--<file type="client" src="files/images/mafiac-logo.png" />-->
<!--<file type="client" src="files/images/gtac-logo.png" />-->
<file type="client" src="files/images/server-logo.png" />
<!-- GUI -->
@@ -101,6 +101,7 @@
<script src="scripts/client/gui/register.js" type="client" language="javascript" />
<script src="scripts/client/gui/resetpass.js" type="client" language="javascript" />
<script src="scripts/client/gui/yesno.js" type="client" language="javascript" />
<script src="scripts/client/gui/localechooser.js" type="client" language="javascript" />
<!-- Client Scripts -->
<script src="scripts/client/afk.js" type="client" language="javascript" />
@@ -109,22 +110,26 @@
<script src="scripts/client/chatbox.js" type="client" language="javascript" />
<script src="scripts/client/event.js" type="client" language="javascript" />
<script src="scripts/client/gui.js" type="client" language="javascript" />
<script src="scripts/client/gps.js" type="client" language="javascript" />
<script src="scripts/client/house.js" type="client" language="javascript" />
<script src="scripts/client/item.js" type="client" language="javascript" />
<script src="scripts/client/job.js" type="client" language="javascript" />
<script src="scripts/client/keybind.js" type="client" language="javascript" />
<script src="scripts/client/label.js" type="client" language="javascript" />
<script src="scripts/client/locale.js" type="client" language="javascript" />
<script src="scripts/client/logo.js" type="client" language="javascript" />
<script src="scripts/client/main.js" type="client" language="javascript" />
<script src="scripts/client/messaging.js" type="client" language="javascript" />
<script src="scripts/client/mousecam.js" type="client" language="javascript" />
<script src="scripts/client/nametag.js" type="client" language="javascript" />
<script src="scripts/client/npc.js" type="client" language="javascript" />
<script src="scripts/client/radio.js" type="client" language="javascript" />
<script src="scripts/client/scoreboard.js" type="client" language="javascript" />
<script src="scripts/client/server.js" type="client" language="javascript" />
<script src="scripts/client/skin-select.js" type="client" language="javascript" />
<script src="scripts/client/sync.js" type="client" language="javascript" />
<script src="scripts/client/utilities.js" type="client" language="javascript" />
<script src="scripts/client/vehicle.js" type="client" language="javascript" />
<!-- MexUI -->
<file type="client" src="third-party/mexui/Images/down-arrow.png" />

View File

@@ -7,6 +7,7 @@
// TYPE: Client (JavaScript)
// ===========================================================================
// Init AFK script
function initAFKScript() {
logToConsole(LOG_DEBUG, "[VRR.AFK]: Initializing AFK script ...");
logToConsole(LOG_DEBUG, "[VRR.AFK]: AFK script initialized!");
@@ -14,12 +15,14 @@ function initAFKScript() {
// ===========================================================================
// Process stuff when game loses focus
function processLostFocusAFK(event) {
sendServerNewAFKStatus(true);
}
// ===========================================================================
// Process stuff when game gains focus
function processFocusAFK(event) {
sendServerNewAFKStatus(false);
}

View File

@@ -7,64 +7,127 @@
// TYPE: Client (JavaScript)
// ===========================================================================
function makePedPlayAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition, freezePlayer) {
logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animGroup}/${animId} for ped ${pedId}`);
if(getGame() < VRR_GAME_GTA_IV) {
if(animType == VRR_ANIMTYPE_NORMAL || animType == VRR_ANIMTYPE_SURRENDER) {
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
getElementFromId(pedId).clearAnimations();
} else {
getElementFromId(pedId).clearObjective();
}
getElementFromId(pedId).addAnimation(animGroup, animId);
function makePedPlayAnimation(pedId, animationSlot, positionOffset) {
let ped = getElementFromId(pedId);
if(getElementFromId(pedId) == localPlayer && freezePlayer == true) {
if(ped == null) {
return false;
}
let animationData = getAnimationData(animationSlot);
logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animationData[0]} for ped ${pedId}`);
let freezePlayer = false;
switch(animationData.moveType) {
case VRR_ANIMMOVE_FORWARD: {
setElementCollisionsEnabled(ped, false);
if(ped.isSyncer) {
setElementPosition(ped, getPosInFrontOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
}
freezePlayer = true;
break;
}
case VRR_ANIMMOVE_BACK: {
setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) {
setElementPosition(pedId, getPosBehindPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
}
freezePlayer = true;
break;
}
case VRR_ANIMMOVE_LEFT: {
setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) {
setElementPosition(pedId, getPosToLeftOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
}
freezePlayer = true;
break;
}
case VRR_ANIMMOVE_RIGHT: {
setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) {
setElementPosition(pedId, getPosToRightOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
}
freezePlayer = true;
break;
}
default: {
break;
}
}
if(getGame() < VRR_GAME_GTA_IV) {
if(animationData.animType == VRR_ANIMTYPE_NORMAL || animationData.animType == VRR_ANIMTYPE_SURRENDER) {
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
ped.clearAnimations();
} else {
ped.clearObjective();
}
ped.addAnimation(animationData.groupId, animationData.animId);
if(ped == localPlayer && freezePlayer == true) {
inAnimation = true;
setLocalPlayerControlState(false, false);
localPlayer.collisionsEnabled = false;
}
} else if(animType == VRR_ANIMTYPE_BLEND) {
getElementFromId(pedId).position = getElementFromId(pedId).position;
getElementFromId(pedId).blendAnimation(animGroup, animId, animSpeed);
} else if(animationData.animType == VRR_ANIMTYPE_BLEND) {
ped.position = ped.position;
ped.blendAnimation(animationData.groupId, animationData.animId, animationData.animSpeed);
}
} else {
natives.requestAnims(animGroup);
natives.taskPlayAnimNonInterruptable(getElementFromId(pedId), animId, animGroup, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition, -1);
natives.requestAnims(animationData.groupId);
natives.taskPlayAnimNonInterruptable(ped, animationData.groupId, animationData.animId, animationData.animSpeed, boolToInt(animationData.infiniteLoop), boolToInt(animationData.infiniteLoopNoMovement), boolToInt(animationData.dontReturnToStartCoords), boolToInt(animationData.freezeLastFrame), -1);
}
}
// ===========================================================================
function forcePedAnimation(pedId, animGroup, animId, animType, animSpeed, loop, loopNoControl, freezeLastFrame, returnToOriginalPosition) {
if(getGame() < VRR_GAME_GTA_IV) {
forcedAnimation = [animGroup, animId];
getElementFromId(pedId).position = getElementFromId(pedId).position;
getElementFromId(pedId).addAnimation(animGroup, animId);
function forcePedAnimation(pedId, animSlot) {
let ped = getElementFromId(pedId);
if(getElementFromId(pedId) == localPlayer) {
if(ped == null) {
return false;
}
let animationData = getAnimationData(animSlot);
if(getGame() < VRR_GAME_GTA_IV) {
ped.position = ped.position;
ped.addAnimation(animationData.groupId, animationData.animId);
if(ped == localPlayer) {
inAnimation = true;
setLocalPlayerControlState(false, false);
localPlayer.collisionsEnabled = false;
}
} else {
natives.requestAnims(animationData.groupId);
natives.taskPlayAnimNonInterruptable(ped, animationData.groupId, animationData.animId, animationData.animSpeed, boolToInt(animationData.infiniteLoop), boolToInt(animationData.infiniteLoopNoMovement), boolToInt(animationData.dontReturnToStartCoords), boolToInt(animationData.freezeLastFrame), -1);
}
}
// ===========================================================================
function makePedStopAnimation(pedId) {
if(getElementFromId(pedId) == null) {
let ped = getElementFromId(pedId);
if(ped == null) {
return false;
}
if(getGame() != VRR_GAME_GTA_IV) {
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) {
getElementFromId(pedId).clearAnimations();
ped.clearAnimations();
} else {
getElementFromId(pedId).clearObjective();
ped.clearObjective();
}
}
if(getElementFromId(pedId) == localPlayer) {
if(ped == localPlayer) {
if(getGame() != VRR_GAME_GTA_IV) {
localPlayer.collisionsEnabled = true;
}
@@ -73,3 +136,13 @@ function makePedStopAnimation(pedId) {
}
// ===========================================================================
/**
* @param {number} animationSlot - The slot index of the animation
* @return {AnimationData} The animation's data (array)
*/
function getAnimationData(animationSlot, gameId = getGame()) {
return getGameConfig().animations[gameId][animationSlot];
}
// ===========================================================================

View File

@@ -18,6 +18,7 @@ class BusinessData {
this.hasInterior = hasInterior;
this.hasItems = hasItems;
this.blipId = -1;
this.labelInfoType = 0;
}
}
@@ -26,7 +27,7 @@ class BusinessData {
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
logToConsole(LOG_DEBUG, `[VRR.Business] Received business ${businessId} (${name}) from server`);
if(getGame() == VRR_GAME_GTA_IV) {
if(!areServerElementsSupported()) {
if(getBusinessData(businessId) != false) {
let businessData = getBusinessData(businessId);
businessData.name = name;
@@ -40,7 +41,11 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if(blipModel == -1) {
if(businessData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
} else {
destroyElement(getElementFromId(blipId));
}
businessData.blipId = -1;
//businesses.splice(businessData.index, 1);
//setAllBusinessDataIndexes();
@@ -50,19 +55,17 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
} else {
if(businessData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition);
natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
natives.setBlipMarkerLongDistance(businessData.blipId, false);
natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
}
} else {
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
businessData.blipId = blipId;
natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
natives.setBlipMarkerLongDistance(businessData.blipId, false);
natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`);
let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name);
if(blipId != -1) {
tempBusinessData.blipId = blipId;
}
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
}
@@ -71,19 +74,15 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} doesn't exist. Adding ...`);
let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
if(blipModel != -1) {
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name);
if(blipId != -1) {
tempBusinessData.blipId = blipId;
natives.changeBlipSprite(tempBusinessData.blipId, blipModel);
natives.setBlipMarkerLongDistance(tempBusinessData.blipId, false);
natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(tempBusinessData.blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} has no blip.`);
}
businesses.push(tempBusinessData);
getServerData().businesses.push(tempBusinessData);
setAllBusinessDataIndexes();
}
}
@@ -98,6 +97,9 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
function getBusinessData(businessId) {
//let tempBusinessData = businesses.find((b) => b.businessId == businessId);
//return (typeof tempBusinessData != "undefined") ? tempBusinessData[0] : false;
let businesses = getServerData().businesses;
for(let i in businesses) {
if(businesses[i].businessId == businessId) {
return businesses[i];
@@ -110,8 +112,8 @@ function getBusinessData(businessId) {
// ===========================================================================
function setAllBusinessDataIndexes() {
for(let i in businesses) {
businesses[i].index = i;
for(let i in getServerData().businesses) {
getServerData().businesses[i].index = i;
}
}

View File

@@ -16,6 +16,9 @@ let maxChatBoxHistory = 500;
let scrollAmount = 1;
let maxChatBoxLines = 6;
let chatAutoHideDelay = 0;
let chatLastUse = 0;
let scrollUpKey = false;
let scrollDownKey = false;
@@ -46,11 +49,22 @@ function unBindChatBoxKeys() {
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour) {
if(bottomMessageIndex => chatBoxHistory.length-1) {
message(messageString, colour);
logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Received chatbox message from server: ${messageString}`);
// Just in case it's hidden by auto hide
//setChatWindowEnabled(true);
let colouredString = replaceColoursInMessage(messageString);
logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Changed colours in string: ${colouredString}`);
addToChatBoxHistory(colouredString, colour);
//if(bottomMessageIndex >= chatBoxHistory.length-1) {
message(colouredString, colour);
bottomMessageIndex = chatBoxHistory.length-1;
}
addToChatBoxHistory(messageString, colour);
//}
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
@@ -61,6 +75,12 @@ function setChatScrollLines(amount) {
// ===========================================================================
function setChatAutoHideDelay(delay) {
chatAutoHideDelay = delay*1000;
}
// ===========================================================================
function addToChatBoxHistory(messageString, colour) {
chatBoxHistory.push([messageString, colour]);
}
@@ -102,6 +122,50 @@ function updateChatBox() {
message("", COLOUR_WHITE);
}
}
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
function processMouseWheelForChatBox(mouseId, deltaCoordinates, flipped) {
// There isn't a way to detect whether chat input is active, but mouse cursor is forced shown when typing so ¯\_(ツ)_/¯
if(!gui.cursorEnabled) {
return false;
}
if(!flipped) {
if(deltaCoordinates.y > 0) {
chatBoxScrollUp();
} else {
chatBoxScrollDown();
}
} else {
if(deltaCoordinates.y > 0) {
chatBoxScrollDown();
} else {
chatBoxScrollUp();
}
}
}
// ===========================================================================
function checkChatAutoHide() {
return false;
// Make sure chat input isn't active
if(gui.cursorEnabled) {
return false;
}
// Don't process auto-hide if it's disabled
if(chatAutoHideDelay == 0) {
return false;
}
if(getCurrentUnixTimestamp()-chatLastUse >= chatAutoHideDelay) {
setChatWindowEnabled(false);
}
}
// ===========================================================================

View File

@@ -51,14 +51,17 @@ function addAllEventHandlers() {
addEventHandler("OnFocus", onFocus);
addEventHandler("OnCameraProcess", onCameraProcess);
addEventHandler("OnMouseWheel", onMouseWheel);
addEventHandler("OnEntityProcess", onEntityProcess);
}
// ===========================================================================
function onResourceStart(event, resource) {
sendResourceStartedSignalToServer();
setUpInitialGame();
garbageCollectorInterval = setInterval(collectAllGarbage, 1000*60);
//garbageCollectorInterval = setInterval(collectAllGarbage, 1000*60);
}
// ===========================================================================
@@ -95,7 +98,10 @@ function onProcess(event, deltaTime) {
processGameSpecifics();
processNearbyPickups();
processVehiclePurchasing();
processVehicleBurning();
//checkChatBoxAutoHide(); // Will be uncommented on 1.4.0 GTAC update
//processVehicleFires();
}
// ===========================================================================
@@ -161,13 +167,13 @@ function onLocalPlayerEnteredVehicle(event, vehicle, seat) {
sendNetworkEventToServer("vrr.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
if (areServerElementsSupported()) {
if(inVehicleSeat == 0) {
inVehicle.engine = false;
if(!inVehicle.engine) {
parkedVehiclePosition = inVehicle.position;
parkedVehicleHeading = inVehicle.heading;
}
}
//if(inVehicleSeat == 0) {
//setVehicleEngine(vehicle, false);
//if(!inVehicle.engine) {
// parkedVehiclePosition = inVehicle.position;
// parkedVehicleHeading = inVehicle.heading;
//}
//}
}
}
@@ -181,7 +187,7 @@ function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healt
if (damagedEntity.isType(ELEMENT_PLAYER)) {
if (damagedEntity == localPlayer) {
//if(!weaponDamageEnabled[damagerEntity.name]) {
event.preventDefault();
preventDefaultEventAction(event);
sendNetworkEventToServer("vrr.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss);
//}
}
@@ -219,11 +225,31 @@ function onFocus(event) {
// ===========================================================================
function onLocalPlayerSwitchWeapon(oldWeapon, newWeapon) {
}
// ===========================================================================
function onCameraProcess(event) {
}
// ===========================================================================
function onMouseWheel(event, mouseId, deltaCoordinates, flipped) {
processMouseWheelForChatBox(mouseId, deltaCoordinates, flipped);
}
// ===========================================================================
function onEntityProcess(event, entity) {
if (!isSpawned) {
return false;
}
//if(entity.isType(ELEMENT_PED) && !entity.isType(ELEMENT_PLAYER)) {
// processNPCMovement(entity);
//}
}
// ===========================================================================

65
scripts/client/gps.js Normal file
View File

@@ -0,0 +1,65 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: gps.js
// DESC: Provides GPS functions and usage
// TYPE: Client (JavaScript)
// ===========================================================================
let gpsBlip = null;
let gpsBlipBlinkTimes = 0;
let gpsBlipBlinkAmount = 0;
let gpsBlipBlinkInterval = 500;
let gpsBlipBlinkTimer = null;
// ===========================================================================
function showGPSLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.GPS] Showing gps location`);
if(getMultiplayerMod() == VRR_MPMOD_GTAC) {
if(getGame() == VRR_GAME_GTA_SA) {
// Server-side spheres don't show in GTA SA for some reason.
gpsSphere = game.createPickup(1318, position, 1);
} else {
gpsSphere = game.createSphere(position, 3);
gpsSphere.colour = colour;
}
if(gpsBlip != null) {
destroyElement(gpsBlip);
}
// Blinking is bugged if player hit the spot before it stops blinking.
blinkGPSBlip(10, position, colour);
gpsBlip = game.createBlip(position, 0, 2, colour);
}
}
// ===========================================================================
function blinkGPSBlip(times, position, colour) {
gpsBlipBlinkTimes = times;
gpsBlipBlinkTimer = setInterval(function() {
if(gpsBlip != null) {
destroyElement(gpsBlip);
gpsBlip = null;
} else {
gpsBlip = game.createBlip(position, 0, 2, colour);
}
if(gpsBlipBlinkAmount >= gpsBlipBlinkTimes) {
if(gpsBlip != null) {
destroyElement(gpsBlip);
gpsBlip = null;
}
gpsBlipBlinkAmount = 0;
gpsBlipBlinkTimes = 0;
gpsBlip = game.createBlip(position, 0, 2, colour);
clearInterval(gpsBlipBlinkTimer);
}
}, gpsBlipBlinkInterval);
}
// ===========================================================================

View File

@@ -12,7 +12,7 @@ var app = {};
let mainFont = "Roboto"; // "Arial"
//let mainLogoPath = (typeof gta == "undefined") ? "files/images/mafiac-logo.png" : "files/images/gtac-logo.png";
let mainLogoPath = "files/images/server-logo.png";
let mainLogoPath = "files/images/asshat-logo.png";
let primaryColour = [200, 200, 200];
let secondaryColour = [16, 16, 16];
@@ -29,27 +29,6 @@ let textInputAlpha = 180;
let guiReady = false;
let guiSubmitKey = false;
let guiLeftKey = false;
let guiRightKey = false;
let guiUpKey = false;
let guiDownKey = false;
// ===========================================================================
let placesOfOrigin = [
"Liberty City",
"Vice City",
"Los Santos",
"San Fierro",
"Las Venturas",
"San Andreas",
"Blaine County",
"Red County",
"Bone County",
"Other",
];
// ===========================================================================
let characterData = [];
@@ -81,11 +60,19 @@ function initGUI() {
initListGUI();
initResetPasswordGUI();
initChangePasswordGUI();
initLocaleChooserGUI();
closeAllWindows();
guiReady = true;
logToConsole(LOG_DEBUG, `[VRR.GUI] All GUI created successfully!`);
loadLocaleConfig();
loadAllLocaleStrings();
resetGUIStrings();
resetLocaleChooserOptions();
sendNetworkEventToServer("vrr.guiReady", true);
};
@@ -102,8 +89,9 @@ function closeAllWindows() {
characterSelect.window.shown = false;
twoFactorAuth.window.shown = false;
listDialog.window.shown = false;
resetPassword.window.shown = false;
passwordReset.window.shown = false;
passwordChange.window.shown = false;
localeChooser.window.shown = false;
mexui.setInput(false);
mexui.focusedControl = false;
@@ -113,6 +101,8 @@ function closeAllWindows() {
guiRightKey = false;
guiUpKey = false;
guiDownKey = false;
setChatWindowEnabled(true);
}
// ===========================================================================
@@ -158,7 +148,7 @@ function isAnyGUIActive() {
return true;
}
if(resetPassword.window.shown == true) {
if (passwordReset.window.shown == true) {
return true;
}
@@ -166,104 +156,16 @@ function isAnyGUIActive() {
return true;
}
if (localeChooser.window.shown == true) {
return true;
}
return false;
}
// ===========================================================================
addNetworkEventHandler("vrr.showCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show character selection window`);
showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId);
});
// ===========================================================================
addNetworkEventHandler("vrr.switchCharacterSelect", function(firstName, lastName, cash, clan, lastPlayed, skinId) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to update character selection window with new info`);
switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId);
});
// ===========================================================================
addNetworkEventHandler("vrr.showError", function(errorMessage, errorTitle) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show error window`);
showError(errorMessage, errorTitle);
});
// ===========================================================================
addNetworkEventHandler("vrr.showPrompt", function(promptMessage, promptTitle) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show prompt window`);
showYesNoPromptGUI(promptMessage, promptTitle);
});
// ===========================================================================
addNetworkEventHandler("vrr.showInfo", function(infoMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received request from server to show info dialog`);
showInfo(infoMessage);
});
// ===========================================================================
addNetworkEventHandler("vrr.loginSuccess", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful login from server`);
loginSuccess();
});
// ===========================================================================
addNetworkEventHandler("vrr.characterSelectSuccess", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful character selection from server`);
characterSelectSuccess();
setChatWindowEnabled(true);
});
// ===========================================================================
addNetworkEventHandler("vrr.loginFailed", function(remainingAttempts) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed login from server`);
loginFailed(remainingAttempts);
});
// ===========================================================================
addNetworkEventHandler("vrr.registrationSuccess", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of successful registration from server`);
registrationSuccess();
});
// ===========================================================================
addNetworkEventHandler("vrr.registrationFailed", function(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`);
registrationFailed(errorMessage);
});
// ===========================================================================
addNetworkEventHandler("vrr.newCharacterFailed", function(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal of failed registration from server`);
newCharacterFailed(errorMessage);
});
// ===========================================================================
addNetworkEventHandler("vrr.changePassword", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to change password from server`);
showChangePasswordGUI();
});
// ===========================================================================
addNetworkEventHandler("vrr.showResetPasswordCodeInput", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received signal to input reset password code from server`);
resetPasswordCodeInputGUI();
});
// ===========================================================================
addNetworkEventHandler("vrr.guiColour", function(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
function setGUIColours(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`);
primaryColour = [red1, green1, blue1];
secondaryColour = [red2, green2, blue2];
@@ -271,15 +173,7 @@ addNetworkEventHandler("vrr.guiColour", function(red1, green1, blue1, red2, gree
focusedColour = [red1 + focusedColourOffset, green1 + focusedColourOffset, blue1 + focusedColourOffset];
initGUI();
});
// ===========================================================================
addNetworkEventHandler("vrr.guiInit", function() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing MexUI app`);
//initGUI();
sendNetworkEventToServer("vrr.guiReady", true);
});
}
// ===========================================================================
@@ -292,29 +186,42 @@ function hideAllGUI() {
// ===========================================================================
function processGUIKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Processing key press: ${keyCode}`);
if (!isAnyGUIActive()) {
logToConsole(LOG_DEBUG, `[VRR.GUI] GUI is not active. Cancelling keypress processing.`);
return false;
}
if (keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is submit (${guiSubmitKey})`);
if (guiSubmitKey != false) {
guiSubmitKey();
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling submit key function`);
guiSubmitKey.call();
}
} else if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is left (${guiLeftKey})`);
if (guiLeftKey != false) {
guiLeftKey();
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling left key function`);
guiLeftKey.call();
}
} else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is right (${guiRightKey})`);
if (guiRightKey != false) {
guiRightKey();
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling right key function`);
guiRightKey.call();
}
} else if (keyCode == getKeyIdFromParams("down") || keyCode == getKeyIdFromParams("s")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is down (${guiDownKey})`);
if (guiDownKey != false) {
guiDownKey();
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling down key function`);
guiDownKey.call();
}
} else if (keyCode == getKeyIdFromParams("up") || keyCode == getKeyIdFromParams("w")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is up (${guiUpKey})`);
if (guiUpKey != false) {
guiUpKey();
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling up key function`);
guiUpKey.call();
}
}
}
@@ -328,3 +235,49 @@ function processToggleGUIKeyPress(keyCode) {
}
// ===========================================================================
function resetGUIStrings() {
// Login GUI
login.messageLabel.text = getLocaleString("GUILoginWindowLabelEnterPassword");
login.passwordInput.placeholder = getLocaleString("GUILoginWindowPasswordPlaceholder");
login.loginButton.text = toUpperCase(getLocaleString("GUILoginWindowSubmitButton"));
login.forgotPasswordButton.text = toUpperCase(getLocaleString("GUILoginWindowResetPasswordButton"));
login.resetPasswordLabel.text = getLocaleString("GUILoginWindowForgotPasswordLabel");
// Register GUI
register.messageLabel.text = getLocaleString("GUIRegisterWindowLabelCreateAccount");
register.passwordInput.placeholder = getLocaleString("GUIRegisterWindowPasswordPlaceholder");
register.confirmPasswordInput.placeholder = getLocaleString("GUIRegisterWindowConfirmPasswordPlaceholder");
register.emailInput.placeholder = getLocaleString("GUIRegisterWindowEmailPlaceholder");
register.registerButton.text = toUpperCase(getLocaleString("GUIRegisterWindowSubmitButton"));
// Change Password GUI
passwordChange.window.title = toUpperCase(getLocaleString("GUIChangePasswordWindowTitle"));
passwordChange.messageLabel.text = getLocaleString("GUIChangePasswordPasswordLabel");
passwordChange.passwordInput.placeholder = getLocaleString("GUIChangePasswordPasswordPlaceholder");
passwordChange.confirmPasswordInput.placeholder = getLocaleString("GUIChangePasswordConfirmPasswordPlaceholder");
passwordChange.submitButton.text = toUpperCase(getLocaleString("GUIChangePasswordSubmitButton"));
// Reset Password GUI
passwordReset.messageLabel.text = toUpperCase(getLocaleString("GUIResetPasswordConfirmEmailLabel"));
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordEmailPlaceholder");
passwordReset.resetPasswordButton.text = toUpperCase(getLocaleString("GUIResetPasswordSubmitButton"));
passwordReset.backToLoginButton.text = toUpperCase(getLocaleString("GUIResetPasswordLoginButton"));
passwordReset.backToLoginLabel.text = getLocaleString("GUIResetPasswordRememberMessage");
// Character Selection GUI
characterSelect.window.title = toUpperCase(getLocaleString("GUICharacterSelectWindowTitle"));
characterSelect.cashText.text = getLocaleString("GUICharacterSelectMoneyLabel", "0");
characterSelect.clanText.text = getLocaleString("GUICharacterSelectClanLabel", "None");
characterSelect.lastPlayedText.text = getLocaleString("GUICharacterSelectLastPlayedLabel", "Never");
characterSelect.previousCharacterButton.text = toUpperCase(getLocaleString("GUIPreviousCharacterButton"));
characterSelect.nextCharacterButton.text = toUpperCase(getLocaleString("GUINextCharacterButton"));
characterSelect.selectCharacterButton.text = toUpperCase(getLocaleString("GUIPlayAsCharacterButton"));
characterSelect.newCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterButton"));
// Character Creation GUI
newCharacter.messageLabel.text = getLocaleString("GUINewCharacterMessageLabel");
newCharacter.firstNameInput.placeholder = getLocaleString("GUINewCharacterFirstNamePlaceholder");
newCharacter.lastNameInput.placeholder = getLocaleString("GUINewCharacterLastNamePlaceholder");
newCharacter.createCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterSubmitButton"));
}

View File

@@ -38,14 +38,15 @@ function initChangePasswordGUI() {
});
passwordChange.window.titleBarIconSize = toVector2(0, 0);
passwordChange.window.titleBarHeight = 0;
passwordChange.window.titleBarShown = false;
passwordChange.window.image(85, -10, 140, 140, mainLogoPath, {
passwordChange.window.image(100, 20, 75, 75, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordChange.messageLabel = passwordChange.window.text(20, 75, 260, 20, 'Enter a new password', {
passwordChange.messageLabel = passwordChange.window.text(20, 95, 260, 20, 'Enter a new password', {
main: {
textSize: 10.0,
textAlign: 0.5,
@@ -132,14 +133,17 @@ function checkChangePassword() {
// ===========================================================================
function showChangePasswordGUI() {
function showChangePasswordGUI(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing change password window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
passwordChange.window.shown = true;
passwordChange.messageLabel = errorMessage;
mexui.focusedControl = passwordChange.passwordInput;
guiSubmitKey = checkChangePassword;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), passwordChange.window.position.y + passwordChange.window.size.y + 20));
}
// ===========================================================================

View File

@@ -24,23 +24,26 @@ let characterSelect = {
function initCharacterSelectGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating character select GUI ...`);
characterSelect.window = mexui.window(game.width/2-215, game.height/2-83, 430, 190, 'Select Character', {
characterSelect.window = mexui.window(game.width/2-215, game.height/2-83, 430, 190, 'SELECT CHARACTER', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
title: {
textSize: 12.0,
textColour: toColour(0, 0, 0, 0),
textFont: mainFont,
textColour: toColour(0, 0, 0, 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 12.0,
textColour: toColour(0, 0, 0, 0),
textSize: 10.0,
textFont: mainFont,
textColour: toColour(0, 0, 0, 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
}
});
characterSelect.window.titleBarIconSize = toVector2(0, 0);
characterSelect.window.titleBarHeight = 0;
characterSelect.window.titleBarIconShown = false;
characterSelect.window.titleBarHeight = 30;
characterSelect.nameText = characterSelect.window.text(5, 40, 200, 25, 'Lastname, Firstname', {
main: {
@@ -163,6 +166,12 @@ function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, ski
characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`;
characterSelect.skinImage = characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
characterSelect.window.shown = true;
guiSubmitKey = selectThisCharacter;
guiLeftKey = selectPreviousCharacter;
guiRightKey = selectNextCharacter;
showLocaleChooserGUI(new Vec2(getScreenWidth()/2-(localeChooser.window.size.x/2), characterSelect.window.position.y+characterSelect.window.size.y+20));
}
// ===========================================================================
@@ -211,6 +220,7 @@ function switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, s
characterSelect.skinImage = (getGame() == VRR_GAME_GTA_III) ? characterSelect.window.image(310, 32, 100, 90, `files/images/skins/gta3/${getSkinImage(skinId)}.png`) : characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
characterSelect.window.shown = true;
guiSubmitKey = selectThisCharacter;
guiLeftKey = selectPreviousCharacter;
guiRightKey = selectNextCharacter;

View File

@@ -17,7 +17,7 @@ let errorDialog = {
function initErrorDialogGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating error GUI ...`);
errorDialog.window = mexui.window(game.width/2-200, game.height/2-70, 500, 140, 'ERROR', {
errorDialog.window = mexui.window(getScreenWidth()/2-200, getScreenHeight()/2-70, 400, 140, 'ERROR', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
@@ -34,7 +34,7 @@ function initErrorDialogGUI() {
},
});
errorDialog.messageLabel = errorDialog.window.text(15, 50, 470, 75, 'Error Message', {
errorDialog.messageLabel = errorDialog.window.text(15, 50, 370, 20, 'Error Message', {
main: {
textSize: 10.0,
textAlign: 0.5,
@@ -63,12 +63,14 @@ function initErrorDialogGUI() {
// ===========================================================================
function showErrorGUI(errorMessage, errorTitle) {
function showErrorGUI(errorMessage, errorTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing error window. Error: ${errorTitle} - ${errorMessage}`);
setChatWindowEnabled(false);
mexui.setInput(true);
errorDialog.messageLabel.text = errorMessage;
errorDialog.okayButton.text = buttonText;
errorDialog.window.title = errorTitle;
errorDialog.window.shown = true;
}

View File

@@ -17,7 +17,7 @@ let infoDialog = {
function initInfoDialogGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating info dialog GUI ...`);
infoDialog.window = mexui.window(game.width/2-200, game.height/2-70, 400, 140, 'Information', {
infoDialog.window = mexui.window(getScreenWidth()/2-200, getScreenHeight()/2-70, 400, 140, 'Information', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
@@ -70,11 +70,13 @@ function closeInfoDialog() {
// ===========================================================================
function showInfo(infoMessage, infoTitle) {
function showInfoGUI(infoMessage, infoTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing info dialog window. Info: ${infoTitle} - ${infoMessage}`);
mexui.setInput(true);
infoDialog.messageLabel.text = infoMessage;
infoDialog.okayButton.text = buttonText;
infoDialog.window.title = infoTitle;
infoDialog.window.shown = true;
}

View File

@@ -0,0 +1,116 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: localechooser.js
// DESC: Provides locale chooser GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let localeChooser = {
window: null,
flagImages: [],
activeRingImages: [],
};
let flagImageSize = toVector2(30, 30);
let flagImageGap = toVector2(5, 5);
// ===========================================================================
function initLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating locale chooser GUI ...`);
localeChooser.window = mexui.window(game.width/2-200, game.height-150, 60, 60, 'Choose a language', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], 0),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
localeChooser.window.titleBarShown = false;
loadLocaleConfig();
logToConsole(LOG_DEBUG, `[VRR.GUI] Created locale chooser GUI`);
}
// ===========================================================================
function closeLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing locale chooser window`);
localeChooser.window.shown = false;
mexui.setInput(false);
}
// ===========================================================================
function showLocaleChooserGUI(position = toVector2(0.0, 0.0)) {
if(position.x != 0.0 && position.y != 0.0) {
localeChooser.window.position = position;
} else {
localeChooser.window.position = toVector2((getScreenWidth()/2)-(localeChooser.window.size.x/2), getScreenHeight()-100);
}
//closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing locale chooser window`);
mexui.setInput(true);
localeChooser.window.shown = true;
}
// ===========================================================================
function toggleLocaleChooserGUI() {
if(localeChooser.window.shown) {
closeLocaleChooserGUI();
} else {
showLocaleChooserGUI();
}
}
// ===========================================================================
function localeChooserSetLocale(localeId) {
logToConsole(LOG_DEBUG|LOG_WARN, `[VRR.GUI] Asking server to change locale to ${localeId}`);
sendLocaleSelectToServer(localeId);
}
// ===========================================================================
function resetLocaleChooserOptions() {
logToConsole(LOG_DEBUG|LOG_WARN, `[VRR.GUI] Resetting locale chooser options`);
// let tempLocaleOptions = getServerData().localeOptions; // getAvailableLocaleOptions();
let tempLocaleOptions = getAvailableLocaleOptions();
localeChooser.window.size = toVector2((tempLocaleOptions.length*(flagImageSize.x+flagImageGap.x))+flagImageGap.x, flagImageSize.y+flagImageGap.y*2);
localeChooser.window.position = toVector2((getScreenWidth()/2)-(localeChooser.window.size.x/2), getScreenHeight()-100);
for(let i in localeChooser.flagImages) {
localeChooser.flagImages[i].remove();
}
for(let i in tempLocaleOptions) {
let imagePath = `files/images/flags/${tempLocaleOptions[i].flagImageFile}`;
localeChooser.flagImages[i] = localeChooser.window.image((i*(flagImageSize.x+flagImageGap.x))+flagImageGap.x, flagImageGap.y, flagImageSize.x, flagImageSize.y, imagePath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
}, function() {
localeChooserSetLocale(tempLocaleOptions[i].id);
});
logToConsole(LOG_DEBUG|LOG_WARN, `[VRR.GUI] Created locale chooser option ${tempLocaleOptions[i].englishName} with image ${imagePath}`);
//localeChooser.activeRingImages.push(activeRingImage);
}
}
// ===========================================================================

View File

@@ -11,7 +11,6 @@ let login = {
window: null,
logoImage: null,
messageLabel: null,
passwordLabel: null,
passwordInput: null,
loginButton: null,
forgotPasswordButton: null,
@@ -20,9 +19,31 @@ let login = {
// ===========================================================================
let loginHTML =
`<html>
<head>
<title>Asshat Gaming Roleplay: Login</title>
<style type="text/css" rel="stylesheet">
.input-box
{
font-family: "Roboto";
font-size: 14px;
border-style: solid;
border-colour: #0066AA;
border-radius: 2px;
color: #0066AA;
};
</style>
</head>
<body>
</body>
</html>`;
// ===========================================================================
function initLoginGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating login GUI ...`);
login.window = mexui.window(game.width/2-150, game.height/2-135, 300, 275, 'LOGIN', {
login.window = mexui.window(getScreenWidth()/2-150, getScreenHeight()/2-135, 300, 275, 'LOGIN', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
@@ -41,8 +62,9 @@ function initLoginGUI() {
});
login.window.titleBarIconSize = toVector2(0,0);
login.window.titleBarHeight = 0;
login.window.titleBarShown = false;
login.logoImage = login.window.image(5, 20, 290, 100, mainLogoPath, {
login.logoImage = login.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
@@ -96,7 +118,7 @@ function initLoginGUI() {
},
}, checkLogin);
login.forgotPasswordButton = login.window.button(200, 240, 80, 15, 'RESET PASS', {
login.forgotPasswordButton = login.window.button(180, 240, 100, 15, 'RESET PASS', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(0, 0, 0, 255),
@@ -109,7 +131,7 @@ function initLoginGUI() {
},
}, switchToPasswordResetGUI);
login.resetPasswordLabel = login.window.text(125, 240, 60, 15, 'Forgot your password?', {
login.resetPasswordLabel = login.window.text(110, 240, 60, 15, 'Forgot your password?', {
main: {
textSize: 8.0,
textAlign: 1.0,
@@ -134,6 +156,8 @@ function showLoginGUI() {
login.window.shown = true;
mexui.focusedControl = login.passwordInput;
guiSubmitKey = checkLogin;
showLocaleChooserGUI(new Vec2(getScreenWidth()/2-(localeChooser.window.size.x/2), login.window.position.y+login.window.size.y+20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}
@@ -164,9 +188,10 @@ function loginSuccess() {
// ===========================================================================
function switchToPasswordResetGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset dialog window`);
showResetPasswordGUI();
//closeAllWindows();
//logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset dialog window`);
//showResetPasswordGUI();
sendNetworkEventToServer("vrr.checkResetPassword", "");
return false;
}

View File

@@ -9,11 +9,10 @@
let newCharacter = {
window: null,
messageLabel: null,
firstNameInput: null,
lastNameInput: null,
skinDropDown: null,
spawnAreaDropDown: null,
createButton: null,
createCharacterButton: null,
mainLogoImage: null,
};
@@ -21,13 +20,14 @@ let newCharacter = {
function initNewCharacterGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating new character GUI ...`);
newCharacter.window = mexui.window(game.width/2-130, game.height/2-115, 300, 230, 'New Character', {
newCharacter.window = mexui.window(getScreenWidth()/2-130, getScreenHeight()/2-115, 300, 230, 'NEW CHARACTER', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textSize: 12.0,
textFont: mainFont,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
@@ -38,9 +38,11 @@ function initNewCharacterGUI() {
}
});
newCharacter.window.titleBarIconSize = toVector2(0, 0);
newCharacter.window.titleBarHeight = 0;
newCharacter.window.titleBarIconShown = false;
newCharacter.window.titleBarShown = false;
newCharacter.window.titleBarHeight = 30;
newCharacter.mainLogoImage = newCharacter.window.image(5, 20, 290, 80, mainLogoPath, {
newCharacter.mainLogoImage = newCharacter.window.image(80, 20, 80, 80, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
@@ -133,8 +135,6 @@ function newCharacterFailed(errorMessage) {
function checkNewCharacter() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking new character with server ...`);
let skinId = false;
if(newCharacter.firstNameInput.lines[0].length < 2) {
return false;
}
@@ -158,7 +158,9 @@ function showNewCharacterGUI() {
mexui.setInput(true);
newCharacter.window.shown = true;
mexui.focusedInput = newCharacter.firstNameInput;
guiSubmitButton = checkNewCharacter;
guiSubmitKey = checkNewCharacter;
showLocaleChooserGUI(new Vec2(getScreenWidth()/2-(localeChooser.window.size.x/2), newCharacter.window.position.y+newCharacter.window.size.y+20));
}
// ===========================================================================

View File

@@ -21,7 +21,7 @@ let register = {
function initRegisterGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating register GUI ...`);
register.window = mexui.window(game.width/2-150, game.height/2-150, 300, 300, 'Register', {
register.window = mexui.window(getScreenWidth()/2-150, getScreenHeight()/2-150, 300, 300, 'Register', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
@@ -39,8 +39,9 @@ function initRegisterGUI() {
});
register.window.titleBarIconSize = toVector2(0,0);
register.window.titleBarHeight = 0;
register.window.titleBarShown = false;
register.window.image(5, 20, 290, 80, mainLogoPath, {
register.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
@@ -160,6 +161,9 @@ function showRegistrationGUI() {
register.window.shown = true;
mexui.focusedControl = register.passwordInput;
guiSubmitKey = checkRegistration;
showLocaleChooserGUI(new Vec2(getScreenWidth()/2-(localeChooser.window.size.x/2), register.window.position.y+register.window.size.y+20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}

View File

@@ -7,11 +7,10 @@
// TYPE: Client (JavaScript)
// ===========================================================================
let resetPassword = {
let passwordReset = {
window: null,
logoImage: null,
messageLabel: null,
emailLabel: null,
emailInput: null,
resetPasswordButton: null,
backToLoginButton: null,
@@ -22,7 +21,7 @@ let resetPassword = {
function initResetPasswordGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating password reset GUI ...`);
resetPassword.window = mexui.window(game.width/2-150, game.height/2-130, 300, 260, 'RESET PASSWORD', {
passwordReset.window = mexui.window(getScreenWidth() / 2 - 150, getScreenHeight() / 2 - 135, 300, 275, 'RESET PASSWORD', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
@@ -39,16 +38,17 @@ function initResetPasswordGUI() {
borderColour: toColour(0, 0, 0, 0),
},
});
resetPassword.window.titleBarIconSize = toVector2(0,0);
resetPassword.window.titleBarHeight = 0;
passwordReset.window.titleBarIconSize = toVector2(0, 0);
passwordReset.window.titleBarHeight = 0;
passwordReset.window.titleBarShown = false;
resetPassword.logoImage = resetPassword.window.image(5, 20, 290, 80, mainLogoPath, {
passwordReset.logoImage = passwordReset.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
resetPassword.messageLabel = resetPassword.window.text(20, 135, 260, 20, 'Please confirm your email', {
passwordReset.messageLabel = passwordReset.window.text(20, 135, 260, 20, 'Please confirm your email', {
main: {
textSize: 10.0,
textAlign: 0.5,
@@ -60,7 +60,7 @@ function initResetPasswordGUI() {
},
});
resetPassword.emailInput = resetPassword.window.textInput(20, 170, 260, 25, '', {
passwordReset.emailInput = passwordReset.window.textInput(20, 170, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
@@ -80,9 +80,9 @@ function initResetPasswordGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
});
resetPassword.emailInput.placeholder = "Email";
passwordReset.emailInput.placeholder = "Email";
resetPassword.resetPasswordButton = resetPassword.window.button(20, 205, 260, 30, 'RESET PASSWORD', {
passwordReset.resetPasswordButton = passwordReset.window.button(20, 205, 260, 30, 'RESET PASSWORD', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
@@ -95,7 +95,7 @@ function initResetPasswordGUI() {
},
}, checkResetPassword);
resetPassword.backToLoginButton = resetPassword.window.button(200, 240, 80, 15, 'LOGIN', {
passwordReset.backToLoginButton = passwordReset.window.button(200, 240, 80, 15, 'LOGIN', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
@@ -108,7 +108,7 @@ function initResetPasswordGUI() {
},
}, switchToLoginGUI);
resetPassword.backToLoginLabel = resetPassword.window.text(125, 240, 60, 15, 'Remember your password?', {
passwordReset.backToLoginLabel = passwordReset.window.text(110, 240, 60, 15, 'Remember your password?', {
main: {
textSize: 8.0,
textAlign: 1.0,
@@ -130,40 +130,58 @@ function showResetPasswordGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset window`);
setChatWindowEnabled(false);
mexui.setInput(true);
resetPassword.window.shown = true;
mexui.focusedControl = resetPassword.emailInput;
guiSubmitButton = checkResetPassword;
passwordReset.window.shown = true;
mexui.focusedControl = passwordReset.emailInput;
guiSubmitKey = checkResetPassword;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), passwordReset.window.position.y + passwordReset.window.size.y + 20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}
// ===========================================================================
function checkResetPassword() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password reset with server ...`);
sendNetworkEventToServer("vrr.checkResetPassword", resetPassword.emailInput.lines[0]);
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password reset with server (${passwordReset.emailInput.lines[0]}) ...`);
sendNetworkEventToServer("vrr.checkResetPassword", passwordReset.emailInput.lines[0]);
}
// ===========================================================================
function resetPasswordFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password reset failed`);
resetPassword.messageLabel.text = errorMessage;
resetPassword.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
resetPassword.emailInput.text = "";
passwordReset.messageLabel.text = errorMessage;
passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.text = "";
}
// ===========================================================================
function resetPasswordCodeInputGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password reset was successful`);
resetPassword.messageLabel.text = "Check your email for a verification code";
resetPassword.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
resetPassword.emailInput.text = "";
resetPassword.emailInput.placeholder = "Verification Code";
guiSubmitButton = checkResetPassword;
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Server reports password reset email confirmation was successful. Asking for code ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordCodeInputLabel");
//passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.lines[0] = "";
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordCodePlaceholder");
guiSubmitKey = checkResetPassword;
showResetPasswordGUI();
}
// ===========================================================================
function resetPasswordEmailInputGUI() {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Server reports password reset request was approved. Asking for email ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordConfirmEmailLabel");
//passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.text = "";
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordEmailPlaceholder");
guiSubmitKey = checkResetPassword;
showResetPasswordGUI();
}
// ===========================================================================

View File

@@ -48,7 +48,7 @@ function initYesNoDialogGUI() {
},
});
yesNoDialog.yesButton = yesNoDialog.window.button(5, 100, 197, 25, 'YES', {
yesNoDialog.yesButton = yesNoDialog.window.button(5, 105, 193, 30, 'YES', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
@@ -61,7 +61,7 @@ function initYesNoDialogGUI() {
},
}, yesNoDialogAnswerYes);
yesNoDialog.noButton = yesNoDialog.window.button(202, 105, 197, 25, 'NO', {
yesNoDialog.noButton = yesNoDialog.window.button(203, 105, 192, 30, 'NO', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
@@ -78,11 +78,21 @@ function initYesNoDialogGUI() {
// ===========================================================================
function showYesNoPromptGUI(promptMessage, promptTitle) {
function showYesNoPromptGUI(promptMessage, promptTitle, yesButtonText, noButtonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing prompt window. Prompt: ${promptTitle} - ${promptMessage}`);
mexui.setInput(true);
yesNoDialog.messageLabel.text = "";
yesNoDialog.yesButton.text = "";
yesNoDialog.noButton.text = "";
yesNoDialog.window.title = "";
yesNoDialog.messageLabel.text = promptMessage;
yesNoDialog.yesButton.text = yesButtonText;
yesNoDialog.noButton.text = noButtonText;
yesNoDialog.window.title = promptTitle;
yesNoDialog.window.shown = true;
}

View File

@@ -8,9 +8,10 @@
// ===========================================================================
class HouseData {
constructor(houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
constructor(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) {
this.index = -1;
this.houseId = houseId;
this.description = description;
this.entrancePosition = entrancePosition;
this.blipModel = blipModel;
this.pickupModel = pickupModel;
@@ -21,40 +22,62 @@ class HouseData {
// ===========================================================================
function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
if(getGame() == VRR_GAME_GTA_IV) {
function receiveHouseFromServer(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) {
logToConsole(LOG_DEBUG, `[VRR.House] Received house ${houseId} (${name}) from server`);
if(!areServerElementsSupported()) {
if(getHouseData(houseId) != false) {
let houseData = getHouseData(houseId);
houseData.description = description;
houseData.entrancePosition = entrancePosition;
houseData.blipModel = blipModel;
houseData.pickupModel = pickupModel;
houseData.hasInterior = hasInterior;
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} already exists. Checking blip ...`);
if(blipModel == -1) {
if(houseData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been removed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getHouseData(houseId).blipId);
getHouseData(houseId).blipId = -1;
//houses.splice(getHouseData(houseId).index, 1);
//setAllHouseDataIndexes();
} else {
if(getHouseData(houseId).blipId != -1) {
natives.setBlipCoordinates(getHouseData(houseId).blipId, getHouseData(houseId).entrancePosition);
natives.changeBlipSprite(getHouseData(houseId).blipId, getHouseData(houseId).blipModel);
//natives.changeBlipNameFromAscii(getHouseData(houseId).blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
} else {
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
getHouseData(houseId).blipId = blipId;
natives.changeBlipSprite(blipId, blipModel);
natives.setBlipMarkerLongDistance(blipId, false);
destroyElement(getElementFromId(blipId));
}
houseData.blipId = -1;
} else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip is unchanged`);
}
} else {
if(houseData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.setBlipCoordinates(houseData.blipId, houseData.entrancePosition);
natives.changeBlipSprite(houseData.blipId, houseData.blipModel);
natives.setBlipMarkerLongDistance(houseData.blipId, false);
natives.setBlipAsShortRange(houseData.blipId, true);
natives.changeBlipNameFromAscii(houseData.blipId, `${houseData.name.substr(0, 24)}${(houseData.name.length > 24) ? " ...": ""}`);
}
} else {
let blipId = createGameBlip(houseData.blipModel, houseData.entrancePosition, houseData.name);
if(blipId != -1) {
houseData.blipId = blipId;
}
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
}
}
} else {
let tempHouseData = new HouseData(houseId, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} doesn't exist. Adding ...`);
let tempHouseData = new HouseData(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior);
if(blipModel != -1) {
let blipId = natives.addBlipForCoord(entrancePosition);
if(blipId) {
let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House");
if(blipId != -1) {
tempHouseData.blipId = blipId;
natives.changeBlipSprite(blipId, blipModel);
natives.setBlipMarkerLongDistance(blipId, false);
//natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
}
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} has no blip.`);
}
houses.push(tempHouseData);
getServerData().houses.push(tempHouseData);
setAllHouseDataIndexes();
}
}
@@ -67,15 +90,21 @@ function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupMode
* @return {HouseData} The house's data (class instance)
*/
function getHouseData(houseId) {
let tempHouseData = houses.find((h) => h.houseId == houseId);
return (typeof tempHouseData != "undefined") ? tempHouseData : false;
let houses = getServerData().houses;
for(let i in houses) {
if(houses[i].houseId == houseId) {
return houses[i];
}
}
return false;
}
// ===========================================================================
function setAllHouseDataIndexes() {
for(let i in houses) {
houses[i].index = i;
for(let i in getServerData().houses) {
getServerData().houses[i].index = i;
}
}

View File

@@ -1,34 +0,0 @@
// For RAGEMP only
// Shared Scripts
require("../scripts/shared/const.js");
require("../scripts/shared/utilities.js");
require("../scripts/shared/gamedata.js");
// Multiplayer Mod (Wrapped Natives)
require("scripts/client/native/ragemp.js");
// Client Scripts
require("scripts/client/gui.js");
require("scripts/client/main.js");
require("scripts/client/nametag.js");
require("scripts/client/sync.js");
require("scripts/client/scoreboard.js");
require("scripts/client/keybind.js");
require("scripts/client/chatbox.js");
require("scripts/client/label.js");
require("scripts/client/skin-select.js");
require("scripts/client/server.js");
require("scripts/client/job.js");
require("scripts/client/event.js");
require("scripts/client/item.js");
require("scripts/client/utilities.js");
require("scripts/client/messaging.js");
require("scripts/client/logo.js");
require("scripts/client/afk.js");
require("scripts/client/mousecam.js");
require("scripts/client/radio.js");
require("scripts/client/animation.js");
// Startup
require("scripts/client/startup.js");

View File

@@ -12,6 +12,26 @@ let localPlayerWorking = false;
let jobRouteLocationBlip = null;
let jobRouteLocationSphere = null;
let jobBlipBlinkAmount = 0;
let jobBlipBlinkTimes = 10;
let jobBlipBlinkInterval = 500;
let jobBlipBlinkTimer = null;
// ===========================================================================
class JobData {
constructor(jobId, jobLocationId, name, position, blipModel, pickupModel) {
this.index = -1;
this.jobId = jobId;
this.jobLocationId = jobLocationId;
this.name = name;
this.position = position;
this.blipModel = blipModel;
this.pickupModel = pickupModel;
this.blipId = -1;
}
}
// ===========================================================================
function initJobScript() {
@@ -22,14 +42,14 @@ function initJobScript() {
// ===========================================================================
function setLocalPlayerJobType(tempJobType) {
logToConsole(LOG_DEBUG, `[VRR.Main] Set local player job type to ${tempJobType}`);
logToConsole(LOG_DEBUG, `[VRR.Job] Set local player job type to ${tempJobType}`);
localPlayerJobType = tempJobType;
}
// ===========================================================================
function setLocalPlayerWorkingState(tempWorking) {
logToConsole(LOG_DEBUG, `[VRR.Main] Setting working state to ${tempWorking}`);
logToConsole(LOG_DEBUG, `[VRR.Job] Setting working state to ${tempWorking}`);
localPlayerWorking = tempWorking;
}
@@ -38,7 +58,8 @@ function setLocalPlayerWorkingState(tempWorking) {
function showJobRouteLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.Job] Showing job route location`);
if(getMultiplayerMod() == VRR_MPMOD_GTAC) {
if(game.game == VRR_GAME_GTA_SA) {
if(getGame() == VRR_GAME_GTA_SA) {
// Server-side spheres don't show in GTA SA for some reason.
jobRouteLocationSphere = game.createPickup(1318, position, 1);
} else {
jobRouteLocationSphere = game.createSphere(position, 3);
@@ -49,7 +70,9 @@ function showJobRouteLocation(position, colour) {
destroyElement(jobRouteLocationBlip);
}
// Blinking is bugged if player hit the spot before it stops blinking.
blinkJobRouteLocationBlip(10, position, colour);
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour);
}
}
@@ -57,30 +80,48 @@ function showJobRouteLocation(position, colour) {
function enteredJobRouteSphere() {
logToConsole(LOG_DEBUG, `[VRR.Job] Entered job route sphere`);
tellServerPlayerArrivedAtJobRouteLocation();
destroyElement(jobRouteLocationSphere);
clearInterval(jobBlipBlinkTimer);
jobBlipBlinkAmount = 0;
jobBlipBlinkTimes = 0;
if(jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip);
jobRouteLocationSphere = null;
jobRouteLocationBlip = null;
}
if(jobRouteLocationSphere != null) {
destroyElement(jobRouteLocationSphere);
jobRouteLocationSphere = null;
}
tellServerPlayerArrivedAtJobRouteLocation();
}
// ===========================================================================
function blinkJobRouteLocationBlip(times, position, colour) {
for(let i = 1 ; i <= times ; i++) {
setTimeout(function() {
jobBlipBlinkTimes = times;
jobBlipBlinkTimer = setInterval(function() {
if(jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null;
} else {
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour);
}
}, 500*i);
if(jobBlipBlinkAmount >= jobBlipBlinkTimes) {
if(jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null;
}
setTimeout(function() {
jobBlipBlinkAmount = 0;
jobBlipBlinkTimes = 0;
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour);
}, 500*times+1);
clearInterval(jobBlipBlinkTimer);
}
}, jobBlipBlinkInterval);
}
// ===========================================================================
@@ -93,3 +134,90 @@ function hideJobRouteLocation() {
}
// ===========================================================================
function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, pickupModel) {
logToConsole(LOG_DEBUG, `[VRR.Job] Received job ${jobId} (${name}) from server`);
if(getGame() == VRR_GAME_GTA_IV) {
if(getJobData(jobId) != false) {
let jobData = getJobData(jobId);
jobData.jobLocationId = jobLocationId;
jobData.name = name;
jobData.position = position;
jobData.blipModel = blipModel;
jobData.pickupModel = pickupModel;
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} already exists. Checking blip ...`);
if(blipModel == -1) {
if(jobData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been removed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getJobData(jobId).blipId);
} else {
destroyElement(getElementFromId(blipId));
}
jobData.blipId = -1;
} else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip is unchanged`);
}
} else {
if(jobData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.setBlipCoordinates(jobData.blipId, jobData.position);
natives.changeBlipSprite(jobData.blipId, jobData.blipModel);
natives.setBlipMarkerLongDistance(jobData.blipId, false);
natives.setBlipAsShortRange(jobData.blipId, true);
natives.changeBlipNameFromAscii(jobData.blipId, `${jobData.name.substr(0, 24)}${(jobData.name.length > 24) ? " ...": ""}`);
}
} else {
let blipId = createGameBlip(jobData.blipModel, jobData.position, jobData.name);
if(blipId != -1) {
jobData.blipId = blipId;
}
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
}
}
} else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} doesn't exist. Adding ...`);
let tempJobData = new JobData(jobId, jobLocationId, name, position, blipModel, pickupModel);
if(blipModel != -1) {
let blipId = createGameBlip(blipModel, tempJobData.position, tempJobData.name);
if(blipId != -1) {
tempJobData.blipId = blipId;
}
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} has no blip.`);
}
getServerData().jobs.push(tempJobData);
setAllJobDataIndexes();
}
}
}
// ===========================================================================
/**
* @param {number} job - The ID of the job (initially provided by server)
* @return {JobData} The job's data (class instance)
*/
function getJobData(jobId) {
for(let i in getServerData().jobs) {
if(getServerData().jobs[i].jobId == jobId) {
return getServerData().jobs[i];
}
}
return false;
}
// ===========================================================================
function setAllJobDataIndexes() {
for(let i in getServerData().jobs) {
jobs[i].index = i;
}
}
// ===========================================================================

View File

@@ -78,9 +78,26 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
return false;
}
if(getGame() == VRR_GAME_GTA_IV) {
if(!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
return false;
}
if(!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
let screenPosition = getScreenFromWorldPosition(tempPosition);
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if(getGame() == VRR_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
}
if(screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
@@ -88,7 +105,7 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
let text = "";
if(price > "0") {
text = `For sale: $${price}`;
text = getLocaleString("PropertyForSaleLabel", price);
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(200, 200, 200, 255), false, true, false, true);
@@ -97,60 +114,65 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
text = "";
if(rentPrice != "0") {
text = `For rent: $${rentPrice} every payday`;
text = getLocaleString("PropertyForRentLabel", rentPrice);
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(200, 200, 200, 255), false, true, false, true);
screenPosition.y -= propertyLabelPriceOffset;
}
if(isBusiness) {
text = (locked) ? "CLOSED" : "OPEN";
text = (locked) ? toUpperCase(getLocaleString("Closed")) : toUpperCase(getLocaleString("Open"));
} else {
text = (locked) ? "LOCKED" : "UNLOCKED";
text = (locked) ? toUpperCase(getLocaleString("Locked")) : toUpperCase(getLocaleString("Unlocked"));
}
if(!locked && labelInfoType != VRR_PROPLABEL_INFO_NONE) {
let infoText = "";
switch(labelInfoType) {
case VRR_PROPLABEL_INFO_ENTER:
case VRR_PROPLABEL_INFO_ENTER: {
if(enterPropertyKey) {
infoText = `Press ${toUpperCase(getKeyNameFromId(enterPropertyKey))} to enter`;
infoText = getLocaleString("PropertyEnterKeyPressLabel", toUpperCase(getKeyNameFromId(enterPropertyKey)));
} else {
infoText = `Use /enter to enter`;
infoText = getLocaleString("PropertyEnterCommandLabel", "/enter");
}
break;
}
case VRR_PROPLABEL_INFO_BUY:
infoText = `Use /buy to purchase items`;
case VRR_PROPLABEL_INFO_BUY: {
infoText = getLocaleString("BusinessBuyItemsLabel", "/buy");
break;
}
case VRR_PROPLABEL_INFO_BUYBIZ:
infoText = `Use /buy to purchase items`;
case VRR_PROPLABEL_INFO_BUYBIZ: {
infoText = getLocaleString("BuyBusinessLabel", "/bizbuy");
break;
}
//case VRR_PROPLABEL_INFO_RENTBIZ:
// infoText = `Use /bizrent to buy this business`;
// break;
case VRR_PROPLABEL_INFO_BUYHOUSE:
infoText = `Use /housebuy to buy this house`;
case VRR_PROPLABEL_INFO_BUYHOUSE: {
infoText = getLocaleString("BuyHouseLabel", "/housebuy");
break;
}
case VRR_PROPLABEL_INFO_RENTHOUSE:
infoText = `Use /houserent to rent this house`;
case VRR_PROPLABEL_INFO_RENTHOUSE: {
infoText = getLocaleString("RentHouseLabel", "/houserent");
break;
}
case VRR_PROPLABEL_INFO_ENTERVEH:
infoText = "Enter a vehicle in the parking lot to buy it";
case VRR_PROPLABEL_INFO_ENTERVEHICLE: {
infoText = getLocaleString("VehicleDealershipLabel");
break;
}
case VRR_PROPLABEL_INFO_NONE:
default:
infoText = "";
default: {
if(enterPropertyKey) {
infoText = getLocaleString("PropertyEnterKeyPressLabel", toUpperCase(getKeyNameFromId(enterPropertyKey)));
} else {
infoText = getLocaleString("PropertyEnterCommandLabel", "/enter");
}
break;
}
}
if(getDistance(localPlayer.position, position) <= renderLabelDistance-2) {
let size = propertyLabelLockedFont.measure(infoText, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(infoText, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(234, 198, 126, 255), false, true, false, true);
@@ -183,9 +205,26 @@ function renderPropertyExitLabel(position) {
return false;
}
if(getGame() == VRR_GAME_GTA_IV) {
if(!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
return false;
}
if(!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
let screenPosition = getScreenFromWorldPosition(tempPosition);
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if(getGame() == VRR_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
}
if(screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
@@ -211,9 +250,26 @@ function renderJobLabel(name, position, jobType) {
return false;
}
if(getGame() == VRR_GAME_GTA_IV) {
if(!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
return false;
}
if(!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
let screenPosition = getScreenFromWorldPosition(tempPosition);
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if(getGame() == VRR_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
}
if(screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
@@ -222,15 +278,15 @@ function renderJobLabel(name, position, jobType) {
let text = "";
if(jobType == localPlayerJobType) {
if(localPlayerWorking) {
text = "Use /uniform and /equip for job stuff, or /stopwork to go off duty";
text = getLocaleString("JobEquipAndUniformLabel", "/equip", "/uniform", "/stopwork");
} else {
text = "Use /startwork to go on duty";
text = getLocaleString("StartWorkLabel", "/startwork");
}
} else {
if(localPlayerJobType == 0) {
text = "Use /takejob to work here";
text = getLocaleString("TakeJobLabel", "/takejob");
} else {
text = "You already have a job. Use /quitjob if you want this one";
text = getLocaleString("NotYourJobLabel", "/quitjob");
}
}
@@ -239,7 +295,7 @@ function renderJobLabel(name, position, jobType) {
screenPosition.y -= 18;
text = name + " Job";
text = getLocaleString("JobLabel", name);
size = jobNameLabelFont.measure(text, game.width, 0.0, 0.0, jobNameLabelFont.size, true, true);
jobNameLabelFont.render(text, [screenPosition.x-size[0]/2, screenPosition.y-size[1]/2], game.width, 0.0, 0.0, jobNameLabelFont.size, COLOUR_WHITE, false, true, false, true);
}
@@ -250,11 +306,26 @@ function processLabelRendering() {
if(renderLabels) {
if(!areServerElementsSupported()) {
if(localPlayer != null) {
for(let i in businesses) {
if(getDistance(localPlayer.position, businesses[i].entrancePosition) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(businesses[i].entrancePosition, 1.0), 0.0, 0.0, 0, 153, 255, 255);
getServerData().businesses.forEach((business) => {
if(getDistance(localPlayer.position, business.entrancePosition) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(business.entrancePosition, 1.0), 0.0, 0.0, 0, 153, 255, 255);
//renderPropertyEntranceLabel(business.name, business.entrancePosition, business.locked, true, makeLargeNumberReadable(business.price), makeLargeNumberReadable(business.rentPrice), business.labelInfoType);
}
});
getServerData().houses.forEach((house) => {
if(getDistance(localPlayer.position, house.entrancePosition) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(house.entrancePosition, 1.0), 0.0, 0.0, 0, 200, 0, 255);
//renderPropertyEntranceLabel("House", house.entrancePosition, house.locked, true, makeLargeNumberReadable(house.price), makeLargeNumberReadable(house.rentPrice), 0);
}
});
getServerData().jobs.forEach((job) => {
if(getDistance(localPlayer.position, job.position) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(job.position, 1.0), 0.0, 0.0, 255, 255, 0, 255);
//renderJobLabel(job.name, job.position, job.jobType);
}
});
}
}
@@ -281,19 +352,22 @@ function processLabelRendering() {
}
switch(pickups[i].getData("vrr.label.type")) {
case VRR_LABEL_BUSINESS:
case VRR_LABEL_BUSINESS: {
renderPropertyEntranceLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.locked"), true, price, rentPrice, labelInfoType);
break;
}
case VRR_LABEL_HOUSE:
renderPropertyEntranceLabel("House", pickups[i].position, pickups[i].getData("vrr.label.locked"), false, price, rentPrice, labelInfoType);
case VRR_LABEL_HOUSE: {
renderPropertyEntranceLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.locked"), false, price, rentPrice, labelInfoType);
break;
}
case VRR_LABEL_JOB:
case VRR_LABEL_JOB: {
renderJobLabel(pickups[i].getData("vrr.label.name"), pickups[i].position, pickups[i].getData("vrr.label.jobType"));
break;
}
case VRR_LABEL_EXIT:
case VRR_LABEL_EXIT: {
renderPropertyExitLabel(pickups[i].position);
break;
}
@@ -305,5 +379,6 @@ function processLabelRendering() {
}
}
}
}
// -------------------------------------------------------------------------

62
scripts/client/locale.js Normal file
View File

@@ -0,0 +1,62 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: locale.js
// DESC: Provides locale functions and usage
// TYPE: Client (JavaScript)
// ===========================================================================
function getLocaleString(stringName, ...args) {
if(typeof getServerData().localeStrings[localLocaleId][stringName] == undefined) {
return "";
}
let tempString = getServerData().localeStrings[localLocaleId][stringName];
if(tempString == "" || tempString == null || tempString == undefined) {
return "";
}
for(let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i-1]);
}
return tempString;
}
// ===========================================================================
function getAvailableLocaleOptions() {
return getServerData().localeOptions.filter(localeOption => localeOption.requiresUnicode == false);
}
// ===========================================================================
function loadLocaleConfig() {
let configFile = loadTextFile("config/client/locale.json");
getServerData().localeOptions = JSON.parse(configFile);
}
// ===========================================================================
function loadAllLocaleStrings() {
let localeOptions = getServerData().localeOptions;
for(let i in localeOptions) {
logToConsole(LOG_INFO, `[VRR.Locale] Loading locale strings for ${localeOptions[i].englishName} (${i})`);
let localeFile = loadTextFile(`locale/${localeOptions[i].stringsFile}`);
let localeData = JSON.parse(localeFile);
getServerData().localeStrings[i] = localeData;
}
}
// ===========================================================================
function setLocale(tempLocaleId) {
logToConsole(LOG_DEBUG, `[VRR.Locale] Setting locale to ${tempLocaleId} (${getServerData().localeOptions[tempLocaleId].englishName})`);
localLocaleId = tempLocaleId;
resetGUIStrings();
}
// ===========================================================================

View File

@@ -7,6 +7,9 @@
// TYPE: Client (JavaScript)
// ===========================================================================
let resourceReady = false;
let resourceStarted = false;
let inSphere = false;
let inVehicle = false;
let inVehicleSeat = false;
@@ -27,7 +30,7 @@ let renderHotBar = true;
let renderItemActionDelay = true;
let renderInteriorLights = true;
let logLevel = LOG_ERROR|LOG_WARN|LOG_INFO;
let logLevel = LOG_INFO|LOG_DEBUG|LOG_VERBOSE;
let weaponDamageEnabled = {};
let weaponDamageEvent = {};
@@ -66,12 +69,24 @@ let vehiclePurchasePosition = null;
let forceWantedLevel = 0;
let guiSubmitKey = false;
let guiLeftKey = false;
let guiRightKey = false;
let guiUpKey = false;
let guiDownKey = false;
// Pre-cache all allowed skins
let allowedSkins = getAllowedSkins(getGame());
let businesses = [];
let houses = [];
let jobs = [];
let vehicles = [];
let localLocaleId = 0;
let serverData = {
houses: [],
businesses: [],
localeStrings: [],
localeOptions: [],
vehicles: [],
jobs: [],
};
// ===========================================================================

View File

@@ -7,7 +7,14 @@
// TYPE: Client (JavaScript)
// ===========================================================================
let smallGameMessageFont = null;
let bigGameMessageFonts = {};
let bigGameMessageFontName = "";
let bigGameMessageText = "";
let bigGameMessageColour = COLOUR_WHITE;
let bigGameMessageTimer = null;
let smallGameMessageFonts = {};
let smallGameMessageFontName = "";
let smallGameMessageText = "";
let smallGameMessageColour = COLOUR_WHITE;
let smallGameMessageTimer = null;
@@ -16,43 +23,50 @@ let smallGameMessageTimer = null;
function initMessagingScript() {
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Initializing messaging script ...");
smallGameMessageFont = loadSmallGameMessageFont();
smallGameMessageFonts = loadSmallGameMessageFonts();
bigGameMessageFonts = loadSmallGameMessageFonts();
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Messaging script initialized!");
}
// ===========================================================================
function loadSmallGameMessageFont() {
let tempSmallGameMessageFont = null;
function loadSmallGameMessageFonts() {
let tempSmallGameMessageFonts = {};
let fontStream = openFile("files/fonts/pricedown.ttf");
if(fontStream != null) {
tempSmallGameMessageFont = lucasFont.createFont(fontStream, 20.0);
tempSmallGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 20.0);
fontStream.close();
}
return tempSmallGameMessageFont;
tempSmallGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(20.0, "Roboto");
tempSmallGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(20.0, "Roboto", "Light");
return tempSmallGameMessageFonts;
}
// ===========================================================================
function loadBigGameMessageFont() {
let tempBigGameMessageFont = null;
let tempBigGameMessageFonts = {};
let fontStream = openFile("files/fonts/pricedown.ttf");
if(fontStream != null) {
tempBigGameMessageFont = lucasFont.createFont(fontStream, 28.0);
tempBigGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 28.0);
fontStream.close();
}
return tempBigGameMessageFont;
tempBigGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(28.0, "Roboto");
tempBigGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(28.0, "Roboto", "Light");
return tempBigGameMessageFonts;
}
// ===========================================================================
function processSmallGameMessageRendering() {
if(renderSmallGameMessage) {
if(smallGameMessageFont != null) {
if(smallGameMessageFont != "") {
smallGameMessageFont.render(smallGameMessageText, [0, game.height-90], game.width, 0.5, 0.0, smallGameMessageFont.size, smallGameMessageColour, true, true, false, true);
if(smallGameMessageText != "") {
if(smallGameMessageFonts[smallGameMessageFontName] != null) {
smallGameMessageFonts[smallGameMessageFontName].render(smallGameMessageText, [0, game.height-90], game.width, 0.5, 0.0, smallGameMessageFonts[smallGameMessageFontName].size, smallGameMessageColour, true, true, false, true);
}
}
}
@@ -60,12 +74,13 @@ function processSmallGameMessageRendering() {
// ===========================================================================
function showSmallGameMessage(text, colour, duration) {
logToConsole(LOG_DEBUG, `[VRR.Messaging] Showing small game message '${text}' for ${duration}ms`);
function showSmallGameMessage(text, colour, duration, fontName) {
logToConsole(LOG_DEBUG, `[VRR.Messaging] Showing small game message '${text}' using font ${fontName} for ${duration}ms`);
if(smallGameMessageText != "") {
clearTimeout(smallGameMessageTimer);
}
smallGameMessageFontName = fontName;
smallGameMessageColour = colour;
smallGameMessageText = text;
@@ -73,6 +88,7 @@ function showSmallGameMessage(text, colour, duration) {
smallGameMessageText = "";
smallGameMessageColour = COLOUR_WHITE;
smallGameMessageTimer = null;
smallGameMessageFontName = "";
}, duration);
}

View File

@@ -20,7 +20,7 @@ function SetStandardControlsEnabled(bEnabled)
if (game.standardControls === undefined)
{
console.warn("game.standardControls not implemented");
logToConsole(LOG_WARN, "game.standardControls not implemented");
return;
}
game.standardControls = bEnabled;
@@ -93,7 +93,7 @@ function GetMouseSensitivity()
{
if (game.getMouseSensitivity === undefined)
{
//console.error("game.getMouseSensitivity not implemented");
//logToConsole(LOG_ERROR, "game.getMouseSensitivity not implemented");
return [0.0025,0.003];
}
let MouseSensitivity = game.getMouseSensitivity();
@@ -124,7 +124,7 @@ function ProcessLineOfSight(vecStartX, vecStartY, vecStartZ, vecEndX, vecEndY, v
{
if (game.processLineOfSight === undefined)
{
console.warn("game.processLineOfSight not implemented");
logToConsole(LOG_WARN, "game.processLineOfSight not implemented");
return [null];
}
let Result = game.processLineOfSight([vecStartX, vecStartY, vecStartZ], [vecEndX, vecEndY, vecEndZ], bCheckBuildings, bCheckVehicles, bCheckPeds, bCheckObjects, bCheckDummies, bCheckSeeThroughStuff, bIgnoreSomeObjectsForCamera);

View File

@@ -48,11 +48,11 @@ function updatePlayerNameTag(clientName, characterName, colour, paused, ping) {
playerPaused[clientName] = paused;
playerPing[clientName] = ping;
if(game.game == VRR_GAME_GTA_IV) {
if(getGame() == VRR_GAME_GTA_IV) {
let client = getPlayerFromParams(clientName);
if(client != false) {
if(client.player != null) {
client.player.setNametag(characterName, colour);
if(getPlayerPed(client) != null) {
getPlayerPed(client).setNametag(characterName, colour);
}
}
}
@@ -81,7 +81,7 @@ function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour,
// Health Bar
if(getMultiplayerMod() == VRR_MPMOD_GTAC) {
if(game.game == VRR_GAME_GTA_III) {
if(getGame() == VRR_GAME_GTA_III) {
// Mickey Hamfists is ridiculously tall. Raise the nametag for him a bit
if(skin == 109) {
y -= 20;
@@ -139,7 +139,7 @@ function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour,
// ===========================================================================
function updateNametags(element) {
function updateNametag(element) {
if(!areWorldLabelsSupported()) {
return false;
}
@@ -147,10 +147,11 @@ function updateNametags(element) {
if(localPlayer != null) {
let playerPos = localPlayer.position;
let elementPos = element.position;
let client = getClientFromPlayerElement(element);
elementPos[2] += 0.9;
//if(typeof element.getComponentPosition()) {
let screenPos = getScreenFromWorldPosition(elementPos);
if (screenPos[2] >= 0.0) {
let health = element.health/100.0;
@@ -178,6 +179,7 @@ function updateNametags(element) {
let paused = false;
let ping = -1;
if(element.isType(ELEMENT_PLAYER)) {
if(typeof playerNames[element.name] != "undefined") {
name = playerNames[element.name];
}
@@ -193,6 +195,7 @@ function updateNametags(element) {
if(typeof playerPing[element.name] != "undefined") {
ping = playerPing[element.name];
}
}
drawNametag(screenPos[0], screenPos[1], health, armour, name, ping, 1.0-distance/nametagDistance, distance, colour, paused, element.skin);
}
@@ -205,7 +208,7 @@ function updateNametags(element) {
function getClientFromPlayer(player) {
getClients().forEach(function(client) {
if(client.player == player) {
if(getPlayerPed(client) == player) {
return client;
}
});
@@ -214,13 +217,13 @@ function getClientFromPlayer(player) {
// ===========================================================================
function processNameTagRendering(event) {
//if(game.game >= GAME_GTA_IV) {
//if(getGame() >= GAME_GTA_IV) {
// return false;
//}
getElementsByType(ELEMENT_PLAYER).forEach(function(player) {
if(player != localPlayer) {
updateNametags(player);
getElementsByType(ELEMENT_PED).forEach(function(ped) {
if(ped != localPlayer) {
updateNametag(ped);
}
});
}
@@ -232,3 +235,9 @@ function createColour(alpha, red, green, blue) {
}
// ===========================================================================
function setNameTagDistance(distance) {
nametagDistance = distance;
}
// ===========================================================================

View File

@@ -7,6 +7,23 @@
// TYPE: Server (JavaScript)
// ===========================================================================
let disconnectReasons = [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
];
// ===========================================================================
function sendNetworkEventToPlayer(networkEvent, client, ...args) {
triggerNetworkEvent.apply(null, networkEvent, client, args);
}
@@ -20,33 +37,47 @@ function getPlayerPosition() {
// ===========================================================================
function setPlayerPosition(position) {
if(getGame() == VRR_GAME_GTA_IV) {
natives.setCharCoordinates(localPlayer, position);
} else {
localPlayer.position = position;
}
// ===========================================================================
function getElementPosition(element) {
return element.position;
}
// ===========================================================================
function setElementPosition(element, position) {
if(!element.isSyncer) {
function getElementPosition(elementId) {
return getElementFromId(elementId).position;
}
// ===========================================================================
function getElementHeading(elementId) {
return getElementFromId(elementId).heading;
}
// ===========================================================================
function setElementPosition(elementId, position) {
if(getElementFromId(elementId) == null) {
return false;
}
element.position = position;
if(!getElementFromId(elementId).isSyncer) {
return false;
}
getElementFromId(elementId).position = position;
}
// ===========================================================================
function deleteGameElement(element, position) {
if(!element.isOwner) {
function deleteGameElement(elementId, position) {
if(!getElementFromId(elementId).isOwner) {
return false;
}
destroyGameElement(element);
destroyGameElement(getElementFromId(elementId));
}
// ===========================================================================
@@ -101,7 +132,7 @@ function getClientsInRange(position, distance) {
// ===========================================================================
function getCiviliansInRange(position, distance) {
return getElementsByType(ELEMENT_PED).filter(x => !x.isType(ELEMENT_PLAYER) && getElementPosition(x).position.distance(position) <= distance);
return getElementsByType(ELEMENT_PED).filter(x => !x.isType(ELEMENT_PLAYER) && x.position.distance(position) <= distance);
}
// ===========================================================================
@@ -113,7 +144,7 @@ function getPlayersInRange(position, distance) {
// ===========================================================================
function getElementsByTypeInRange(elementType, position, distance) {
return getElementsByType(elementType).filter(x => getElementPosition(x).position.distance(position) <= distance);
return getElementsByType(elementType).filter(x => x.position.distance(position) <= distance);
}
// ===========================================================================
@@ -124,6 +155,12 @@ function getClosestCivilian(position) {
// ===========================================================================
function getClosestPlayer(position) {
return getElementsByType(ELEMENT_PLAYER).reduce((i, j) => ((i.position.distance(position) <= j.position.distance(position)) ? i : j));
}
// ===========================================================================
function is2dPositionOnScreen(pos2d) {
return pos2d.x >= 0 && pos2d.y >= 0 && pos2d.x <= game.width && pos2d.y <= game.height;
}
@@ -142,3 +179,522 @@ function getVehiclesInRange(position, range) {
}
// ===========================================================================
function createGameBlip(blipModel, position, name = "") {
if(getGame() == VRR_GAME_GTA_IV) {
let blipId = natives.addBlipForCoord(position);
if(blipId) {
natives.changeBlipSprite(blipId, blipModel);
natives.setBlipMarkerLongDistance(blipId, false);
natives.setBlipAsShortRange(blipId, true);
natives.changeBlipNameFromAscii(blipId, `${name.substr(0, 24)}${(name.length > 24) ? " ...": ""}`);
return blipId;
}
}
return -1;
}
// ===========================================================================
function setEntityData(entity, dataName, dataValue, syncToClients = true) {
if(entity != null) {
return entity.setData(dataName, dataValue);
}
}
// ===========================================================================
function setVehicleEngine(vehicleId, state) {
getElementFromId(vehicleId).engine = state;
}
// ===========================================================================
function setVehicleLights(vehicleId, state) {
getElementFromId(vehicleId).lights = state;
}
// ===========================================================================
function repairVehicle(syncId) {
getVehicleFromSyncId(syncId).fix();
}
// ===========================================================================
function syncVehicleProperties(vehicle) {
if(doesEntityDataExist(vehicle, "vrr.lights")) {
let lightStatus = getEntityData(vehicle, "vrr.lights");
vehicle.lights = lightStatus;
}
if(doesEntityDataExist(vehicle, "vrr.invincible")) {
let invincible = getEntityData(vehicle, "vrr.invincible");
element.setProofs(invincible, invincible, invincible, invincible, invincible);
}
if(doesEntityDataExist(vehicle, "vrr.panelStatus")) {
let panelsStatus = getEntityData(vehicle, "vrr.panelStatus");
for(let i in panelsStatus) {
vehicle.setPanelStatus(i, panelsStatus[i]);
}
}
if(doesEntityDataExist(vehicle, "vrr.wheelStatus")) {
let wheelsStatus = getEntityData(vehicle, "vrr.wheelStatus");
for(let i in wheelsStatus) {
vehicle.setWheelStatus(i, wheelsStatus[i]);
}
}
if(doesEntityDataExist(vehicle, "vrr.lightStatus")) {
let lightStatus = getEntityData(vehicle, "vrr.lightStatus");
for(let i in lightStatus) {
vehicle.setLightStatus(i, lightStatus[i]);
}
}
if(doesEntityDataExist(vehicle, "vrr.suspensionHeight")) {
let suspensionHeight = getEntityData(vehicle, "vrr.suspensionHeight");
vehicle.setSuspensionHeight(suspensionHeight);
}
if(getGame() == VRR_GAME_GTA_SA) {
let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
for(let i in allUpgrades) {
vehicle.removeUpgrade(i);
}
if(doesEntityDataExist(vehicle, "vrr.upgrades")) {
let upgrades = getEntityData(vehicle, "vrr.upgrades");
for(let i in upgrades) {
if(upgrades[i] != 0) {
vehicle.addUpgrade(upgrades[i]);
}
}
}
}
if(getGame() == VRR_GAME_GTA_SA || getGame() == VRR_GAME_GTA_IV) {
if(doesEntityDataExist(vehicle, "vrr.livery")) {
let livery = getEntityData(vehicle, "vrr.livery");
if(getGame() == VRR_GAME_GTA_SA) {
vehicle.setPaintJob(livery);
} else if(getGame() == VRR_GAME_GTA_IV) {
vehicle.livery = livery;
}
}
}
}
// ===========================================================================
function removeEntityData(entity, dataName) {
if(entity != null) {
return entity.removeData(dataName);
}
return null;
}
// ===========================================================================
function doesEntityDataExist(entity, dataName) {
if(entity != null) {
return (entity.getData(dataName) != null);
}
return null;
}
// ===========================================================================
function syncCivilianProperties(civilian) {
if(getGame() == VRR_GAME_GTA_III) {
if(doesEntityDataExist(civilian, "vrr.scale")) {
let scaleFactor = getEntityData(civilian, "vrr.scale");
let tempMatrix = civilian.matrix;
tempMatrix.setScale(toVector3(scaleFactor.x, scaleFactor.y, scaleFactor.z));
let tempPosition = civilian.position;
civilian.matrix = tempMatrix;
tempPosition.z += scaleFactor.z;
civilian.position = tempPosition;
}
}
if(getGame() == VRR_GAME_GTA_SA) {
if(doesEntityDataExist(civilian, "vrr.fightStyle")) {
let fightStyle = getEntityData(civilian, "vrr.fightStyle");
civilian.setFightStyle(fightStyle[0], fightStyle[1]);
}
}
if(getGame() == VRR_GAME_GTA_III) {
if(doesEntityDataExist(civilian, "vrr.walkStyle")) {
let walkStyle = getEntityData(civilian, "vrr.walkStyle");
civilian.walkStyle = walkStyle;
}
}
if(getGame() == VRR_GAME_GTA_IV) {
if(doesEntityDataExist(civilian, "vrr.bodyPropHair")) {
let bodyPropHair = getEntityData(civilian, "vrr.bodyPropHair");
civilian.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropHead")) {
let bodyPropHead = getEntityData(civilian, "vrr.bodyPropHead");
civilian.changeBodyProp(1, bodyPropHead[0], bodyPropHead[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropEyes")) {
let bodyPropEyes = getEntityData(civilian, "vrr.bodyPropEyes");
civilian.changeBodyProp(1, bodyPropEyes[0], bodyPropEyes[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropLeftHand")) {
let bodyPropLeftHand = getEntityData(civilian, "vrr.bodyPropLeftHand");
civilian.changeBodyProp(1, bodyPropLeftHand[0], bodyPropLeftHand[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropRightHand")) {
let bodyPropRightHand = getEntityData(civilian, "vrr.bodyPropRightHand");
civilian.changeBodyProp(1, bodyPropRightHand[0], bodyPropRightHand[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropLeftWrist")) {
let bodyPropLeftWrist = getEntityData(civilian, "vrr.bodyPropLeftWrist");
civilian.changeBodyProp(1, bodyPropLeftWrist[0], bodyPropLeftWrist[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropRightWrist")) {
let bodyPropRightWrist = getEntityData(civilian, "vrr.bodyPropRightWrist");
civilian.changeBodyProp(1, bodyPropRightWrist[0], bodyPropRightWrist[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropRightWrist")) {
let bodyPropRightWrist = getEntityData(civilian, "vrr.bodyPropRightWrist");
civilian.changeBodyProp(1, bodyPropRightWrist[0], bodyPropRightWrist[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropHip")) {
let bodyPropHip = getEntityData(civilian, "vrr.bodyPropHip");
civilian.changeBodyProp(1, bodyPropHip[0], bodyPropHip[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropLeftFoot")) {
let bodyPropLeftFoot = getEntityData(civilian, "vrr.bodyPropLeftFoot");
civilian.changeBodyProp(1, bodyPropLeftFoot[0], bodyPropLeftFoot[1]);
}
if(doesEntityDataExist(civilian, "vrr.bodyPropRightFoot")) {
let bodyPropRightFoot = getEntityData(civilian, "vrr.bodyPropRightFoot");
civilian.changeBodyProp(1, bodyPropRightFoot[0], bodyPropRightFoot[1]);
}
}
if(doesEntityDataExist(civilian, "vrr.anim")) {
let animData = getEntityData(vehicle, "vrr.anim");
civilian.addAnimation(animData[0], animData[1]);
}
}
// ===========================================================================
function preventDefaultEventAction(event) {
event.preventDefault();
}
// ===========================================================================
function syncPlayerProperties(player) {
if(getGame() == VRR_GAME_GTA_III) {
if(doesEntityDataExist(player, "vrr.scale")) {
let scaleFactor = getEntityData(player, "vrr.scale");
let tempMatrix = player.matrix;
tempMatrix.setScale(toVector3(scaleFactor.x, scaleFactor.y, scaleFactor.z));
let tempPosition = player.position;
player.matrix = tempMatrix;
tempPosition.z += scaleFactor.z;
player.position = tempPosition;
}
}
if(getGame() == VRR_GAME_GTA_SA) {
if(doesEntityDataExist(player, "vrr.fightStyle")) {
let fightStyle = getEntityData(player, "vrr.fightStyle");
player.setFightStyle(fightStyle[0], fightStyle[1]);
}
}
//if(getGame() == VRR_GAME_GTA_SA) {
// if(doesEntityDataExist(player, "vrr.walkStyle")) {
// let walkStyle = getEntityData(player, "vrr.walkStyle");
// player.walkStyle = walkStyle;
// }
//}
if(getGame() == VRR_GAME_GTA_IV) {
if(doesEntityDataExist(player, "vrr.bodyPartHair")) {
let bodyPartHead = getEntityData(player, "vrr.bodyPartHair");
player.changeBodyPart(0, bodyPartHead[0], bodyPartHair[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPartHead")) {
let bodyPartHead = getEntityData(player, "vrr.bodyPartHead");
player.changeBodyPart(1, bodyPartHead[0], bodyPartHead[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPartUpper")) {
let bodyPartUpper = getEntityData(player, "vrr.bodyPartUpper");
player.changeBodyPart(1, bodyPartUpper[0], bodyPartUpper[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPartLower")) {
let bodyPartLower = getEntityData(player, "vrr.bodyPartLower");
player.changeBodyPart(1, bodyPartLower[0], bodyPartLower[1]);
}
}
if(getGame() == VRR_GAME_GTA_IV) {
if(doesEntityDataExist(player, "vrr.bodyPropHair")) {
let bodyPropHair = getEntityData(player, "vrr.bodyPropHair");
player.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropHead")) {
let bodyPropHead = getEntityData(player, "vrr.bodyPropHead");
player.changeBodyProp(1, bodyPropHead[0], bodyPropHead[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropEyes")) {
let bodyPropEyes = getEntityData(player, "vrr.bodyPropEyes");
player.changeBodyProp(1, bodyPropEyes[0], bodyPropEyes[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropLeftHand")) {
let bodyPropLeftHand = getEntityData(player, "vrr.bodyPropLeftHand");
player.changeBodyProp(1, bodyPropLeftHand[0], bodyPropLeftHand[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropRightHand")) {
let bodyPropRightHand = getEntityData(player, "vrr.bodyPropRightHand");
player.changeBodyProp(1, bodyPropRightHand[0], bodyPropRightHand[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropLeftWrist")) {
let bodyPropLeftWrist = getEntityData(player, "vrr.bodyPropLeftWrist");
player.changeBodyProp(1, bodyPropLeftWrist[0], bodyPropLeftWrist[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropRightWrist")) {
let bodyPropRightWrist = getEntityData(player, "vrr.bodyPropRightWrist");
player.changeBodyProp(1, bodyPropRightWrist[0], bodyPropRightWrist[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropRightWrist")) {
let bodyPropRightWrist = getEntityData(player, "vrr.bodyPropRightWrist");
player.changeBodyProp(1, bodyPropRightWrist[0], bodyPropRightWrist[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropHip")) {
let bodyPropHip = getEntityData(player, "vrr.bodyPropHip");
player.changeBodyProp(1, bodyPropHip[0], bodyPropHip[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropLeftFoot")) {
let bodyPropLeftFoot = getEntityData(player, "vrr.bodyPropLeftFoot");
player.changeBodyProp(1, bodyPropLeftFoot[0], bodyPropLeftFoot[1]);
}
if(doesEntityDataExist(player, "vrr.bodyPropRightFoot")) {
let bodyPropRightFoot = getEntityData(player, "vrr.bodyPropRightFoot");
player.changeBodyProp(1, bodyPropRightFoot[0], bodyPropRightFoot[1]);
}
}
}
// ===========================================================================
function syncObjectProperties(object) {
if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
if(doesEntityDataExist(object, "vrr.scale")) {
let scaleFactor = getEntityData(object, "vrr.scale");
let tempMatrix = object.matrix;
tempMatrix.setScale(toVector3(scaleFactor.x, scaleFactor.y, scaleFactor.z));
let tempPosition = object.position;
object.matrix = tempMatrix;
tempPosition.z += scaleFactor.z;
object.position = tempPosition;
}
}
}
// ===========================================================================
function consolePrint(text) {
console.log(text);
}
// ===========================================================================
function consoleWarn(text) {
console.warn(text);
}
// ===========================================================================
function consoleError(text) {
console.error(text);
}
// ===========================================================================
function getPlayerName(client) {
return client.name;
}
// ===========================================================================
function getGame() {
return game.game;
}
// ===========================================================================
function getPlayerId(client) {
return client.index;
}
// ===========================================================================
function syncElementProperties(element) {
if(doesEntityDataExist(element, "vrr.interior")) {
if(typeof element.interior != "undefined") {
element.interior = getEntityData(element, "vrr.interior");
}
}
switch(element.type) {
case ELEMENT_VEHICLE:
syncVehicleProperties(element);
break;
case ELEMENT_PED:
syncCivilianProperties(element);
break;
case ELEMENT_PLAYER:
syncPlayerProperties(element);
break;
case ELEMENT_OBJECT:
syncObjectProperties(element);
break;
default:
break;
}
}
// ===========================================================================
function getPlayerPed(client) {
return client.player;
}
// ===========================================================================
function getScreenWidth() {
return game.width;
}
// ===========================================================================
function getScreenHeight() {
return game.height;
}
// ===========================================================================
// ===========================================================================
function openAllGarages() {
switch(getGame()) {
case VRR_GAME_GTA_III:
for(let i=0;i<=26;i++) {
openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_VC:
for(let i=0;i<=32;i++) {
openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_SA:
for(let i=0;i<=44;i++) {
openGarage(i);
}
break;
default:
break;
}
}
// ===========================================================================
function closeAllGarages() {
switch(getGame()) {
case VRR_GAME_GTA_III:
for(let i=0;i<=26;i++) {
closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_VC:
for(let i=0;i<=32;i++) {
closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_SA:
for(let i=0;i<=44;i++) {
closeGarage(i);
}
break;
default:
break;
}
}
// ===========================================================================
function setPedInvincible(ped, state) {
ped.invincible = state;
}
// ===========================================================================
function setPedLookAt(ped, position) {
if(getGame() == VRR_GAME_GTA_SA) {
ped.lookAt(position, 10000);
return true;
} else {
setElementHeading(ped.id, getHeadingFromPosToPos(getElementPosition(ped.id), position));
}
}
// ===========================================================================
function setElementHeading(elementId, heading) {
getElementFromId(elementId).heading = heading;
}
// ===========================================================================

19
scripts/client/npc.js Normal file
View File

@@ -0,0 +1,19 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: npc.js
// DESC: Provides NPC functions and processing
// TYPE: Client (JavaScript)
// ===========================================================================
function processNPCMovement(npc) {
//if(npc.isSyncer == true) {
if(getEntityData(npc, "vrr.lookAtClosestPlayer") == true) {
let closestPlayer = getClosestPlayer(getElementPosition(npc.id));
setPedLookAt(npc, getElementPosition(closestPlayer.id));
}
//}
}
// ===========================================================================

View File

@@ -40,7 +40,7 @@ function setStreamingRadioVolume(volume) {
// ===========================================================================
function playAudioFile(audioName, loop, volume) {
playCustomAudio(audioName, volume/100, loop);
findResourceByName("connectedrp-extra").exports.playCustomAudio(audioName, volume/100, loop);
}
// ===========================================================================

View File

@@ -18,97 +18,137 @@ function initServerScript() {
function addAllNetworkHandlers() {
logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ...");
// Chat history
addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible
addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines);
addNetworkEventHandler("vrr.chatAutoHideDelay", setChatAutoHideDelay);
// Messaging (like textdraws and stuff)
addNetworkEventHandler("vrr.smallGameMessage", showSmallGameMessage);
// Job
addNetworkEventHandler("vrr.job", receiveJobFromServer);
addNetworkEventHandler("vrr.working", setLocalPlayerWorkingState);
addNetworkEventHandler("vrr.jobType", setLocalPlayerJobType);
addNetworkEventHandler("vrr.passenger", enterVehicleAsPassenger);
addNetworkEventHandler("vrr.showJobRouteLocation", showJobRouteLocation);
addNetworkEventHandler("vrr.hideJobRouteLocation", hideJobRouteLocation);
// Local player states and values
addNetworkEventHandler("vrr.restoreCamera", restoreLocalCamera);
addNetworkEventHandler("vrr.cameraLookAt", setLocalCameraLookAt);
addNetworkEventHandler("vrr.freeze", setLocalPlayerFrozenState);
addNetworkEventHandler("vrr.control", setLocalPlayerControlState);
addNetworkEventHandler("vrr.fadeCamera", fadeLocalCamera);
addNetworkEventHandler("vrr.removeFromVehicle", removeLocalPlayerFromVehicle);
addNetworkEventHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds);
addNetworkEventHandler("vrr.restoreCamera", restoreLocalCamera);
addNetworkEventHandler("vrr.cameraLookAt", setLocalCameraLookAt);
addNetworkEventHandler("vrr.logo", setServerLogoRenderState);
addNetworkEventHandler("vrr.ambience", setCityAmbienceState);
addNetworkEventHandler("vrr.runCode", runClientCode);
addNetworkEventHandler("vrr.clearWeapons", clearLocalPlayerWeapons);
addNetworkEventHandler("vrr.giveWeapon", giveLocalPlayerWeapon);
addNetworkEventHandler("vrr.position", setLocalPlayerPosition);
addNetworkEventHandler("vrr.heading", setLocalPlayerHeading);
addNetworkEventHandler("vrr.interior", setLocalPlayerInterior);
addNetworkEventHandler("vrr.minuteDuration", setMinuteDuration);
addNetworkEventHandler("vrr.showJobRouteLocation", showJobRouteLocation);
addNetworkEventHandler("vrr.hideJobRouteLocation", hideJobRouteLocation);
addNetworkEventHandler("vrr.snow", setSnowState);
addNetworkEventHandler("vrr.health", setLocalPlayerHealth);
addNetworkEventHandler("vrr.enterPropertyKey", setEnterPropertyKey);
addNetworkEventHandler("vrr.skinSelect", toggleSkinSelect);
addNetworkEventHandler("vrr.hotbar", updatePlayerHotBar);
addNetworkEventHandler("vrr.pedSpeech", playPedSpeech);
addNetworkEventHandler("vrr.clearPedState", clearLocalPedState);
addNetworkEventHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect);
addNetworkEventHandler("vrr.showItemActionDelay", showItemActionDelay);
addNetworkEventHandler("vrr.set2DRendering", setPlayer2DRendering);
addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor);
addNetworkEventHandler("vrr.mouseCamera", toggleMouseCamera);
addNetworkEventHandler("vrr.mouseCameraForce", setMouseCameraState);
addNetworkEventHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled);
addNetworkEventHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent);
addNetworkEventHandler("vrr.spawned", onServerSpawnedPlayer);
addNetworkEventHandler("vrr.spawned", onServerSpawnedLocalPlayer);
addNetworkEventHandler("vrr.money", setLocalPlayerCash);
addNetworkEventHandler("vrr.armour", setLocalPlayerArmour);
addNetworkEventHandler("vrr.wantedLevel", forceLocalPlayerWantedLevel);
addNetworkEventHandler("vrr.localPlayerSkin", setLocalPlayerSkin);
addNetworkEventHandler("vrr.pedSpeak", makeLocalPlayerPedSpeak);
addNetworkEventHandler("vrr.infiniteRun", setLocalPlayerInfiniteRun);
addNetworkEventHandler("vrr.playerCop", setLocalPlayerAsCopState);
addNetworkEventHandler("vrr.health", setLocalPlayerHealth);
addNetworkEventHandler("vrr.wantedLevel", setLocalPlayerWantedLevel);
addNetworkEventHandler("vrr.playerPedId", sendLocalPlayerNetworkIdToServer);
addNetworkEventHandler("vrr.ped", setLocalPlayerPedPartsAndProps);
addNetworkEventHandler("vrr.spawn", serverRequestedLocalPlayerSpawn);
addNetworkEventHandler("vrr.clearPedState", clearLocalPedState);
addNetworkEventHandler("vrr.drunkEffect", setLocalPlayerDrunkEffect);
addNetworkEventHandler("vrr.delKeyBind", unBindAccountKey);
addNetworkEventHandler("vrr.addKeyBind", bindAccountKey);
addNetworkEventHandler("vrr.clearKeyBinds", clearKeyBinds);
addNetworkEventHandler("vrr.nametag", updatePlayerNameTag);
addNetworkEventHandler("vrr.ping", updatePlayerPing);
addNetworkEventHandler("vrr.m", receiveChatBoxMessageFromServer);
addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines);
// Vehicle
addNetworkEventHandler("vrr.vehicle", receiveVehicleFromServer);
addNetworkEventHandler("vrr.veh.lights", setVehicleLights);
addNetworkEventHandler("vrr.veh.engine", setVehicleEngine);
addNetworkEventHandler("vrr.veh.repair", repairVehicle);
// Radio
addNetworkEventHandler("vrr.radioStream", playStreamingRadio);
addNetworkEventHandler("vrr.audioFileStream", playAudioFile);
addNetworkEventHandler("vrr.stopRadioStream", stopStreamingRadio);
addNetworkEventHandler("vrr.radioVolume", setStreamingRadioVolume);
addNetworkEventHandler("vrr.veh.lights", setVehicleLights);
addNetworkEventHandler("vrr.veh.engine", setVehicleEngine);
addNetworkEventHandler("vrr.veh.repair", repairVehicle);
// Key Bindings
addNetworkEventHandler("vrr.delKeyBind", unBindAccountKey);
addNetworkEventHandler("vrr.addKeyBind", bindAccountKey);
addNetworkEventHandler("vrr.clearKeyBinds", clearKeyBinds);
addNetworkEventHandler("vrr.pedAnim", makePedPlayAnimation);
addNetworkEventHandler("vrr.pedStopAnim", makePedStopAnimation);
addNetworkEventHandler("vrr.localPlayerSkin", setLocalPlayerSkin);
addNetworkEventHandler("vrr.forcePedAnim", forcePedAnimation);
addNetworkEventHandler("vrr.hideAllGUI", hideAllGUI);
addNetworkEventHandler("vrr.clientInfo", serverRequestedClientInfo);
addNetworkEventHandler("vrr.interiorLights", updateInteriorLightsState);
addNetworkEventHandler("vrr.syncElement", forceSyncElementProperties);
addNetworkEventHandler("vrr.elementPosition", setElementPosition);
addNetworkEventHandler("vrr.elementCollisions", setElementCollisionsEnabled);
addNetworkEventHandler("vrr.vehBuyState", setVehiclePurchaseState);
// Weapon Damage
addNetworkEventHandler("vrr.weaponDamageEnabled", setPlayerWeaponDamageEnabled);
addNetworkEventHandler("vrr.weaponDamageEvent", setPlayerWeaponDamageEvent);
// GUI
addNetworkEventHandler("vrr.showRegistration", showRegistrationGUI);
addNetworkEventHandler("vrr.showNewCharacter", showNewCharacterGUI);
addNetworkEventHandler("vrr.showLogin", showLoginGUI);
addNetworkEventHandler("vrr.2fa", showTwoFactorAuthGUI);
addNetworkEventHandler("vrr.showResetPasswordCodeInput", resetPasswordCodeInputGUI);
addNetworkEventHandler("vrr.showResetPasswordEmailInput", resetPasswordEmailInputGUI);
addNetworkEventHandler("vrr.showChangePassword", showChangePasswordGUI);
addNetworkEventHandler("vrr.showCharacterSelect", showCharacterSelectGUI);
addNetworkEventHandler("vrr.switchCharacterSelect", switchCharacterSelectGUI);
addNetworkEventHandler("vrr.showError", showErrorGUI);
addNetworkEventHandler("vrr.showInfo", showInfoGUI);
addNetworkEventHandler("vrr.showPrompt", showYesNoPromptGUI);
addNetworkEventHandler("vrr.loginSuccess", loginSuccess);
addNetworkEventHandler("vrr.characterSelectSuccess", characterSelectSuccess);
addNetworkEventHandler("vrr.loginFailed", loginFailed);
addNetworkEventHandler("vrr.registrationSuccess", registrationSuccess);
addNetworkEventHandler("vrr.registrationFailed", registrationFailed);
addNetworkEventHandler("vrr.newCharacterFailed", newCharacterFailed);
addNetworkEventHandler("vrr.changePassword", showChangePasswordGUI);
addNetworkEventHandler("vrr.showLocaleChooser", showLocaleChooserGUI);
addNetworkEventHandler("vrr.guiColour", setGUIColours);
addNetworkEventHandler("vrr.logLevel", setLogLevel);
addNetworkEventHandler("vrr.infiniteRun", setLocalPlayerInfiniteRun);
// Business
addNetworkEventHandler("vrr.business", receiveBusinessFromServer);
// House
addNetworkEventHandler("vrr.house", receiveHouseFromServer);
// GPS
addNetworkEventHandler("vrr.showGPSBlip", showGPSLocation);
// Locale
addNetworkEventHandler("vrr.locale", setLocale);
addNetworkEventHandler("vrr.localeChooser", toggleLocaleChooserGUI);
// Misc
addNetworkEventHandler("vrr.mouseCursor", toggleMouseCursor);
addNetworkEventHandler("vrr.mouseCamera", toggleMouseCamera);
addNetworkEventHandler("vrr.clearPeds", clearLocalPlayerOwnedPeds);
addNetworkEventHandler("vrr.passenger", enterVehicleAsPassenger);
addNetworkEventHandler("vrr.logo", setServerLogoRenderState);
addNetworkEventHandler("vrr.ambience", setCityAmbienceState);
addNetworkEventHandler("vrr.runCode", runClientCode);
addNetworkEventHandler("vrr.minuteDuration", setMinuteDuration);
addNetworkEventHandler("vrr.snow", setSnowState);
addNetworkEventHandler("vrr.enterPropertyKey", setEnterPropertyKey);
addNetworkEventHandler("vrr.skinSelect", toggleSkinSelect);
addNetworkEventHandler("vrr.hotbar", updatePlayerHotBar);
addNetworkEventHandler("vrr.showItemActionDelay", showItemActionDelay);
addNetworkEventHandler("vrr.set2DRendering", set2DRendering);
addNetworkEventHandler("vrr.mouseCameraForce", setMouseCameraState);
addNetworkEventHandler("vrr.logLevel", setLogLevel);
addNetworkEventHandler("vrr.hideAllGUI", hideAllGUI);
addNetworkEventHandler("vrr.nametag", updatePlayerNameTag);
addNetworkEventHandler("vrr.nametagDistance", setNameTagDistance);
addNetworkEventHandler("vrr.ping", updatePlayerPing);
addNetworkEventHandler("vrr.anim", makePedPlayAnimation);
addNetworkEventHandler("vrr.stopAnim", makePedStopAnimation);
addNetworkEventHandler("vrr.forceAnim", forcePedAnimation);
addNetworkEventHandler("vrr.clientInfo", serverRequestedClientInfo);
addNetworkEventHandler("vrr.interiorLights", updateInteriorLightsState);
addNetworkEventHandler("vrr.cutsceneInterior", setCutsceneInterior);
addNetworkEventHandler("vrr.syncElement", forceSyncElementProperties);
addNetworkEventHandler("vrr.elementPosition", setElementPosition);
addNetworkEventHandler("vrr.elementCollisions", setElementCollisionsEnabled);
addNetworkEventHandler("vrr.vehBuyState", setVehiclePurchaseState);
addNetworkEventHandler("vrr.holdObject", makePedHoldObject);
addNetworkEventHandler("vrr.playerPedId", sendLocalPlayerNetworkIdToServer);
addNetworkEventHandler("vrr.ped", setLocalPlayerPedPartsAndProps);
}
// ===========================================================================
@@ -133,7 +173,7 @@ function sendResourceStoppedSignalToServer() {
// ===========================================================================
function setPlayer2DRendering(hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState) {
function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState) {
logToConsole(LOG_DEBUG, `[VRR.Main] Updating render states (HUD: ${hudState}, Labels: ${labelState}, Bottom Text: ${smallGameMessageState}, Scoreboard: ${scoreboardState}, HotBar: ${hotBarState}, Item Action Delay: ${itemActionDelayState})`);
renderHUD = hudState;
@@ -158,12 +198,26 @@ function setPlayer2DRendering(hudState, labelState, smallGameMessageState, score
// ===========================================================================
function onServerSpawnedPlayer(state) {
function onServerSpawnedLocalPlayer(state) {
logToConsole(LOG_DEBUG, `[VRR.Main] Setting spawned state to ${state}`);
isSpawned = state;
if(state) {
setUpInitialGame();
if(state) {
setTimeout(function() {
calledDeathEvent = false;
}, 1000);
getElementsByType(ELEMENT_PED).filter(ped => !ped.isType(ELEMENT_PLAYER)).forEach(ped => {
syncCivilianProperties(ped);
});
getElementsByType(ELEMENT_PLAYER).forEach(player => {
syncPlayerProperties(player);
});
getElementsByType(ELEMENT_VEHICLE).forEach(vehicle => {
syncVehicleProperties(vehicle);
});
}
}
@@ -237,20 +291,6 @@ function forceSyncElementProperties(elementId) {
// ===========================================================================
function setElementPosition(elementId, position) {
if(getElementFromId(elementId) == null) {
return false;
}
if(!getElementFromId(elementId).isSyncer) {
return false;
}
getElementFromId(elementId).position = position;
}
// ===========================================================================
function setElementCollisionsEnabled(elementId, state) {
if(getElementFromId(elementId) == null) {
return false;
@@ -269,7 +309,7 @@ function setLocalPlayerArmour(armour) {
// ===========================================================================
function forceLocalPlayerWantedLevel(wantedLevel) {
function setLocalPlayerWantedLevel(wantedLevel) {
forceWantedLevel = toInteger(wantedLevel);
}
@@ -292,10 +332,9 @@ function setLocalPlayerInfiniteRun(state) {
// ===========================================================================
function setLocalPlayerSkin(skinId) {
logToConsole(LOG_INFO, `[VRR.Server] Setting locale player skin to ${skinId}`);
if(getGame() == VRR_GAME_GTA_IV) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
//localPlayer.skin = allowedSkins[skinSelectorIndex][0];
//localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
} else {
localPlayer.skin = skinId;
}
@@ -316,3 +355,62 @@ function sendLocalPlayerNetworkIdToServer() {
}
// ===========================================================================
function setCutsceneInterior(cutsceneName) {
if(getGame() == VRR_GAME_GTA_IV) {
if(cutsceneName == "") {
natives.clearCutscene();
} else {
if(natives.isInteriorScene()) {
natives.clearCutscene();
}
natives.initCutscene(cutsceneName);
}
}
}
// ===========================================================================
function makeLocalPlayerPedSpeak(speechName) {
if(getGame() == VRR_GAME_GTA_IV) {
// if player is in vehicle, allow megaphone (if last arg is "1", it will cancel megaphone echo)
// Only speeches with _MEGAPHONE will have the bullhorn effect
// Afaik it only works on police voices anyway
if(localPlayer.vehicle != null) {
natives.sayAmbientSpeech(localPlayer, speechName, true, false, 0);
} else {
natives.sayAmbientSpeech(localPlayer, speechName, true, false, 1);
}
} else if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
// Don't have a way to get the ped ref ID and can't use ped in arg
//game.SET_CHAR_SAY(game.GET_PLAYER_ID(), int);
}
}
// ===========================================================================
function setLocalPlayerAsCopState(state) {
if(getGame() == VRR_GAME_GTA_IV) {
natives.setPlayerAsCop(natives.getPlayerId(), state);
natives.setPoliceIgnorePlayer(natives.getPlayerId(), state);
}
}
// ===========================================================================
function serverRequestedLocalPlayerSpawn(skinId, position) {
if(getGame() == VRR_GAME_GTA_IV) {
natives.createPlayer(skinId, position);
//if(isCustomCameraSupported()) {
// game.restoreCamera(true);
//}
}
}
// ===========================================================================
function sendLocaleSelectToServer(localeId) {
sendNetworkEventToServer("vrr.localeSelect", localeId);
}
// ===========================================================================

View File

@@ -54,9 +54,14 @@ function processSkinSelectKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if(getGame() == VRR_GAME_GTA_IV) {
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
//localPlayer.skin = allowedSkins[skinSelectorIndex][0];
//localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
let skinId = allowedSkins[skinSelectorIndex][0];
if(natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if(natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
@@ -69,9 +74,14 @@ function processSkinSelectKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if(getGame() == VRR_GAME_GTA_IV) {
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
//localPlayer.skin = allowedSkins[skinSelectorIndex][0];
//localPlayer.modelIndex = allowedSkins[skinSelectorIndex][0];
let skinId = allowedSkins[skinSelectorIndex][0];
if(natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if(natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
@@ -122,8 +132,14 @@ function toggleSkinSelect(state) {
}
if(getGame() == VRR_GAME_GTA_IV) {
//natives.changePlayerModel(natives.getPlayerId(), allowedSkins[skinSelectorIndex][0]);
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
let skinId = allowedSkins[skinSelectorIndex][0];
if(natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if(natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}

View File

@@ -26,23 +26,39 @@ function initClientScripts() {
function setUpInitialGame() {
if(getGame() == VRR_GAME_GTA_III) {
logToConsole(LOG_DEBUG|LOG_WARN, "Setting up initial game stuff for GTA III ...");
// Turn off unlimited sprint
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), 0);
// Set completed game progress
game.setGameStat(STAT_PROGRESSMADE, 9999);
game.setGameStat(STAT_TOTALPROGRESSINGAME, 9999);
game.SET_CAR_DENSITY_MULTIPLIER(3.0);
game.SET_PED_DENSITY_MULTIPLIER(3.0);
// Traffic and ped density
//game.SET_CAR_DENSITY_MULTIPLIER(3.0); // No visual effect. Needs tweaking and testing.
//game.SET_PED_DENSITY_MULTIPLIER(3.0); // No visual effect. Needs tweaking and testing.
// Disables taxi/vigilante/etc and other start mission triggers
game.onMission = true;
// Provided by mouse camera script (mousecam.js)
SetStandardControlsEnabled(true);
return true;
}
} else if(getGame() == VRR_GAME_GTA_VC) {
logToConsole(LOG_DEBUG|LOG_WARN, "Setting up initial game stuff for GTA Vice City ...");
if(getGame() == VRR_GAME_GTA_VC) {
// Turn off unlimited sprint
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), 0);
game.setGameStat(STAT_PROGRESSMADE, 9999);
game.setGameStat(STAT_TOTALPROGRESSINGAME, 9999);
game.SET_CAR_DENSITY_MULTIPLIER(3.0);
game.SET_PED_DENSITY_MULTIPLIER(3.0);
// Set completed game progress
game.setGameStat(STAT_PROGRESSMADE, 99999);
game.setGameStat(STAT_TOTALPROGRESSINGAME, 99999);
// Traffic and ped density
//game.SET_CAR_DENSITY_MULTIPLIER(3.0); // No visual effect. Needs tweaking and testing.
//game.SET_PED_DENSITY_MULTIPLIER(3.0); // No visual effect. Needs tweaking and testing.
// Load all anim libs
game.REQUEST_ANIMATION("bikev");
game.REQUEST_ANIMATION("bikeh");
game.REQUEST_ANIMATION("biked");
@@ -65,13 +81,15 @@ function setUpInitialGame() {
game.REQUEST_ANIMATION("lance");
game.REQUEST_ANIMATION("skate");
game.LOAD_ALL_MODELS_NOW();
//game.LOAD_ALL_MODELS_NOW();
// Disables taxi/vigilante/etc and other start mission triggers
game.onMission = true;
SetStandardControlsEnabled(true);
return true;
}
if(getGame() == VRR_GAME_GTA_SA) {
// Provided by mouse camera script (mousecam.js)
SetStandardControlsEnabled(true);
} else if(getGame() == VRR_GAME_GTA_SA) {
logToConsole(LOG_DEBUG|LOG_WARN, "Setting up initial game stuff for GTA San Andreas ...");
// Turn weapon skills down a bit
game.setGameStat(STAT_WEAPONTYPE_PISTOL_SKILL, 400);
game.setGameStat(STAT_WEAPONTYPE_PISTOL_SILENCED_SKILL, 400);
game.setGameStat(STAT_WEAPONTYPE_DESERT_EAGLE_SKILL, 400);
@@ -82,7 +100,11 @@ function setUpInitialGame() {
game.setGameStat(STAT_WEAPONTYPE_MP5_SKILL, 400);
game.setGameStat(STAT_WEAPONTYPE_AK47_SKILL, 400);
game.setGameStat(STAT_WEAPONTYPE_M4_SKILL, 400);
// Pro driving skill
game.setGameStat(STAT_DRIVING_SKILL, 9999);
// Only visual for CJ, but affects all peds fight speed, bicycle hop, etc
game.setGameStat(STAT_FAT, 9999);
game.setGameStat(STAT_ENERGY, 9999);
game.setGameStat(STAT_CYCLE_SKILL, 9999);
@@ -97,12 +119,12 @@ function setUpInitialGame() {
game.setGameStat(STAT_UNDERWATER_STAMINA, 9999);
game.setGameStat(STAT_BODY_MUSCLE, 9999);
// Disables default yellow cone at doors for entering places in singleplayer
game.setDefaultInteriors(false);
game.onMission = true;
return true;
}
if(getGame() == VRR_GAME_GTA_IV) {
// Disables taxi/vigilante/etc and other start mission triggers
game.onMission = true;
} else if(getGame() == VRR_GAME_GTA_IV) {
natives.allowEmergencyServices(false);
natives.setCreateRandomCops(true);
natives.setMaxWantedLevel(0);
@@ -115,10 +137,11 @@ function setUpInitialGame() {
natives.setSyncWeatherAndGameTime(false);
natives.usePlayerColourInsteadOfTeamColour(true);
natives.disablePauseMenu(true);
natives.allowReactionAnims(localPlayer, true);
//natives.allowReactionAnims(localPlayer, false);
natives.allowGameToPauseForStreaming(false);
natives.allowStuntJumpsToTrigger(false);
natives.setPickupsFixCars(false);
natives.forceFullVoice(localPlayer);
// HUD and Display
//natives.displayCash(false);
@@ -126,11 +149,11 @@ function setUpInitialGame() {
//natives.displayHud(false);
//natives.displayRadar(false);
//natives.displayAreaName(false);
//natives.displayPlayerNames(false);
natives.displayPlayerNames(true);
natives.setPoliceRadarBlips(false);
natives.removeTemporaryRadarBlipsForPickups();
natives.displayNonMinigameHelpMessages(false);
natives.setDisplayPlayerNameAndIcon(natives.getPlayerId(), false);
natives.setDisplayPlayerNameAndIcon(natives.getPlayerId(), true);
// Item/Money Dropping
natives.setMoneyCarriedByAllNewPeds(0);
@@ -151,14 +174,21 @@ function setUpInitialGame() {
natives.switchAmbientPlanes(true);
natives.switchMadDrivers(false);
natives.requestAnims("DANCING");
return true;
}
// Singleplayer Cellphone
//natives.requestScript("spcellphone");
//natives.startNewScript("spcellphone", 0);
// Script "v-blockedscripts" blocks the mpcellphone scripts
natives.setMessagesWaiting(false); // Seems to have no effect
natives.setMobilePhoneRadioState(false);
if(getGame() == VRR_GAME_MAFIA_ONE) {
// Animation libraries
natives.requestAnims("DANCING");
// Some last steps
//natives.loadAllObjectsNow();
} else if(getGame() == VRR_GAME_MAFIA_ONE) {
game.mapEnabled = false;
game.setTrafficEnabled(false);
return true;
}
}

View File

@@ -10,8 +10,8 @@
function processSync(event, deltaTime) {
if(localPlayer != null) {
if(!areServerElementsSupported()) {
sendNetworkEventToServer("vrr.plr.pos", localPlayer.position);
sendNetworkEventToServer("vrr.plr.rot", localPlayer.heading);
sendNetworkEventToServer("vrr.plr.pos", (localPlayer.vehicle != null) ? localPlayer.vehicle.position : localPlayer.position);
sendNetworkEventToServer("vrr.plr.rot", (localPlayer.vehicle != null) ? localPlayer.vehicle.heading : localPlayer.heading);
//if(localPlayer.vehicle != null) {
// sendNetworkEventToServer("vrr.veh.pos", getVehicleForNetworkEvent(localPlayer.vehicle), localPlayer.vehicle.position);
@@ -27,13 +27,22 @@ function processSync(event, deltaTime) {
sendNetworkEventToServer("vrr.playerDeath");
}
}
}
if(localPlayer.health <= 0) {
if(!calledDeathEvent) {
logToConsole(LOG_DEBUG, `Local player died`);
localPlayer.clearWeapons();
calledDeathEvent = true;
sendNetworkEventToServer("vrr.playerDeath");
}
}
if(streamingRadioElement) {
streamingRadio.position = getElementPosition(streamingRadioElement);
streamingRadio.position = getElementPosition(streamingRadioElement.id);
//streamingRadio.volume = getStreamingRadioVolumeForPosition(streamingRadio.position);
}
}
}
// ===========================================================================
@@ -44,8 +53,6 @@ function setVehicleEngine(vehicleId, state) {
// ===========================================================================
function setVehicleLights(vehicleId, state) {
if(getGame() != VRR_GAME_MAFIA_ONE) {
if(!state) {
getElementFromId(vehicleId).lightStatus = 2;
@@ -121,10 +128,10 @@ function syncVehicleProperties(vehicle) {
}
if(getGame() == VRR_GAME_GTA_SA) {
let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
for(let i in allUpgrades) {
vehicle.removeUpgrade(i);
}
//let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
//for(let i in allUpgrades) {
// vehicle.removeUpgrade(i);
//}
if(doesEntityDataExist(vehicle, "vrr.upgrades")) {
let upgrades = getEntityData(vehicle, "vrr.upgrades");
@@ -239,8 +246,9 @@ function syncCivilianProperties(civilian) {
}
if(doesEntityDataExist(civilian, "vrr.anim")) {
let animData = getEntityData(vehicle, "vrr.anim");
civilian.addAnimation(animData[0], animData[1]);
let animationSlot = getEntityData(civilian, "vrr.anim");
let animationData = getAnimationData(animationSlot);
civilian.addAnimation(animationData.groupId, animationData.animId);
}
}
@@ -359,26 +367,6 @@ function syncPlayerProperties(player) {
// ===========================================================================
function syncObjectProperties(object) {
if(!areServerElementsSupported()) {
return false;
}
if(getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
if(doesEntityDataExist(object, "vrr.scale")) {
let scaleFactor = getEntityData(object, "vrr.scale");
let tempMatrix = object.matrix;
tempMatrix.setScale(toVector3(scaleFactor.x, scaleFactor.y, scaleFactor.z));
let tempPosition = object.position;
object.matrix = tempMatrix;
tempPosition.z += scaleFactor.z;
object.position = tempPosition;
}
}
}
// ===========================================================================
function syncElementProperties(element) {
if(!areServerElementsSupported()) {
return false;
@@ -390,6 +378,7 @@ function syncElementProperties(element) {
}
}
if(getGame() == VRR_GAME_MAFIA_ONE) {
switch(element.type) {
case ELEMENT_VEHICLE:
syncVehicleProperties(element);
@@ -403,8 +392,21 @@ function syncElementProperties(element) {
syncPlayerProperties(element);
break;
case ELEMENT_OBJECT:
syncObjectProperties(element);
default:
break;
}
} else {
switch(element.type) {
case ELEMENT_VEHICLE:
syncVehicleProperties(element);
break;
case ELEMENT_PED:
syncCivilianProperties(element);
break;
case ELEMENT_PLAYER:
syncPlayerProperties(element);
break;
default:
@@ -412,7 +414,7 @@ function syncElementProperties(element) {
}
}
}
// ===========================================================================

View File

@@ -7,173 +7,6 @@
// TYPE: Client (JavaScript)
// ===========================================================================
let weaponSlots = [
false,
[
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11
],
[
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
2,
2,
2,
2,
2,
3,
3,
4,
4,
4,
5,
5,
5,
5,
6,
6,
8,
8,
7,
7,
7,
7,
9,
-1,
9,
],
[
0,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
8,
8,
8,
-1,
-1,
-1,
2,
2,
2,
3,
3,
3,
4,
4,
5,
5,
4,
6,
6,
7,
7,
7,
7,
8,
12,
9,
9,
9,
9,
9,
11,
9,
9,
9,
],
];
function openAllGarages() {
switch(game.game) {
case VRR_GAME_GTA_III:
for(let i=0;i<=26;i++) {
openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_VC:
for(let i=0;i<=32;i++) {
openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_SA:
for(let i=0;i<=44;i++) {
openGarage(i);
}
break;
default:
break;
}
}
// ===========================================================================
function closeAllGarages() {
switch(game.game) {
case VRR_GAME_GTA_III:
for(let i=0;i<=26;i++) {
closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_VC:
for(let i=0;i<=32;i++) {
closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
}
break;
case VRR_GAME_GTA_SA:
for(let i=0;i<=44;i++) {
closeGarage(i);
}
break;
default:
break;
}
}
// ===========================================================================
function setLocalPlayerFrozenState(state) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting frozen state to ${state}`);
gui.showCursor(state, !state);
@@ -185,12 +18,10 @@ function setLocalPlayerControlState(controlState, cursorState = false) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting control state to ${controlState} (Cursor: ${cursorState})`);
controlsEnabled = controlState;
if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) {
game.SET_PLAYER_CONTROL(localClient.index, boolToInt(controlState));
}
if(getGame() != VRR_GAME_GTA_IV) {
localPlayer.collisionsEnabled = controlState;
localPlayer.invincible = true;
game.SET_PLAYER_CONTROL(game.GET_PLAYER_ID(), boolToInt(controlState));
} else if (getGame() != VRR_GAME_GTA_IV) {
setElementCollisionsEnabled(localPlayer, controlState);
setPedInvincible(localPlayer, true);
}
}
@@ -246,7 +77,7 @@ function setCityAmbienceState(state, clearElements = false) {
if (getMultiplayerMod() == VRR_MPMOD_GTAC) {
game.setGenerateCarsAroundCamera(state);
if(game.game != VRR_GAME_GTA_SA) {
if (getGame() != VRR_GAME_GTA_SA) {
game.setCiviliansEnabled(state);
}
@@ -264,10 +95,16 @@ function runClientCode(code, returnTo) {
try {
returnValue = eval("(" + code + ")");
} catch (error) {
sendNetworkEventToServer("vrr.runCodeFail", returnTo, code);
sendNetworkEventToServer("vrr.runCodeFail", returnTo, error.toString());
return false;
}
sendNetworkEventToServer("vrr.runCodeSuccess", returnTo, code, returnValue);
let returnValueString = returnValue;
if (returnValue != null && returnValue != undefined) {
returnValueString = `${returnValue.toString()} (${typeof returnValue})`;
} else {
returnValueString = "null/undefined";
}
sendNetworkEventToServer("vrr.runCodeSuccess", returnTo, returnValueString);
}
// ===========================================================================
@@ -280,11 +117,13 @@ function enterVehicleAsPassenger() {
localPlayer.enterVehicle(tempVehicle, false);
}
} else {
for(let i = 0 ; i <= natives.getMaximumNumberOfPassengers(tempVehicle); i++) {
if(natives.isCarPassengerSeatFree(tempVehicle, i)) {
natives.taskEnterCarAsPassenger(localPlayer, tempVehicle, i, 1);
}
}
// Disable for now. GTA IV has built-in passenger entry
//for(let i = 0 ; i <= natives.getMaximumNumberOfPassengers(tempVehicle); i++) {
// if(natives.isCarPassengerSeatFree(tempVehicle, i)) {
// natives.taskEnterCarAsPassenger(localPlayer, tempVehicle, i, 10000);
// }
//}
}
}
}
@@ -312,13 +151,15 @@ function giveLocalPlayerWeapon(weaponId, ammo, active) {
// ===========================================================================
function clearLocalPlayerWeapons() {
function clearLocalPlayerWeapons(clearData) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing weapons`);
localPlayer.clearWeapons();
if (clearData == true) {
forceWeapon = 0;
forceWeaponAmmo = 0;
forceWeaponClipAmmo = 0;
}
}
// ===========================================================================
@@ -356,18 +197,25 @@ function setLocalPlayerInterior(interior) {
if (!isGTAIV()) {
localPlayer.interior = interior;
game.cameraInterior = interior;
} else {
let interiorId = natives.getInteriorAtCoords(localPlayer.position);
natives.activateInterior(interiorId, true);
}
} //else {
//if(getGameConfig().mainWorldInterior != interior) {
// let interiorId = natives.getInteriorAtCoords(localPlayer.position);
// natives.activateInterior(interiorId, true);
// natives.loadAllObjectsNow();
//}
//let interiorId = natives.getInteriorAtCoords(localPlayer.position);
//natives.activateInterior(interiorId, true);
//}
}
//let vehicles = getElementsByType(ELEMENT_VEHICLE);
//for(let i in vehicles) {
// if(getEntityData(vehicles[i], "vrr.interior")) {
// vehicles[i].interior = getEntityData(vehicles[i], "vrr.interior");
// }
//}
if (areServerElementsSupported() && isGameFeatureSupported("interior")) {
let vehicles = getElementsByType(ELEMENT_VEHICLE);
for (let i in vehicles) {
if (getEntityData(vehicles[i], "vrr.interior")) {
vehicles[i].interior = getEntityData(vehicles[i], "vrr.interior");
}
}
}
}
// ===========================================================================
@@ -389,12 +237,6 @@ function setLocalPlayerHealth(health) {
// ===========================================================================
function isSnowEnabled() {
return (typeof snowing != "undefined");
}
// ===========================================================================
function playPedSpeech(pedName, speechId) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Making ${pedName}'s ped talk (${speechId})`);
if (getMultiplayerMod() == VRR_MPMOD_GTAC) {
@@ -412,11 +254,7 @@ function clearLocalPedState() {
// ===========================================================================
function getWeaponSlot(weaponId) {
if(getGame() == VRR_GAME_GTA_IV) {
return false;
}
return weaponSlots[getGame()][weaponId];
return getGameConfig().weaponSlots[getGame()][weaponId];
}
// ===========================================================================
@@ -568,24 +406,20 @@ function processWantedLevelReset() {
function processLocalPlayerVehicleControlState() {
if (areServerElementsSupported()) {
if (inVehicle && localPlayer.vehicle != null) {
if (doesEntityDataExist(localPlayer.vehicle, "vrr.engine")) {
if (getEntityData(localPlayer.vehicle, "vrr.engine") == false) {
localPlayer.vehicle.engine = false;
}
if (!localPlayer.vehicle.engine) {
if (typeof localPlayer.vehicle.velocity != "undefined") {
localPlayer.vehicle.velocity = toVector3(0.0, 0.0, 0.0);
localPlayer.vehicle.turnVelocity = toVector3(0.0, 0.0, 0.0);
}
if(parkedVehiclePosition) {
localPlayer.vehicle.position = parkedVehiclePosition;
localPlayer.vehicle.heading = parkedVehicleHeading;
//if(parkedVehiclePosition) {
// localPlayer.vehicle.position = parkedVehiclePosition;
// localPlayer.vehicle.heading = parkedVehicleHeading;
//}
}
} else {
if(parkedVehiclePosition) {
parkedVehiclePosition = false;
parkedVehicleHeading = false;
}
}
}
@@ -617,7 +451,7 @@ function processLocalPlayerSphereEntryExitHandling() {
// ===========================================================================
function processJobRouteSphere() {
if(game.game == VRR_GAME_GTA_SA) {
if (getGame() == VRR_GAME_GTA_SA) {
let position = getLocalPlayerPosition();
if (jobRouteLocationSphere != null) {
if (getDistance(position, jobRouteLocationSphere.position) <= 2.0) {
@@ -639,10 +473,10 @@ function forceLocalPlayerEquippedWeaponItem() {
localPlayer.setWeaponAmmunition(getWeaponSlot(forceWeapon), forceWeaponAmmo);
}
} else {
if(getGame() < VRR_GAME_GTA_IV) {
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon));
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon));
}
//if(getGame() < VRR_GAME_GTA_IV) {
// forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon));
// forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon));
//}
}
} else {
if (localPlayer.weapon > 0) {
@@ -687,7 +521,7 @@ function getVehicleForNetworkEvent(vehicle) {
if (getGame() == VRR_GAME_GTA_IV) {
return natives.getNetworkIdFromVehicle(vehicle);
}
return vehicle;
return vehicle.id;
}
// ===========================================================================
@@ -767,7 +601,7 @@ function processNearbyPickups() {
// ===========================================================================
function processGameSpecifics() {
if(game.game < VRR_GAME_GTA_IV) {
if (getGame() < VRR_GAME_GTA_IV) {
game.clearMessages();
}
@@ -776,38 +610,8 @@ function processGameSpecifics() {
// ===========================================================================
function processVehiclePurchasing() {
if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) {
if(inVehicle == false) {
vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITVEH);
return false;
} else {
if(vehiclePurchasing == inVehicle) {
if(getDistance(inVehicle.position, vehiclePurchasePosition) >= 25) {
vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH);
}
} else {
vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH);
}
}
}
}
// ===========================================================================
function setVehiclePurchaseState(state, vehicleId, position) {
vehiclePurchaseState = state;
if(vehicleId != null) {
vehiclePurchasing = getElementFromId(vehicleId);
} else {
vehiclePurchasing = null;
}
vehiclePurchasePosition = position;
function getServerData() {
return serverData;
}
// ===========================================================================

131
scripts/client/vehicle.js Normal file
View File

@@ -0,0 +1,131 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: vehicle.js
// DESC: Provides vehicle functions and arrays with data
// TYPE: Client (JavaScript)
// ===========================================================================
class VehicleData {
constructor(vehicleId, model, position, heading, colour1, colour2, colour3, colour4, locked, lights, engine, licensePlate) {
this.index = -1;
this.vehicleId = vehicleId;
this.model = model;
this.position = position;
this.heading = heading;
this.colour1 = colour1;
this.colour2 = colour2;
this.colour3 = colour3;
this.colour4 = colour4;
this.pickupModel = pickupModel;
this.locked = locked;
this.lights = lights;
this.engine = engine;
this.licensePlate = licensePlate;
this.ivNetworkId = -1;
}
}
// ===========================================================================
function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2, colour3 = 0, colour4 = 0, locked = false, lights = false, engine = false, licensePlate = "") {
logToConsole(LOG_DEBUG, `[VRR.Vehicle] Received vehicle ${vehicleId} (${getVehicleNameFromModel(model, getGame())}) from server`);
if(getGame() != VRR_GAME_GTA_IV) {
return false;
}
if(getVehicleData(vehicleId) != false) {
let vehicleData = getVehicleData(vehicleId);
//vehicleData.position = position;
//vehicleData.heading = heading;
//vehicleData.model
vehicleData.colour1 = colour1;
vehicleData.colour2 = colour2;
vehicleData.colour3 = colour3;
vehicleData.colour4 = colour4;
vehicleData.engine = engine;
vehicleData.lights = lights;
vehicleData.locked = locked;
vehicleData.licensePlate = "";
let vehicle = natives.getVehicleFromNetworkId(vehicleId.ivNetworkId);
} else {
//logToConsole(LOG_DEBUG, `[VRR.Vehicle] Vehicle ${vehicleId} doesn't exist. Adding ...`);
//let tempVehicleData = new VehicleData(vehicleId, name, position, blipModel, pickupModel);
//vehicles.push(tempVehicleData);
//setAllJobDataIndexes();
}
}
// ===========================================================================
function processVehiclePurchasing() {
if(vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) {
if(getLocalPlayerVehicle() == false) {
vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_EXITVEH);
return false;
} else {
if(vehiclePurchasing == getLocalPlayerVehicle()) {
if(getDistance(getLocalPlayerVehicle().position, vehiclePurchasePosition) >= 25) {
vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH);
}
} else {
vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH;
sendNetworkEventToServer("vrr.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH);
}
}
}
}
// ===========================================================================
function processVehicleBurning() {
getElementsByType(ELEMENT_VEHICLE).filter(vehicle => vehicle.isSyncer && vehicle.health < 250).forEach((vehicle) => {
vehicle.health = 250;
});
}
// ===========================================================================
function setVehiclePurchaseState(state, vehicleId, position) {
vehiclePurchaseState = state;
if(vehicleId != null) {
vehiclePurchasing = getElementFromId(vehicleId);
} else {
vehiclePurchasing = null;
}
vehiclePurchasePosition = position;
}
// ===========================================================================
/**
* @param {number} vehicleId - The ID of the job (initially provided by server)
* @return {VehicleData} The vehicle's data (class instance)
*/
function getVehicleData(vehicleId) {
for(let i in getServerData().vehicles) {
if(getServerData().vehicles[i].vehicleId == vehicleId) {
return getServerData().vehicles[i];
}
}
return false;
}
// ===========================================================================
function setAllVehicleDataIndexes() {
for(let i in getServerData().vehicles) {
getServerData().vehicles[i].index = i;
}
}
// ===========================================================================

View File

@@ -63,7 +63,7 @@ function listAccentsCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(accentList, 8);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "AccentList")));
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "AccentsListHeader")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
}
@@ -91,7 +91,7 @@ function getAccentFromParams(params) {
function reloadAccentConfigurationCommand(command, params, client) {
getGlobalConfig().accents = loadAccentConfig();
messageAdmins(`${client.name} {MAINCOLOUR}has reloaded the accent list`);
messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}has reloaded the accent list`);
}
// ===========================================================================
@@ -111,7 +111,7 @@ function addAccentCommand(command, params, client) {
getGlobalConfig().accents.push(newAccentName);
saveAccentConfig();
messageAdmins(`${client.name}{MAINCOLOUR} added a new accent: ${newAccentName}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} added a new accent: {ALTCOLOUR}${newAccentName}{MAINCOLOUR}`);
}
// ===========================================================================
@@ -131,7 +131,7 @@ function removeAccentCommand(command, params, client) {
getGlobalConfig().accents.push(newAccentName);
saveAccentConfig();
messageAdmins(`${client.name}{MAINCOLOUR} added a new accent: ${newAccentName}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed an accent: {ALTCOLOUR}${newAccentName}{MAINCOLOUR}`);
}
// ===========================================================================

View File

@@ -277,15 +277,16 @@ function toggleAutoSelectLastCharacterCommand(command, params, client) {
// ===========================================================================
function toggleAccountGUICommand(command, params, client) {
// Remember, the flag is BACKWARD. Enabled = NO GUI!
let flagValue = getAccountSettingsFlagValue("NoGUI");
if(!doesPlayerHaveGUIEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
} else {
if (doesPlayerHaveGUIEnabled(client)) {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`));
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account OFF.`);
} else {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
}
@@ -296,7 +297,7 @@ function toggleAccountGUICommand(command, params, client) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI`);
} else {
hideAllPlayerGUI(client);
messagePlayerNormal(client, `👋 Welcome back to ${getServerName()}, ${getPlayerName(client)}! Please /login to continue.`, getColourByName("softGreen"));
messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client), "{ALTCOLOUR}/login{MAINCOLOUR}"));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled)`);
}
} else {
@@ -305,7 +306,7 @@ function toggleAccountGUICommand(command, params, client) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
} else {
hideAllPlayerGUI(client);
messagePlayerNormal(client, `👋 Welcome to ${getServerName()}, ${getPlayerName(client)}! Please /register to continue.`, getColourByName("softGreen"));
messagePlayerNormal(client, getLocaleString(client, "WelcomeNewPlayer", getServerName(), getPlayerName(client), "{ALTCOLOUR}/register{MAINCOLOUR}"));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled)`);
}
}
@@ -318,13 +319,13 @@ function toggleAccountGUICommand(command, params, client) {
function toggleAccountLoginAttemptNotificationsCommand(command, params, client) {
let flagValue = getAccountSettingsFlagValue("AuthAttemptAlert");
if(hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) {
if (doesPlayerHaveLoginAlertsEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You will ${getBoolRedGreenInlineColour(true)}now {MAINCOLOUR}be notified by email when somebody tries to login to your account`);
messagePlayerNormal(client, `⚙️ You turned ${getBoolRedGreenInlineColour(false)}OFF{MAINCOLOUR} notification by email when somebody tries to login to your account`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You will ${getBoolRedGreenInlineColour(false)}not {MAINCOLOUR}be notified by email when somebody tries to login to your account`);
messagePlayerNormal(client, `⚙️ You turned ${getBoolRedGreenInlineColour(true)}ON{MAINCOLOUR} notification by email when somebody tries to login to your account`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
}
@@ -338,14 +339,14 @@ function toggleAccountServerLogoCommand(command, params, client) {
if (!doesPlayerHaveLogoEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You will ${getBoolRedGreenInlineColour(true)}now {MAINCOLOUR}be shown the server logo (if enabled on current server)`);
messagePlayerSuccess(client, getLocaleString(client, "AccountServerLogoSet", `${getBoolRedGreenInlineColour(true)}${getLocaleString(client, "On")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo ON for their account`);
if (getServerConfig().showLogo) {
updatePlayerShowLogoState(client, true);
}
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You will ${getBoolRedGreenInlineColour(false)}not {MAINCOLOUR}be shown the server logo.`);
messagePlayerSuccess(client, getLocaleString(client, "AccountServerLogoSet", `${getBoolRedGreenInlineColour(false)}${getLocaleString(client, "Off")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo OFF for their account`);
updatePlayerShowLogoState(client, false);
}
@@ -374,11 +375,11 @@ function toggleAccountTwoFactorAuthCommand(command, params, client) {
if (!doesPlayerHaveTwoFactorAuthEnabled(client)) {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `{MAINCOLOUR}You have turned ${getBoolRedGreenInlineColour(false)}ON {MAINCOLOUR} two factor authentication!{ALTCOLOUR}${addtoAuthenticatorCode}`);
messagePlayerSuccess(client, getLocaleString(client, "TwoFactorAuthSet", `${getBoolRedGreenInlineColour(true)}${getLocaleString(client, "On")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication ON for their account`);
} else {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, `You have turned ${getBoolRedGreenInlineColour(false)}OFF {MAINCOLOUR}two-factor authentication for login.`);
messagePlayerSuccess(client, getLocaleString(client, "TwoFactorAuthSet", `${getBoolRedGreenInlineColour(false)}${toUpperCase(getLocaleString(client, "Off"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication OFF for their account`);
}
return true;
@@ -388,7 +389,7 @@ function toggleAccountTwoFactorAuthCommand(command, params, client) {
function registerCommand(command, params, client) {
if (isPlayerRegistered(client)) {
messagePlayerError(client, `Your name is already registered!`);
messagePlayerError(client, getLocaleString(client, "AccountNameAlreadyRegistered"));
return false;
}
@@ -420,8 +421,8 @@ function changeAccountPasswordCommand(command, params, client) {
}
if (!doesPasswordMeetRequirements(newPassword)) {
messagePlayerError(client, `The new password must meet the requirements!`);
messagePlayerInfo(client, `Passwords must have at least one capital letter, one lowercase letter, and one number!`);
messagePlayerError(client, getLocaleString(client, "PasswordNotGoodEnough"));
messagePlayerInfo(client, getLocaleString(client, "PasswordNeedsBase", `${getLocaleString(client, "PasswordNeedsCapitals", getGlobalConfig().passwordRequiredCapitals)}, ${getLocaleString(client, "PasswordNeedsSymbols", getGlobalConfig().passwordRequiredSymbols)}`));
return false;
}
@@ -438,12 +439,12 @@ function setAccountChatScrollLinesCommand(command, params, client) {
}
if (isNaN(params)) {
messagePlayerError(client, `The line amount must be a number!`);
messagePlayerError(client, getLocaleString(client, "ChatScrollLinesNotNumber"));
return false;
}
if (toInteger(params) < 1 || toInteger(params) > 6) {
messagePlayerError(client, `The line amount must be between 1 and 6!`);
messagePlayerError(client, getLocaleString(client, "ChatScrollLinesMustBeBetween", getGlobalConfig().minChatLines, getGlobalConfig().maxChatLines));
return false;
}
@@ -451,7 +452,27 @@ function setAccountChatScrollLinesCommand(command, params, client) {
getPlayerData(client).accountData.chatScrollLines = lines;
sendPlayerChatScrollLines(client, lines);
messagePlayerSuccess(client, `Your chatbox will now scroll ${toInteger(lines)} lines at a time!`);
messagePlayerSuccess(client, getLocaleString(client, "ChatScrollLinesSet", lines));
}
// ===========================================================================
function setAccountChatAutoHideDelayCommand(command, params, client) {
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if (isNaN(params)) {
messagePlayerError(client, `The delay time must be a number!`);
return false;
}
let delay = Math.ceil(toInteger(params));
getPlayerData(client).accountData.chatAutoHideDelay = delay;
sendPlayerChatAutoHideDelay(client, delay);
messagePlayerSuccess(client, `Your chatbox will now automatically hide after ${toInteger(delay)} seconds!`);
}
// ===========================================================================
@@ -465,7 +486,7 @@ function setAccountEmailCommand(command, params, client) {
let emailAddress = getParam(params, " ", 1);
if (!isValidEmailAddress(emailAddress)) {
messagePlayerError(client, `The email '${emailAddress} is not valid!`);
messagePlayerError(client, getLocaleString(client, "RegistrationFailedInvalidEmail"));
return false;
}
@@ -475,7 +496,7 @@ function setAccountEmailCommand(command, params, client) {
//}
if (getPlayerData(client).accountData.emailAddress != "" && isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, `You already set your email and verified it!`);
messagePlayerError(client, getLocaleString(client, "AccountEmailAlreadySetAndVerified"));
return false;
}
@@ -485,9 +506,9 @@ function setAccountEmailCommand(command, params, client) {
setAccountEmailVerificationCode(getPlayerData(client).accountData, emailVerificationCode);
sendEmailVerificationEmail(client, emailVerificationCode);
messagePlayerSuccess(client, `Your email has been set!`);
messagePlayerAlert(client, `Please verify your email to enable extra account security and recovery features.`);
messagePlayerAlert(client, `A verification code and instructions have been sent to your email.`);
messagePlayerSuccess(client, getLocaleString(client, "EmailSet"));
messagePlayerAlert(client, getLocaleString(client, "RegistrationEmailVerifyReminder"));
messagePlayerAlert(client, getLocaleString(client, "EmailVerificationCodeSent"));
saveAccountToDatabase(getPlayerData(client).accountData);
}
@@ -507,7 +528,7 @@ function verifyAccountEmailCommand(command, params, client) {
}
if (module.hashing.sha512(verificationCode) != getPlayerData(client).accountData.emailVerificationCode) {
messagePlayerError(client, `Invalid email verification code! A new one has been created and sent to your email.`);
messagePlayerError(client, getLocaleString(client, "InvalidEmailVerificationCode"));
let emailVerificationCode = generateEmailVerificationCode();
setAccountEmailVerificationCode(getPlayerData(client).accountData, emailVerificationCode);
sendEmailVerificationEmail(client, emailVerificationCode);
@@ -517,8 +538,8 @@ function verifyAccountEmailCommand(command, params, client) {
getPlayerData(client).accountData.flags.moderation = addBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("EmailVerified"));
getPlayerData(client).accountData.emailVerificationCode = "";
messagePlayerSuccess(client, `Your email has been verified!`);
messagePlayerAlert(client, `You can now use your email for password resets, two-factor authentication, alerts, and more!`);
messagePlayerSuccess(client, getLocaleString(client, "EmailVerified"));
messagePlayerAlert(client, getLocaleString(client, "EmailVerifiedTip"));
saveAccountToDatabase(getPlayerData(client).accountData);
}
@@ -748,13 +769,14 @@ function loginSuccess(client) {
if (doesPlayerHaveStaffPermission(client, "Developer") || doesPlayerHaveStaffPermission(client, "ManageServer")) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has needed permissions and is being given administrator access`);
client.administrator = true;
setPlayerNativeAdminState(client, true);
}
if (doesServerHaveTesterOnlyEnabled()) {
if (!hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("IsTester"))) {
setTimeout(function () {
client.disconnect();
getPlayerData(client).customDisconnectReason = "Kicked - Not a tester";
disconnectPlayer(client);
}, 3500);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
@@ -771,7 +793,7 @@ function loginSuccess(client) {
if (getPlayerData(client).subAccounts.length == 0) {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerPromptGUI(client, getLocaleString(client, "NoCharactersGUIMessage"), getLocaleString(client, "NoCharactersGUIWindowTitle"));
showPlayerPrompt(client, getLocaleString(client, "NoCharactersGUIMessage"), getLocaleString(client, "NoCharactersGUIWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = VRR_PROMPT_CREATEFIRSTCHAR;
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters prompt GUI`);
} else {
@@ -782,11 +804,20 @@ function loginSuccess(client) {
showCharacterSelectToClient(client);
}
getPlayerData(client).accountData.ipAddress = client.ip;
getPlayerData(client).accountData.ipAddress = getPlayerIP(client);
sendPlayerChatScrollLines(client, getPlayerData(client).accountData.chatScrollLines);
messagePlayerNormal(null, `👋 ${getPlayerName(client)} has joined the server`, getColourByName("softYellow"));
messageDiscordChatChannel(`👋 ${getPlayerName(client)} has joined the server`);
//let countryName = "Unknown";
//if(getCountryNameFromIP(getPlayerIP(client))) {
// countryName = getCountryNameFromIP(getPlayerIP(client));
//}
//let clients = getClients();
//for(let i in clients) {
// messagePlayerNormal(clients[i], getLocaleString(clients[i], "PlayerJoinedServer", `{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR}`, `{ALTCOLOUR}${countryName}{MAINCOLOUR}`), getColourByName("softYellow"));
//}
}
// ===========================================================================
@@ -821,6 +852,7 @@ function saveAccountToDatabase(accountData) {
["acct_svr_staff_flags", accountData.flags.admin],
["acct_svr_mod_flags", accountData.flags.moderation],
["acct_svr_chat_scroll_lines", accountData.chatScrollLines],
["acct_svr_chat_auto_hide_delay", accountData.chatAutoHideDelay],
];
let queryString1 = createDatabaseUpdateQuery("acct_main", data, `acct_id=${accountData.databaseId}`);
@@ -954,10 +986,11 @@ function createAccount(name, password, email = "") {
// ===========================================================================
function checkLogin(client, password) {
async function checkLogin(client, password) {
getPlayerData(client).loginAttemptsRemaining = getPlayerData(client).loginAttemptsRemaining - 1;
if (getPlayerData(client).loginAttemptsRemaining <= 0) {
client.disconnect();
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
disconnectPlayer(client);
}
if (isPlayerLoggedIn(client)) {
@@ -993,9 +1026,10 @@ function checkLogin(client, password) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
}
if(isAccountEmailVerified(getPlayerData(client).accountData) && isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
sendAccountLoginFailedNotification(getPlayerData(client).accountData.emailAddress, client.name, client.ip, getServerGame());
}
// Disabling email login alerts for now. It hangs the server for a couple seconds. Need a way to thread it.
//if (isAccountEmailVerified(getPlayerData(client).accountData) && !isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
// await sendAccountLoginFailedNotification(getPlayerData(client).accountData.emailAddress, getPlayerName(client), getPlayerIP(client), getGame());
//}
return false;
}
@@ -1009,17 +1043,19 @@ function checkLogin(client, password) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
}
if(isAccountEmailVerified(getPlayerData(client).accountData) && isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
sendAccountLoginFailedNotification(getPlayerData(client).accountData.emailAddress, client.name, client.ip, getServerGame());
}
// Disabling email login alerts for now. It hangs the server for a couple seconds. Need a way to thread it.
//if (isAccountEmailVerified(getPlayerData(client).accountData) && !isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
// await sendAccountLoginFailedNotification(getPlayerData(client).accountData.emailAddress, getPlayerName(client), getPlayerIP(client), getGame());
//}
return false;
}
//if(doesPlayerHaveTwoFactorAuthEnabled(client)) {
// getPlayerData(client).twoFactorAuthCode = toUpperCase(generateRandomString(6));
// showPlayerTwoFactorAuthenticationGUI(client);
// return true;
//}
if (doesPlayerHaveTwoFactorAuthEnabled(client) && checkForSMTPModule() && getEmailConfig().enabled) {
getPlayerData(client).twoFactorAuthCode = toUpperCase(generateRandomString(6));
showPlayerTwoFactorAuthenticationGUI(client);
sendAccountTwoFactorAuthCode(getPlayerData(client).accountData.emailAddress, getPlayerName(client), getPlayerData(client).twoFactorAuthCode);
return true;
}
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginSuccessGUI(client);
@@ -1027,9 +1063,10 @@ function checkLogin(client, password) {
loginSuccess(client);
if(isAccountEmailVerified(getPlayerData(client).accountData) && isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
sendAccountLoginSuccessNotification(getPlayerData(client).accountData.emailAddress, client.name, client.ip, getServerGame());
}
// Disabling email login alerts for now. It hangs the server for a couple seconds. Need a way to thread it.
//if (isAccountEmailVerified(getPlayerData(client).accountData) && !isAccountSettingFlagEnabled(getPlayerData(client).accountData, getAccountSettingsFlagValue("AuthAttemptAlert"))) {
// await sendAccountLoginSuccessNotification(getPlayerData(client).accountData.emailAddress, getPlayerName(client), getPlayerIP(client), getGame());
//}
}
// ===========================================================================
@@ -1100,13 +1137,13 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
} else {
messagePlayerError(client, "Password doesn't meet requirements!");
}
return false
return false;
}
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
if (!isValidEmailAddress(emailAddress)) {
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedInvalidEmail"));
return false
return false;
}
}
@@ -1136,7 +1173,8 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
if (doesServerHaveTesterOnlyEnabled() && !isPlayerATester(client)) {
setTimeout(function () {
client.disconnect();
getPlayerData(client).customDisconnectReason = "Kicked - Not a tester";
disconnectPlayer(client);
}, 5000);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
@@ -1153,7 +1191,7 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationSuccessGUI(client);
showPlayerPromptGUI(client, getLocaleString(client, "NoCharactersMessage"), getLocaleString(client, "NoCharactersWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
showPlayerPrompt(client, getLocaleString(client, "NoCharactersMessage"), getLocaleString(client, "NoCharactersWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = VRR_PROMPT_CREATEFIRSTCHAR;
} else {
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage"), `{ALTCOLOUR}/newchar{MAINCOLOUR}`);
@@ -1164,27 +1202,53 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
// ===========================================================================
function checkAccountResetPasswordRequest(client, inputText) {
if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_NONE) {
if (!checkForSMTPModule() || !getEmailConfig().enabled) {
return false;
}
switch (getPlayerData(client).passwordResetState) {
case VRR_RESETPASS_STATE_EMAILCONFIRM: {
if (toLowerCase(getPlayerData(client).accountData.emailAddress) != toLowerCase(inputText)) {
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (email not correct)`);
logToConsole(LOG_INFO | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (email not correct)`);
showPlayerErrorGUI(client, getLocaleString(client, "GUIErrorResetPasswordFailedInvalidEmail"), getLocaleString(client, "GUIErrorTitle"), getLocaleString(client, "GUIOkButton"));
return false;
}
let passwordResetCode = toUpperCase(generateEmailVerificationCode());
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_CODEINPUT;
getPlayerData(client).passwordResetCode = passwordResetCode;
sendPasswordResetEmail(client, passwordResetCode);
showPlayerResetPasswordCodeInputGUI(client);
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} reset their password. Awaiting verification code input ...`);
} else if(getPlayerData(client).passwordResetState == VRR_RESETPASS_STATE_CODEINPUT) {
sendPasswordResetEmail(client, passwordResetCode);
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)} submitted successful email for password reset. Sending email and awaiting verification code input (${passwordResetCode}) ...`);
break;
}
case VRR_RESETPASS_STATE_CODEINPUT: {
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)} submitted code for password reset (${inputText}) ...`);
if (inputText != "") {
if (getPlayerData(client).passwordResetCode == toUpperCase(inputText)) {
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_SETPASS;
showPlayerChangePasswordGUI(client);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} entered the correct reset password verification code. Awaiting new password input ...`);
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)} entered the correct reset password verification code. Awaiting new password input ...`);
} else {
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE;
client.disconnect();
logToConsole(LOG_DEBUG|LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct)`);
getPlayerData(client).passwordResetAttemptsRemaining = getPlayerData(client).passwordResetAttemptsRemaining - 1;
logToConsole(LOG_INFO | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct, ${getPlayerData(client).passwordResetAttemptsRemaining} attempts remaining)`);
if (getPlayerData(client).passwordResetAttemptsRemaining <= 0) {
logToConsole(LOG_INFO | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct, no more attempts remaining, kicking ...)`);
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
disconnectPlayer(client);
return false;
}
}
}
break;
}
case VRR_RESETPASS_STATE_NONE: {
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)} requested a password reset. Awaiting email input ...`);
showPlayerResetPasswordEmailInputGUI(client);
getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_EMAILCONFIRM;
break;
}
}
@@ -1197,7 +1261,7 @@ function checkAccountChangePassword(client, newPassword, confirmNewPassword) {
if (!isPlayerLoggedIn(client)) {
if (getPlayerData(client).passwordResetState != VRR_RESETPASS_STATE_SETPASS) {
//getPlayerData(client).passwordResetState = VRR_RESETPASS_STATE_NONE;
//client.disconnect();
//disconnectPlayer(client);
logToConsole(LOG_DEBUG | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to change their password (not logged in or not using reset password)`);
return false;
}
@@ -1248,7 +1312,7 @@ function isValidEmailAddress(emailAddress) {
// ===========================================================================
function saveAllClientsToDatabase() {
function saveAllPlayersToDatabase() {
logToConsole(LOG_DEBUG, "[VRR.Account]: Saving all clients to database ...");
getClients().forEach(function (client) {
savePlayerToDatabase(client);
@@ -1263,7 +1327,7 @@ function savePlayerToDatabase(client) {
return false;
}
if(!getPlayerData(client).loggedIn) {
if (!isPlayerLoggedIn(client)) {
return false;
}
@@ -1273,8 +1337,8 @@ function savePlayerToDatabase(client) {
if (getPlayerData(client).currentSubAccount != -1) {
//let subAccountData = getPlayerCurrentSubAccount(client);
if(client.player != null) {
if(getPlayerData(client).returnToPosition != null) {
if (getPlayerPed(client) != null) {
if (getPlayerData(client).returnToPosition != null && getPlayerData(client).returnToType != VRR_RETURNTO_TYPE_ADMINGET) {
getPlayerCurrentSubAccount(client).spawnPosition = getPlayerData(client).returnToPosition;
getPlayerCurrentSubAccount(client).spawnHeading = getPlayerData(client).returnToHeading.z;
getPlayerCurrentSubAccount(client).interior = getPlayerData(client).returnToInterior;
@@ -1296,41 +1360,55 @@ function savePlayerToDatabase(client) {
// ===========================================================================
function initClient(client) {
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing client ${getPlayerDisplayForConsole(client)} ...`);
if (isConsole(client)) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[VRR.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (is console client)`);
return false;
}
if(client.getData("vrr.isInitialized") != null || client.getData("vrr.isInitialized") == true) {
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing client ${getPlayerDisplayForConsole(client)} ...`);
if (playerInitialized[client.index] == true) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[VRR.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (already initialized)`);
return false;
}
client.setData("vrr.isInitialized", true, false);
setEntityData(client, "vrr.isInitialized", true, false);
sendPlayerGUIColours(client);
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing GUI for ${getPlayerDisplayForConsole(client)} ...`);
sendPlayerGUIInit(client);
updatePlayerSnowState(client);
showConnectCameraToPlayer(client);
//logToConsole(LOG_DEBUG, `[VRR.Account] Showing connect camera to ${getPlayerDisplayForConsole(client)} ...`);
//showConnectCameraToPlayer(client);
messageClient(`Please wait ...`, client, getColourByName("softGreen"));
logToConsole(LOG_DEBUG, `[VRR.Account] Waiting for 2.5 seconds to prevent race attack ...`);
setTimeout(function () {
if (client != null) {
clearChatBox(client);
logToConsole(LOG_DEBUG, `[VRR.Account] Loading account for ${getPlayerDisplayForConsole(client)}`);
let tempAccountData = loadAccountFromName(getPlayerName(client), true);
logToConsole(LOG_DEBUG, `[VRR.Account] Loading subaccounts for ${getPlayerDisplayForConsole(client)}`);
let tempSubAccounts = loadSubAccountsFromAccount(tempAccountData.databaseId);
getServerData().clients[client.index] = new ClientData(client, tempAccountData, tempSubAccounts);
getServerData().clients[getPlayerId(client)] = new ClientData(client, tempAccountData, tempSubAccounts);
getServerData().clients[client.index].sessionId = saveConnectionToDatabase(client);
getServerData().clients[client.index].connectTime = getCurrentUnixTimestamp();
getServerData().clients[getPlayerId(client)].sessionId = saveConnectionToDatabase(client);
getServerData().clients[getPlayerId(client)].connectTime = getCurrentUnixTimestamp();
requestClientInfo(client);
if (tempAccountData != false) {
if(isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == client.ip) {
sendPlayerLocaleId(client, getPlayerData(client).accountData.locale);
if (isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == getPlayerIP(client)) {
messagePlayerAlert(client, getLocaleString(client, "AutoLoggedInIP"));
loginSuccess(client);
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
} else {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI.`);
@@ -1338,10 +1416,17 @@ function initClient(client) {
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled).`);
messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client), "/login"), getColourByName("softGreen"));
//if(checkForGeoIPModule()) {
// let iso = module.geoip.getCountryISO(getPlayerIP(client));
// let localeId = getLocaleFromCountryISO(iso);
//}
//showGameMessage(client, getLocaleString(client, "LocaleOffer", `/lang ${getLocaleData(localeId)[2]}`), getColourByName("white"), 10000, "Roboto");
}
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
} else {
sendPlayerLocaleId(client, 0);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI.`);
showPlayerRegistrationGUI(client);
@@ -1352,9 +1437,10 @@ function initClient(client) {
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
getServerData().clients[client.index].keyBinds = loadAccountKeybindsFromDatabase(getServerData().clients[client.index].accountData.databaseId);
getServerData().clients[getPlayerId(client)].keyBinds = loadAccountKeybindsFromDatabase(getServerData().clients[getPlayerId(client)].accountData.databaseId);
sendAccountKeyBindsToClient(client);
}
}, 2500);
}
@@ -1364,7 +1450,7 @@ function saveConnectionToDatabase(client) {
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, getPlayerName(client));
let dbQueryString = `INSERT INTO conn_main (conn_when_connect, conn_server, conn_script_version, conn_game_version, conn_client_version, conn_name, conn_ip) VALUES (NOW(), ${getServerConfig().databaseId}, '${scriptVersion}', '${client.gameVersion}', '0.0.0', '${safeName}', '${client.ip}')`;
let dbQueryString = `INSERT INTO conn_main (conn_when_connect, conn_server, conn_script_version, conn_game_version, conn_client_version, conn_name, conn_ip) VALUES (NOW(), ${getServerConfig().databaseId}, '${scriptVersion}', '${getPlayerGameVersion(client)}', '0.0.0', '${safeName}', '${getPlayerIP(client)}')`;
queryDatabase(dbConnection, dbQueryString);
return getDatabaseInsertId(dbConnection);
}
@@ -1551,14 +1637,14 @@ function isAccountEmailVerified(accountData) {
// ===========================================================================
function isAccountTwoFactorAuthenticationVerified(accountData) {
return hasBitFlag(accountData.flags.moderation, getModerationFlagValue("TwoFactorAuthVerified"));
function doesPlayerHaveTwoFactorAuthEnabled(client) {
return hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("TwoStepAuth"));
}
// ===========================================================================
function doesPlayerHaveTwoFactorAuthEnabled(client) {
return hasBitFlag(getPlayerData(client).accountData.flags.settings, getAccountSettingsFlagValue("TwoFactorAuth"));
function doesPlayerHaveLoginAlertsEnabled(client) {
return hasBitFlag(getPlayerData(client).accountData.settings, getAccountSettingsFlagValue("AuthAttemptAlert"));
}
// ===========================================================================
@@ -1616,7 +1702,7 @@ function verifyAccountEmail(accountData, verificationCode) {
// ===========================================================================
function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getServerGame()) {
function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getGame()) {
let countryName = module.geoip.getCountryName(getGlobalConfig().geoIPCountryDatabaseFilePath, ip);
let subDivisionName = module.geoip.getSubdivisionName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
let cityName = module.geoip.getCityName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
@@ -1624,9 +1710,9 @@ function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getSe
let emailBodyText = getEmailConfig().bodyContent.accountAuthFailAlert;
emailBodyText = emailBodyText.replace("{GAMENAME}", getGameName(game));
emailBodyText = emailBodyText.replace("{IPADDRESS}", ip);
emailBodyText = emailBodyText.replace("{LOCATION}", `${cityName}, ${countryName}, ${countryName}`);
emailBodyText = emailBodyText.replace("{LOCATION}", `${cityName}, ${subDivisionName}, ${countryName}`);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
emailBodyText = emailBodyText.replace("{TIMESTAMP}", date.toLocaleString('en-US'));
emailBodyText = emailBodyText.replace("{TIMESTAMP}", new Date().toLocaleString('en-US'));
sendEmail(emailAddress, name, `Login failed on ${getServerName()}`, emailBodyText);
return true;
@@ -1634,7 +1720,7 @@ function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getSe
// ===========================================================================
function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getServerGame()) {
function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getGame()) {
let countryName = module.geoip.getCountryName(getGlobalConfig().geoIPCountryDatabaseFilePath, ip);
let subDivisionName = module.geoip.getSubdivisionName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
let cityName = module.geoip.getCityName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
@@ -1644,9 +1730,9 @@ function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getS
emailBodyText = emailBodyText.replace("{IPADDRESS}", ip);
emailBodyText = emailBodyText.replace("{LOCATION}", `${cityName}, ${subDivisionName}, ${countryName}`);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
emailBodyText = emailBodyText.replace("{TIMESTAMP}", date.toLocaleString('en-US'));
emailBodyText = emailBodyText.replace("{TIMESTAMP}", new Date().toLocaleString('en-US'));
sendEmail(emailAddress, name, `Login failed on ${getServerName()}`, emailBodyText);
sendEmail(emailAddress, name, `Login successful on ${getServerName()}`, emailBodyText);
return true;
}
@@ -1672,7 +1758,8 @@ function checkPlayerTwoFactorAuthentication(client, authCode) {
}
}
client.disconnect();
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
disconnectPlayer(client);
return false;
}
@@ -1683,3 +1770,15 @@ function isPlayerATester(client) {
}
// ===========================================================================
function sendAccountTwoFactorAuthCode(emailAddress, name, twoFactorAuthCode) {
let emailBodyText = getEmailConfig().bodyContent.twoFactorAuthentication;
emailBodyText = emailBodyText.replace("{2FACODE}", twoFactorAuthCode);
emailBodyText = emailBodyText.replace("{GAMENAME}", getGameName(getGame()));
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(emailAddress, name, `Login code for ${getServerName()}`, emailBodyText);
return true;
}
// ===========================================================================

View File

@@ -24,13 +24,13 @@ let animationSlot = getAnimationFromParams(getParam(params, " ", 1));
let animationPositionOffset = 1;
if(!animationSlot) {
messagePlayerError(client, getLocaleString(client, "AnimationNotFound"));
messagePlayerInfo(client, getLocaleString(client, "AnimationHelpTip"), `{ALTCOLOUR}/animlist{MAINCOLOUR}`);
messagePlayerError(client, getLocaleString(client, "InvalidAnimation"));
messagePlayerInfo(client, getLocaleString(client, "AnimationCommandTip", `{ALTCOLOUR}/animlist{MAINCOLOUR}`));
return false;
}
if(toInteger(animationPositionOffset) < 0 || toInteger(animationPositionOffset) > 3) {
messagePlayerError(client, getLocaleString(client, "AnimationInvalidDistance"));
messagePlayerError(client, getLocaleString(client, "InvalidAnimationDistance"));
return false;
}
@@ -39,7 +39,7 @@ let animationSlot = getAnimationFromParams(getParam(params, " ", 1));
}
if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) {
messagePlayerError(client, `You aren't able to do that`);
messagePlayerError(client, getLocaleString(client, "UnableToDoThat"));
return false;
}
@@ -51,12 +51,12 @@ let animationSlot = getAnimationFromParams(getParam(params, " ", 1));
function stopPlayerAnimationCommand(command, params, client) {
if(isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) {
messagePlayerError(client, `You aren't able to do that`);
messagePlayerError(client, getLocaleString(client, "UnableToDoThat"));
return false;
}
setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo);
makePedStopAnimation(getPlayerData(client).ped);
makePedStopAnimation(getPlayerPed(client));
getPlayerData(client).currentAnimation = -1;
getPlayerData(client).currentAnimationPositionOffset = false;
@@ -64,13 +64,13 @@ function stopPlayerAnimationCommand(command, params, client) {
getPlayerData(client).animationStart = 0;
getPlayerData(client).animationForced = false;
setPlayerMouseCameraState(client, false);
//setPlayerMouseCameraState(client, false);
}
// ===========================================================================
function showAnimationListCommand(command, params, client) {
let animList = getGameConfig().animations[getServerGame()].map(function(x) { return x[0]; });
let animList = getGameConfig().animations[getGame()].map(function(x) { return x.name; });
let chunkedList = splitArrayIntoChunks(animList, 10);
@@ -87,7 +87,7 @@ function showAnimationListCommand(command, params, client) {
* @param {number} animationSlot - The slot index of the animation
* @return {Array} The animation's data (array)
*/
function getAnimationData(animationSlot, gameId = getServerGame()) {
function getAnimationData(animationSlot, gameId = getGame()) {
return getGameConfig().animations[gameId][animationSlot];
}
@@ -106,8 +106,8 @@ function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).animationStart = getCurrentUnixTimestamp();
getPlayerData(client).animationForced = false;
makePedPlayAnimation(getPlayerData(client).ped, animationSlot, offsetPosition);
makePedPlayAnimation(getPlayerPed(client), animationSlot, offsetPosition);
setEntityData(getPlayerPed(client), "vrr.anim", animationSlot, true);
//if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) {
// if(getGame() < VRR_GAME_GTA_SA) {
// setPlayerMouseCameraState(client, true);
@@ -125,14 +125,14 @@ function forcePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).animationForced = true;
setPlayerControlState(client, false);
forcePedAnimation(getPlayerData(client).ped, animationSlot, offsetPosition);
forcePedAnimation(getPlayerPed(client), animationSlot, offsetPosition);
}
// ===========================================================================
function makePlayerStopAnimation(client) {
//setPlayerPosition(client, getPlayerData(client).currentAnimationPositionReturnTo);
makePedStopAnimation(getPlayerData(client).ped);
makePedStopAnimation(getPlayerPed(client));
getPlayerData(client).currentAnimation = -1;
getPlayerData(client).currentAnimationPositionOffset = false;
@@ -144,14 +144,15 @@ function makePlayerStopAnimation(client) {
// ===========================================================================
function getAnimationFromParams(params) {
let animations = getGameConfig().animations[getGame()];
if(isNaN(params)) {
for(let i in getGameConfig().animations[getServerGame()]) {
if(toLowerCase(getGameConfig().animations[getServerGame()][i][0]).indexOf(toLowerCase(params)) != -1) {
for(let i in animations) {
if(toLowerCase(animations[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if(typeof getGameConfig().animations[getServerGame()][params] != "undefined") {
if(typeof getGameConfig().animations[getGame()][params] != "undefined") {
return toInteger(params);
}
}

View File

@@ -67,9 +67,11 @@ function accountBanCommand(command, params, client) {
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name}) account was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been account banned.`);
announceAdminAction(`PlayerAccountBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banAccount(getPlayerData(targetClient).accountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
disconnectPlayer(client);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`;
disconnectPlayer(targetClient);
}
// ===========================================================================
@@ -97,10 +99,11 @@ function subAccountBanCommand(command, params, client, fromDiscord) {
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name})'s subaccount was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been character banned.`);
announceAdminAction(`PlayerCharacterBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banSubAccount(getPlayerData(targetClient).currentSubAccountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
disconnectPlayer(client);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`;
disconnectPlayer(targetClient);
}
// ===========================================================================
@@ -126,11 +129,12 @@ function ipBanCommand(command, params, client, fromDiscord) {
return false;
}
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been IP banned.`);
banIPAddress(targetClient.ip, getPlayerData(client).accountData.databaseId, reason);
announceAdminAction(`PlayerIPBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banIPAddress(getPlayerIP(targetClient), getPlayerData(client).accountData.databaseId, reason);
server.banIP(targetClient.ip);
targetClient.disconnect();
getPlayerData(targetClient).customDisconnectReason = `IP Banned - ${reason}`;
serverBanIP(getPlayerIP(targetClient));
disconnectPlayer(targetClient);
}
// ===========================================================================
@@ -157,10 +161,11 @@ function subNetBanCommand(command, params, client, fromDiscord) {
return false;
}
messageAdminAction(`{ALTCOLOUR}${getPlayerData(targetClient).currentSubAccountData.name} {MAINCOLOUR}has been subnet banned`);
banSubNet(targetClient.ip, getSubNet(targetClient.ip, octetAmount), getPlayerData(client).accountData.databaseId, reason);
announceAdminAction(`PlayerSubNetBanned`, `{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR}`);
banSubNet(getPlayerIP(targetClient), getSubNet(getPlayerIP(targetClient), octetAmount), getPlayerData(client).accountData.databaseId, reason);
server.banIP(targetClient.ip);
getPlayerData(client).customDisconnectReason = `IP Subnet Banned - ${reason}`;
serverBanIP(getPlayerIP(targetClient));
}
// ===========================================================================
@@ -282,14 +287,10 @@ function unbanSubNet(ipAddressStart, ipAddressEnd, adminAccountId) {
// ===========================================================================
function isAccountBanned(accountId) {
let bans = getServerData().bans;
for(let i in bans) {
if(bans[i].type == VRR_BANTYPE_ACCOUNT) {
if(bans[i].detail == accountId) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_ACCOUNT && ban.detail === accountId);
if (bans.length > 0) {
return true;
}
}
}
return false;
}
@@ -297,14 +298,10 @@ function isAccountBanned(accountId) {
// ===========================================================================
function isSubAccountBanned(subAccountId) {
let bans = getServerData().bans;
for(let i in bans) {
if(bans[i].type == VRR_BANTYPE_SUBACCOUNT) {
if(bans[i].detail == subAccountId) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_SUBACCOUNT && ban.detail === subAccountId);
if (bans.length > 0) {
return true;
}
}
}
return false;
}
@@ -312,17 +309,12 @@ function isSubAccountBanned(subAccountId) {
// ===========================================================================
function isIpAddressBanned(ipAddress) {
let bans = getServerData().bans;
for(let i in bans) {
if(bans[i].type == VRR_BANTYPE_IPADDRESS) {
if(bans[i].detail == ipAddress) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_IPADDRESS && ban.detail === ipAddress);
if (bans.length > 0) {
return true;
}
}
}
return false;
}
// ===========================================================================

View File

@@ -7,8 +7,6 @@
// TYPE: Server (JavaScript)
// ===========================================================================
// ===========================================================================
let serverBitFlags = {
staffFlags: {},
moderationFlags: {},
@@ -21,7 +19,6 @@ let serverBitFlags = {
npcTriggerTypeFlags: {},
npcTriggerConditionTypesFlags: {},
npcTriggerResponseTypeFlags: {},
serverSettings: {}
};
// ===========================================================================
@@ -41,6 +38,8 @@ let serverBitFlagKeys = {
"ManageWorld",
"ManageAntiCheat",
"Developer",
"ManageNPCs",
"ManageRaces",
],
moderationFlagKeys: [
"None",
@@ -119,6 +118,8 @@ let serverBitFlagKeys = {
"NoRandomTips",
"NoActionTips",
],
// Not going to be used. Use trigger, condition, and response stuff in trigger.js
npcTriggerTypeKeys: [
"None",
"FarProximity", // Comes within a far distance of NPC
@@ -219,26 +220,6 @@ let serverBitFlagKeys = {
"ShowItemsAfterPurchase",
"BuyCommandAfterEnterBusiness",
],
serverSettingsKeys: [
"None",
"GUI",
"ServerLogo",
"FallingSnow",
"GroundSnow",
"Anticheat",
"CheckGameScripts",
"GameScriptBlackList",
"GameScriptWhiteList",
"JobBlips",
"JobPickups",
"BusinessBlips",
"BusinessPickups",
"HouseBlips",
"HousePickups",
"DiscordBot",
"RealTime",
"Testing",
],
};
// ===========================================================================
@@ -255,47 +236,12 @@ function initBitFlagScript() {
serverBitFlags.npcTriggerTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerTypeKeys);
serverBitFlags.npcTriggerConditionTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerConditionTypeKeys);
serverBitFlags.npcTriggerResponseTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerResponseTypeKeys);
serverBitFlags.serverSettings = createBitFlagTable(serverBitFlagKeys.serverSettingsKeys);
logToConsole(LOG_INFO, "[VRR.BitFlag]: Bit flag script initialized successfully!");
return true;
}
// ===========================================================================
function createBitFlagTable(keyNames) {
let bitVal = 0;
let bitTable = {};
let incVal = 1;
for(let i in keyNames) {
let key = keyNames[i];
bitTable[key] = bitVal;
bitVal = 1 << incVal;
incVal++;
}
return bitTable;
}
// ===========================================================================
function hasBitFlag(allFlags, checkForFlag) {
if(allFlags == 0) {
return false;
}
if(allFlags == -1) {
return true;
}
if((allFlags & checkForFlag) == checkForFlag) {
return true;
}
return false;
}
// ===========================================================================
function doesPlayerHaveStaffPermission(client, requiredFlags) {
if(isConsole(client)) {
return true;
@@ -410,20 +356,6 @@ function getModerationFlagValue(flagName) {
// ===========================================================================
function getServerSettingsFlagValue(flagName) {
if(flagName == "All") {
return -1;
}
if(typeof serverBitFlags.serverSettings[flagName] == "undefined") {
return false;
}
return serverBitFlags.serverSettings[flagName];
}
// ===========================================================================
function givePlayerStaffFlag(client, flagName) {
if(!getStaffFlagValue(flagName)) {
return false;
@@ -447,18 +379,6 @@ function takePlayerStaffFlag(client, flagName) {
// ===========================================================================
function addBitFlag(allFlags, flagValue) {
return allFlags | flagValue;
}
// ===========================================================================
function removeBitFlag(allFlags, flagValue) {
return allFlags ^ flagValue;
}
// ===========================================================================
function takePlayerStaffFlag(client, flagName) {
if(!getStaffFlagValue(flagName)) {
return false;
@@ -488,19 +408,3 @@ function getServerBitFlagKeys() {
}
// ===========================================================================
function createBitwiseTable(tableKeys) {
let bitVal = 0;
let bitTable = {};
let incVal = 1;
for(let i in tableKeys) {
let key = tableKeys[i];
bitTable[key] = bitVal;
bitVal = 1 << incVal;
incVal++;
}
return bitTable;
}
// ===========================================================================

File diff suppressed because it is too large Load Diff

View File

@@ -16,27 +16,33 @@ function initChatScript() {
// ===========================================================================
function processPlayerChat(client, messageText) {
if(!isConsole(client)) {
if(!getPlayerData(client)) {
messagePlayerError(client, "You need to login before you can chat!");
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false;
}
if(!isPlayerLoggedIn(client)) {
messagePlayerError(client, "You need to login before you can chat!");
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false;
}
if(!isPlayerSpawned(client)) {
messagePlayerError(client, "You need to spawn before you can chat!");
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false;
}
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
messageText = messageText.substring(0, 128);
messagePlayerNormal(null, `💬 ${getCharacterFullName(client)}: {MAINCOLOUR}${messageText}`, getPlayerColour(client));
messageDiscordChatChannel(`💬 ${getCharacterFullName(client)}: ${messageText}`);
} else {
messagePlayerNormal(null, `🛡️ (ADMIN) - ${messageText}`);
}
/*
let clients = getClients();
@@ -48,7 +54,7 @@ function processPlayerChat(client, messageText) {
messagePlayerNormal(clients[i], `💬 ${getCharacterFullName(client)}: [#FFFFFF]${translatedText}${original}`, clients[i], getColourByName("mediumGrey"));
}
*/
messagePlayerNormal(null, `💬 ${getCharacterFullName(client)}: ${messageText}`);
//messageDiscordChatChannel(`💬 ${getCharacterFullName(client)}: ${messageText}`);
}
@@ -68,7 +74,7 @@ function meActionCommand(command, params, client) {
function doActionCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -85,7 +91,7 @@ function doActionCommand(command, params, client) {
function shoutCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -102,7 +108,7 @@ function shoutCommand(command, params, client) {
function megaphoneChatCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -112,7 +118,7 @@ function megaphoneChatCommand(command, params, client) {
}
if(!canPlayerUseMegaphone(client)) {
messagePlayerError(client, "You must have a megaphone item or be in an emergency vehicle!");
messagePlayerError(client, getLocaleString(client, "CantUseMegaphone"));
return false;
}
@@ -124,7 +130,7 @@ function megaphoneChatCommand(command, params, client) {
function talkCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -141,7 +147,7 @@ function talkCommand(command, params, client) {
function whisperCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -158,7 +164,7 @@ function whisperCommand(command, params, client) {
function adminChatCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
@@ -167,14 +173,14 @@ function adminChatCommand(command, params, client) {
return false;
}
messageAdmins(`{jobYellow}[Admin Chat] {ALTCOLOUR}${getPlayerName(client)} [#CCCCCC](${getPlayerStaffTitle(client)}){MAINCOLOUR}: ${params}`);
messageAdmins(`{jobYellow}[Admin Chat] {ALTCOLOUR}${getPlayerName(client)}: ${params}`);
}
// ===========================================================================
function clanChatCommand(command, params, client) {
if(isPlayerMuted(client)) {
messagePlayerError(client, "You are muted and can't chat!");
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}

View File

@@ -106,8 +106,6 @@ class ClanMemberData {
function initClanScript() {
logToConsole(LOG_INFO, "[VRR.Clan]: Initializing clans script ...");
getServerData().clans = loadClansFromDatabase();
setAllClanDataIndexes();
logToConsole(LOG_INFO, "[VRR.Clan]: Clan script initialized successfully!");
return true;
}
@@ -130,7 +128,7 @@ function loadClansFromDatabase() {
//tempClanData.members = loadClanMembersFromDatabase(tempClanData.databaseId);
tempClanData.ranks = loadClanRanksFromDatabase(tempClanData.databaseId);
tempClans.push(tempClanData);
logToConsole(LOG_VERBOSE, `[VRR.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[VRR.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -211,7 +209,7 @@ function createClanRank(clanId, rankId, rankName) {
let rankIndex = getClanData(clanId).ranks.push(tempClanRankData);
setAllClanDataIndexes();
saveAllClanRanksToDatabase(clanId);
saveClanRanksToDatabase(clanId);
return rankIndex;
}
@@ -223,7 +221,7 @@ function removeClanRank(clanId, rankId) {
return false;
}
quickDatabaseQuery(`DELETE FROM clan_rank WHERE clan_rank_id = ${tempClanRankData.database}`);
quickDatabaseQuery(`UPDATE clan_rank SET clan_rank_deleted = 1, clan_rank_when_deleted = UNIX_TIMESTAMP(), clan_rank_who_deleted = ${getPlayerData(client).accountData.databaseId} WHERE biz_id ${tempClanRankData.database}`);
getClanData(clanId).ranks.splice(tempClanRankData.index, 1);
}
@@ -241,7 +239,7 @@ function listClansCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(nameList, 5);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clans {clanOrange}====================================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderClansList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
@@ -268,7 +266,7 @@ function listClanRanksCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(rankNameList, 5);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clan Ranks (${getClanData(clanId).name}) {clanOrange}=====================`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderClanRanksList")));
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", "));
@@ -290,7 +288,7 @@ function createClanCommand(command, params, client) {
// Create clan without owner. Can set owner with /clanowner afterward
createClan(params);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}created clan {clanOrange}${params}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created clan {clanOrange}${params}`);
}
// ===========================================================================
@@ -308,8 +306,8 @@ function deleteClanCommand(command, params, client) {
return false;
}
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}deleted clan {clanOrange}${getClanData(clanId).name}`);
deleteClan(clanId);
messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}deleted clan {clanOrange}${getClanData(clanId).name}`);
deleteClan(clanId, getPlayerData(client).accountData.databaseId);
}
// ===========================================================================
@@ -339,10 +337,13 @@ function setClanOwnerCommand(command, params, client) {
}
getClanData(clanId).owner = getPlayerCurrentSubAccount(targetClient).databaseId;
getClanData(clanId).needsSaved = true;
getPlayerCurrentSubAccount(targetClient).clan = getClanData(clanId).databaseId;
getPlayerCurrentSubAccount(targetClient).clanFlags = getClanFlagValue("All");
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}owner to {ALTCOLOUR}${getCharacterFullName(targetClient)}`);
//messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}owner to {ALTCOLOUR}${getCharacterFullName(targetClient)}`);
messagePlayerSuccess(client, `You changed the clan owner to {ALTCOLOUR}${getCharacterFullName(targetClient)}`);
}
// ===========================================================================
@@ -365,9 +366,11 @@ function setClanTagCommand(command, params, client) {
return false;
}
getClanData(clanId).params = params;
getClanData(clanId).tag = params;
getClanData(clanId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).index} {MAINCOLOUR}tag to {ALTCOLOUR}${params}`);
//messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).index} {MAINCOLOUR}tag to {ALTCOLOUR}${params}`);
messagePlayerSuccess(client, `You changed the clan tag to {ALTCOLOUR}${params}`);
}
// ===========================================================================
@@ -391,8 +394,10 @@ function setClanNameCommand(command, params, client) {
}
getClanData(clanId).name = params;
getClanData(clanId).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).index} {MAINCOLOUR}name to {ALTCOLOUR}${params}`);
//messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}set clan {clanOrange}${getClanData(clanId).index} {MAINCOLOUR}name to {ALTCOLOUR}${params}`);
messagePlayerSuccess(client, `You changed the clan name to {ALTCOLOUR}${params}`);
}
// ===========================================================================
@@ -453,6 +458,7 @@ function deleteClanRankCommand(command, params, client) {
}
removeClanRank(clanId, rankId);
getClanData(clanId).needsSaved = true;
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${tempRankName}{MAINCOLOUR} rank`);
}
@@ -496,7 +502,7 @@ function setClanMemberTagCommand(command, params, client) {
}
}
getPlayerCurrentSubAccount(targetClient).ClanTag = getParam(params, " ", 2);
getPlayerCurrentSubAccount(targetClient).clanTag = getParam(params, " ", 2);
messagePlayerSuccess(client, `You set {ALTCOLOUR}${getCharacterFullName(targetClient)}'s {MAINCOLOUR}clan tag to {ALTCOLOUR}${getParam(params, " ", 2)}`);
messagePlayerAlert(client, `{ALTCOLOUR}${getCharacterFullName(targetClient)} {MAINCOLOUR}set your clan tag to {ALTCOLOUR}${getParam(params, " ", 2)}`);
@@ -530,7 +536,8 @@ function setClanRankTagCommand(command, params, client) {
}
}
getServerData().clans[clanId].rankId[rankId].customTag = newTag;
getClanRankData(clanId, rankId).customTag = newTag;
getClanRankData(clanId, rankId).needsSaved = true;
}
// ===========================================================================
@@ -578,7 +585,8 @@ function setClanRankLevelCommand(command, params, client) {
return false;
}
getServerData().clans[clanId].rankId[rankId].level = toInteger(newLevel);
getClanRankData(clanId, rankId).level = toInteger(newLevel);
getClanRankData(clanId, rankId).needsSaved = true;
}
// ===========================================================================
@@ -717,7 +725,8 @@ function addClanRankFlagCommand(command, params, client) {
let flagValue = getClanFlagValue(getParam(params, " ", 2));
addBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
getClanRankData(clanId, rankId).flags = addBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
getClanRankData(clanId, rankId).needsSaved = true;
messagePlayerSuccess(client, `You added the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag to rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
}
@@ -755,7 +764,8 @@ function removeClanRankFlagCommand(command, params, client) {
let flagValue = getClanFlagValue(getParam(params, " ", 2));
removeBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
getClanRankData(clanId, rankId).flags = removeBitFlag(getClanRankData(clanId, rankId).flags, flagValue);
getClanRankData(clanId, rankId).needsSaved = true;
messagePlayerSuccess(client, `You removed the {ALTCOLOUR}${getParam(params, " ", 2)} {MAINCOLOUR}clan flag from rank {ALTCOLOUR}${getClanRankData(clanId, rankId).name}`);
}
@@ -799,8 +809,7 @@ function showClanRankFlagsCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(flagList, 6);
messagePlayerInfo(client, `{clanOrange}== {jobYellow}Clan Rank Flags (${getClanRankData(clanId, rankId).name}){clanOrange}===================`);
makeChatBoxSectionHeader(client, getLocaleString(client, "ClanRankFlags"), getClanRankData(clanId, rankId).name);
for(let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join("{MAINCOLOUR}, "));
}
@@ -881,6 +890,7 @@ function setClanRankTitleCommand(command, params, client) {
let oldRankName = getClanRankData(clanId, rankId).name;
getClanRankData(clanId, rankId).name = getParam(params, " ", 2);
getClanRankData(clanId, rankId).needsSaved = true;
messagePlayerSuccess(client, `You changed the name of rank ${rankId} from {ALTCOLOUR}${oldRankName} {MAINCOLOUR}to {ALTCOLOUR}${params}`);
}
@@ -966,12 +976,12 @@ function createClan(name) {
// ===========================================================================
function deleteClan(clanId) {
saveClansToDatabase();
function deleteClan(clanId, whoDeleted = 0) {
//saveAllClansToDatabase();
let dbConnection = connectToDatabase();
if(dbConnection) {
let dbQuery = queryDatabase(dbConnection, `UPDATE clan_main SET clan_deleted = 1 WHERE clan_id = ${clanId}`);
let dbQuery = queryDatabase(dbConnection, `UPDATE clan_main SET clan_deleted = 1, clan_when_deleted = UNIX_TIMESTAMP, clan_who_deleted = ${whoDeleted} WHERE clan_id = ${clanId}`);
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
@@ -1024,12 +1034,20 @@ function doesClanIdExist(clanId) {
// ===========================================================================
function reloadAllClans() {
if(getServerConfig().devServer) {
return false;
}
getServerData().clans = loadClansFromDatabase();
}
// ===========================================================================
function saveAllClanRanksToDatabase(clanId) {
function saveClanRanksToDatabase(clanId) {
if(getServerConfig().devServer) {
return false;
}
let ranks = getServerData().clans[clanId].ranks;
for(let i in ranks) {
saveClanRankToDatabase(clanId, i);
@@ -1045,6 +1063,10 @@ function saveClanToDatabase(clanId) {
return false;
}
if(tempClanData.databaseId == -1) {
return false;
}
if(!tempClanData.needsSaved) {
return false;
}
@@ -1079,7 +1101,7 @@ function saveClanToDatabase(clanId) {
disconnectFromDatabase(dbConnection);
}
saveAllClanRanksToDatabase(clanId);
saveClanRanksToDatabase(clanId);
return true;
}
@@ -1169,6 +1191,10 @@ function setClanRankTitle(clanId, rankId, title) {
// ===========================================================================
function saveAllClansToDatabase() {
if(getServerConfig().devServer) {
return false;
}
for(let i in getServerData().clans) {
saveClanToDatabase(i);
}
@@ -1231,6 +1257,11 @@ function getClanRankIdFromDatabaseId(clanId, databaseId) {
// ===========================================================================
/**
* @param {number} clanId - The data index of the clan
* @param {number} clanRankId - The data index of the clan rank
* @return {ClanRankData} The clan rank's data (class instance)
*/
function getClanRankData(clanId, rankId) {
return getServerData().clans[clanId].ranks[rankId];
}
@@ -1310,6 +1341,12 @@ let rankId = getClanRankFromParams(clanId, getParam(params, " ", 1));
}
*/
// ===========================================================================
/**
* @param {String} params - The params to search for
* @return {Number} The data index of a matching clan
*/
function getClanFromParams(params) {
if(isNaN(params)) {
for(let i in getServerData().clans) {
@@ -1328,6 +1365,11 @@ function getClanFromParams(params) {
// ===========================================================================
/**
* @param {Number} clanId - The clan ID to search ranks for
* @param {String} params - The params to search for
* @return {Number} The data index of a matching clan
*/
function getClanRankFromParams(clanId, params) {
if(isNaN(params)) {
for(let i in getClanData(clanId).ranks) {

View File

@@ -181,6 +181,9 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("vrr.itemActionDelayComplete", playerItemActionDelayComplete);
addNetworkEventHandler("vrr.weaponDamage", playerDamagedByPlayer);
// Locale
addNetworkEventHandler("vrr.localeSelect", playerSelectedNewLocale);
// Misc
addNetworkEventHandler("vrr.plr.pos", updatePositionInPlayerData);
addNetworkEventHandler("vrr.plr.rot", updateHeadingInPlayerData);
@@ -188,6 +191,7 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("vrr.clientInfo", updateConnectionLogOnClientInfoReceive);
addNetworkEventHandler("vrr.vehBuyState", receiveVehiclePurchaseStateUpdateFromClient);
addNetworkEventHandler("vrr.playerPedId", receivePlayerPedNetworkId);
addNetworkEventHandler("vrr.playerCop", setPlayerAsCopState);
}
// ===========================================================================
@@ -211,15 +215,15 @@ function updateAllPlayerNameTags() {
function updatePlayerPing(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`);
sendNetworkEventToPlayer("vrr.ping", null, getPlayerName(client), client.ping);
sendNetworkEventToPlayer("vrr.ping", null, getPlayerName(client), getPlayerPing(client));
}
// ===========================================================================
function playerClientReady(client) {
setEntityData(client, "vrr.isReady", true, false);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s client resources are downloaded and ready!`);
if(client.getData("vrr.isStarted") == true) {
playerResourceReady[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are downloaded and ready! Started: ${getYesNoFromBool(playerResourceStarted[client.index])}`);
if (playerResourceStarted[client.index] == true) {
initClient(client);
}
}
@@ -227,16 +231,16 @@ function playerClientReady(client) {
// ===========================================================================
function playerGUIReady(client) {
setEntityData(client, "vrr.guiReady", true, false);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s client GUI is initialized and ready!`);
playerGUI[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client GUI is initialized and ready!`);
}
// ===========================================================================
function playerClientStarted(client) {
setEntityData(client, "vrr.isStarted", true, false);
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s client resources are started and running!`);
if(client.getData("vrr.isReady") == true) {
playerResourceStarted[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are started and running! Ready: ${getYesNoFromBool(playerResourceReady[client.index])}`);
if (playerResourceReady[client.index] == true) {
initClient(client);
}
}
@@ -244,15 +248,16 @@ function playerClientStarted(client) {
// ===========================================================================
function playerClientStopped(client) {
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s client resources have stopped (possibly error?). Kicking them from the server ...`);
client.disconnect();
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources have stopped (possibly error?). Kicking them from the server ...`);
getPlayerData(targetClient).customDisconnectReason = `Kicked - Client script verification failed. Possible hacks.`;
disconnectPlayer(client);
}
// ===========================================================================
function showGameMessage(client, text, colour, duration) {
function showGameMessage(client, text, colour, duration, fontName = "Pricedown") {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`);
sendNetworkEventToPlayer("vrr.smallGameMessage", client, text, colour, duration);
sendNetworkEventToPlayer("vrr.smallGameMessage", client, text, colour, duration, fontName);
}
// ===========================================================================
@@ -323,13 +328,13 @@ function setPlayer2DRendering(client, hudState = false, labelState = false, smal
function syncPlayerProperties(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to sync ${getPlayerDisplayForConsole(client)}'s player ped properties`);
sendNetworkEventToPlayer("vrr.player.sync", null, client.player);
sendNetworkEventToPlayer("vrr.syncElement", null, getPlayerPed(client).id);
}
// ===========================================================================
function updatePlayerSnowState(client) {
if(isSnowSupported(getServerGame())) {
if (isSnowSupported(getGame())) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`);
sendNetworkEventToPlayer("vrr.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow);
}
@@ -382,13 +387,6 @@ function sendJobRouteLocationToPlayer(client, position, colour) {
// ===========================================================================
function showPlayerChangePasswordGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.changePassword", client);
}
// ===========================================================================
function showPlayerLoginSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.loginSuccess", client);
@@ -454,18 +452,25 @@ function showPlayerNewCharacterGUI(client) {
function showPlayerChangePasswordGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showChangePassword", client);
sendNetworkEventToPlayer("vrr.showChangePassword", client, errorMessage);
}
// ===========================================================================
function showPlayerResetPasswordCodeInputGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password code input GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showResetPasswordCodeInput", client);
}
// ===========================================================================
function showPlayerResetPasswordEmailInputGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password email input GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showResetPasswordEmailInput", client);
}
// ===========================================================================
function showPlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("vrr.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
@@ -494,8 +499,8 @@ function showPlayerCharacterSelectFailedGUI(client) {
// ===========================================================================
function showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText, noButtonText) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage})`);
function showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText = "Yes", noButtonText = "No") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage}, YesButton: ${yesButtonText}, NoButton: ${noButtonText})`);
sendNetworkEventToPlayer("vrr.showPrompt", client, promptMessage, promptTitle, yesButtonText, noButtonText);
}
@@ -510,14 +515,14 @@ function showPlayerInfoGUI(client, infoMessage, infoTitle, buttonText = "OK") {
function showPlayerErrorGUI(client, errorMessage, errorTitle, buttonText = "OK") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`);
sendNetworkEventToPlayer("vrr.showInfo", client, errorMessage, errorTitle, buttonText);
sendNetworkEventToPlayer("vrr.showError", client, errorMessage, errorTitle, buttonText);
}
// ===========================================================================
function sendRunCodeToClient(client, code, returnTo) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`);
sendNetworkEventToPlayer("vrr.runCode", client, code, returnTo);
sendNetworkEventToPlayer("vrr.runCode", client, code, getPlayerId(returnTo));
}
// ===========================================================================
@@ -613,9 +618,9 @@ function sendPlayerFrozenState(client, state) {
// ===========================================================================
function clearPlayerWeapons(client) {
function clearPlayerWeapons(client, clearData = true) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`);
sendNetworkEventToPlayer("vrr.clearWeapons", client);
sendNetworkEventToPlayer("vrr.clearWeapons", client, clearData);
}
// ===========================================================================
@@ -634,9 +639,9 @@ function sendPlayerRemoveFromVehicle(client) {
// ===========================================================================
function sendChatBoxMessageToPlayer(client, message, colour) {
sendNetworkEventToPlayer("vrr.m", client, message, colour)
//messageClient(message, client, colour);
function sendChatBoxMessageToPlayer(client, messageText, colour) {
//messageClient(messageText, client, colour);
sendNetworkEventToPlayer("m", client, messageText, colour);
}
// ===========================================================================
@@ -842,17 +847,17 @@ function updateHeadingInVehicleData(client, vehicle, heading) {
// ===========================================================================
function forcePlayerIntoSkinSelect(client) {
if(getGameConfig().skinChangePosition[getServerGame()].length > 0) {
if (typeof getGameConfig().skinChangePosition[getGame()] != "undefined") {
getPlayerData(client).returnToPosition = getPlayerPosition(client);
getPlayerData(client).returnToHeading = getPlayerHeading(client);
getPlayerData(client).returnToInterior = getPlayerInterior(client);
getPlayerData(client).returnToDimension = getPlayerDimension(client);
getPlayerData(client).returnToType = VRR_RETURNTO_TYPE_SKINSELECT;
setPlayerPosition(client, getGameConfig().skinChangePosition[getServerGame()][0]);
setPlayerHeading(client, getGameConfig().skinChangePosition[getServerGame()][1]);
setPlayerInterior(client, getGameConfig().skinChangePosition[getServerGame()][2]);
setPlayerDimension(client, client.index+500);
setPlayerPosition(client, getGameConfig().skinChangePosition[getGame()][0]);
setPlayerHeading(client, getGameConfig().skinChangePosition[getGame()][1]);
setPlayerInterior(client, getGameConfig().skinChangePosition[getGame()][2]);
setPlayerDimension(client, getPlayerId(client) + 500);
}
sendNetworkEventToPlayer("vrr.skinSelect", client, true);
@@ -867,14 +872,14 @@ function updatePlayerCash(client) {
// ===========================================================================
function sendAllPoliceStationBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].policeStation != -1) {
if (getGameConfig().blipSprites[getGame()].policeStation != -1) {
let tempBlips = [];
for(let i in getServerData().policeStations[getServerGame()]) {
for (let i in getServerData().policeStations[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].policeStation,
getServerData().policeStations[getServerGame()][i].position.x,
getServerData().policeStations[getServerGame()][i].position.y,
getServerData().policeStations[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].policeStation,
getServerData().policeStations[getGame()][i].position.x,
getServerData().policeStations[getGame()][i].position.y,
getServerData().policeStations[getGame()][i].position.z,
3,
getColourByName("policeBlue"),
]);
@@ -886,14 +891,14 @@ function sendAllPoliceStationBlips(client) {
// ===========================================================================
function sendAllFireStationBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].fireStation != -1) {
if (getGameConfig().blipSprites[getGame()].fireStation != -1) {
let tempBlips = [];
for(let i in getServerData().fireStations[getServerGame()]) {
for (let i in getServerData().fireStations[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].fireStation,
getServerData().fireStations[getServerGame()][i].position.x,
getServerData().fireStations[getServerGame()][i].position.y,
getServerData().fireStations[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].fireStation,
getServerData().fireStations[getGame()][i].position.x,
getServerData().fireStations[getGame()][i].position.y,
getServerData().fireStations[getGame()][i].position.z,
3,
getColourByName("firefighterRed"),
]);
@@ -905,14 +910,14 @@ function sendAllFireStationBlips(client) {
// ===========================================================================
function sendAllHospitalBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].hospital != -1) {
if (getGameConfig().blipSprites[getGame()].hospital != -1) {
let tempBlips = [];
for(let i in getServerData().hospitals[getServerGame()]) {
for (let i in getServerData().hospitals[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].hospital,
getServerData().hospitals[getServerGame()][i].position.x,
getServerData().hospitals[getServerGame()][i].position.y,
getServerData().hospitals[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].hospital,
getServerData().hospitals[getGame()][i].position.x,
getServerData().hospitals[getGame()][i].position.y,
getServerData().hospitals[getGame()][i].position.z,
3,
getColourByName("medicPink"),
]);
@@ -924,14 +929,14 @@ function sendAllHospitalBlips(client) {
// ===========================================================================
function sendAllAmmunationBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].ammunation != -1) {
if (getGameConfig().blipSprites[getGame()].ammunation != -1) {
let tempBlips = [];
for(let i in getServerData().ammunations[getServerGame()]) {
for (let i in getServerData().ammunations[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].ammunation,
getServerData().ammunations[getServerGame()][i].position.x,
getServerData().ammunations[getServerGame()][i].position.y,
getServerData().ammunations[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].ammunation,
getServerData().ammunations[getGame()][i].position.x,
getServerData().ammunations[getGame()][i].position.y,
getServerData().ammunations[getGame()][i].position.z,
3,
0
]);
@@ -943,14 +948,14 @@ function sendAllAmmunationBlips(client) {
// ===========================================================================
function sendAllPayAndSprayBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].payAndSpray != -1) {
if (getGameConfig().blipSprites[getGame()].payAndSpray != -1) {
let tempBlips = [];
for(let i in getServerData().payAndSprays[getServerGame()]) {
for (let i in getServerData().payAndSprays[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].payAndSpray,
getServerData().payAndSprays[getServerGame()][i].position.x,
getServerData().payAndSprays[getServerGame()][i].position.y,
getServerData().payAndSprays[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].payAndSpray,
getServerData().payAndSprays[getGame()][i].position.x,
getServerData().payAndSprays[getGame()][i].position.y,
getServerData().payAndSprays[getGame()][i].position.z,
3,
0
]);
@@ -962,14 +967,14 @@ function sendAllPayAndSprayBlips(client) {
// ===========================================================================
function sendAllFuelStationBlips(client) {
if(getGameConfig().blipSprites[getServerGame()].fuelStation != -1) {
if (getGameConfig().blipSprites[getGame()].fuelStation != -1) {
let tempBlips = [];
for(let i in getServerData().fuelStations[getServerGame()]) {
for (let i in getServerData().fuelStations[getGame()]) {
tempBlips.push([
getGameConfig().blipSprites[getServerGame()].fuelStation,
getServerData().fuelStations[getServerGame()][i].position.x,
getServerData().fuelStations[getServerGame()][i].position.y,
getServerData().fuelStations[getServerGame()][i].position.z,
getGameConfig().blipSprites[getGame()].fuelStation,
getServerData().fuelStations[getGame()][i].position.x,
getServerData().fuelStations[getGame()][i].position.y,
getServerData().fuelStations[getGame()][i].position.z,
3,
getColourByName("burntOrange"),
]);
@@ -981,10 +986,9 @@ function sendAllFuelStationBlips(client) {
// ===========================================================================
function sendPlayerSetHealth(client, health) {
sendNetworkEventToPlayer("vrr.health", client, health);
sendNetworkEventToPlayer("vrr.health", client, toInteger(health));
}
// ===========================================================================
function sendPlayerSetArmour(client, armour) {
@@ -1012,7 +1016,7 @@ function playerFinishedSkinSelection(client, allowedSkinIndex) {
}
return false;
} else {
getPlayerCurrentSubAccount(client).skin = getSkinIndexFromModel(allowedSkins[allowedSkinIndex][0]);
getPlayerCurrentSubAccount(client).skin = getSkinIndexFromModel(getServerData().allowedSkins[allowedSkinIndex][0]);
if (isPlayerWorking(client)) {
messagePlayerAlert(client, "Your new skin has been saved but won't be shown until you stop working.");
setPlayerSkin(client, getJobData(getPlayerCurrentSubAccount(client).job).uniforms[getPlayerData(client).jobUniform].skinId);
@@ -1039,7 +1043,7 @@ function playerFinishedSkinSelection(client, allowedSkinIndex) {
switchPlayerActiveHotBarSlot(client, -1);
cachePlayerHotBarItems(client);
meActionToNearbyPlayers(client, `changes their skin to ${allowedSkins[allowedSkinIndex][1]}`);
meActionToNearbyPlayers(client, `changes their skin to ${getServerData().allowedSkins[allowedSkinIndex][1]}`);
}
}
@@ -1051,6 +1055,12 @@ function sendPlayerChatScrollLines(client, amount) {
// ===========================================================================
function sendPlayerChatAutoHideDelay(client, delay) {
sendNetworkEventToPlayer("vrr.chatAutoHideDelay", client, delay);
}
// ===========================================================================
function playRadioStreamForPlayer(client, streamURL, loop = true, volume = 0, element = false) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`);
sendNetworkEventToPlayer("vrr.radioStream", client, streamURL, loop, volume, element);
@@ -1094,50 +1104,22 @@ function sendPlayerEnterPropertyKey(client, key) {
// ===========================================================================
function makePedPlayAnimation(ped, animationSlot, positionOffset) {
let animationData = getAnimationData(animationSlot);
let freezePlayer = false;
//if(animationData[9] != VRR_ANIMMOVE_NONE) {
switch(animationData[9]) {
case VRR_ANIMMOVE_FORWARD:
setElementCollisionsEnabled(ped, false);
setElementPosition(ped, getPosInFrontOfPos(getElementPosition(ped), fixAngle(getElementHeading(ped)), positionOffset));
freezePlayer = true;
break;
case VRR_ANIMMOVE_BACK:
setElementCollisionsEnabled(ped, false);
setElementPosition(ped, getPosBehindPos(getElementPosition(ped), fixAngle(getElementHeading(ped)), positionOffset));
freezePlayer = true;
break;
case VRR_ANIMMOVE_LEFT:
setElementCollisionsEnabled(ped, false);
setElementPosition(ped, getPosToLeftOfPos(getElementPosition(ped), fixAngle(getElementHeading(ped)), positionOffset));
freezePlayer = true;
break;
case VRR_ANIMMOVE_RIGHT:
setElementCollisionsEnabled(ped, false);
setElementPosition(ped, getPosToRightOfPos(getElementPosition(ped), fixAngle(getElementHeading(ped)), positionOffset));
freezePlayer = true;
break;
}
//}
sendNetworkEventToPlayer("vrr.pedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4], animationData[5], positionOffset, freezePlayer);
setEntityData(ped, "vrr.anim", animationSlot, true);
sendNetworkEventToPlayer("vrr.anim", null, getPedForNetworkEvent(ped), animationSlot, positionOffset);
}
// ===========================================================================
function makePedStopAnimation(pedId) {
sendNetworkEventToPlayer("vrr.pedStopAnim", null, pedId);
function makePedStopAnimation(ped) {
removeEntityData(ped, "vrr.anim");
sendNetworkEventToPlayer("vrr.stopAnim", null, getPedForNetworkEvent(ped));
}
// ===========================================================================
function forcePedAnimation(ped, animationSlot) {
let animationData = getAnimationData(animationSlot);
sendNetworkEventToPlayer("vrr.forcePedAnim", null, ped.id, animationData[1], animationData[2], animationData[3], animationData[4]);
function forcePedAnimation(ped, animationSlot, positionOffset = 0) {
addEntityData(ped, "vrr.anim", animationSlot, true);
sendNetworkEventToPlayer("vrr.forceAnim", null, getPedForNetworkEvent(ped), animationSlot, positionOffset);
}
// ===========================================================================
@@ -1175,13 +1157,6 @@ function sendPlayerPedPartsAndProps(client) {
// ===========================================================================
function forcePlayerWantedLevel(client, wantedLevel) {
sendNetworkEventToPlayer("vrr.wantedLevel", client, wantedLevel);
return true;
}
// ===========================================================================
function onPlayerNearPickup(client, pickupId) {
getPlayerData(client).currentPickup = getElementFromId(pickupId);
}
@@ -1210,7 +1185,7 @@ function setPlayerBuyingVehicleState(client, state, vehicleId, position) {
function receiveVehiclePurchaseStateUpdateFromClient(client, state) {
if (getGlobalConfig().useServerSideVehiclePurchaseCheck == false) {
checkVehicleBuying(client);
checkVehiclePurchasing(client);
}
}
@@ -1234,8 +1209,20 @@ function sendBusinessToPlayer(client, businessId, name, entrancePosition, blipMo
// ==========================================================================
function sendHouseToPlayer(client, houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
sendNetworkEventToPlayer("vrr.house", client, houseId, entrancePosition, blipModel, pickupModel, hasInterior);
function sendHouseToPlayer(client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) {
sendNetworkEventToPlayer("vrr.house", client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior);
}
// ==========================================================================
function sendJobToPlayer(client, jobId, jobLocationId, name, position) {
sendNetworkEventToPlayer("vrr.job", client, jobId, jobLocationId, name, position);
}
// ==========================================================================
function sendVehicleToPlayer(client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4) {
sendNetworkEventToPlayer("vrr.vehicle", client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4);
}
// ==========================================================================
@@ -1258,6 +1245,26 @@ function sendAllHousesToPlayer(client) {
// ==========================================================================
function sendAllJobsToPlayer(client) {
let jobs = getServerData().jobs;
for (let i in jobs) {
for (let j in jobs[i].locations) {
sendJobToPlayer(client, jobs[i].index, jobs[i].locations[j].index, jobs[i].name, jobs[i].locations[j].position, jobs[i].blipModel);
}
}
}
// ==========================================================================
function sendAllVehiclesToPlayer(client) {
let vehicles = getServerData().vehicles;
for (let i in vehicles) {
sendVehicleToPlayer(client, vehicles[i].index, vehicles[i].model, vehicles[i].syncPosition, vehicles[i].syncHeading, vehicles[i].colour1, vehicles[i].colour2, vehicles[i].colour3, vehicles[i].colour4);
}
}
// ==========================================================================
function makePlayerHoldObjectModel(client, modelIndex) {
sendNetworkEventToPlayer("vrr.holdObject", client, getPlayerData(client).ped, modelIndex);
}
@@ -1275,3 +1282,68 @@ function requestPlayerPedNetworkId(client) {
}
// ==========================================================================
function setPlayerInCutsceneInterior(client, cutsceneName) {
getPlayerData(client).interiorCutscene = cutsceneName;
sendNetworkEventToPlayer("vrr.cutsceneInterior", client, cutsceneName);
}
// ==========================================================================
function makePlayerPedSpeak(client, pedSpeechName) {
sendNetworkEventToPlayer("vrr.pedSpeak", client, pedSpeechName);
}
// ==========================================================================
function setPlayerAsCopState(client, state) {
sendNetworkEventToPlayer("vrr.playerCop", client, state);
}
// ==========================================================================
function tellPlayerToSpawn(client, skinId, position) {
sendNetworkEventToPlayer("vrr.spawn", client, skinId, position);
}
// ==========================================================================
function sendNameTagDistanceToClient(client, distance) {
sendNetworkEventToPlayer("vrr.nameTagDistance", client, distance);
}
// ==========================================================================
function sendGPSBlipToPlayer(client, position, colour) {
sendNetworkEventToPlayer("vrr.showGPSBlip", client, position, colour);
}
// ==========================================================================
function playerSelectedNewLocale(client, localeId) {
getPlayerData(client).locale = localeId;
sendPlayerLocaleId(client, localeId);
}
// ==========================================================================
function sendPlayerLocaleId(client, localeId) {
sendNetworkEventToPlayer("vrr.locale", client, localeId);
}
// ==========================================================================
function showLocaleChooserForPlayer(client) {
sendNetworkEventToPlayer("vrr.localeChooser", client);
}
// ==========================================================================
function sendPlayerLocaleStrings(client) {
let strings = getGlobalConfig().locale.sendStringsToClient;
for (let i in strings) {
sendNetworkEventToPlayer("vrr.localeString", client, strings[i], getLocaleString(client, strings[i]));
}
}
// ==========================================================================

File diff suppressed because it is too large Load Diff

View File

@@ -127,13 +127,18 @@
};
let serverConfig = false;
let databaseConfig = false;
let emailConfig = false;
let gameConfig = false;
// ===========================================================================
let globalConfig = {
keyBind: [],
economy: {},
database: {},
locale: {},
accents: {},
discord: {},
email: {},
accountPasswordHash: "SHA512",
npcFarProximity: 100,
npcMediumProximity: 40,
@@ -150,7 +155,6 @@ let globalConfig = {
stopWorkingDistance: 10,
spawnCarDistance: 5,
payAndSprayDistance: 5,
keyBind: [],
exitPropertyDistance: 3.0,
enterPropertyDistance: 3.0,
businessDimensionStart: 5000,
@@ -186,64 +190,107 @@ let globalConfig = {
],
vehicleInactiveRespawnDelay: 1800000, // 20 minutes
chatSectionHeaderLength: 96,
economy: {},
locales: [],
accents: [],
useServerSideVehiclePurchaseCheck: false,
useServerSideVehiclePurchaseCheck: true,
useServerSideVehicleBurnCheck: false,
businessPickupStreamInDistance: 100,
businessPickupStreamOutDistance: 120,
housePickupStreamInDistance: 100,
housePickupStreamOutDistance: 120,
jobPickupStreamInDistance: 100,
jobPickupStreamOutDistance: 120,
businessBlipStreamInDistance: 150,
businessBlipStreamOutDistance: 200,
houseBlipStreamInDistance: 100,
houseBlipStreamOutDistance: 120,
jobBlipStreamInDistance: -1,
jobBlipStreamOutDistance: -1,
playerBlipStreamInDistance: -1,
playerBlipStreamOutDistance: -1,
handcuffPlayerDistance: 3,
firstAidKitPlayerDistance: 3,
droppedItemPickupRange: 2,
passwordRequiredCapitals: 0,
passwordRequiredNumbers: 0,
passwordRequiredSymbols: 0,
minChatLines: 1,
maxChatLines: 6,
};
// ===========================================================================
function initConfigScript() {
logToConsole(LOG_INFO, "[VRR.Config]: Initializing config script ...");
logToConsole(LOG_DEBUG, "[VRR.Config]: Loading global config ...");
loadGlobalConfig();
logToConsole(LOG_INFO, "[VRR.Config]: Loading server config ...");
serverConfig = loadServerConfigFromGameAndPort(server.game, server.port, getMultiplayerMod());
logToConsole(LOG_INFO, "[VRR.Config]: Applying server config ...");
getServerConfig().fallingSnow = intToBool(toInteger(server.getCVar("vrr_fallingsnow")));
getServerConfig().groundSnow = intToBool(toInteger(server.getCVar("vrr_groundsnow")));
getServerConfig().useGUI = intToBool(toInteger(server.getCVar("vrr_gui")));
getServerConfig().showLogo = false;
getServerConfig().testerOnly = intToBool(toInteger(server.getCVar("vrr_testeronly")));
getServerConfig().discordEnabled = false;
getServerConfig().createJobPickups = intToBool(toInteger(server.getCVar("vrr_jobpickups")));
getServerConfig().createBusinessPickups = intToBool(toInteger(server.getCVar("vrr_businesspickups")));
getServerConfig().createHousePickups = intToBool(toInteger(server.getCVar("vrr_housepickups")));
getServerConfig().createJobBlips = intToBool(toInteger(server.getCVar("vrr_jobblips")));
getServerConfig().createBusinessBlips = intToBool(toInteger(server.getCVar("vrr_businessblips")));
getServerConfig().createHouseBlips = intToBool(toInteger(server.getCVar("vrr_houseblips")));
getServerConfig().useRealTime = intToBool(toInteger(server.getCVar("vrr_realtime")));
getServerConfig().antiCheat.enabled = intToBool(toInteger(server.getCVar("vrr_anticheat")));
applyConfigToServer(serverConfig);
logToConsole(LOG_DEBUG, "[VRR.Config]: Server config applied successfully!");
logToConsole(LOG_INFO, "[VRR.Config]: Config script initialized!");
}
// ===========================================================================
function loadGlobalConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading global configuration ...");
try {
getGlobalConfig().database = loadDatabaseConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load global configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().economy = loadEconomyConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load economy configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().locale = loadLocaleConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load locale configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().accents = loadAccentConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load accent configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().discord = loadDiscordConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load discord configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().keyBind = loadKeyBindConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load keybind configuration. Error: ${error}`);
thisResource.stop();
}
try {
getGlobalConfig().email = loadEmailConfig();
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load email configuration. Error: ${error}`);
thisResource.stop();
}
logToConsole(LOG_DEBUG, "[VRR.Config] Loaded global configuration successfully!");
}
// ===========================================================================
function loadServerConfigFromGameAndPort(gameId, port, mpMod) {
function loadServerConfigFromGameAndPort(gameId, port) {
let dbConnection = connectToDatabase();
if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} AND svr_port = ${port} AND svr_mpmod = ${mpMod} LIMIT 1;`;
let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} AND svr_port = ${port} LIMIT 1;`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
if (dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerData(dbAssoc);
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
@@ -263,7 +310,7 @@ function loadServerConfigFromId(tempServerId) {
if (dbQuery) {
if (dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerData(dbAssoc);
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
@@ -276,6 +323,9 @@ function loadServerConfigFromId(tempServerId) {
// ===========================================================================
function applyConfigToServer(tempServerConfig) {
logToConsole(LOG_INFO, "[VRR.Config]: Applying server config ...");
logToConsole(LOG_DEBUG, "[VRR.Config]: Server config applied successfully!");
if (isTimeSupported()) {
logToConsole(LOG_DEBUG, `[VRR.Config]: Setting time to to ${tempServerConfig.hour}:${tempServerConfig.minute} with minute duration of ${tempServerConfig.minuteDuration}`);
setGameTime(tempServerConfig.hour, tempServerConfig.minute, tempServerConfig.minuteDuration);
@@ -297,7 +347,7 @@ function saveServerConfigToDatabase() {
let dbConnection = connectToDatabase();
if (dbConnection) {
let data = [
["svr_settings", toInteger(getServerConfig().settings)],
//["svr_settings", toInteger(getServerConfig().settings)],
["svr_start_time_hour", getServerConfig().hour],
["svr_start_time_min", getServerConfig().minute],
["svr_start_weather", getServerConfig().weather],
@@ -333,6 +383,17 @@ function saveServerConfigToDatabase() {
["svr_charselect_vw", getServerConfig().characterSelectDimension],
["svr_inflation_multiplier", getServerConfig().inflationMultiplier],
["svr_intro_music", getServerConfig().introMusicURL],
["svr_gui", getServerConfig().useGUI],
["svr_logo", getServerConfig().showLogo],
["svr_snow_falling", getServerConfig().fallingSnow],
["svr_snow_ground", getServerConfig().groundSnow],
["svr_biz_blips", getServerConfig().createBusinessBlips],
["svr_biz_pickups", getServerConfig().createBusinessPickups],
["svr_house_blips", getServerConfig().createHouseBlips],
["svr_house_pickups", getServerConfig().createHousePickups],
["svr_job_blips", getServerConfig().createJobBlips],
["svr_job_pickups", getServerConfig().createJobPickups],
["svr_nametag_distance", getServerConfig().nameTagDistance],
];
let dbQuery = null;
@@ -352,7 +413,7 @@ function saveServerConfigToDatabase() {
/**
*
* @return {ServerData} - Server configuration data
* @return {ServerConfigData} - Server configuration data
*
*/
function getServerConfig() {
@@ -419,7 +480,7 @@ function setTimeCommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} set the time to ${makeReadableTime(hour, minute)}`);
announceAdminAction("ServerTimeSet", getPlayerName(client), makeReadableTime(hour, minute));
return true;
}
@@ -447,7 +508,7 @@ function setMinuteDurationCommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} set the minute duration to ${minuteDuration}ms`);
announceAdminAction("ServerMinuteDurationSet", getPlayerName(client), makeReadableTime(hour, minute));
return true;
}
@@ -480,7 +541,7 @@ function setWeatherCommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} set the weather to {ALTCOLOUR}${getGameConfig().weatherNames[getServerGame()][toInteger(weatherId)]}`);
announceAdminAction("ServerWeatherSet", getPlayerName(client), getGameConfig().weatherNames[getGame()][toInteger(weatherId)]);
updateServerRules();
return true;
}
@@ -513,7 +574,7 @@ function setSnowingCommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned falling snow ${getBoolRedGreenInlineColour(falling)}${getOnOffFromBool(falling)} {MAINCOLOUR}and ground snow ${getBoolRedGreenInlineColour(ground)}${getOnOffFromBool(ground)}`);
announceAdminAction("ServerSnowSet", getPlayerName(client), `${getBoolRedGreenInlineColour(falling)}${getOnOffFromBool(falling)}`, `${getBoolRedGreenInlineColour(ground)}${getOnOffFromBool(ground)}`);
updateServerRules();
return true;
}
@@ -549,7 +610,7 @@ function setServerGUIColoursCommand(command, params, client) {
getServerConfig().needsSaved = true;
//messageAdminAction(`${getPlayerName(client)} ${getInlineChatColourByName("orange")}set the server ${getBoolRedGreenInlineColour(fallingSnow)}${getOnOffFromBool(fallingSnow)} ${getInlineChatColourByName("orange")}and ground snow ${getBoolRedGreenInlineColour(groundSnow)}${getOnOffFromBool(groundSnow)}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} has set the server GUI colours to ${colourRed}, ${colourGreen}, ${colourBlue}`);
//updateServerRules();
return true;
}
@@ -571,7 +632,7 @@ function toggleServerLogoCommand(command, params, client) {
updatePlayerShowLogoState(null, getServerConfig().useLogo);
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned the server logo image ${getBoolRedGreenInlineColour(doesServerHaveServerLogoEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().useLogo))}`);
announceAdminAction(`ServerLogoSet`, `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().useLogo)}${toUpperCase(getOnOffFromBool(getServerConfig().useLogo))}`);
updateServerRules();
return true;
}
@@ -591,7 +652,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createJobBlips = !getServerConfig().createJobBlips;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveJobBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createJobBlips))} {MAINCOLOUR}all job blips`);
announceAdminAction("ServerJobBlipsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createJobBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createJobBlips))}{MAINCOLOUR}`);
resetAllJobBlips();
return true;
}
@@ -611,7 +672,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createJobPickups = !getServerConfig().createJobPickups;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveJobPickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createJobPickups))} {MAINCOLOUR}all job pickups`);
announceAdminAction("ServerJobPickupsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createJobPickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createJobPickups))}{MAINCOLOUR}`);
resetAllJobPickups();
return true;
}
@@ -631,7 +692,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createBusinessBlips = !getServerConfig().createBusinessBlips;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveBusinessBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessBlips))} {MAINCOLOUR}all business blips`);
announceAdminAction("ServerBusinessBlipsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createBusinessBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessBlips))}{MAINCOLOUR}`);
resetAllBusinessBlips();
return true;
}
@@ -651,7 +712,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createBusinessPickups = !getServerConfig().createBusinessPickups;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveBusinessPickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessPickups))} {MAINCOLOUR}all business pickups`);
announceAdminAction("ServerBusinessPickupsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createBusinessPickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createBusinessPickups))}{MAINCOLOUR}`);
resetAllBusinessPickups();
return true;
}
@@ -671,7 +732,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createHouseBlips = !getServerConfig().createHouseBlips;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveHouseBlipsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createHouseBlips))} {MAINCOLOUR}all house blips`);
announceAdminAction("ServerHouseBlipsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createHouseBlips)}${toUpperCase(getOnOffFromBool(getServerConfig().createHouseBlips))}{MAINCOLOUR}`);
resetAllHouseBlips();
return true;
}
@@ -691,7 +752,7 @@ function toggleServerLogoCommand(command, params, client) {
getServerConfig().createHousePickups = !getServerConfig().createHousePickups;
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned ${getBoolRedGreenInlineColour(doesServerHaveHousePickupsEnabled())}${toUpperCase(getOnOffFromBool(getServerConfig().createHousePickups))} {MAINCOLOUR}all house pickups`);
announceAdminAction("ServerHousePickupsSet", `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().createHousePickups)}${toUpperCase(getOnOffFromBool(getServerConfig().createHousePickups))}{MAINCOLOUR}`);
resetAllHousePickups();
return true;
}
@@ -712,7 +773,7 @@ function toggleServerGUICommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned GUI ${toLowerCase(getOnOffFromBool(doesServerHaveGUIEnabled()))} for this server`);
announceAdminAction(`ServerGUISet`, `${getPlayerName(client)}{MAINCOLOUR}`, `${getBoolRedGreenInlineColour(getServerConfig().useGUI)}${toUpperCase(getOnOffFromBool(getServerConfig().useGUI))}{MAINCOLOUR}`);
updateServerRules();
return true;
}
@@ -733,9 +794,10 @@ function toggleServerUseRealWorldTimeCommand(command, params, client) {
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}turned real-world time ${getServerConfig().useRealTime} for this server (GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)})`);
//announceAdminAction(`${getPlayerName(client)}{MAINCOLOUR} turned real-world time ${getServerConfig().useRealTime} for this server (GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)})`);
updateServerGameTime();
updateServerRules();
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} turned real-world time ${getOnOffFromBool(getServerConfig().useRealTime)} for this server (GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)})`);
return true;
}
@@ -759,9 +821,11 @@ function setServerRealWorldTimeZoneCommand(command, params, client) {
getServerConfig().realTimeZone = toInteger(params);
getServerConfig().needsSaved = true;
messageAdminAction(`${getPlayerName(client)} {MAINCOLOUR}set the time zone for in-game's real-world time to GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)}`);
//announceAdminAction(`${getPlayerName(client)} {MAINCOLOUR}set the time zone for in-game's real-world time to GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)}`);
updateServerGameTime();
updateServerRules();
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set the timezone for in-game real-world time to GMT ${addPositiveNegativeSymbol(getServerConfig().realTimeZone)}`);
return true;
}
@@ -782,6 +846,7 @@ function reloadServerConfigurationCommand(command, params, client) {
updateServerRules();
messagePlayerSuccess(client, `You reloaded the server configuration!`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} reloaded the server config`);
return true;
}
@@ -797,8 +862,8 @@ function reloadServerConfigurationCommand(command, params, client) {
*
*/
function reloadEmailConfigurationCommand(command, params, client) {
emailConfig = loadEmailConfiguration();
messagePlayerSuccess(client, `You reloaded the email configuration!`);
getGlobalConfig().email = loadEmailConfig();
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} reloaded the email config`);
return true;
}
@@ -814,19 +879,43 @@ function reloadEmailConfigurationCommand(command, params, client) {
*
*/
function reloadDatabaseConfigurationCommand(command, params, client) {
if(databaseConfig.usePersistentConnection && isDatabaseConnected(persistentDatabaseConnection)) {
console.warn(`[VRR.Database] Closing persistent database connection`);
if (getDatabaseConfig().usePersistentConnection && isDatabaseConnected(persistentDatabaseConnection)) {
logToConsole(LOG_WARN, `[VRR.Database] Closing persistent database connection`);
persistentDatabaseConnection.close();
persistentDatabaseConnection = null;
}
databaseEnabled = false;
databaseConfig = loadEmailConfig();
messagePlayerSuccess(client, `You reloaded the database configuration!`);
getGlobalConfig().database = loadDatabaseConfig();
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} reloaded the database config`);
databaseEnabled = true;
if(databaseConfig.usePersistentConnection) {
if (getDatabaseConfig().usePersistentConnection) {
connectToDatabase();
}
return true;
}
// ===========================================================================
/**
* This is a command handler function.
*
* @param {string} command - The command name used by the player
* @param {string} params - The parameters/args string used with the command by the player
* @param {Client} client - The client/player that used the command
* @return {bool} Whether or not the command was successful
*
*/
function setServerNameTagDistanceCommand(command, params, client) {
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
getServerConfig().nameTagDistance = toFloat(params);
getServerConfig().needsSaved = true;
sendNameTagDistanceToClient(null, getServerConfig().nameTagDistance);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set the name tag distance to ${getServerConfig().nameTagDistance}`);
return true;
}
@@ -839,6 +928,7 @@ function getServerIntroMusicURL() {
// ===========================================================================
function loadLocaleConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading locale configuration");
let localeConfig = JSON.parse(loadTextFile(`config/locale.json`));
if (localeConfig != null) {
return localeConfig;
@@ -848,6 +938,7 @@ function loadLocaleConfig() {
// ===========================================================================
function loadEconomyConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading economy configuration");
let economyConfig = JSON.parse(loadTextFile(`config/economy.json`));
if (economyConfig != null) {
return economyConfig;
@@ -857,6 +948,7 @@ function loadEconomyConfig() {
// ===========================================================================
function loadAccentConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading accents configuration");
let accentConfig = JSON.parse(loadTextFile(`config/accents.json`));
if (accentConfig != null) {
return accentConfig;
@@ -865,6 +957,50 @@ function loadAccentConfig() {
// ===========================================================================
function loadDiscordConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading discord configuration");
let discordConfig = JSON.parse(loadTextFile(`config/discord.json`));
if (discordConfig != null) {
return discordConfig;
}
return false;
}
// ===========================================================================
function loadDatabaseConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading database configuration");
let databaseConfig = JSON.parse(loadTextFile("config/database.json"));
if (databaseConfig != null) {
return databaseConfig;
}
return false;
}
// ===========================================================================
function loadKeyBindConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading keybind configuration");
let keyBindConfig = JSON.parse(loadTextFile("config/keybind.json"));
if (keyBindConfig != null) {
return keyBindConfig;
}
return false;
}
// ===========================================================================
function loadEmailConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading email configuration");
let emailConfig = JSON.parse(loadTextFile("config/email.json"));
if (emailConfig != null) {
return emailConfig;
}
return false;
}
// ===========================================================================
function doesServerHaveGUIEnabled() {
return getServerConfig().useGUI;
}
@@ -901,7 +1037,7 @@ function doesServerHaveJobPickupsEnabled() {
// ===========================================================================
function doesServerHaveBusinesBlipsEnabled() {
function doesServerHaveBusinessBlipsEnabled() {
return getServerConfig().createBusinessBlips;
}
@@ -930,3 +1066,21 @@ function doesServerHaveGroundSnowEnabled() {
}
// ===========================================================================
function getDatabaseConfig() {
return getGlobalConfig().database;
}
// ===========================================================================
function loadServerConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading server configuration");
try {
serverConfig = loadServerConfigFromGameAndPort(getGame(), getServerPort());
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Could not load server configuration for game ${getGame()} and port ${getServerPort}`);
thisResource.stop();
}
}
// ===========================================================================

View File

@@ -7,52 +7,69 @@
// TYPE: Server (JavaScript)
// ===========================================================================
let scriptVersion = "1.0";
let scriptVersion = "1.1";
let serverStartTime = 0;
let logLevel = LOG_INFO;
let logLevel = LOG_INFO|LOG_DEBUG|LOG_VERBOSE; // LOG_ERROR|LOG_WARN;
let playerResourceReady = new Array(server.maxClients).fill(false);
let playerResourceStarted = new Array(server.maxClients).fill(false);
let playerInitialized = new Array(server.maxClients).fill(false);
let playerGUI = new Array(server.maxClients).fill(false);
// ===========================================================================
/**
* @typedef {Object} ServerData
* @property {Array.<VehicleData>} vehicles
* @property {Array.<ClientData>} clients
* @property {Array.<BusinessData>} businesses
* @property {Array.<HouseData>} houses
* @property {Array.<HouseData>} commands
* @property {Array.<ItemData>} items
* @property {Array.<ItemTypeData>} itemTypes
* @property {Array.<ClanData>} clans
* @property {Array} localeStrings
* @property {Array.<NPCData>} npcs
* @property {Array.<RaceData>} races
* @property {Array.<JobData>} jobs
* @property {Array.<Gates>} gates
* @property {Array} groundItemCache
* @property {Array} groundPlantCache
* @property {Array} purchasingVehicleCache
* @property {Array} rentingVehicleCache
*/
let serverData = {
vehicles: [],
clients: new Array(128),
businesses: [],
houses: [],
commands: {},
groundItemCache: [],
groundPlantCache: [],
items: [],
itemTypes: [],
clans: [],
antiCheat: {
//whiteListedGameScripts: [],
//blackListedGameScripts: [],
},
localeStrings: {},
cachedTranslations: [],
cachedTranslationFrom: [],
//triggers: [],
npcs: [],
races: [],
jobs: [],
gates: [],
groundItemCache: [],
groundPlantCache: [],
purchasingVehicleCache: [],
rentingVehicleCache: [],
};
// ===========================================================================
// Pre-cache allowed skins
let allowedSkins = getAllowedSkins(getGame());
// ===========================================================================
function initServerData() {
}
// ===========================================================================
/**
*
* @return {ServerData}
*
*/
function getServerData() {
return serverData;
}
// ===========================================================================
function getModNatives() {
return modNatives;
}
// ===========================================================================

View File

@@ -15,9 +15,60 @@ let persistentDatabaseConnection = null;
function initDatabaseScript() {
logToConsole(LOG_INFO, "[VRR.Database]: Initializing database script ...");
databaseConfig = loadDatabaseConfiguration();
logToConsole(LOG_INFO, "[VRR.Database]: Database script initialized successfully!");
}
// ===========================================================================
function createDatabaseInsertQuery(tableName, data) {
let fields = [];
let values = [];
for(let i in data) {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
fields.push(data[i][0]);
if(typeof data[i][1] == "string") {
if(data[i][1] == "{UNIXTIMESTAMP}") {
values.push("UNIX_TIMESTAMP()");
} else {
values.push(`'${data[i][1]}'`);
}
} else {
values.push(data[i][1]);
}
}
}
}
let queryString = `INSERT INTO ${tableName} (${fields.join(", ")}) VALUES (${values.join(", ")})`;
return queryString;
}
// ===========================================================================
function createDatabaseUpdateQuery(tableName, data, whereClause) {
let values = [];
for(let i in data) {
if(data[i][0] != "undefined" && data[i][0] != NaN && data[i][0] != 'NaN') {
if(data[i][1] != "undefined" && data[i][1] != NaN && data[i][1] != 'NaN') {
if(typeof data[i][1] == "string") {
if(data[i][1] == "{UNIXTIMESTAMP}") {
values.push(`${data[i][0]}=UNIX_TIMESTAMP()`);
} else {
values.push(`${data[i][0]}='${data[i][1]}'`);
}
} else {
values.push(`${data[i][0]}=${data[i][1]}`);
}
}
}
}
let queryString = `UPDATE ${tableName} SET ${values.join(", ")} WHERE ${whereClause}`;
return queryString;
}
// ===========================================================================

View File

@@ -152,7 +152,7 @@ function addLogLevelCommand(command, params, client) {
sendPlayerLogLevel(null, logLevel);
messageAdminAction(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}enabled log level {ALTCOLOUR}${toLowerCase(params)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}enabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
}
@@ -222,7 +222,7 @@ function removeLogLevelCommand(command, params, client) {
sendPlayerLogLevel(null, logLevel);
messageAdminAction(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}disabled log level {ALTCOLOUR}${toLowerCase(params)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}disabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
}
@@ -263,7 +263,7 @@ function simulateCommandForPlayerCommand(command, params, client) {
}
getCommand(toLowerCase(tempCommand)).handlerFunction(tempCommand, tempParams, targetClient);
messagePlayerSuccess(client, `The command string {ALTCOLOUR}/${tempCommand} ${tempParams}{MAINCOLOUR} has been simulated for {ALTCOLOUR}${targetgetPlayerName(client)}`);
messagePlayerSuccess(client, `The command string {ALTCOLOUR}/${tempCommand} ${tempParams}{MAINCOLOUR} has been simulated for {ALTCOLOUR}${getPlayerName(targetClient)}`);
return true;
}
@@ -324,8 +324,8 @@ function executeServerCodeCommand(command, params, client) {
messagePlayerSuccess(client, "Server code executed!");
messagePlayerNormal(client, `Code: ${params}`, COLOUR_YELLOW);
messagePlayerNormal(client, `Returns: ${returnValue}`, COLOUR_YELLOW);
console.log(returnValue);
messagePlayerNormal(client, `Returns: ${returnValue} (${typeof returnValue})`, COLOUR_YELLOW);
logToConsole(LOG_INFO, `Server code executed by ${getPlayerDisplayForConsole(client)}: ${params}`);
return true;
}
@@ -337,6 +337,7 @@ function executeClientCodeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(getParam(params, " ", 1));
let targetCode = splitParams.slice(1).join(" ");
@@ -350,10 +351,10 @@ function executeClientCodeCommand(command, params, client) {
return false;
}
sendRunCodeToClient(client, targetClient, targetCode, client.index);
sendRunCodeToClient(targetClient, targetCode, client);
messagePlayerSuccess(client, "Executing client code for " + toString(targetgetPlayerName(client)) + "!");
messagePlayerNormal(client, "Code: " + targetCode);
messagePlayerSuccess(client, `Executing client code for ${getPlayerName(targetClient)}`);
messagePlayerNormal(client, `Code: ${targetCode}`);
return true;
}
@@ -380,23 +381,87 @@ function setPlayerTesterStatusCommand(command, params, client) {
let enabled = hasBitFlag(getPlayerData(targetClient).accountData.flags.moderation, getModerationFlagValue("IsTester"));
messageAdminAction(`{ALTCOLOUR}${client.name} ${getBoolRedGreenInlineColour(enabled)}${toUpperCase(getEnabledDisabledFromBool(enabled))} {ALTCOLOUR}${targetClient.name}'s {MAINCOLOUR}tester status`)
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} ${getBoolRedGreenInlineColour(enabled)}${toUpperCase(getEnabledDisabledFromBool(enabled))} {ALTCOLOUR}${getPlayerName(targetClient)}'s {MAINCOLOUR}tester status`)
return true;
}
// ===========================================================================
function saveAllServerDataCommand(command, params, client) {
messageAdmins(`{clanOrange}Vortrex has forced a manual save of all data. Initiating ...`);
saveAllServerDataToDatabase();
messageAdmins(`{clanOrange}All server data saved to database successfully!`);
function testPromptGUICommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
showPlayerPromptGUI(targetClient, "Testing the two button prompt GUI", "Testing", getLocaleString(client, "Yes"), getLocaleString(client, "No"))
return true;
}
// ===========================================================================
function testInfoGUICommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
showPlayerInfoGUI(targetClient, "Testing the info dialog GUI", "Testing", "Ok");
return true;
}
// ===========================================================================
function testErrorGUICommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let targetClient = getPlayerFromParams(params);
if(!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
showPlayerErrorGUI(targetClient, "Testing the error dialog GUI", "Testing", "Ok");
return true;
}
// ===========================================================================
function saveServerDataCommand(command, params, client) {
messageAdmins(`{adminOrange}Vortrex{MAINCOLOUR} has forced a manual save of all data. Initiating ...`);
saveServerDataToDatabase();
messageAdmins(`{MAINCOLOUR}All server data saved to database successfully!`);
return true;
}
// ===========================================================================
function testEmailCommand(command, params, client) {
try {
messagePlayerAlert(client, `Sending test email to ${params}`);
sendEmail(params, "Player", "Test email", "Just testing the SMTP module for the server!");
} catch(error) {
messagePlayerError(client, "The email could not be sent! Error: ${error}");
return false;
}
return true;
}
@@ -404,34 +469,32 @@ function testEmailCommand(command, params, client) {
function restartGameModeCommand(command, params, client) {
messagePlayerNormal(null, `The server game mode is restarting!`, getColourByName("orange"));
consoleCommand("/refresh");
thisResource.restart();
return true;
}
// ===========================================================================
function clientRunCodeFail(client, returnTo, code) {
function clientRunCodeFail(client, returnTo, error) {
let returnClient = getClientFromIndex(returnTo);
if(!returnClient) {
return false;
}
messagePlayerError(returnClient, `Client code failed to execute for ${getPlayerName(client)}!`);
messagePlayerNormal(returnClient, `Code: ${code}`, getColourByName("yellow"));
messagePlayerError(returnClient, `(${getPlayerName(client)}). Error: ${error}`);
}
// ===========================================================================
function clientRunCodeSuccess(client, returnTo, returnVal, code) {
function clientRunCodeSuccess(client, returnTo, returnVal) {
let returnClient = getClientFromIndex(returnTo);
if(!returnClient) {
return false;
}
messagePlayerSuccess(returnClient, `Client code executed for ${getPlayerName(client)}!`);
messagePlayerNormal(returnClient, `Code: ${code}`, getColourByName("yellow"));
messagePlayerNormal(returnClient, `Returns: ${returnVal}`, getColourByName("yellow"));
//messagePlayerSuccess(returnClient, `Client code executed for ${getPlayerName(client)}!`);
//messagePlayerNormal(returnClient, `Code: ${code}`, getColourByName("yellow"));
messagePlayerNormal(returnClient, `(${getPlayerName(client)}) Code returns: ${returnVal}`, getColourByName("white"));
}
// ===========================================================================
@@ -610,7 +673,44 @@ function resetAllServerAmbienceElementsCommand(command, params, client) {
function reloadEconomyConfigurationCommand(command, params, client) {
getGlobalConfig().economy = loadEconomyConfig();
messageAdmins(`${client.name} {MAINCOLOUR}has reloaded the economy settings`);
messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR}has reloaded the economy settings`);
}
// ===========================================================================
function showLocalePickerTestCommand(command, params, client) {
showLocaleChooserForPlayer(client);
}
// ===========================================================================
function executeDatabaseQueryCommand(command, params, client) {
if(areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if(!targetClient) {
messagePlayerError(client, "That player was not found!");
return false;
}
if(targetCode == "") {
messagePlayerError(client, "You didn't enter any code!");
return false;
}
let success = quickDatabaseQuery(params);
if(!success) {
messagePlayerAlert(client, `Database query failed to execute: {ALTCOLOUR}${query}`);
} else if(typeof success != "boolean") {
messagePlayeSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
messagePlayerInfo(client, `Returns: ${success}`);
} else {
messagePlayerSuccess(client, `Database query successful: {ALTCOLOUR}${query}`);
}
return true;
}
// ===========================================================================

View File

@@ -88,53 +88,83 @@ function getDiscordUserData(discordUserId) {
// ===========================================================================
function messageDiscordChatChannel(message) {
if(!getServerConfig().discordConfig.sendChat) {
function messageDiscordChatChannel(messageString) {
if (getServerConfig().devServer == true) {
return false;
}
message = removeColoursInMessage(message);
console.warn(message);
let payloadData = {
"username": "Chat",
"content": message,
};
if (!getGlobalConfig().discord.sendChat) {
return false;
}
triggerWebHook(getServerConfig().discordConfig.chatChannelWebHookURL, JSON.stringify(payloadData));
if (!getServerConfig().discord.sendChat) {
return false;
}
messageString = removeColoursInMessage(messageString);
triggerDiscordWebHook(messageString, getServerId(), VRR_DISCORD_WEBHOOK_LOG);
}
// ===========================================================================
function messageDiscordAdminChannel(message) {
if(!getServerConfig().discordConfig.sendAdminEvents) {
function messageDiscordEventChannel(messageString) {
if (getServerConfig().devServer == true) {
return false;
}
message = removeColoursInMessage(message);
console.warn(message);
let payloadData = {
"username": "Admin Event",
"content": message,
};
if (!getGlobalConfig().discord.sendEvents) {
return false;
}
triggerWebHook(getServerConfig().discordConfig.adminChannelWebHookURL, JSON.stringify(payloadData));
if (!getServerConfig().discord.sendEvents) {
return false;
}
messageString = removeColoursInMessage(messageString);
triggerDiscordWebHook(messageString, getServerId(), VRR_DISCORD_WEBHOOK_LOG);
}
// ===========================================================================
function messageDiscordEventChannel(message) {
if(!getServerConfig().discordConfig.sendEvents) {
function messageDiscordAdminChannel(messageString) {
if (getServerConfig().devServer == true) {
return false;
}
message = removeColoursInMessage(message);
console.warn(message);
let payloadData = {
"username": "Event",
"content": message,
};
if (!getGlobalConfig().discord.sendAdmin) {
return false;
}
triggerWebHook(getServerConfig().discordConfig.eventChannelWebHookURL, JSON.stringify(payloadData));
if (!getServerConfig().discord.sendAdmin) {
return false;
}
messageString = removeColoursInMessage(messageString);
triggerDiscordWebHook(messageString, getServerId(), VRR_DISCORD_WEBHOOK_ADMIN);
}
// ===========================================================================
function triggerDiscordWebHook(messageString, serverId = getServerId(), type = VRR_DISCORD_WEBHOOK_LOG) {
if (!getGlobalConfig().discord.webhook.enabled) {
return false;
}
let tempURL = getGlobalConfig().discord.webhook.webhookBaseURL;
tempURL = tempURL.replace("{0}", encodeURI(messageString));
tempURL = tempURL.replace("{1}", serverId);
tempURL = tempURL.replace("{2}", type);
tempURL = tempURL.replace("{3}", getGlobalConfig().discord.webhook.pass);
httpGet(
tempURL,
"",
function (data) {
},
function (data) {
}
);
}
// ===========================================================================

View File

@@ -31,14 +31,19 @@ function playerPayDay(client) {
let grossIncome = getPlayerData(client).payDayAmount;
// Passive income
grossIncome = grossIncome + getGlobalConfig().economy.passiveIncomePerPayDay;
grossIncome = Math.round(grossIncome + getGlobalConfig().economy.passiveIncomePerPayDay);
// Payday bonus
grossIncome = grossIncome*getGlobalConfig().economy.grossIncomeMultiplier;
grossIncome = Math.round(grossIncome * getGlobalConfig().economy.grossIncomeMultiplier);
let incomeTaxAmount = calculateIncomeTax(wealth);
// Double bonus
if (isDoubleBonusActive()) {
grossIncome = Math.round(grossIncome * 2);
}
let netIncome = grossIncome-incomeTaxAmount;
let incomeTaxAmount = Math.round(calculateIncomeTax(wealth));
let netIncome = Math.round(grossIncome - incomeTaxAmount);
messagePlayerAlert(client, "== Payday! =============================");
messagePlayerInfo(client, `Paycheck: {ALTCOLOUR}$${grossIncome}`);
@@ -49,11 +54,11 @@ function playerPayDay(client) {
let canPayNow = totalCash + netIncome;
if (incomeTaxAmount <= canPayNow) {
takePlayerCash(client, canPayNow);
messagePlayerInfo(client, `You covered the remaining taxes with {ALTCOLOUR}$${canPayNow} {MAINCOLOUR}in cash.`);
messagePlayerAlert(client, `{orange}You lost money since your taxes are more than your paycheck!`);
messagePlayerAlert(client, `{orange}If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!`);
messagePlayerInfo(client, `{orange}${getLocaleString(client, "RemainingTaxPaidInCash", `{ALTCOLOUR}${canPayNow}{MAINCOLOUR}`)}`);
messagePlayerAlert(client, `{orange}${getLocaleString(client, "LostMoneyFromTaxes")}`);
messagePlayerAlert(client, `{orange}${getLocaleString(client, "NextPaycheckRepossessionWarning")}`);
} else {
messagePlayerInfo(client, `{orange}You don't have enough cash to pay your taxes!`);
messagePlayerInfo(client, `{orange}${getLocaleString(client, "NotEnoughCashForTax")}`);
takePlayerCash(client, canPayNow);
let vehicleCount = getAllVehiclesOwnedByPlayer(client).length;
@@ -65,7 +70,7 @@ function playerPayDay(client) {
let newVehicleCount = getAllVehiclesOwnedByPlayer(client).length;
let newHouseCount = getAllHousesOwnedByPlayer(client).length;
let newBusinessCount = getAllBusinessesOwnedByPlayer(client).length;
messagePlayerInfo(client, `{orange}You lost ${newVehicleCount-vehicleCount} vehicles, ${newHouseCount-houseCount} houses, and ${newBusinessCount-businessCount} businesses to cover the remaining tax.`);
messagePlayerInfo(client, `{orange}${getLocaleString(client, "AssetsRepossessedForTaxes", newVehicleCount - vehicleCount, newHouseCount - houseCount, newBusinessCount - businessCount)}`);
}
}
@@ -106,7 +111,7 @@ function forcePlayerPayDayCommand(command, params, client) {
return false;
}
messageAdmins(`${client.name} gave ${targetClient.name} an instant payday`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} gave {ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR} an instant payday`);
playerPayDay(targetClient);
}
@@ -127,7 +132,7 @@ function setPayDayBonusMultiplier(command, params, client) {
getGlobalConfig().economy.grossIncomeMultiplier = newMultiplier;
messageAdminAction(`${client.name} set payday bonus to ${newMultiplier*100}%`);
announceAdminAction(`PaydayBonusSet`, `{adminOrange}${getPlayerName(client)}{MAINCOLOUR}`, `{ALTCOLOUR}${newMultiplier * 100}%{MAINCOLOUR}`);
}
// ===========================================================================
@@ -142,7 +147,7 @@ function taxInfoCommand(command, params, client) {
function wealthInfoCommand(command, params, client) {
let wealth = calculateWealth(client);
messagePlayerInfo(client, `Your wealth is: $${wealth}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`);
messagePlayerInfo(client, `Your wealth is: {ALTCOLOUR}$${wealth}{MAINCOLOUR}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`);
}
// ===========================================================================
@@ -157,10 +162,12 @@ function attemptRepossession(client, totalToPay) {
return true;
}
// ===========================================================================
function repossessFirstAsset(client) {
let vehicles = getAllVehiclesOwnedByPlayer(client);
if (vehicles.length > 0) {
deleteVehicle(vehicles[0])
deleteVehicle(vehicles[0]);
return getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle;
}
@@ -194,3 +201,15 @@ function getAllBusinessesOwnedByPlayer(client) {
function getAllHousesOwnedByPlayer(client) {
return getServerData().houses.filter((h) => h.ownerType == VRR_HOUSEOWNER_PLAYER && h.ownerId == getPlayerCurrentSubAccount(client).databaseId);
}
// ===========================================================================
function isDoubleBonusActive() {
if (isWeekend()) {
return true;
}
return false;
}
// ===========================================================================

View File

@@ -8,22 +8,18 @@
// ===========================================================================
function initEmailScript() {
if(!checkForSMTPModule()) {
return false;
}
logToConsole(LOG_INFO, "[VRR.Email]: Initializing email script ...");
emailConfig = loadEmailConfiguration();
logToConsole(LOG_INFO, "[VRR.Email]: Email script initialized successfully!");
}
// ===========================================================================
function sendEmail(toEmail, toName, subject, body) {
async function sendEmail(toEmail, toName, subject, body) {
if (!checkForSMTPModule()) {
return false;
}
Promise.resolve().then(() => {
module.smtp.send(
getEmailConfig().smtp.host,
getEmailConfig().smtp.port,
@@ -35,20 +31,15 @@ function sendEmail(toEmail, toName, subject, body) {
subject,
body,
getEmailConfig().smtp.from,
getEmailConfig().smtp.fromName);
}
// ===========================================================================
function loadEmailConfiguration() {
let emailConfigFile = loadTextFile("config/email.json");
return JSON.parse(emailConfigFile);
getEmailConfig().smtp.fromName
);
});
}
// ===========================================================================
function getEmailConfig() {
return emailConfig;
return getGlobalConfig().email;
}
// ===========================================================================

View File

@@ -38,7 +38,7 @@ function addAllEventHandlers() {
addEventHandler("onPedEnteringVehicle", onPedEnteringVehicle);
addEventHandler("onPedExitingVehicle", onPedExitingVehicle);
addEventHandler("OnPlayerCommand", onPlayerCommand);
//addEventHandler("OnPlayerCommand", onPlayerCommand);
}
// ===========================================================================
@@ -54,13 +54,25 @@ function onPlayerConnect(event, ipAddress, port) {
// ===========================================================================
function onPlayerJoin(event, client) {
logToConsole(LOG_INFO, `[VRR.Event] Client ${client.name}[${client.index}] joining from ${client.ip}`);
logToConsole(LOG_INFO, `[VRR.Event] Client ${getPlayerName(client)}[${getPlayerId(client)}] joining from ${getPlayerIP(client)}`);
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has joined the server.`);
//if(isCustomCameraSupported()) {
// showConnectCameraToPlayer(client);
//}
let messageText = `👋 ${getPlayerName(client)} is connecting to the server ...`;
messageDiscordEventChannel(messageText);
let clients = getClients();
for (let i in clients) {
messagePlayerNormal(clients[i], getLocaleString(clients[i], "PlayerConnecting", getPlayerName(client)));
}
//messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has joined the server.`);
}
// ===========================================================================
@@ -96,25 +108,38 @@ function onPlayerQuit(event, client, quitReasonId) {
logToConsole(LOG_INFO, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`);
updateConnectionLogOnQuit(client, quitReasonId);
if(isPlayerLoggedIn(client)) {
messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${disconnectReasons[quitReasonId]})`, getColourByName("softYellow"));
savePlayerToDatabase(client);
resetClientStuff(client);
getServerData().clients[client.index] = null;
let reasonText = disconnectReasons[quitReasonId];
if (getPlayerData(client) != false) {
if (getPlayerData(client).customDisconnectReason != "") {
reasonText = getPlayerData(client).customDisconnectReason;
}
}
messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has left the server.`);
messageDiscordEventChannel(`👋 ${getPlayerName(client)} has left the server (${reasonText})`);
clearTemporaryVehicles();
clearTemporaryPeds();
getClients().forEach(forClient => {
let reasonText = getGroupedLocaleString(forClient, "DisconnectReasons", quitReasonId);
messagePlayerNormal(forClient, getLocaleString(forClient, "PlayerLeftServer", getPlayerName(client), reasonText));
});
//messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${reasonText})`, getColourByName("softYellow"));
if (isPlayerLoggedIn(client)) {
savePlayerToDatabase(client);
resetClientStuff(client);
getServerData().clients[getPlayerId(client)] = null;
}
playerResourceReady[client.index] = false;
playerResourceStarted[client.index] = false;
playerInitialized[client.index] = false;
playerGUIReady[client.index] = false;
}
// ===========================================================================
async function onPlayerChat(event, client, messageText) {
event.preventDefault();
processPlayerChat(client, messageText);
event.preventDefault();
}
// ===========================================================================
@@ -155,8 +180,8 @@ function onPedEnteringVehicle(event, ped, vehicle, seat) {
messagePlayerNormal(client, `🔒 This ${getVehicleName(vehicle)} is locked and you don't have the keys to unlock it`);
}
getPlayerData(client).enteringVehicle = null;
makePlayerStopAnimation(client);
//getPlayerData(client).enteringVehicle = null;
//makePlayerStopAnimation(client);
return false;
}
@@ -186,40 +211,28 @@ function onPedExitingVehicle(event, ped, vehicle) {
// ===========================================================================
function onResourceStart(event, resource) {
logToConsole(LOG_WARN, `[VRR.Event] ${resource.name} started!`);
logToConsole(LOG_WARN, `[VRR.Event] Resource ${resource.name} started!`);
if(resource != thisResource) {
messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name} {MAINCOLOUR}started!`);
}
//if(resource != thisResource) {
// messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name}{MAINCOLOUR} started!`);
//}
}
// ===========================================================================
function onResourceStop(event, resource) {
logToConsole(LOG_WARN, `[VRR.Event] ${resource.name} stopped!`);
logToConsole(LOG_WARN, `[VRR.Event] Resource ${resource.name} stopped!`);
if(resource != thisResource) {
messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name} {MAINCOLOUR}stopped!`);
}
//if(resource != thisResource) {
// messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name}{MAINCOLOUR} stopped!`);
//}
if (resource == thisResource) {
saveAllServerDataToDatabase();
clearArray(getServerData().vehicles);
clearArray(getServerData().clients);
clearArray(getServerData().businesses);
clearArray(getServerData().houses);
clearArray(getServerData().factions);
clearArray(getServerData().jobs);
clearArray(getServerData().clans);
clearArray(getServerData().items);
clearArray(getServerData().itemTypes);
clearArray(getServerData().groundItemCache);
clearArray(getServerData().groundPlantCache);
kickAllClients();
}
saveServerDataToDatabase();
collectAllGarbage();
}
}
// ===========================================================================
@@ -245,16 +258,16 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) {
if (getGame() == VRR_GAME_GTA_IV) {
vehicle = getVehicleFromIVNetworkId(clientVehicle);
} else {
if(client.player == null) {
if (getPlayerPed(client) == null) {
return false;
}
await waitUntil(() => client != null && client.player != null && client.player.vehicle != null);
await waitUntil(() => client != null && getPlayerPed(client) != null && getPlayerVehicle(client) != null);
vehicle = client.player.vehicle;
vehicle = getPlayerVehicle(client);
}
if(getVehicleData(vehicle) == false) {
if (!getVehicleData(vehicle)) {
return false;
}
@@ -346,7 +359,7 @@ async function onPlayerEnteredVehicle(client, clientVehicle, seat) {
if (getVehicleData(vehicle).streamingRadioStation != -1) {
if (getPlayerData(client).streamingRadioStation != getVehicleData(vehicle).streamingRadioStation) {
playRadioStreamForPlayer(client, radioStations[getVehicleData(vehicle).streamingRadioStation].url, true, getPlayerStreamingRadioVolume(client));
playRadioStreamForPlayer(client, getServerData().radioStations[getVehicleData(vehicle).streamingRadioStation].url, true, getPlayerStreamingRadioVolume(client));
}
}
}
@@ -389,10 +402,19 @@ function onPlayerDeath(client, position) {
setTimeout(function () {
if (getPlayerCurrentSubAccount(client).inJail) {
let closestJail = getClosestPoliceStation(getPlayerPosition(client));
client.despawnPlayer();
despawnPlayer(client);
getPlayerCurrentSubAccount(client).interior = closestJail.interior;
getPlayerCurrentSubAccount(client).dimension = closestJail.dimension;
if (isPlayerWorking(client)) {
stopWorking(client);
}
if (getGame() == VRR_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0], closestJail.position, closestJail.heading);
} else {
spawnPlayer(client, closestJail.position, closestJail.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
}
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
@@ -400,22 +422,45 @@ function onPlayerDeath(client, position) {
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
resetPlayerBlip(client);
} else {
let closestHospital = getClosestHospital(getPlayerPosition(client));
client.despawnPlayer();
despawnPlayer(client);
getPlayerCurrentSubAccount(client).interior = closestHospital.interior;
getPlayerCurrentSubAccount(client).dimension = closestHospital.dimension;
if (isPlayerWorking(client)) {
stopWorking(client);
}
if (getGame() == VRR_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0], closestHospital.position, closestHospital.heading);
} else {
spawnPlayer(client, closestHospital.position, closestHospital.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
}
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
resetPlayerBlip(client);
}
}, 2000);
}, 1000);
let queryData = [
["log_death_server", getServerId()]
["log_death_who_died", getPlayerCurrentSubAccount(client).databaseId],
["log_death_when_died", "{UNIXTIMESTAMP}"],
["log_death_pos_x", position.x],
["log_death_pos_y", position.y],
["log_death_pos_z", position.x],
];
let queryString = createDatabaseInsertQuery("log_death", queryData);
addToQueryQueue(queryString);
}
// ===========================================================================
@@ -429,47 +474,53 @@ function onPedSpawn(ped) {
// ===========================================================================
function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Checking for ${getPlayerDisplayForConsole(client)}'s player ped`);
//if(client.player == null) {
async function onPlayerSpawn(client) {
//logToConsole(LOG_DEBUG, `[VRR.Event] Checking for ${getPlayerDisplayForConsole(client)}'s player ped`);
//if(getPlayerPed(client) == null) {
// logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player element not set yet. Rechecking ...`);
// setTimeout(onPlayerSpawn, 500, client);
// return false;
//}
//logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player ped is valid. Continuing spawn processing ...`);
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player ped is valid. Continuing spawn processing ...`);
if (areServerElementsSupported()) {
await waitUntil(() => client != null && getPlayerPed(client) != null);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s player data`);
if (!getPlayerData(client)) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is invalid. Kicking them from server.`);
client.disconnect();
getPlayerData(targetClient).customDisconnectReason = `Kicked - Spawn bug. Data invalid.`;
disconnectPlayer(client);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s login status`);
if(!getPlayerData(client).loggedIn) {
if (!isPlayerLoggedIn(client)) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} is NOT logged in. Despawning their player.`);
client.disconnect();
getPlayerData(targetClient).customDisconnectReason = `Kicked - Tried to force spawn without logging in.`;
disconnectPlayer(client);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s selected character status`);
if (getPlayerData(client).currentSubAccount == -1) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} has NOT selected a character. Despawning their player.`);
client.disconnect();
getPlayerData(targetClient).customDisconnectReason = `Kicked - Tried to force spawn without selecting a character.`;
disconnectPlayer(client);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`);
if(getServerGame() == VRR_GAME_GTA_IV) {
if (getGame() == VRR_GAME_GTA_IV) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped body parts and props`);
setEntityData(client.player, "vrr.bodyParts", getPlayerCurrentSubAccount(client).bodyParts, true);
setEntityData(client.player, "vrr.bodyProps", getPlayerCurrentSubAccount(client).bodyProps, true);
setEntityData(getPlayerPed(client), "vrr.bodyParts", getPlayerCurrentSubAccount(client).bodyParts, true);
setEntityData(getPlayerPed(client), "vrr.bodyProps", getPlayerCurrentSubAccount(client).bodyProps, true);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped scale (${getPlayerCurrentSubAccount(client).pedScale})`);
setEntityData(client.player, "vrr.scale", getPlayerCurrentSubAccount(client).pedScale, true);
setEntityData(getPlayerPed(client), "vrr.scale", getPlayerCurrentSubAccount(client).pedScale, true);
if (isPlayerSwitchingCharacter(client) || isPlayerCreatingCharacter(client)) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s ped is being used for character selection/creation. No further spawn processing needed'`);
@@ -482,16 +533,19 @@ function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Storing ${getPlayerDisplayForConsole(client)} ped in client data `);
if (areServerElementsSupported()) {
getPlayerData(client).ped = client.player;
getPlayerData(client).ped = getPlayerPed(client);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)} the 'now playing as' message`);
messagePlayerAlert(client, `You are now playing as: {businessBlue}${getCharacterFullName(client)}`, getColourByName("white"));
messagePlayerNormal(client, "This server is in early development and may restart at any time for updates.", getColourByName("orange"));
messagePlayerNormal(client, "Please report any bugs using /bug and suggestions using /idea", getColourByName("yellow"));
//messagePlayerNormal(client, "This server is in early development and may restart at any time for updates.", getColourByName("orange"));
//messagePlayerNormal(client, "Please report any bugs using /bug and suggestions using /idea", getColourByName("yellow"));
logToConsole(LOG_DEBUG, `[VRR.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
updatePlayerSpawnedState(client, true);
if (getGame() == VRR_GAME_MAFIA_ONE) {
setPlayerPosition(client, getPlayerCurrentSubAccount(client).spawnPosition);
setPlayerHeading(client, getPlayerCurrentSubAccount(client).spawnHeading);
setPlayerDimension(client, getPlayerCurrentSubAccount(client).dimension);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player interior for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).interior}`);
setPlayerInterior(client, getPlayerCurrentSubAccount(client).interior);
@@ -520,9 +574,9 @@ function onPlayerSpawn(client) {
updatePlayerSnowState(client);
}
if(areServerElementsSupported() && getServerGame() == VRR_GAME_GTA_SA) {
if (areServerElementsSupported() && getGame() == VRR_GAME_GTA_SA) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walk and fightstyle for ${getPlayerDisplayForConsole(client)}`);
setEntityData(client.player, "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);
setEntityData(getPlayerPed(client), "vrr.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);
setPlayerFightStyle(client, getPlayerCurrentSubAccount(client).fightStyle);
}
@@ -548,20 +602,20 @@ function onPlayerSpawn(client) {
}
//if(isGTAIV()) {
// setEntityData(client.player, "vrr.bodyPartHair", getPlayerCurrentSubAccount(client).bodyParts.hair, true);
// setEntityData(client.player, "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyParts.head, true);
// setEntityData(client.player, "vrr.bodyPartUpper", getPlayerCurrentSubAccount(client).bodyParts.upper, true);
// setEntityData(client.player, "vrr.bodyPartLower", getPlayerCurrentSubAccount(client).bodyParts.lower, true);
// setEntityData(client.player, "vrr.bodyPropHair", getPlayerCurrentSubAccount(client).bodyProps.hair, true);
// setEntityData(client.player, "vrr.bodyPropEyes", getPlayerCurrentSubAccount(client).bodyProps.eyes, true);
// setEntityData(client.player, "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyProps.head, true);
// setEntityData(client.player, "vrr.bodyPartLeftHand", getPlayerCurrentSubAccount(client).bodyProps.leftHand, true);
// setEntityData(client.player, "vrr.bodyPartRightHand", getPlayerCurrentSubAccount(client).bodyProps.rightHand, true);
// setEntityData(client.player, "vrr.bodyPartLeftWrist", getPlayerCurrentSubAccount(client).bodyProps.leftWrist, true);
// setEntityData(client.player, "vrr.bodyPartRightWrist", getPlayerCurrentSubAccount(client).bodyProps.rightWrist, true);
// setEntityData(client.player, "vrr.bodyPartHip", getPlayerCurrentSubAccount(client).bodyProps.hip, true);
// setEntityData(client.player, "vrr.bodyPartLeftFoot", getPlayerCurrentSubAccount(client).bodyProps.leftFoot, true);
// setEntityData(client.player, "vrr.bodyPartRightFoot", getPlayerCurrentSubAccount(client).bodyProps.rightFoot, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartHair", getPlayerCurrentSubAccount(client).bodyParts.hair, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyParts.head, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartUpper", getPlayerCurrentSubAccount(client).bodyParts.upper, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartLower", getPlayerCurrentSubAccount(client).bodyParts.lower, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPropHair", getPlayerCurrentSubAccount(client).bodyProps.hair, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPropEyes", getPlayerCurrentSubAccount(client).bodyProps.eyes, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartHead", getPlayerCurrentSubAccount(client).bodyProps.head, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartLeftHand", getPlayerCurrentSubAccount(client).bodyProps.leftHand, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartRightHand", getPlayerCurrentSubAccount(client).bodyProps.rightHand, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartLeftWrist", getPlayerCurrentSubAccount(client).bodyProps.leftWrist, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartRightWrist", getPlayerCurrentSubAccount(client).bodyProps.rightWrist, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartHip", getPlayerCurrentSubAccount(client).bodyProps.hip, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartLeftFoot", getPlayerCurrentSubAccount(client).bodyProps.leftFoot, true);
// setEntityData(getPlayerPed(client), "vrr.bodyPartRightFoot", getPlayerCurrentSubAccount(client).bodyProps.rightFoot, true);
//}
if (isGTAIV()) {
@@ -584,16 +638,51 @@ function onPlayerSpawn(client) {
logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`);
updateAllPlayerNameTags();
logToConsole(LOG_DEBUG, `[VRR.Event] Sending player nametag distance to ${getPlayerDisplayForConsole(client)}`);
sendNameTagDistanceToClient(client, getServerConfig().nameTagDistance);
if (!areServerElementsSupported()) {
sendAllBusinessesToPlayer(client);
//sendAllHousesToPlayer(client);
//sendAllJobLocationsToPlayer(client);
sendAllHousesToPlayer(client);
//sendAllJobsToPlayer(client);
//sendAllVehiclesToPlayer(client);
requestPlayerPedNetworkId(client);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
updatePlayerSpawnedState(client, true);
getPlayerData(client).payDayTickStart = sdl.ticks;
//sendPlayerLocaleStrings(client);
// Stop playing intro music and any other radio
stopRadioStreamForPlayer(client);
// Start playing business/house radio if in one
let businessId = getPlayerBusiness(client);
let houseId = getPlayerHouse(client);
if (businessId != -1) {
if (getBusinessData(businessId).streamingRadioStation != -1) {
playRadioStreamForPlayer(client, getRadioStationData(getBusinessData(businessId).streamingRadioStation).url, true, getPlayerStreamingRadioVolume(client), null);
}
} else if (houseId != -1) {
if (getHouseData(houseId).streamingRadioStation != -1) {
playRadioStreamForPlayer(client, getRadioStationData(getHouseData(houseId).streamingRadioStation).url, true, getPlayerStreamingRadioVolume(client), null);
}
}
resetPlayerBlip(client)
messageDiscordEventChannel(`🧍 ${getPlayerName(client)} spawned as ${getCharacterFullName(client)}`);
}
// ===========================================================================
function onPlayerCommand(event, client, command, params) {
if (!doesCommandExist(command)) {
processPlayerCommand(command, params, client);
}
}
// ===========================================================================

View File

@@ -17,6 +17,11 @@ const VRR_GATEOWNER_PUBLIC = 5; // Public gate. Technically not
const VRR_GATEOWNER_BUSINESS = 6; // Owned by a business. Back lots, unloading areas, and other stuff like that
const VRR_GATEOWNER_HOUSE = 7; // Owned by a house. Like for mansions with closed private areas.
function initGateScript() {
logToConsole(LOG_INFO, `[VRR.Gate]: Initializing gate script ...`);
logToConsole(LOG_INFO, `[VRR.Gate]: Gate script initialized successfully!`);
}
// ===========================================================================
function doesPlayerHaveGateKeys(client, vehicle) {
@@ -103,7 +108,7 @@ function getGateData(gateId) {
function getClosestGate(position) {
let closest = 0;
for(let i in getServerData().gates[getServerGame()]) {
for (let i in getServerData().gates[getGame()]) {
if (getDistance(getServerData().gates[i].position, position) < getDistance(getServerData().gates[closest].position, position)) {
closest = i;
}
@@ -121,7 +126,7 @@ function triggerGateCommand(command, params, client) {
messagePlayerError(client, getLocaleString(client, "InvalidGate"));
}
if(!canPlayerUseGate(client, closestGate)) {
if (!doesPlayerHaveGateKeys(client, closestGate)) {
messagePlayerError(client, getLocaleString(client, "NoGateAccess"));
return false;
}
@@ -130,3 +135,102 @@ function triggerGateCommand(command, params, client) {
}
// ===========================================================================
function saveAllGatesToDatabase() {
if (getServerConfig().devServer) {
return false;
}
for (let i in getServerData().gates) {
saveGateToDatabase(i);
}
}
// ===========================================================================
function saveGateToDatabase(gateId) {
if (getGateData(gateId) == null) {
// Invalid gate data
return false;
}
let tempGateData = getGateData(gateId);
if (tempGateData.databaseId == -1) {
// Temp gate, no need to save
return false;
}
if (!tempGateData.needsSaved) {
// Gate hasn't changed. No need to save.
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Gate]: Saving gate ${tempGateData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeGateName = escapeDatabaseString(tempGateData.name);
let safeGateScriptName = escapeDatabaseString(tempGateData.scriptName);
let data = [
["gate_server", getServerId()],
["gate_name", safeGateName],
["gate_script_name", safeGateScriptName],
["gate_owner_type", toInteger(tempGateData.ownerType)],
["gate_owner_id", toInteger(tempGateData.ownerId)],
["gate_pos_x", toFloat(tempGateData.position.x)],
["gate_pos_y", toFloat(tempGateData.position.y)],
["gate_pos_z", toFloat(tempGateData.position.z)],
["gate_radius", toFloat(tempGateData.radius)],
];
let dbQuery = null;
if (tempGateData.databaseId == 0) {
let queryString = createDatabaseInsertQuery("gate_main", data);
dbQuery = queryDatabase(dbConnection, queryString);
tempGateData.databaseId = getDatabaseInsertId(dbConnection);
tempGateData.needsSaved = false;
} else {
let queryString = createDatabaseUpdateQuery("gate_main", data, `gate_id=${tempGateData.databaseId}`);
dbQuery = queryDatabase(dbConnection, queryString);
tempGateData.needsSaved = false;
}
freeDatabaseQuery(dbQuery);
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.Gate]: Saved gate ${gateDataId} to database!`);
return true;
}
// ===========================================================================
function loadGatesFromDatabase() {
logToConsole(LOG_INFO, "[VRR.Gate]: Loading gates from database ...");
let tempGates = [];
let dbConnection = connectToDatabase();
let dbAssoc;
if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `SELECT * FROM gate_main WHERE gate_server = ${getServerId()}`);
if (dbQuery) {
if (dbQuery.numRows > 0) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempGateData = new GateData(dbAssoc);
tempGates.push(tempGateData);
logToConsole(LOG_DEBUG, `[VRR.Gate]: Gate '${tempGateData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Gate]: ${tempGates.length} gates loaded from database successfully!`);
return tempGates;
}
// ===========================================================================

View File

@@ -32,7 +32,8 @@ function playerPromptAnswerNo(client) {
case VRR_PROMPT_CREATEFIRSTCHAR:
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} chose not to create a first character. Kicking them from the server ...`);
showPlayerErrorGUI(client, "You don't have a character to play. Goodbye!", "No Characters");
setTimeout(function() { client.disconnect(); }, 5000);
getPlayerData(targetClient).customDisconnectReason = `Kicked - Didn't create a character`;
setTimeout(function () { disconnectPlayer(client); }, 5000);
break;
case VRR_PROMPT_BIZORDER:
@@ -65,11 +66,12 @@ function playerPromptAnswerYes(client) {
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} answered YES to their prompt (${getPlayerData(client).promptType})`);
switch (getPlayerData(client).promptType) {
case VRR_PROMPT_CREATEFIRSTCHAR:
case VRR_PROMPT_CREATEFIRSTCHAR: {
showPlayerNewCharacterGUI(client);
break;
}
case VRR_PROMPT_BIZORDER:
case VRR_PROMPT_BIZORDER: {
if (getPlayerData(client).businessOrderAmount > 0) {
if (getBusinessData(getPlayerData(client).businessOrderBusiness).till < getPlayerData(client).businessOrderCost) {
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} failed to order ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness).name} (Reason: Not enough money in business till)`);
@@ -89,17 +91,151 @@ function playerPromptAnswerYes(client) {
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
}
} else {
showPlayerErrorGUI(client, `You aren't ordering anything for a business!`, `Business Order Canceled`);
showPlayerErrorGUI(client, ``, `Business Order Canceled`);
}
break;
}
default:
case VRR_PROMPT_GIVEVEHTOCLAN: {
if (!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeInVehicle"));
return false;
}
if (!getVehicleData(getPlayerVehicle(client))) {
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerType != VRR_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
getVehicleData(getPlayerVehicle(client)).ownerType = VRR_VEHOWNER_CLAN;
getVehicleData(getPlayerVehicle(client)).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveVehicleToClan", getVehicleName(getPlayerVehicle(client))));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case VRR_PROMPT_GIVEHOUSETOCLAN: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).ownerType != VRR_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
if (getHouseData(houseId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
getHouseData(houseId).ownerType = VRR_HOUSEOWNER_CLAN;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveHouseToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case VRR_PROMPT_GIVEBIZTOCLAN: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).ownerType != VRR_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
if (getBusinessData(businessId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
getBusinessData(businessId).ownerType = VRR_BIZOWNER_CLAN;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveBusinessToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case VRR_PROMPT_BUYHOUSE: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "HouseNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getHouseData(houseId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "HousePurchaseNotEnoughMoney"));
return false;
}
getHouseData(houseId).ownerType = VRR_HOUSEOWNER_PLAYER;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getHouseData(houseId).buyPrice = 0;
getHouseData(houseId).needsSaved = true;
updateHousePickupLabelData(houseId);
messageDiscordEventChannel(`🏘️ ${getCharacterFullName(client)} is now the owner of *${getHouseData(houseId).description}*!`);
messagePlayerSuccess(client, `🏘️ You are now the owner of {houseGreen}${getHouseData(houseId).description}`);
break;
}
case VRR_PROMPT_BUYBIZ: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "BusinessNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getBusinessData(businessId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "BusinessPurchaseNotEnoughMoney"));
return false;
}
getBusinessData(businessId).ownerType = VRR_BIZOWNER_PLAYER;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getBusinessData(businessId).buyPrice = 0;
getBusinessData(businessId).needsSaved = true;
updateBusinessPickupLabelData(businessId);
messageDiscordEventChannel(`🏢 ${getCharacterFullName(client)} is now the owner of *${getBusinessData(businessId).name}*!`);
messagePlayerSuccess(client, `🏢 You are now the owner of {businessBlue}${getBusinessData(businessId).name}`);
break;
}
default: {
submitBugReport(client, `[AUTOMATED REPORT] Unknown prompt type: ${getPlayerData(client).promptType}`);
break;
}
}
getPlayerData(client).promptType = VRR_PROMPT_NONE;
}
@@ -129,12 +265,6 @@ function playerToggledGUI(client) {
// ===========================================================================
function showPlayerChangePasswordGUI(client) {
sendNetworkEventToPlayer("vrr.changePassword", client);
}
// ===========================================================================
function showPlayerTwoFactorAuthenticationGUI(client) {
sendNetworkEventToPlayer("vrr.2fa", client);
}

View File

@@ -16,7 +16,7 @@ function initHelpScript() {
let randomTips = [
`{MAINCOLOUR}Look for yellow dots on your map for job locations.`,
`{MAINCOLOUR}You can set custom key binds. Use {ALTCOLOUR}/help keys {MAINCOLOUR} for details.`,
`{MAINCOLOUR}You can set custom key binds. Use {ALTCOLOUR}/info keys {MAINCOLOUR} for details.`,
`{MAINCOLOUR}Use /notips if you don't want to see tips and extra information`,
`{MAINCOLOUR}You can edit your keybinds using {ALTCOLOUR}/bindkey and /unbindkey`,
`{MAINCOLOUR}Press to see your inventory, and use number keys to select an item`,
@@ -40,8 +40,8 @@ let randomTips = [
//`{MAINCOLOUR}You can change your quick item display. Choices are GTAV-style pie menu or Minecraft-style hotbar`,
//`{MAINCOLOUR}Hold [#0066FF]E {MAINCOLOUR}to hail a nearby taxi if you need a ride.`,
//`{MAINCOLOUR}Press [#0066FF]G {MAINCOLOUR}to enter a vehicle as passenger.`,
//`{MAINCOLOUR}Banks can provide loans. Use {ALTCOLOUR}/help loans {MAINCOLOUR} for more details.`,
`{MAINCOLOUR}Want to make a clan? Use {ALTCOLOUR}/help clans {MAINCOLOUR} for details.`,
//`{MAINCOLOUR}Banks can provide loans. Use {ALTCOLOUR}/info loans {MAINCOLOUR} for more details.`,
`{MAINCOLOUR}Want to make a clan? Use {ALTCOLOUR}/info clans {MAINCOLOUR} for details.`,
`{MAINCOLOUR}Legal weapons can be purchased at any ammunation.`,
];
@@ -184,8 +184,8 @@ function helpCommand(command, params, client) {
// ===========================================================================
function showMainHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderHelpMainList")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /help <category> for commands and info. Example: {ALTCOLOUR}/help vehicle`);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HelpMainListHeader")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use /info <category> for commands and info. Example: {ALTCOLOUR}/info vehicle`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Help Categories: [#A9A9A9]account, command, vehicle, job, chat, rules, website, animation`);
messagePlayerNormal(client, `{clanOrange}• [#A9A9A9]skin, mechanic, dealership, discord, colour, keybind`);
}
@@ -194,51 +194,51 @@ function showMainHelpMessage(client) {
function showAccountHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderAccountHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Do not share your password with anybody else.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/changepass{MAINCOLOUR} to change your password.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some settings you can use: {ALTCOLOUR}/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AccountHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AccountHelp", 1, `{ALTCOLOUR}/changepass{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "AccountHelp", 2, `{ALTCOLOUR}/gui, /logo, /iplogin, /autolastchar, /2fa, /loginalert{MAINCOLOUR}`));
}
// ===========================================================================
function showVehicleHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit dealerships to buy new vehicles (Use {ALTCOLOUR}/help dealership {MAINCOLOUR}for more info.)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some commands: {ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your personal vehicles will save wherever you or somebody else leaves them!`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit a mechanic garage to repair, colour, and tune up your car! {ALTCOLOUR}/help mechanic {MAINCOLOUR} for info`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Don't forget to register and insure your vehicle! Use {ALTCOLOUR}/gps {MAINCOLOUR}to find a DMV for this.`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 0, `{ALTCOLOUR}/info dealership{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 1, `{ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 2));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 3, `{ALTCOLOUR}/info mechanic{MAINCOLOUR}`));
}
// ===========================================================================
function showVehicleDealershipHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit a vehicle dealer to buy new vehicles. Use {ALTCOLOUR}/gps {MAINCOLOUR}to find one.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At the dealer, simply enter a car you want to buy, and the price will be shown to you`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}If you want to buy the vehicle and have enough money, use {ALTCOLOUR}/buyveh {MAINCOLOUR}and you will be given keys`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}A new car for sale will appear when you drive away from the dealer.`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 0, `{ALTCOLOUR}/gps{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 1, `{ALTCOLOUR}/buyveh{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 2));
}
// ===========================================================================
function showJobHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderJobHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Visit job locations get a job and earn money. Look for yellow spots on the map`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}At a job location, use {ALTCOLOUR}/takejob {MAINCOLOUR}to get the job. Use {ALTCOLOUR}/quitjob {MAINCOLOUR}to quit your job`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/startwork {MAINCOLOUR}to begin working. You can also get a job {ALTCOLOUR}/uniform and {ALTCOLOUR}/equipment`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Most job vehicles are locked. Use {ALTCOLOUR}/lock {MAINCOLOUR}near one to enter it.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}When entering a job vehicle, information on how to do the job will be shown to you.`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "JobHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "JobHelp", 1, `{ALTCOLOUR}/takejob{MAINCOLOUR}`, `{ALTCOLOUR}/quitjob{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "JobHelp", 2, `{ALTCOLOUR}/lock{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "JobHelp", 3));
}
// ===========================================================================
function showChatHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderChatHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}There are two main types of chat: out-of-character (OOC) and in-character (IC)`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Mixing these two types is not proper roleplay. See {ALTCOLOUR}/rules {MAINCOLOUR}for info.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some chat commands: {ALTCOLOUR}/dm /whisper /talk /shout /me.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Some have shorter names available ({ALTCOLOUR}/t {MAINCOLOUR}for talk, {ALTCOLOUR}/s {MAINCOLOUR}for shout, etc)`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ChatHelp", 0, `{ALTCOLOUR}/buy {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ChatHelp", 1, `{ALTCOLOUR}/rules{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ChatHelp", 2, `{ALTCOLOUR}/dm /whisper /talk /shout /me{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "ChatHelp", 3, `{ALTCOLOUR}/t{MAINCOLOUR}`, `{ALTCOLOUR}/s{MAINCOLOUR}`));
}
// ===========================================================================
@@ -249,21 +249,21 @@ function showRulesHelpMessage(client) {
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 2));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 3));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 4), `{ALTCOLOUR}/help language {MAINCOLOUR}`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "RulesHelp", 4), `{ALTCOLOUR}/info language {MAINCOLOUR}`);
}
// ===========================================================================
function showWebsiteHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWebsiteInfo")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`);
messagePlayerHelpContent(client, `{MAINCOLOUR}${server.getRule("Website")}`);
}
// ===========================================================================
function showDiscordHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderDiscordInfo")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}${server.getRule("Website")}`);
messagePlayerHelpContent(client, `{MAINCOLOUR}${server.getRule("Discord")}`);
}
// ===========================================================================
@@ -280,7 +280,7 @@ function showAnimationHelpMessage(client) {
function showClothesHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderSkinHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 0, `{ALTCOLOUR}/buy {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 1, `{ALTCOLOUR}/help items {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 1, `{ALTCOLOUR}/info items {MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "SkinHelp", 2));
}
@@ -328,10 +328,10 @@ function showRadioHelpMessage(client) {
function showWealthAndTaxHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderWealthandTaxHelp")));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your taxes on payday are ${100*getGlobalConfig().economy.incomeTaxRate}% of your calculated wealth.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Each vehicle is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}, {MAINCOLOUR}each house is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}, {MAINCOLOUR}and each business is {ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Use {ALTCOLOUR}/wealth {MAINCOLOUR}to see your current wealth, and {ALTCOLOUR}/tax {MAINCOLOUR}to see how much you'll pay in tax each payday`);
messagePlayerHelpContent(client, getGroupedLocaleString(client, "WealthAndTaxHelp", 0, `{ALTCOLOUR}${100*getGlobalConfig().economy.incomeTaxRate}%{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "WealthAndTaxHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "WealthAndTaxHelp", 2, `{ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerVehicle}{MAINCOLOUR}`, `{ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerHouse}{MAINCOLOUR}`, `{ALTCOLOUR}${getGlobalConfig().economy.upKeepCosts.upKeepPerBusiness}{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "WealthAndTaxHelp", 3, `{ALTCOLOUR}/wealth{MAINCOLOUR}`, `{ALTCOLOUR}/tax{MAINCOLOUR}`));
}
// ===========================================================================
@@ -353,7 +353,7 @@ function showCommandHelpMessage(client, commandName) {
let aliases = getCommandAliasesNames(command);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName)));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.description}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.helpDescription}`);
if(aliases.length > 0) {
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Aliases: ${aliases.join(", ")}`);
@@ -380,7 +380,7 @@ function showCommandHelpMessage(client, commandName) {
*
*/
function helpGetCarCommand(command, params, client) {
messagePlayerAlert(client, `You can buy a car by visiting a vehicle dealership. Use {ALTCOLOUR}/help vehicle {MAINCOLOUR}for more info.`);
messagePlayerAlert(client, getLocaleString(client, "CarCommandHelp", `{ALTCOLOUR}/info vehicle{MAINCOLOUR}`));
}
// ===========================================================================
@@ -395,7 +395,8 @@ function helpGetCarCommand(command, params, client) {
*
*/
function helpGetSkinCommand(command, params, client) {
messagePlayerAlert(client, `You can change your skin by visiting a clothes store. Use {ALTCOLOUR}/help skin {MAINCOLOUR}for more info.`);
messagePlayerAlert(client, getLocaleString(client, "SkinCommandHelp", `{ALTCOLOUR}/info skin{MAINCOLOUR}`));
messagePlayerAlert(client, ``);
}
// ===========================================================================

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