From ae6a08c45771c6498b4f6bc00be739a4bcac8112 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Fri, 20 May 2022 16:51:01 -0500 Subject: [PATCH] More RageMP prep --- locale/finnish.json | 558 +++++++++++++ locale/french.json | 559 +++++++++++++ locale/german.json | 558 +++++++++++++ locale/japanese.json | 559 +++++++++++++ scripts/server/business.js | 13 +- scripts/server/event.js | 4 +- scripts/server/house.js | 14 +- scripts/server/item.js | 30 +- scripts/server/job.js | 147 ++-- scripts/server/native/connected.js | 152 +++- scripts/server/native/ragemp.js | 1187 ++++++++++++++++++++++++++++ scripts/server/npc.js | 50 +- scripts/server/radio.js | 11 +- scripts/server/subaccount.js | 59 +- scripts/server/vehicle.js | 11 +- 15 files changed, 3709 insertions(+), 203 deletions(-) create mode 100644 locale/finnish.json create mode 100644 locale/french.json create mode 100644 locale/german.json create mode 100644 locale/japanese.json create mode 100644 scripts/server/native/ragemp.js diff --git a/locale/finnish.json b/locale/finnish.json new file mode 100644 index 00000000..e083ccb5 --- /dev/null +++ b/locale/finnish.json @@ -0,0 +1,558 @@ +{ + "TranslationProvidedBy": "SIMBA_MEOW", + "LocaleEnglishName": "Finnish", + + "LocaleNativeName": "Finnish", + "LocaleOffer": "Tämä Serveri on nyt käytettävissä suomen kielellä Käytä {1} jotta voit käyttää sitä", + "LocaleChanged1": "Sinun kieli on nyt vaihdettu suomeen. {1}", + "LocaleChanged2": "Tämä serveri nyt näyttää tekstit suomen kielellä. {1}", + "LocaleChangedNote": "Tämä ei vaihda tekstejä muilta pelaajilta.", + "AccentsListHeader": "Aksentit", + "HelpMainListHeader": "Ohje luokat", + "AccentNotFound": "Aksenttia ei löydetty", + "AccentSet": "Sinä vaihdoit sinun aksentin{1}", + "InvalidAnimation": "Tuo animaatio on väärä.", + "AnimationCommandTip": "Käytä {1} että näet listan toimivia animaatioita.", + "InvalidAnimationDistance": "etäisyyden pitää olla väliin 0 ja 3", + "AnimationStopCommandTip": "Käytä {1} lopettaaksesi animaation", + "CantBanClient": "Sinä et voi bannätä tätä pelaajaa", + "PlayerAccountBanned": "{1} Käyttäjä on nyt bannätty", + "ClanNotFound": "Claania ei löydetty", + "ClanNameTaken": "Claani tuolla nimellä on jo otettu", + "PlayerNotFound": "Pelaajaa ei löytynyt ", + "ClanCantRemoveRanks": "Sinä et voi poistaa tämän claanin rankkejä", + "ClanCantAddRanks": "sinä et voi lisätä claani ranksejä", + "ClanRankNotFound": "Claanin nimeä ei loytynyt", + "ClanCantChangeMemberTag": " Sinä et voi vaihtaa claanin jäsenen tagejä", + "ClanPlayerNotInSameClan": "Tuo pelaaja ei ole sinun claanissa.", + "ClanCantChangeRankLevel": "Sinä et voi vaihtaa claanin rankin leveleitä", + "ClanCantChangeRankTag": "Sinä et voi vaihtaa claanin rankin tägeja", + "NameNotRegistered": "Sinun käyttäjä ei ole Rekisteröitu! Käytä {1} että voit tehdä käyttäjän", + "AutomaticLoginIPToggle": "Automaatinen Kirjautuminen IP ltä on nyt päällä {1}", + "CouldNotRegisterAccount": "tässä oli ongelma luodettasi käyttäjää. Ole hyvä ja kysy adminilta.", + "RandomTipsToggle": "Randomi vinkit ovat nyt {1}", + "ActionTipsToggle": "toiminta vinkit ovat nyt {1}", + "AutoSpawnLastCharToggle": "Automaattinen spawni viimeksi käytettynä hahmo on {1}", + "AccountGUISettingToggle": "🖥️ GUI on nyt päällä {1}", + "On": "On", + "Off": "Off", + "Yes": "Kyllä", + "No": "Ei", + "True": "oikea", + "False": "väärin", + "Locked": "Lukittu", + "Unlocked": "Lukitsematon", + "PasswordNotGoodEnough": "Uusi salasana ei täytä vaatimuksia!", + "PasswordNeedsBase": "Salasanallasi pitää olla ainakin yksi {1}", + "PasswordNeedsCapitals": "{1} ISON alku kirjaimen", + "PasswordNeedsNumbers": "{1} Numerot", + "PasswordNeedsSymbols": "{1} Symboolit", + "PasswordsDontMatch": "Uusi salasana ja salasanan vahvistus eivät ole samat!", + "PasswordChanged": "Sinun salasanasi on vaihdettu!", + "AutoLoggedInIP": "Olet kirjautunut automaattisesti sisään IP osoitteella!", + "WelcomeBack": "Tervetuloa takaisin {1}, {2}! ole hyvä {3} jatkaaksesi.", + "WelcomeNewPlayer": "Tervetuloa {1}, {2}! ole hyvä {3} pelataaksesi.", + "InvalidPlayer": "Pelaajaa ei löytynyt!", + "InvalidBusiness": "Bisnestä ei löytynyt!", + "InvalidHouse": "Taloa ei löytynyt!", + "InvalidVehicle": "Ajoneuvoa ei löytynyt!", + "InvalidClan": "Claania ei löytynyt!", + "InvalidClanRank": "Claanin rankkiä ei löytynyt!", + "InvalidJob": "Työtä ei löytynyt!", + "InvalidItem": "kohdetta ei löytynyt!", + "InvalidItemType": "kohteen tyyppiä ei löytynyt!", + "InvalidRadioStation": "Radio kanavaa ei löytynyt!", + "InvalidGate": "porttia ei löytynyt!", + "EntersProperty": "avaa oven ja astuu sisään {1}", + "ExitsProperty": "avaa oven ja astuu pois {1}", + "EnterExitPropertyDoorLocked": "yrittää avata oven {1} ovi mutta epäonnistuu koska se on lukittu", + "PropertyNoInterior": "Tämä {1} ei sisällä sisätilaa, mutta voit silti käyttää komentoja ovikuvakkeessa.", + "NoBusinessWithItemType": "täällä ei ole kauppaa kyseisen tuotteen kanssa", + "HeaderKeyBinds": "avain sitoo", + "HeaderAccountHelp": "Käyttäjä apu", + "HeaderVehicleHelp": "ajoneuvo apu", + "HeaderVehicleDealershipHelp": "Ajoneuvo liikkeen apu", + "HeaderJobHelp": "työ apu", + "HeaderChatHelp": "Chatti apu", + "HeaderServerRules": "Serverin säännöt", + "HeaderWebsiteInfo": "Verkkosivusto", + "HeaderDiscordInfo": "Discord", + "HeaderAnimationsList": "Animaatioluettelo", + "HeaderPayAndSprayHelp": "maksa ja suihkuta apu", + "HeaderAmmunationHelp": "Ase kauppa apu", + "HeaderVehicleTuneupHelp": "ajoneuvon sävelmä apu", + "HeaderBindableKeysHelp": "sidottavat avaimet", + "HeaderSkinHelp": "Vaatteet/iho apu", + "HeaderBusinessHelp": "Kauppa/bisnes apu", + "HeaderClanHelp": "Claanin apu", + "HeaderPlayerVehiclesList": "pelaajan ajoneuvot ({1})", + "HeaderPlayerBusinessesList": "pelaajan bisnekset ({1})", + "HeaderClansList": "Claani Lista", + "HeaderAdminsList": "Admini Lista", + "HeaderBadgeInfo": "merkki Informaatio", + "HeaderAccentsList": "Aksentti Lista", + "HeaderPlayerInfo": "Pelaajan Informaatio ({1})", + "HeaderWealthandTaxHelp": "varallisuus and verot Informaatio", + "HeaderCommandInfo": "komennon Informaatio ({1})", + "HeaderRadioHelp": "Radio apu", + "HeaderRadioStationsList": "Radio asemat/kanavat", + "HeaderKeyBindsList": "avain sitomis Lista", + "RadioVolumeChanged": "{1} Sinä vaihdoit sinun radion ääniä to {2}%", + "VolumeLevelNotNumber": "Äänenvoimakkuuden on oltava numero", + "RadioStationLocationInvalid": "Sinun on oltava ajoneuvossa, talossa tai yrityksessä tai sinulla on oltava henkilökohtainen laite vaihtaaksesi radio asemaa!", + "ActionBusinessRadioStationChange": "vaihtaa bisnes radioasemaksi {1} ({2})", + "ActionHouseRadioStationChange": "muuttaa talon radioasemaksi {1} ({2})", + "ActionVehicleRadioStationChange": "vaihtaa ajoneuvon radioasemaksi {1} ({2})", + "ActionItemRadioStationChange": "vaihtaa {1}'s aseman {2} ({3})", + "RandomVehicleCommandsDisabled": "Tämä on satunnainen liikenneajoneuvo, eikä siihen voi käyttää komentoja.", + "HouseDoorLock": "Talo {1} {2}!", + "BusinessDoorLock": "Bisnes {1} {2}!", + "ServerGameModeRestarting": "Palvelinpelitila käynnistyy uudelleen!", + "HeaderSelfItemList": "Sinun inventoori", + "HeaderPlayerItemList": "Pelaajan inventoori ({1})", + "HeaderHouseItemList": "Talon inventoori", + "HeaderBusinessFloorItemList": "Bisnes Inventoori (myyntiin)", + "HeaderBusinessStorageItemList": "Bisnes Inventoori (tila)", + "HeaderItemItemList": "{1}'s Inventoori", + "ItemSlotNotNumber": "Tuotepaikan on oltava numero", + "ItemSlotMustBeBetween": "Tuotepaikan tulee olla välillä {1} ja {2}!", + "UseItemBugged": "Kohde, jota yrität käyttää, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.", + "PickupItemBugged": "Tuote, jota yrität ottaa, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.", + "DropItemBugged": "Kohde, jonka yrität pudottaa, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.", + "HandsBusy": "kätesi ovat vararru", + "CantUseItemInSkinChange": "Et voi käyttää kohdetta muokkaaessasi ulkonäköäsi", + "CantDropItemInSkinChange": "Et voi pudottaa esinettä, kun muokkaat ulkonäköäsi", + "CantPickupItemInSkinChange": "Et voi ottaa tuotetta, kun muokkaat ulkonäköäsi", + "CantSwitchItemInSkinChange": "Et voi vaihtaa kohdetta muokkaaessasi ulkonäköäsi", + "CantGiveItemInSkinChange": "Et voi antaa esinettä, kun muokkaat ulkonäköäsi", + "CantTakeItemInSkinChange": "Et voi ottaa esinettä mukauttaessasi ulkonäköäsi", + "ItemUnequippableNoAmmo": " {1} paikassa {2} ei ole ammuksia, eikä sitä voi varustaa!", + "NoSpaceSelfInventory": "Sinulla ei ole enää tilaa varastossasi", + "Business": "bisnes", + "House": "talo", + "Clan": "claani", + "Vehicle": "ajoneuvo", + "Item": "kohde", + "ItemType": "kohteen tyyppi", + "Gate": "portti", + "Door": "ovi", + "ClanRank": "claan ränkki", + "JobRank": "työ ränkki", + "RadioStation": "radio kanava", + "Months": [ + "Tammikuu", + "Helmikuu", + "Maaliskuu", + "Huhtikuu", + "Toukokuu", + "Kesäkuu", + "Heinäkuu", + "Elokuu", + "Syyskuu", + "Lokakuu", + "Marraskuu", + "Joulukuu" + ], + "WeekDays": [ + "Sunnuntai", + "Maanantai", + "Tiistai", + "Keskiviikko", + "Torstai", + "Perjantai", + "Lauantai" + ], + "CardinalDirections": [ + "Pohjoinen", + "Koilinen", + "Itä", + "Kaakko", + "Etelä", + "Lounas", + "Länsi", + "Luonteinen" + ], + "NewPlayerReadyToPlay": [ + "Sinulle on annettu rahaa. Käyttää {1} löytää ostopaikkoja.", + "Jos tarvitset rahaa, työpaikat ovat keltaisia pisteitä tutkassa.", + "Autoa varten käy autoliikkeessä. Voit myös käyttää vuokra-ajoneuvoa spawnin lähellä tai matkustaa junalla", + "Muista lukea tämä{1} Ja käyttää {2} tiedoksi" + ], + "YourCurrentVehicleDeleted": "ajoneuvo, jossa olit, poistettiin.", + "Distance": "Etäisyys", + "Meters": "Metrejä", + "Feet": "jalkaa", + "Kilometers": "Kilometrejä", + "Miles": "Maileja", + "MustBeVehicleDriver": "Sinun on oltava ajoneuvon kuljettaja!", + "PlayerJoined": "{1} on liittynyt peliin {2}!", + "PlayerLeftServer": "{1} poistui pelistä! ({2})", + "TakeItemFromHouse": "ottaa {1} talosta", + "TakeItemFromBusinessStorage": "ottaa {1} varastosta", + "TakeItemFromBusiness": "ottaaa {1} bisneksestä", + "TakeItemFromItem": "ottaa {1} {2}", + "TakeItemFromVehicleTrunk": "ottaa {1} tavaratilasta", + "TakeItemFromVehicleDash": "ottaa {1} hansikaslokerosta", + "JobEquipmentInventoryKeyBindTip": "Työvälineet ovat varastossasi. Paina {1} että näet sen", + "JobEquipmentInventoryCommandTip": "Työvälineet ovat varastossasi. Käytä {1} että näet sen.", + "AccountHelp": [ + "ÄLÄ jaa salasanaasi kenenkään muun kanssa. {1} henkilökunta ei koskaan kysy sinulta salasanaasi", + "Käytä {1} vaihtaaksesi salasanasi ja {2} jos unohdit sen", + "Some settings you can use: {1}" + ], + "VehicleHelp": [ + "Henkilökohtaiset ajoneuvosi säästävät minne sinä tai joku muu jättää ne!", + "Vieraile jälleenmyyjissä ostamassa uusia ajoneuvoja (Käytä {1} saadaksesi lisää tietoa)", + "Some commands: {1}", + "Vieraile mekaanikkokorjaamolla korjaamassa, värjäämässä ja virittämässä autosi! {1} saadaaksesi tietoa" + ], + "VehicleDealershipHelp": [ + "Vieraile ajoneuvoliikkeessä ostamassa uusia ajoneuvoja. Käytä {1} löytääksesi yhden.", + "Jälleenmyyjällä mene auton sisään auto, jonka haluat ostaa, ja hinta näytetään sinulle", + "Jos haluat ostaa ajoneuvon, käytä {1}ja sinulle annetaan avaimet koeajeluun parkkipaikalla.", + "Aja pois jälleenmyyjältä uudella ajoneuvolla vahvistaaksesi oston." + ], + "JobHelp": [ + "Vieraile työpaikoilla saadaksesi työtä ja ansaitaksesi rahaa. Etsi kartalta keltaisia pisteitä", + "työpaikalla Käytä {1} saadaaksesi työpaikan. Käytä {2} lopettamaan työsi", + "Käytä {1} Aloittaaksesi työn. Sinä voit myös saada työn {2} ja {3}", + "useimmat työajoneuvot ovat lukittuja. Käytä {1} lähdellä yhtä astuaaksesi autoon.", + "Kun astut työajoneuvoon, sinulle näytetään tietoja työn suorittamisesta." + ], + "ChatHelp": [ + "There are two main types of chat: luonteen vastaisesti (OOC) ja luonteeltaan (IC)", + "Näiden kahden tyypin sekoittaminen ei ole oikea roolileikki. Katso {1} saadaaksesi lisää tietoa.", + "Some chat commands: {1}", + "Joillakin on saatavilla lyhyempiä nimiä ({1} puhua, {2} huutaa jne)" + ], + "ServerRulesHelp": [ + "Epärealistiset toimet (voimapelaaminen) eivät ole sallittuja. Et ole supermies.", + "Terroristin tai terrorismin roolileikkejä ei sallita.", + "Noudata aina moderaattorien ja järjestelmänvalvojien antamia ohjeita.", + "Älä sekoita keskusteluja (metapelaaminen). Et voi käyttää IC:ssä olevia tietoja, jotka vastaanotettiin OOC", + "Pidä englantia pääkeskusteluissa. Jos sinulla ei ole hyvää englantia, käytä {1}" + ], + "AnimationHelp": [ + "Animaatioiden avulla voit tehostaa roolipeliä visuaalisilla toimilla", + "Käytä nimeä {1} tai {2}, jos haluat käyttää animaatiota.", + "Näet luettelon animaatioista käyttämällä {1}" + ], + "WeaponHelp": [ + "Käy aseliikkeessä ostamaan aseita. Käytä {1} löytääksesi sellaisen.", + "Aseen ostaminen vaatii aseluvan.", + "Poliisilaitos hallinnoi aselupia. Hae siellä saadaksesi sellaisen.", + "Aseita voidaan ostaa myös laittomasti joiltakin yrityksiltä, asekauppiailta ja claaneista." + ], + "SkinHelp": [ + "Käytä vaatekaupassa {1} vaatteiden ostamiseen", + "Kun sinulla on vaate, varusta ja käytä sitä kuten mitä tahansa muuta esinettä näyttääksesi ihovalikoiman (katso {1} saadaksesi lisätietoja vaatteiden käytöstä)", + "Jotkin skinit on rajoitettu töihin, claaneihin tai muista syistä." + ], + "KeyBindHelp": [ + "Voit asettaa omat näppäinsidokset. Käytä {1} nähdäksesi sidotut avaimet.", + "Käytä {1} lisätäksesi uuden näppäimistön ja {2} poistaaksesi yhden.", + "Default keys are:{1} {1} ajoneuvon moottorille, {2} valoille ja {3} lukitsemiselle/lukituksen avaamiselle", + "Paina {1} nähdäksesi kohteesi ja {2} varustaaksesi kohteita tai {3} poistaaksesi kaikki.", + "Paina {1} käyttääksesi kohdetta, jota pidät, paina {2} pudottaaksesi sen tai paina {3} noutaaksesi esineen maasta." + ], + "BusinessHelp": [ + "Käytä {1} tuotteiden ostamiseen tai {2} nähdäksesi luettelon myytävistä missä tahansa yrityksessä", + "Yritykset näkyvät sinisillä nimillä sisäänkäynnin kuvakkeen yläpuolella.", + "Yrityksen omistajan komennot: {1}", + "Uusi myytävä auto ilmestyy, kun ajat pois myyjän luota." + ], + "ClanHelp": [ + "Pyydä järjestelmänvalvojaa luomaan Claani (Samanlainen kuin ryhmät/ryhmät/perheet)", + "Claanin omistajilla on täysi määräysvalta klaaniin, kun se on luotu", + "Clanin komennot: {1}", + "Lisää klaanikomentoja: {1}" + ], + "RadioStationHelp": [ + "Aseta asema ajoneuvollesi, talollesi tai yrityksellesi käyttämällä {1}-merkkiä", + "Käytä {2} nähdäksesi luettelon asemista", + "Voit muuttaa radion suoratoiston äänenvoimakkuutta käyttämällä {1}-arvoa 0-100 prosentteina" + ], + "WealthAndTaxHelp": [ + "Palkkapäivän verot ovat {1} prosenttia lasketusta omaisuudestasi.", + "Laskettu varallisuus on kokonaissumma, joka perustuu siihen, kuinka monta ajoneuvoa, taloa ja yritystä sinulla on.", + "Jokainen ajoneuvo on {1}, jokainen talo on {2} ja jokainen yritys on {3}", + "Käytä {1} nähdäksesi nykyisen varallisuutesi ja {2} nähdäksesi kuinka paljon maksat veroja jokaisena palkkapäivänä" + ], + "MustBeInAVehicle": "Sinun täytyy olla ajoneuvossa!", + "MustBeInOrNearVehicle": "Sinun on oltava ajoneuvossa tai sen lähellä!", + "MustBeInVehicleFrontSeat": "Sinun tulee istua auton etupenkillä!", + "MustBeInVehicleDriverSeat": "Sinun täytyy olla kuljettaja!", + "DontHaveVehicleKey": "Sinulla ei ole avainta tähän ajoneuvoon!", + "NoGateAccess": "Sinulla ei ole pääsyä tälle portille!", + "GateBroken": "tämä portti on rikki!", + "GateHacked": "Portti ei vastaa!", + "RadioJammed": "Radiosta kuuluu vain staattista ääntä.", + "VehicleNotForSale": "Tämä ajoneuvo ei ole myynnissä!", + "VehicleNotForRent": "This vehicle is not for rent!", + "BusinessNotForSale": "Tämä yritys ei ole myytävänä!", + "BusinessNotForRent": "Tämä yritys ei ole vuokrattavissa!", + "HouseNotForSale": "Tämä talo ei ole myynnissä!", + "HouseNotForRent": "Tämä talo ei ole vuokrattavissa!", + "DealershipPurchaseTestDrive": "Aja ajoneuvo pois jälleenmyyjältä ostaaksesi se tai mene ulos peruuttaaksesi.", + "DealershipPurchaseExitedVehicle": "Peruutit ajoneuvon oston poistumalla ajoneuvosta!", + "VehiclePurchaseComplete": "Tämä ajoneuvo on nyt sinun! Se säästyy minne jätätkin sen.", + "VehiclePurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä ajoneuvoa!", + "HousePurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä taloa!", + "BusinessPurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä yritystä", + + "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", + "GUIAccountSettingToggle": "You have turned {1} GUI", + + "ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations", + "CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.", + "SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.", + "BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!", + "JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!", + "PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!", + "ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!", + "PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!", + "EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!", + "AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!", + "AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!", + "YourVehicleRespawned": "🚗 Your vehicle has been respawned!", + "PlayerIPBanned": "💀 {1} has been IP banned!", + "PlayerCharacterBanned": "💀 {1} has been character banned!", + "PlayerSubNetBanned": "💀 {1} has been subnet banned!", + "CantModifyBusiness": "You can't manage or modify this business!", + "CantModifyHouse": "You can't manage or modify this house!", + "ServerTimeSet": "⏰ {1} set the time to {2}", + "ServerWeatherSet": "☁️ {1} set the weather to {2}", + "ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}", + "AllJobsReloaded": "💼 All server jobs have been reloaded by an admin", + "ServerLogoSet": "{1} turned the server logo image {2}", + "ServerGUISet": "🖥️ {1} turned GUI for this server {2}", + "ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}", + "ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}", + "ServerJobBlipsSet": "💼 {1} turned all job blips {2}", + "ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}", + "ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}", + "ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}", + "BusinessBuyItemsLabel": "Use {1} to purchase items", + "PropertyEnterCommandLabel": "Use {1} to enter", + "PropertyEnterKeyPressLabel": "Press {1} to enter", + "PropertyForSaleLabel": "For sale: ${1}", + "PropertyForRentLabel": "For rent: ${1} every payday", + "RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.", + "LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!", + "NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!", + "NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!", + "AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!", + "Closed": "Closed", + "Open": "Open", + "VehicleDealershipLabel": "Enter a vehicle as driver to buy it", + "TakeJobLabel": "Use {1} to work here", + "StartWorkLabel": "Use {1} to start working", + "JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working", + "NotYourJobLabel": "You already have a different job. Use {1} if you want this one", + "JobLabel": "{1} Job", + "PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}", + "AllHousesReloaded": "🏘️ All houses have been reloaded by an admin", + "AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!", + "PlayerKicked": "🦶 {1} has been kicked from the server", + "AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!", + "UnableToDoThat": "You aren't able to do that", + "SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?", + "SetVehicleClanConfirmTitle": "Warning!", + "SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!", + "SetItemPriceBelowOrderPriceTitle": "Warning!", + "MustOwnVehicle": "You don't own this vehicle!", + "RandomTips": [ + "Look for yellow dots on your map for job locations", + "You can set custom key binds. Use {1} for details", + "Use {1} if you don't want to see tips and extra information", + "You can edit your keybinds using {1} and {2}", + "Press ℹ️ to see your inventory, and use number keys to select an item", + "Use {1} at a business to purchase items", + "Found a bug? Report it with {1}", + "Have an idea or suggestion for the server? Let the devs know using {1}", + "Want to buy a business? Use {1} at one for sale", + "Want to buy a house? Use {1} at one for sale", + "Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!", + "Switch to any of your characters with {1}", + "Use {1} to automatically login when connecting with the same IP", + "Use {1} to turn on/off the lights in your house or business", + "Use {1} to play an internet radio station in your car, house, or business", + "Want to make a clan? Use {1} for details", + "Legal weapons can be purchased at any ammunation" + ], + "PromptResponseTip": "Use {1} to accept or {2} to decline", + "PlayerConnecting": "👋 {1} is connecting to the server ...", + "GetStartedJobVehicle": "Get in a {1} to get started.", + "VehicleTypes": { + "Car": "Car", + "Truck": "Truck", + "Van": "Van", + "Taxi": "Taxi", + "Bus": "Bus", + "PoliceCar": "Police Car", + "Ambulance": "Ambulance", + "FireTruck": "Fire Truck", + "Bike": "Bike", + "Motorbike": "Motorbike", + "Boat": "Boat", + "Helicopter": "Helicopter", + "Plane": "Plane", + "Train": "Train" + }, + "AlreadyOnJobRoute": "You are already doing a job route!", + "GaveVehicleToClan": "You gave this {1} to your clan!", + "JobDisabled": "This job is disabled!", + "SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?", + "SetHouseClanConfirmTitle": "Warning!", + "SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?", + "SetBusinessClanConfirmTitle": "Warning!", + "MustOwnHouse": "You don't own this house!", + "MustOwnBusiness": "You don't own this business!", + "GaveHouseToClan": "You gave this house to your clan!", + "GaveBusinessToClan": "You gave this business to your clan!", + "BuyBusinessConfirmMessage": "Are you sure you want to buy this business?", + "BuyBusinessConfirmTitle": "Attention!", + "BuyHouseConfirmMessage": "Are you sure you want to buy this house?", + "BuyHouseConfirmTitle": "Attention!", + "BuyBusinessLabel": "Use {1} to buy this business", + "BuyHouseLabel": "Use {1} to buy this house", + "RentHouseLabel": "Use {1} to rent this house", + "DisconnectReasons": [ + "Lost Connection", + "Disconnected", + "Unsupported Client", + "Wrong Game", + "Incorrect Password", + "Unsupported Executable", + "Disconnected", + "Banned", + "Failed", + "Invalid Name", + "Crashed", + "Modified Game" + ], + "AccountEmailAlreadyVerified": "You already set and verified your email!", + "EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.", + "GUIPlayAsCharacterButton": "Play", + "GUINewCharacterButton": "New character", + "GUIPreviousCharacterButton": "Previous", + "GUINextCharacterButton": "Next", + "GUICharacterSelectWindowTitle": "Select a character", + "GUICharacterSelectMoneyLabel": "Money: ${1}", + "GUICharacterSelectClanLabel": "Clan: {1}", + "GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago", + "GUILoginWindowLabelEnterPassword": "Please enter your password", + "GUILoginWindowSubmitButton": "Login", + "GUILoginWindowResetPasswordButton": "Reset password", + "GUILoginWindowPasswordPlaceholder": "Password", + "GUILoginWindowForgotPasswordLabel": "Forgot your password?", + "GUIRegisterWindowLabelCreateAccount": "Create an account", + "GUIRegisterWindowPasswordPlaceholder": "Password", + "GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password", + "GUIRegisterWindowEmailPlaceholder": "Email", + "GUIRegisterWindowSubmitButton": "Create account", + "GUINewCharacterMessageLabel": "Name your character", + "GUINewCharacterFirstNamePlaceholder": "First Name", + "GUINewCharacterLastNamePlaceholder": "Last Name", + "GUIChangePasswordWindowTitle": "Change Password", + "GUIChangePasswordPasswordLabel": "Enter a new password", + "GUIChangePasswordPasswordPlaceholder": "Password", + "GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password", + "GUIChangePasswordSubmitButton": "Change Password", + "GUIResetPasswordWindowMessage": "Reset Password", + "GUIResetPasswordConfirmEmailLabel": "Please confirm your email", + "GUIResetPasswordEmailPlaceholder": "Email", + "GUIResetPasswordSubmitButton": "Reset Password", + "GUIResetPasswordLoginButton": "Login", + "GUIResetPasswordRememberMessage": "Remember your password?", + "HeaderJobList": "Jobs", + "HeaderBusinessInfo": "Business Info", + "HeaderHouseInfo": "House Info", + "HeaderClanInfo": "Clan Info", + "Locales": { + "English": "Englanti", + "Russian": "Venäjä", + "Spanish": "Espanja", + "German": "Saksa", + "Dutch": "Hollanti", + "Polish": "Puola", + "Chinese": "Chinese", + "French": "French", + "Japanese": "Japanese", + "Slovak": "Slovak", + "Arabic": "Arabic" + } +} diff --git a/locale/french.json b/locale/french.json new file mode 100644 index 00000000..4c698462 --- /dev/null +++ b/locale/french.json @@ -0,0 +1,559 @@ +{ + "TranslationProvidedBy": "Cocam", + "LocaleEnglishName": "French", + + "LocaleNativeName": "Français", + "LocaleOffer": "Ce serveur est disponible en Français. Appuie sur {1} pour changer la langue.", + "LocaleChanged1": "La langue est maintenant paramétrée sur {1}", + "LocaleChanged2": "Le serveur va maintenant afficher les messages en {1}", + "LocaleChangedNote": "Cela ne change pas les messages des autres joueurs", + "AccentsListHeader": "Accents", + "HelpMainListHeader": "Aide Catégorie", + "AccentNotFound": "Accent non trouvé", + "AccentSet": "Vous avez paramétré votre accent sur {1}", + "InvalidAnimation": "L'animation n'existe pas", + "AnimationCommandTip": "Utilise la commande {1} pour voir la liste des animations valides", + "InvalidAnimationDistance": "La distance doit être entre 0 et 3", + "AnimationStopCommandTip": "Utilise la commande {1} pour arrêter l'animation", + "CantBanClient": "Vous ne pouvez pas bannir cette personne", + "PlayerAccountBanned": "le compte {1} a été banni", + "ClanNotFound": "Clan non trouvé", + "ClanNameTaken": "Un clan avec ce nom existe déjà", + "PlayerNotFound": "Joueur non trouvé", + "ClanCantRemoveRanks": "Vous ne pouvez pas retirer le rang du clan", + "ClanCantAddRanks": "Vous ne pouvez pas ajouter de rang au clan", + "ClanRankNotFound": "Le rang du clan est introuvable", + "ClanCantChangeMemberTag": "Vous ne pouvez pas modifier les tags des membres du clan", + "ClanPlayerNotInSameClan": "Ce joueur n'est pas dans votre clan", + "ClanCantChangeRankLevel": "Vous ne pouvez pas modifier le niveau du rang du clan", + "ClanCantChangeRankTag": "Vous ne pouvez pas modifier les tags du rang du clan", + "NameNotRegistered": "Votre nom n'est pas enregistré ! Utilise {1} pour créer un compte.", + "AutomaticLoginIPToggle": "La connexion automatique par IP est maintenant {1}", + "CouldNotRegisterAccount": "Un problème est survenue lors de la création de votre compte. Merci de bien vouloir contacter le staff.", + "RandomTipsToggle": "Les conseils aléatoires sont maintenant {1}", + "ActionTipsToggle": "Les conseils d'action sont maintenant {1}", + "AutoSpawnLastCharToggle": "Réapparition automatique du dernier personnage utilisé est {1}", + "AccountGUISettingToggle": "🖥️ la GUI est {1}", + "On": "On", + "Off": "Off", + "Yes": "Oui", + "No": "Non", + "True": "Vrai", + "False": "Faux", + "Locked": "Verrouillé", + "Unlocked": "Déverrouillé", + "PasswordNotGoodEnough": "Le nouveau mot de passe doit répondre aux exigences !", + "PasswordNeedsBase": "Le mot de passe doit au moins avoir : {1}", + "PasswordNeedsCapitals": "{1} Une majuscule", + "PasswordNeedsNumbers": "{1} Un nombre", + "PasswordNeedsSymbols": "{1} Un caractère spécial", + "PasswordsDontMatch": "Le mot de passe et la confirmation ne sont pas identiques !", + "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!", + "PlayerJoined": "{1} has joined the game from {2}!", + "PlayerLeftServer": "{1} has left the game! ({2})", + "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, {2} 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!", + + "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", + "GUIAccountSettingToggle": "You have turned {1} GUI", + + "ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations", + "CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.", + "SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.", + "BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!", + "JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!", + "PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!", + "ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!", + "PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!", + "EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!", + "AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!", + "AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!", + "YourVehicleRespawned": "🚗 Your vehicle has been respawned!", + "PlayerIPBanned": "💀 {1} has been IP banned!", + "PlayerCharacterBanned": "💀 {1} has been character banned!", + "PlayerSubNetBanned": "💀 {1} has been subnet banned!", + "CantModifyBusiness": "You can't manage or modify this business!", + "CantModifyHouse": "You can't manage or modify this house!", + "ServerTimeSet": "⏰ {1} set the time to {2}", + "ServerWeatherSet": "☁️ {1} set the weather to {2}", + "ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}", + "AllJobsReloaded": "💼 All server jobs have been reloaded by an admin", + "ServerLogoSet": "{1} turned the server logo image {2}", + "ServerGUISet": "🖥️ {1} turned GUI for this server {2}", + "ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}", + "ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}", + "ServerJobBlipsSet": "💼 {1} turned all job blips {2}", + "ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}", + "ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}", + "ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}", + "BusinessBuyItemsLabel": "Use {1} to purchase items", + "PropertyEnterCommandLabel": "Use {1} to enter", + "PropertyEnterKeyPressLabel": "Press {1} to enter", + "PropertyForSaleLabel": "For sale: ${1}", + "PropertyForRentLabel": "For rent: ${1} every payday", + "RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.", + "LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!", + "NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!", + "NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!", + "AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!", + "Closed": "Closed", + "Open": "Open", + "VehicleDealershipLabel": "Enter a vehicle as driver to buy it", + "TakeJobLabel": "Use {1} to work here", + "StartWorkLabel": "Use {1} to start working", + "JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working", + "NotYourJobLabel": "You already have a different job. Use {1} if you want this one", + "JobLabel": "{1} Job", + "PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}", + "AllHousesReloaded": "🏘️ All houses have been reloaded by an admin", + "AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!", + "PlayerKicked": "🦶 {1} has been kicked from the server", + "AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!", + "UnableToDoThat": "You aren't able to do that", + "SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?", + "SetVehicleClanConfirmTitle": "Warning!", + "SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!", + "SetItemPriceBelowOrderPriceTitle": "Warning!", + "MustOwnVehicle": "You don't own this vehicle!", + "RandomTips": [ + "Look for yellow dots on your map for job locations", + "You can set custom key binds. Use {1} for details", + "Use {1} if you don't want to see tips and extra information", + "You can edit your keybinds using {1} and {2}", + "Press ℹ️ to see your inventory, and use number keys to select an item", + "Use {1} at a business to purchase items", + "Found a bug? Report it with {1}", + "Have an idea or suggestion for the server? Let the devs know using {1}", + "Want to buy a business? Use {1} at one for sale", + "Want to buy a house? Use {1} at one for sale", + "Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!", + "Switch to any of your characters with {1}", + "Use {1} to automatically login when connecting with the same IP", + "Use {1} to turn on/off the lights in your house or business", + "Use {1} to play an internet radio station in your car, house, or business", + "Want to make a clan? Use {1} for details", + "Legal weapons can be purchased at any ammunation" + ], + "PromptResponseTip": "Use {1} to accept or {2} to decline", + "PlayerConnecting": "👋 {1} is connecting to the server ...", + "GetStartedJobVehicle": "Get in a {1} to get started.", + "VehicleTypes": { + "Car": "Car", + "Truck": "Truck", + "Van": "Van", + "Taxi": "Taxi", + "Bus": "Bus", + "PoliceCar": "Police Car", + "Ambulance": "Ambulance", + "FireTruck": "Fire Truck", + "Bike": "Bike", + "Motorbike": "Motorbike", + "Boat": "Boat", + "Helicopter": "Helicopter", + "Plane": "Plane", + "Train": "Train" + }, + "AlreadyOnJobRoute": "You are already doing a job route!", + "GaveVehicleToClan": "You gave this {1} to your clan!", + "JobDisabled": "This job is disabled!", + "SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?", + "SetHouseClanConfirmTitle": "Warning!", + "SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?", + "SetBusinessClanConfirmTitle": "Warning!", + "MustOwnHouse": "You don't own this house!", + "MustOwnBusiness": "You don't own this business!", + "GaveHouseToClan": "You gave this house to your clan!", + "GaveBusinessToClan": "You gave this business to your clan!", + "BuyBusinessConfirmMessage": "Are you sure you want to buy this business?", + "BuyBusinessConfirmTitle": "Attention!", + "BuyHouseConfirmMessage": "Are you sure you want to buy this house?", + "BuyHouseConfirmTitle": "Attention!", + "BuyBusinessLabel": "Use {1} to buy this business", + "BuyHouseLabel": "Use {1} to buy this house", + "RentHouseLabel": "Use {1} to rent this house", + "DisconnectReasons": [ + "Lost Connection", + "Disconnected", + "Unsupported Client", + "Wrong Game", + "Incorrect Password", + "Unsupported Executable", + "Disconnected", + "Banned", + "Failed", + "Invalid Name", + "Crashed", + "Modified Game" + ], + "AccountEmailAlreadyVerified": "You already set and verified your email!", + "EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.", + "GUIPlayAsCharacterButton": "Play", + "GUINewCharacterButton": "New character", + "GUIPreviousCharacterButton": "Previous", + "GUINextCharacterButton": "Next", + "GUICharacterSelectWindowTitle": "Select a character", + "GUICharacterSelectMoneyLabel": "Money: ${1}", + "GUICharacterSelectClanLabel": "Clan: {1}", + "GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago", + "GUILoginWindowLabelEnterPassword": "Please enter your password", + "GUILoginWindowSubmitButton": "Login", + "GUILoginWindowResetPasswordButton": "Reset password", + "GUILoginWindowPasswordPlaceholder": "Password", + "GUILoginWindowForgotPasswordLabel": "Forgot your password?", + "GUIRegisterWindowLabelCreateAccount": "Create an account", + "GUIRegisterWindowPasswordPlaceholder": "Password", + "GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password", + "GUIRegisterWindowEmailPlaceholder": "Email", + "GUIRegisterWindowSubmitButton": "Create account", + "GUINewCharacterMessageLabel": "Name your character", + "GUINewCharacterFirstNamePlaceholder": "First Name", + "GUINewCharacterLastNamePlaceholder": "Last Name", + "GUINewCharacterSubmitButton": "Create Character", + "GUIChangePasswordWindowTitle": "Change Password", + "GUIChangePasswordPasswordLabel": "Enter a new password", + "GUIChangePasswordPasswordPlaceholder": "Password", + "GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password", + "GUIChangePasswordSubmitButton": "Change Password", + "GUIResetPasswordWindowMessage": "Reset Password", + "GUIResetPasswordConfirmEmailLabel": "Please confirm your email", + "GUIResetPasswordEmailPlaceholder": "Email", + "GUIResetPasswordSubmitButton": "Reset Password", + "GUIResetPasswordLoginButton": "Login", + "GUIResetPasswordRememberMessage": "Remember your password?", + "HeaderJobList": "Jobs", + "HeaderBusinessInfo": "Business Info", + "HeaderHouseInfo": "House Info", + "HeaderClanInfo": "Clan Info", + "Locales": { + "English": "English", + "Russian": "Russian", + "Spanish": "Spanish", + "German": "German", + "Dutch": "Dutch", + "Polish": "Polish", + "Chinese": "Chinese", + "French": "French", + "Japanese": "Japanese", + "Slovak": "Slovak", + "Arabic": "Arabic" + } +} \ No newline at end of file diff --git a/locale/german.json b/locale/german.json new file mode 100644 index 00000000..28afe0d1 --- /dev/null +++ b/locale/german.json @@ -0,0 +1,558 @@ +{ + "TranslationProvidedBy": "Sladernimo", + "LocaleEnglishName": "German", + + "LocaleNativeName": "German", + "LocaleOffer": "This server is available in German. 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", + "HelpMainListHeader": "Help Categories", + "AccentNotFound": "Accent not found", + "AccentSet": "You set your accent to {1}", + "InvalidAnimation": "That animation doesn't exist", + "AnimationCommandTip": "Use {1} to see a list of valid animations", + "InvalidAnimationDistance": "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!", + "PlayerJoined": "{1} has joined the game from {2}!", + "PlayerLeftServer": "{1} has left the game! ({2})", + "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, {2} 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!", + + "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", + "GUIAccountSettingToggle": "You have turned {1} GUI", + + "ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations", + "CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.", + "SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.", + "BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!", + "JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!", + "PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!", + "ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!", + "PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!", + "EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!", + "AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!", + "AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!", + "YourVehicleRespawned": "🚗 Your vehicle has been respawned!", + "PlayerIPBanned": "💀 {1} has been IP banned!", + "PlayerCharacterBanned": "💀 {1} has been character banned!", + "PlayerSubNetBanned": "💀 {1} has been subnet banned!", + "CantModifyBusiness": "You can't manage or modify this business!", + "CantModifyHouse": "You can't manage or modify this house!", + "ServerTimeSet": "⏰ {1} set the time to {2}", + "ServerWeatherSet": "☁️ {1} set the weather to {2}", + "ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}", + "AllJobsReloaded": "💼 All server jobs have been reloaded by an admin", + "ServerLogoSet": "{1} turned the server logo image {2}", + "ServerGUISet": "🖥️ {1} turned GUI for this server {2}", + "ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}", + "ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}", + "ServerJobBlipsSet": "💼 {1} turned all job blips {2}", + "ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}", + "ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}", + "ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}", + "BusinessBuyItemsLabel": "Use {1} to purchase items", + "PropertyEnterCommandLabel": "Use {1} to enter", + "PropertyEnterKeyPressLabel": "Press {1} to enter", + "PropertyForSaleLabel": "For sale: ${1}", + "PropertyForRentLabel": "For rent: ${1} every payday", + "RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.", + "LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!", + "NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!", + "NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!", + "AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!", + "Closed": "Closed", + "Open": "Open", + "VehicleDealershipLabel": "Enter a vehicle as driver to buy it", + "TakeJobLabel": "Use {1} to work here", + "StartWorkLabel": "Use {1} to start working", + "JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working", + "NotYourJobLabel": "You already have a different job. Use {1} if you want this one", + "JobLabel": "{1} Job", + "PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}", + "AllHousesReloaded": "🏘️ All houses have been reloaded by an admin", + "AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!", + "PlayerKicked": "🦶 {1} has been kicked from the server", + "AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!", + "UnableToDoThat": "You aren't able to do that", + "SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?", + "SetVehicleClanConfirmTitle": "Warning!", + "SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!", + "SetItemPriceBelowOrderPriceTitle": "Warning!", + "MustOwnVehicle": "You don't own this vehicle!", + "RandomTips": [ + "Look for yellow dots on your map for job locations", + "You can set custom key binds. Use {1} for details", + "Use {1} if you don't want to see tips and extra information", + "You can edit your keybinds using {1} and {2}", + "Press ℹ️ to see your inventory, and use number keys to select an item", + "Use {1} at a business to purchase items", + "Found a bug? Report it with {1}", + "Have an idea or suggestion for the server? Let the devs know using {1}", + "Want to buy a business? Use {1} at one for sale", + "Want to buy a house? Use {1} at one for sale", + "Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!", + "Switch to any of your characters with {1}", + "Use {1} to automatically login when connecting with the same IP", + "Use {1} to turn on/off the lights in your house or business", + "Use {1} to play an internet radio station in your car, house, or business", + "Want to make a clan? Use {1} for details", + "Legal weapons can be purchased at any ammunation" + ], + "PromptResponseTip": "Use {1} to accept or {2} to decline", + "PlayerConnecting": "👋 {1} is connecting to the server ...", + "GetStartedJobVehicle": "Get in a {1} to get started.", + "VehicleTypes": { + "Car": "Car", + "Truck": "Truck", + "Van": "Van", + "Taxi": "Taxi", + "Bus": "Bus", + "PoliceCar": "Police Car", + "Ambulance": "Ambulance", + "FireTruck": "Fire Truck", + "Bike": "Bike", + "Motorbike": "Motorbike", + "Boat": "Boat", + "Helicopter": "Helicopter", + "Plane": "Plane", + "Train": "Train" + }, + "AlreadyOnJobRoute": "You are already doing a job route!", + "GaveVehicleToClan": "You gave this {1} to your clan!", + "JobDisabled": "This job is disabled!", + "SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?", + "SetHouseClanConfirmTitle": "Warning!", + "SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?", + "SetBusinessClanConfirmTitle": "Warning!", + "MustOwnHouse": "You don't own this house!", + "MustOwnBusiness": "You don't own this business!", + "GaveHouseToClan": "You gave this house to your clan!", + "GaveBusinessToClan": "You gave this business to your clan!", + "BuyBusinessConfirmMessage": "Are you sure you want to buy this business?", + "BuyBusinessConfirmTitle": "Attention!", + "BuyHouseConfirmMessage": "Are you sure you want to buy this house?", + "BuyHouseConfirmTitle": "Attention!", + "BuyBusinessLabel": "Use {1} to buy this business", + "BuyHouseLabel": "Use {1} to buy this house", + "RentHouseLabel": "Use {1} to rent this house", + "DisconnectReasons": [ + "Lost Connection", + "Disconnected", + "Unsupported Client", + "Wrong Game", + "Incorrect Password", + "Unsupported Executable", + "Disconnected", + "Banned", + "Failed", + "Invalid Name", + "Crashed", + "Modified Game" + ], + "AccountEmailAlreadyVerified": "You already set and verified your email!", + "EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.", + "GUIPlayAsCharacterButton": "Spielen", + "GUINewCharacterButton": "Neuer Charakter", + "GUIPreviousCharacterButton": "Zurück", + "GUINextCharacterButton": "Weiter", + "GUICharacterSelectWindowTitle": "Wähle einen Charakter", + "GUICharacterSelectMoneyLabel": "Geld: ${1}", + "GUICharacterSelectClanLabel": "Clan: {1}", + "GUICharacterSelectLastPlayedLabel": "Zuletzt gespielt vor: {1} Tagen, {2} Stunden, {3} Minuten", + "GUILoginWindowLabelEnterPassword": "Bitte Passwort eingeben", + "GUILoginWindowSubmitButton": "Login", + "GUILoginWindowResetPasswordButton": "Passwort zurücksetzen", + "GUILoginWindowPasswordPlaceholder": "Passwort", + "GUILoginWindowForgotPasswordLabel": "Passwort vergessen?", + "GUIRegisterWindowLabelCreateAccount": "Profil erstellen", + "GUIRegisterWindowPasswordPlaceholder": "Passwort", + "GUIRegisterWindowConfirmPasswordPlaceholder": "Passwort bestätigen", + "GUIRegisterWindowEmailPlaceholder": "Email", + "GUIRegisterWindowSubmitButton": "Profil erstellen", + "GUINewCharacterMessageLabel": "Charakter Name", + "GUINewCharacterFirstNamePlaceholder": "Vorname", + "GUINewCharacterLastNamePlaceholder": "Nachname", + "GUIChangePasswordWindowTitle": "Passwort ändern", + "GUIChangePasswordPasswordLabel": "Neues Passwort eingeben", + "GUIChangePasswordPasswordPlaceholder": "Passwort", + "GUIChangePasswordConfirmPasswordPlaceholder": "Passwort bestätigen", + "GUIChangePasswordSubmitButton": "Passwort ändern", + "GUIResetPasswordWindowMessage": "Passwort zurücksetzen", + "GUIResetPasswordConfirmEmailLabel": "Bitte bestätige deine Email", + "GUIResetPasswordEmailPlaceholder": "Email", + "GUIResetPasswordSubmitButton": "Passwort zurücksetzen", + "GUIResetPasswordLoginButton": "Login", + "GUIResetPasswordRememberMessage": "Passwort bekannt?", + "HeaderJobList": "Jobs", + "HeaderBusinessInfo": "Business Info", + "HeaderHouseInfo": "House Info", + "HeaderClanInfo": "Clan Info", + "Locales": { + "English": "English", + "Russian": "Russian", + "Spanish": "Spanish", + "German": "German", + "Dutch": "Dutch", + "Polish": "Polish", + "Chinese": "Chinese", + "French": "French", + "Japanese": "Japanese", + "Slovak": "Slovak", + "Arabic": "Arabic" + } +} \ No newline at end of file diff --git a/locale/japanese.json b/locale/japanese.json new file mode 100644 index 00000000..ccd7deae --- /dev/null +++ b/locale/japanese.json @@ -0,0 +1,559 @@ +{ + "TranslationProvidedBy": "Cocam", + "LocaleEnglishName": "Japanese", + + "LocaleNativeName": "Japanese (Translate this to your native language)", + "LocaleOffer": "This server is available in Japanese. 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", + "HelpMainListHeader": "Help Categories", + "AccentNotFound": "Accent not found", + "AccentSet": "You set your accent to {1}", + "InvalidAnimation": "That animation doesn't exist", + "AnimationCommandTip": "Use {1} to see a list of valid animations", + "InvalidAnimationDistance": "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!", + "PlayerJoined": "{1} has joined the game from {2}!", + "PlayerLeftServer": "{1} has left the game! ({2})", + "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, {2} 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!", + + "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", + "GUIAccountSettingToggle": "You have turned {1} GUI", + + "ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations", + "CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.", + "SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.", + "BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!", + "JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!", + "PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!", + "ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!", + "PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!", + "EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!", + "AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!", + "AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!", + "YourVehicleRespawned": "🚗 Your vehicle has been respawned!", + "PlayerIPBanned": "💀 {1} has been IP banned!", + "PlayerCharacterBanned": "💀 {1} has been character banned!", + "PlayerSubNetBanned": "💀 {1} has been subnet banned!", + "CantModifyBusiness": "You can't manage or modify this business!", + "CantModifyHouse": "You can't manage or modify this house!", + "ServerTimeSet": "⏰ {1} set the time to {2}", + "ServerWeatherSet": "☁️ {1} set the weather to {2}", + "ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}", + "AllJobsReloaded": "💼 All server jobs have been reloaded by an admin", + "ServerLogoSet": "{1} turned the server logo image {2}", + "ServerGUISet": "🖥️ {1} turned GUI for this server {2}", + "ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}", + "ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}", + "ServerJobBlipsSet": "💼 {1} turned all job blips {2}", + "ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}", + "ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}", + "ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}", + "BusinessBuyItemsLabel": "Use {1} to purchase items", + "PropertyEnterCommandLabel": "Use {1} to enter", + "PropertyEnterKeyPressLabel": "Press {1} to enter", + "PropertyForSaleLabel": "For sale: ${1}", + "PropertyForRentLabel": "For rent: ${1} every payday", + "RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.", + "LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!", + "NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!", + "NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!", + "AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!", + "Closed": "Closed", + "Open": "Open", + "VehicleDealershipLabel": "Enter a vehicle as driver to buy it", + "TakeJobLabel": "Use {1} to work here", + "StartWorkLabel": "Use {1} to start working", + "JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working", + "NotYourJobLabel": "You already have a different job. Use {1} if you want this one", + "JobLabel": "{1} Job", + "PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}", + "AllHousesReloaded": "🏘️ All houses have been reloaded by an admin", + "AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!", + "PlayerKicked": "🦶 {1} has been kicked from the server", + "AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!", + "UnableToDoThat": "You aren't able to do that", + "SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?", + "SetVehicleClanConfirmTitle": "Warning!", + "SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!", + "SetItemPriceBelowOrderPriceTitle": "Warning!", + "MustOwnVehicle": "You don't own this vehicle!", + "RandomTips": [ + "Look for yellow dots on your map for job locations", + "You can set custom key binds. Use {1} for details", + "Use {1} if you don't want to see tips and extra information", + "You can edit your keybinds using {1} and {2}", + "Press ℹ️ to see your inventory, and use number keys to select an item", + "Use {1} at a business to purchase items", + "Found a bug? Report it with {1}", + "Have an idea or suggestion for the server? Let the devs know using {1}", + "Want to buy a business? Use {1} at one for sale", + "Want to buy a house? Use {1} at one for sale", + "Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!", + "Switch to any of your characters with {1}", + "Use {1} to automatically login when connecting with the same IP", + "Use {1} to turn on/off the lights in your house or business", + "Use {1} to play an internet radio station in your car, house, or business", + "Want to make a clan? Use {1} for details", + "Legal weapons can be purchased at any ammunation" + ], + "PromptResponseTip": "Use {1} to accept or {2} to decline", + "PlayerConnecting": "👋 {1} is connecting to the server ...", + "GetStartedJobVehicle": "Get in a {1} to get started.", + "VehicleTypes": { + "Car": "Car", + "Truck": "Truck", + "Van": "Van", + "Taxi": "Taxi", + "Bus": "Bus", + "PoliceCar": "Police Car", + "Ambulance": "Ambulance", + "FireTruck": "Fire Truck", + "Bike": "Bike", + "Motorbike": "Motorbike", + "Boat": "Boat", + "Helicopter": "Helicopter", + "Plane": "Plane", + "Train": "Train" + }, + "AlreadyOnJobRoute": "You are already doing a job route!", + "GaveVehicleToClan": "You gave this {1} to your clan!", + "JobDisabled": "This job is disabled!", + "SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?", + "SetHouseClanConfirmTitle": "Warning!", + "SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?", + "SetBusinessClanConfirmTitle": "Warning!", + "MustOwnHouse": "You don't own this house!", + "MustOwnBusiness": "You don't own this business!", + "GaveHouseToClan": "You gave this house to your clan!", + "GaveBusinessToClan": "You gave this business to your clan!", + "BuyBusinessConfirmMessage": "Are you sure you want to buy this business?", + "BuyBusinessConfirmTitle": "Attention!", + "BuyHouseConfirmMessage": "Are you sure you want to buy this house?", + "BuyHouseConfirmTitle": "Attention!", + "BuyBusinessLabel": "Use {1} to buy this business", + "BuyHouseLabel": "Use {1} to buy this house", + "RentHouseLabel": "Use {1} to rent this house", + "DisconnectReasons": [ + "Lost Connection", + "Disconnected", + "Unsupported Client", + "Wrong Game", + "Incorrect Password", + "Unsupported Executable", + "Disconnected", + "Banned", + "Failed", + "Invalid Name", + "Crashed", + "Modified Game" + ], + "AccountEmailAlreadyVerified": "You already set and verified your email!", + "EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.", + "GUIPlayAsCharacterButton": "Play", + "GUINewCharacterButton": "New character", + "GUIPreviousCharacterButton": "Previous", + "GUINextCharacterButton": "Next", + "GUICharacterSelectWindowTitle": "Select a character", + "GUICharacterSelectMoneyLabel": "Money: ${1}", + "GUICharacterSelectClanLabel": "Clan: {1}", + "GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago", + "GUILoginWindowLabelEnterPassword": "Please enter your password", + "GUILoginWindowSubmitButton": "Login", + "GUILoginWindowResetPasswordButton": "Reset password", + "GUILoginWindowPasswordPlaceholder": "Password", + "GUILoginWindowForgotPasswordLabel": "Forgot your password?", + "GUIRegisterWindowLabelCreateAccount": "Create an account", + "GUIRegisterWindowPasswordPlaceholder": "Password", + "GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password", + "GUIRegisterWindowEmailPlaceholder": "Email", + "GUIRegisterWindowSubmitButton": "Create account", + "GUINewCharacterMessageLabel": "Name your character", + "GUINewCharacterFirstNamePlaceholder": "First Name", + "GUINewCharacterLastNamePlaceholder": "Last Name", + "GUINewCharacterSubmitButton": "Create Character", + "GUIChangePasswordWindowTitle": "Change Password", + "GUIChangePasswordPasswordLabel": "Enter a new password", + "GUIChangePasswordPasswordPlaceholder": "Password", + "GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password", + "GUIChangePasswordSubmitButton": "Change Password", + "GUIResetPasswordWindowMessage": "Reset Password", + "GUIResetPasswordConfirmEmailLabel": "Please confirm your email", + "GUIResetPasswordEmailPlaceholder": "Email", + "GUIResetPasswordSubmitButton": "Reset Password", + "GUIResetPasswordLoginButton": "Login", + "GUIResetPasswordRememberMessage": "Remember your password?", + "HeaderJobList": "Jobs", + "HeaderBusinessInfo": "Business Info", + "HeaderHouseInfo": "House Info", + "HeaderClanInfo": "Clan Info", + "Locales": { + "English": "English", + "Russian": "Russian", + "Spanish": "Spanish", + "German": "German", + "Dutch": "Dutch", + "Polish": "Polish", + "Chinese": "Chinese", + "French": "French", + "Japanese": "Japanese", + "Slovak": "Slovak", + "Arabic": "Arabic" + } +} \ No newline at end of file diff --git a/scripts/server/business.js b/scripts/server/business.js index 343c09c1..6d4f2de8 100644 --- a/scripts/server/business.js +++ b/scripts/server/business.js @@ -48,10 +48,10 @@ function loadBusinessesFromDatabase() { let tempBusinesses = []; let dbConnection = connectToDatabase(); - let dbQuery = null; - let dbAssoc; + let dbAssoc = []; if(dbConnection) { +<<<<<<< Updated upstream dbQuery = queryDatabase(dbConnection, `SELECT * FROM biz_main WHERE biz_server = ${getServerId()}`); if(dbQuery) { if(dbQuery.numRows > 0) { @@ -64,6 +64,15 @@ function loadBusinessesFromDatabase() { } } freeDatabaseQuery(dbQuery); +======= + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM biz_main WHERE biz_server = ${getServerId()}`); + for(let i in dbAssoc) { + let tempBusinessData = new BusinessData(dbAssoc[i]); + //tempBusinessData.locations = loadBusinessLocationsFromDatabase(tempBusinessData.databaseId); + //tempBusinessData.gameScripts = loadBusinessGameScriptsFromDatabase(tempBusinessData.databaseId); + tempBusinesses.push(tempBusinessData); + logToConsole(LOG_VERBOSE, `[VRR.Business]: Business '${tempBusinessData.name}' (ID ${tempBusinessData.databaseId}) loaded from database successfully!`); +>>>>>>> Stashed changes } disconnectFromDatabase(dbConnection); } diff --git a/scripts/server/event.js b/scripts/server/event.js index 249211d2..2f639f16 100644 --- a/scripts/server/event.js +++ b/scripts/server/event.js @@ -627,7 +627,9 @@ function onPlayerSpawn(client) { // =========================================================================== -function onPlayerCommand(event, client, command, params) { +// Only used for MP mods without an "add command handler" ability +// Not bound on GTA Connected or RageMP +function onPlayerCommand(client, command, params) { if(!doesCommandExist(command)) { processPlayerCommand(command, params, client); } diff --git a/scripts/server/house.js b/scripts/server/house.js index 46ec940f..fe717ff0 100644 --- a/scripts/server/house.js +++ b/scripts/server/house.js @@ -35,15 +35,11 @@ function loadHousesFromDatabase() { let dbAssoc; if(dbConnection) { - let dbQuery = queryDatabase(dbConnection, `SELECT * FROM house_main WHERE house_server = ${getServerId()}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempHouseData = new HouseData(dbAssoc); - tempHouses.push(tempHouseData); - logToConsole(LOG_VERBOSE, `[VRR.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`); - } - } + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM house_main WHERE house_server = ${getServerId()}`); + for(let i in dbAssoc) { + let tempHouseData = new HouseData(dbAssoc[i]); + tempHouses.push(tempHouseData); + logToConsole(LOG_VERBOSE, `[VRR.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`); freeDatabaseQuery(dbQuery); } disconnectFromDatabase(dbConnection); diff --git a/scripts/server/item.js b/scripts/server/item.js index 085b7575..642e9e62 100644 --- a/scripts/server/item.js +++ b/scripts/server/item.js @@ -28,17 +28,12 @@ function initItemScript() { function loadItemsFromDatabase() { let tempItems = []; let dbConnection = connectToDatabase(); - let dbFetchAssoc; + let dbAssoc; if(dbConnection) { - let dbQuery = queryDatabase(dbConnection, `SELECT * FROM item_main WHERE item_server = ${getServerId()}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbFetchAssoc = fetchQueryAssoc(dbQuery)) { - let tempItemData = new ItemData(dbFetchAssoc); - tempItems.push(tempItemData); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM item_main WHERE item_server = ${getServerId()}`); + for(let i in dbAssoc) { + let tempItemData = new ItemData(dbAssoc[i]); + tempItems.push(tempItemData); } disconnectFromDatabase(dbConnection); } @@ -50,17 +45,12 @@ function loadItemsFromDatabase() { function loadItemTypesFromDatabase() { let tempItemTypes = []; let dbConnection = connectToDatabase(); - let dbFetchAssoc; + let dbAssoc; if(dbConnection) { - let dbQuery = queryDatabase(dbConnection, `SELECT * FROM item_type WHERE item_type_enabled = 1 AND item_type_server = ${getServerId()}`); - if(dbQuery) { - if(getQueryNumRows(dbQuery) > 0) { - while(dbFetchAssoc = fetchQueryAssoc(dbQuery)) { - let tempItemTypeData = new ItemTypeData(dbFetchAssoc); - tempItemTypes.push(tempItemTypeData); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM item_type WHERE item_type_enabled = 1 AND item_type_server = ${getServerId()}`); + for(let i in dbAssoc) { + let tempItemTypeData = new ItemTypeData(dbAssoc[i]); + tempItemTypes.push(tempItemTypeData); } disconnectFromDatabase(dbConnection); } diff --git a/scripts/server/job.js b/scripts/server/job.js index 584318e6..c480e266 100644 --- a/scripts/server/job.js +++ b/scripts/server/job.js @@ -27,24 +27,19 @@ function loadJobsFromDatabase() { let tempJobs = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, `SELECT * FROM job_main WHERE job_enabled = 1 AND job_server = ${getServerId()}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobData = new JobData(dbAssoc); - tempJobData.locations = loadJobLocationsFromDatabase(tempJobData.databaseId); - tempJobData.equipment = loadJobEquipmentsFromDatabase(tempJobData.databaseId); - tempJobData.uniforms = loadJobUniformsFromDatabase(tempJobData.databaseId); - tempJobData.routes = loadJobRoutesFromDatabase(tempJobData.databaseId); - tempJobs.push(tempJobData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job '${tempJobData.name}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbQuery = queryDatabase(dbConnection, ); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_main WHERE job_enabled = 1 AND job_server = ${getServerId()}`); + for(let i in dbAssoc) { + let tempJobData = new JobData(dbAssoc[i]); + tempJobData.locations = loadJobLocationsFromDatabase(tempJobData.databaseId); + tempJobData.equipment = loadJobEquipmentsFromDatabase(tempJobData.databaseId); + tempJobData.uniforms = loadJobUniformsFromDatabase(tempJobData.databaseId); + tempJobData.routes = loadJobRoutesFromDatabase(tempJobData.databaseId); + tempJobs.push(tempJobData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job '${tempJobData.name}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -92,21 +87,15 @@ function loadJobRoutesFromDatabase(jobDatabaseId) { let tempJobRoutes = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, `SELECT * FROM job_route WHERE job_route_enabled = 1 AND job_route_job = ${jobDatabaseId}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobRouteData = new JobRouteData(dbAssoc); - tempJobRouteData.locations = loadJobRouteLocationsFromDatabase(tempJobRouteData.databaseId); - tempJobRoutes.push(tempJobRouteData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job route '${tempJobRouteData.name}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_route WHERE job_route_enabled = 1 AND job_route_job = ${jobDatabaseId}`); + for(let i in dbAssoc) { + let tempJobRouteData = new JobRouteData(dbAssoc[i]); + tempJobRouteData.locations = loadJobRouteLocationsFromDatabase(tempJobRouteData.databaseId); + tempJobRoutes.push(tempJobRouteData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job route '${tempJobRouteData.name}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -122,20 +111,14 @@ function loadJobRouteLocationsFromDatabase(jobRouteId) { let tempJobRouteLocations = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, `SELECT * FROM job_route_loc WHERE job_route_loc_enabled = 1 AND job_route_loc_route = ${jobRouteId}`); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobRouteLocationData = new JobRouteLocationData(dbAssoc); - tempJobRouteLocations.push(tempJobRouteLocationData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job route location '${tempJobRouteLocationData.databaseId}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_route_loc WHERE job_route_loc_enabled = 1 AND job_route_loc_route = ${jobRouteId}`); + for(let i in dbAssoc) { + let tempJobRouteLocationData = new JobRouteLocationData(dbAssoc[i]); + tempJobRouteLocations.push(tempJobRouteLocationData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job route location '${tempJobRouteLocationData.databaseId}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -151,21 +134,15 @@ function loadJobEquipmentsFromDatabase(jobDatabaseId) { let tempJobEquipments = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_equip` WHERE `job_equip_enabled` = 1 AND `job_equip_job` = " + toString(jobDatabaseId)); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobEquipmentData = new JobEquipmentData(dbAssoc); - tempJobEquipmentData.items = loadJobEquipmentItemsFromDatabase(tempJobEquipmentData.databaseId); - tempJobEquipments.push(tempJobEquipmentData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment '${tempJobEquipmentData.name}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_equip WHERE job_equip_enabled = 1 AND job_equip_job = ${jobDatabaseId}`); + for(let i in dbAssoc) { + let tempJobEquipmentData = new JobEquipmentData(dbAssoc[i]); + tempJobEquipmentData.items = loadJobEquipmentItemsFromDatabase(tempJobEquipmentData.databaseId); + tempJobEquipments.push(tempJobEquipmentData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment '${tempJobEquipmentData.name}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -181,20 +158,14 @@ function loadJobLocationsFromDatabase(jobDatabaseId) { let tempJobLocations = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_loc` WHERE `job_loc_enabled` = 1 AND `job_loc_job` = " + toString(jobDatabaseId)); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobLocationData = new JobLocationData(dbAssoc); - tempJobLocations.push(tempJobLocationData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job location '${tempJobLocationData.databaseId}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_loc WHERE job_loc_enabled = 1 AND job_loc_job = ${jobDatabaseId}`); + for(let i in dbAssoc) { + let tempJobLocationData = new JobLocationData(dbAssoc[i]); + tempJobLocations.push(tempJobLocationData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job location '${tempJobLocationData.databaseId}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -210,20 +181,14 @@ function loadJobUniformsFromDatabase(jobDatabaseId) { let tempJobUniforms = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_uniform` WHERE `job_uniform_enabled` = 1 AND `job_uniform_job` = " + toString(jobDatabaseId)); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobUniformData = new JobUniformData(dbAssoc); - tempJobUniforms.push(tempJobUniformData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job uniform '${tempJobUniformData.databaseId}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_uniform WHERE job_uniform_enabled = 1 AND job_uniform_job = ${jobDatabaseId}`); + for(let i in dbAssoc) { + let tempJobUniformData = new JobUniformData(dbAssoc[i]); + tempJobUniforms.push(tempJobUniformData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job uniform '${tempJobUniformData.databaseId}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -239,20 +204,14 @@ function loadJobEquipmentItemsFromDatabase(jobEquipmentDatabaseId) { let tempJobEquipmentItems = []; let dbConnection = connectToDatabase(); - let dbQuery = null; let dbAssoc; if(dbConnection) { - dbQuery = queryDatabase(dbConnection, "SELECT * FROM `job_equip_item` WHERE `job_equip_item_enabled` = 1 AND `job_equip_item_equip` = " + toString(jobEquipmentDatabaseId)); - if(dbQuery) { - if(dbQuery.numRows > 0) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempJobEquipmentItemData = new JobEquipmentItemData(dbAssoc); - tempJobEquipmentItems.push(tempJobEquipmentItemData); - logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment item '${tempJobEquipmentItemData.databaseId}' loaded from database successfully!`); - } - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM job_equip_item WHERE job_equip_item_enabled = 1 AND job_equip_item_equip = ${jobEquipmentDatabaseId}`); + for(let i in dbAssoc) { + let tempJobEquipmentItemData = new JobEquipmentItemData(dbAssoc[i]); + tempJobEquipmentItems.push(tempJobEquipmentItemData); + logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment item '${tempJobEquipmentItemData.databaseId}' loaded from database successfully!`); } disconnectFromDatabase(dbConnection); } @@ -268,6 +227,14 @@ function createAllJobBlips() { return false; } + if(areServerElementsSupported()) { + return false; + } + + if(areBlipsSupported()) { + return false; + } + logToConsole(LOG_DEBUG, `[VRR.Job] Spawning all job location blips ...`); for(let i in getServerData().jobs) { for(let j in getServerData().jobs[i].locations) { @@ -288,6 +255,14 @@ function createAllJobPickups() { return false; } + if(areServerElementsSupported()) { + return false; + } + + if(arePickupsSupported()) { + return false; + } + logToConsole(LOG_DEBUG, `[VRR.Job] Spawning all job location pickups ...`); let pickupCount = 0; for(let i in getServerData().jobs) { @@ -1987,7 +1962,6 @@ function saveJobRouteToDatabase(jobRouteData) { ["job_route_detail", jobRouteData.detail], ]; - let dbQuery = null; if(jobRouteData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_route", data); dbQuery = queryDatabase(dbConnection, queryString); @@ -2036,7 +2010,6 @@ function saveJobRouteLocationToDatabase(jobRouteLocationData) { ]; - let dbQuery = null; if(jobRouteLocationData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_route_loc", data); dbQuery = queryDatabase(dbConnection, queryString); @@ -2082,7 +2055,6 @@ function saveJobLocationToDatabase(jobLocationData) { ["job_loc_vw", jobLocationData.dimension], ]; - let dbQuery = null; if(jobLocationData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_loc", data); dbQuery = queryDatabase(dbConnection, queryString); @@ -2127,7 +2099,6 @@ function saveJobEquipmentToDatabase(jobEquipmentData) { ["job_equip_name", safeName], ]; - let dbQuery = null; if(tempJobRouteData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_equip", data); dbQuery = queryDatabase(dbConnection, queryString); @@ -2170,7 +2141,6 @@ function saveJobEquipmentItemToDatabase(jobEquipmentItemData) { ["job_equip_item_value", jobEquipmentItemData.value], ]; - let dbQuery = null; if(tempJobRouteData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_equip_item", data); dbQuery = queryDatabase(dbConnection, queryString); @@ -2214,7 +2184,6 @@ function saveJobUniformToDatabase(jobUniformData) { ["job_uniform_name", safeName], ]; - let dbQuery = null; if(tempJobRouteData.databaseId == 0) { let queryString = createDatabaseInsertQuery("job_uniform", data); dbQuery = queryDatabase(dbConnection, queryString); diff --git a/scripts/server/native/connected.js b/scripts/server/native/connected.js index 2aaaf067..3b135dca 100644 --- a/scripts/server/native/connected.js +++ b/scripts/server/native/connected.js @@ -838,8 +838,14 @@ function freeDatabaseQuery(dbQuery) { // =========================================================================== -function fetchQueryAssoc(dbQuery) { - return dbQuery.fetchAssoc(); +async function fetchQueryAssoc(dbQuery) { + let queryAssoc = new Promise(function() { + let result = dbConnection.query(queryString); + let tempAassoc = result.fetchAssoc(); + result.free(); + resolve(tempAassoc); + }); + return queryAssoc; } // =========================================================================== @@ -1166,4 +1172,146 @@ function doesEntityDataExist(entity, dataName) { return null; } +<<<<<<< Updated upstream +======= +// =========================================================================== + +function getPlayerId(client) { + return client.index; +} + +// =========================================================================== + +function getPlayerIP(client) { + return client.ip; +} + +// =========================================================================== + +function getPlayerGameVersion(client) { + client.gameVersion; +} + +// =========================================================================== + +function setPlayerNativeAdminState(client, state) { + client.administrator = state; +} + +// =========================================================================== + +function despawnPlayer(client) { + client.despawnPlayer(); +} + +// =========================================================================== + +function getGame() { + return server.game; +} + +// =========================================================================== + +function getCountryNameFromIP(ip) { + if(module.geoip.getCountryName(ip)) { + return module.geoip.getCountryName(ip); + } + return false; +} + +// =========================================================================== + +function getSubdivisionNameFromIP(ip) { + if(module.geoip.getSubdivisionName(ip)) { + return module.geoip.getSubdivisionName(ip); + } + return false; +} + +// =========================================================================== + +function getCityNameFromIP(ip) { + if(module.geoip.getCityNameFromIP(ip)) { + return module.geoip.getCityNameFromIP(ip); + } + return false; +} + +// =========================================================================== + +function getServerPort() { + return server.port; +} + +// =========================================================================== + +function serverBanIP(ip) { + server.banIP(ip); +} + +// =========================================================================== + +function setVehicleTrunkState(vehicle, trunkState) { + sendNetworkEventToPlayer("vrr.veh.trunk", null, getVehicleForNetworkEvent(vehicle), trunkState); +} + +// =========================================================================== + +function addAllEventHandlers() { + bindServerEventHandler("onResourceStart", onResourceStart) + bindServerEventHandler("onResourceStop", onResourceStart) + addServerEventHandler("onServerStop", onResourceStart); + + addServerEventHandler("onResourceStart", onResourceStart); + addServerEventHandler("onResourceStop", onResourceStop); + addServerEventHandler("onServerStop", onResourceStop); + + addServerEventHandler("onProcess", onProcess); + addServerEventHandler("onEntityProcess", onEntityProcess); + + addServerEventHandler("onPlayerConnect", onInitialConnectionToServer); + addServerEventHandler("onPlayerJoin", onPlayerJoin); + addServerEventHandler("onPlayerJoined", onPlayerJoined); + addServerEventHandler("onPlayerChat", onPlayerChat); + addServerEventHandler("onPlayerQuit", onPlayerQuit); + addServerEventHandler("onElementStreamIn", onElementStreamIn); + addServerEventHandler("onElementStreamOut", onElementStreamOut); + + addServerEventHandler("onPedSpawn", onPedSpawn); + addServerEventHandler("onPedEnterVehicle", onPedEnteringVehicle); + addServerEventHandler("onPedExitVehicle", onPedExitingVehicle); + + addServerEventHandler("onPedEnteringVehicle", onPedEnteringVehicle); + addServerEventHandler("onPedExitingVehicle", onPedExitingVehicle); +} + +// =========================================================================== + +function addServerCommandHandler(command, handlerFunction) { + addCommandHandler(command, handlerFunction); +} + +// =========================================================================== + +function addServerEventHandler(eventName, handlerFunction) { + addEventHandler(eventName, function(event, ...args) { + let result = handlerFunction.apply(this, args); + if(result == false) { + event.preventDefault(); + } + }); +} + +// =========================================================================== + +function bindServerEventHandler(eventName, bindTo, handlerFunction) { + addEventHandler(eventName, bindTo, function(event, ...args) { + let result = handlerFunction.apply(this, args); + if(result == false) { + event.preventDefault(); + } + }); +} + +>>>>>>> Stashed changes // =========================================================================== \ No newline at end of file diff --git a/scripts/server/native/ragemp.js b/scripts/server/native/ragemp.js new file mode 100644 index 00000000..1eb9148d --- /dev/null +++ b/scripts/server/native/ragemp.js @@ -0,0 +1,1187 @@ +// =========================================================================== +// Vortrex's Roleplay Resource +// https://github.com/VortrexFTW/gtac_roleplay +// =========================================================================== +// FILE: ragemp.js +// DESC: Provides wrapped natives for RageMP +// TYPE: Server (JavaScript) +// =========================================================================== + +class DatabaseConnection { + constructor(host, username, password, database, port = 3306) { + this.host = host; + this.port = port; + this.username = username; + this.password = password; + this.connection = database; + this.insertId = 0; + this.error = null; + + let handle = mysql.createConnection({ + host: this.host, + port: this.port, + username: this.username, + password: this.password, + database: this.database + }); + + this.connection = handle; + } + + query(queryString) { + return new DatabaseQuery(this.connection, queryString); + } + + close() { + this.connection.close(); + } +} + +class DatabaseQuery { + constructor(connection, queryString) { + this.connection = connection; + this.rows = []; + this.fields = []; + this.numRows = 0; + + this.connection.query(queryString, function(err, results, fields) { + if(err) { + logToConsole(LOG_DEBUG|LOG_ERROR, err); + return false; + } + + this.rows = results; + this.fields = fields; + + this.connection.insertId = results.insertId; + this.numRows = results.changedRows; + }); + } + + fetchAssoc() { + return this.rows; + } + + free() { + return; + } +} + +// =========================================================================== + +const VRR_ELEMENT_NONE = 0; +const VRR_ELEMENT_VEHICLE = 1; +const VRR_ELEMENT_PLAYER = 2; + +// =========================================================================== + +let builtInCommands = [ + +]; + +// =========================================================================== + +let disconnectReasons = [ + +]; + +// =========================================================================== + +function getPlayerPosition(client) { + return client.position; +} + +// =========================================================================== + +function setPlayerPosition(client, position) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s position to ${position.x}, ${position.y}, ${position.z}`); + client.position = position; +} + +// =========================================================================== + +function getPlayerHeading(client) { + return client.heading +} + +// =========================================================================== + +function setPlayerHeading(client, heading) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s heading to ${heading}`); + client.heading = heading; +} + +// =========================================================================== + +function getPlayerVehicle(client) { + return client.vehicle; +} + +// =========================================================================== + +function getPlayerDimension(client) { + return client.dimension; +} + +// =========================================================================== + +function getPlayerInterior(client) { + return 0; +} + +// =========================================================================== + +function setPlayerDimension(client, dimension) { + logToConsole(LOG_VERBOSE, `Setting ${getPlayerDisplayForConsole(client)}'s dimension to ${dimension}`); + client.dimension = dimension; +} + +// =========================================================================== + +function setPlayerInterior(client, interior) { + logToConsole(LOG_VERBOSE, `Setting ${getPlayerDisplayForConsole(client)}'s interior to ${interior}`); + return false; +} + +// =========================================================================== + +function isPlayerInAnyVehicle(client) { + return (client.vehicle != null); +} + +// =========================================================================== + +function getPlayerVehicleSeat(client) { + if(!isPlayerInAnyVehicle(client)) { + return false; + } + + return client.seat; +} + +// =========================================================================== + +function isPlayerSpawned(client) { + return getPlayerData(client).spawned; +} + +// =========================================================================== + +function getVehiclePosition(vehicle) { + return vehicle.position; +} + +// =========================================================================== + +function getVehicleHeading(vehicle) { + return vehicle.heading; +} + +// =========================================================================== + +function setVehicleHeading(vehicle, heading) { + return vehicle.heading = heading; +} + +// =========================================================================== + +function getElementTransient(element) { + return false; +} + +// =========================================================================== + +function setElementTransient(element, state) { + return false; +} + +// =========================================================================== + +function getVehicleSyncer(vehicle) { + return null; +} + +// =========================================================================== + +function getVehicleForNetworkEvent(vehicle) { + return vehicle.id; +} + +// =========================================================================== + +function deleteGameElement(element) { + element.destroy(); +} + +// =========================================================================== + +function isPlayerInFrontVehicleSeat(client) { + return (getPlayerVehicleSeat(client) == 0 || getPlayerVehicleSeat(client) == 1); +} + +// =========================================================================== + +function removePlayerFromVehicle(client) { + logToConsole(LOG_DEBUG, `Removing ${getPlayerDisplayForConsole(client)} from their vehicle`); + client.removeFromVehicle(); + return true; +} + +// =========================================================================== + +function setPlayerSkin(client, skinIndex) { + client.model = getGameConfig().skins[getGame()][skinIndex][0]; +} + +// =========================================================================== + +function getPlayerSkin(client) { + return getSkinIndexFromModel(client.model); +} + +// =========================================================================== + +function setPlayerHealth(client, health) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s health to ${health}`); + client.health = health; + getServerData(client).health = health; +} + +// =========================================================================== + +function getPlayerHealth(client) { + return client.health; +} + +// =========================================================================== + +function setPlayerArmour(client, armour) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s armour to ${armour}`); + client.armour = armour; +} + +// =========================================================================== + +function getPlayerArmour(client) { + return client.armour; +} + +// =========================================================================== + +function setPlayerCash(client, amount) { + getPlayerCurrentSubAccount(client).cash = toInteger(amount); + updatePlayerCash(client); +} + +// =========================================================================== + +function givePlayerCash(client, amount) { + if(client == null) { + return false; + } + + if(isNaN(amount)) { + return false; + } + + getPlayerCurrentSubAccount(client).cash = getPlayerCurrentSubAccount(client).cash + toInteger(amount); + updatePlayerCash(client); +} + +// =========================================================================== + +function takePlayerCash(client, amount) { + if(client == null) { + return false; + } + + if(isNaN(amount)) { + return false; + } + + getPlayerCurrentSubAccount(client).cash = getPlayerCurrentSubAccount(client).cash - toInteger(amount); + updatePlayerCash(client); +} + +// =========================================================================== + +function getElementSyncer(element) { + return getClients()[element.syncer]; +} + +// =========================================================================== + +function getPlayerWeaponAmmo(client) { + return getPlayerPed(client).weaponAmmunition; +} + +// =========================================================================== + +function setPlayerVelocity(client, velocity) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s velocity to ${velocity.x}, ${velocity.y}, ${velocity.z}`); + if(typeof getPlayerPed(client).velocity != "undefined") { + getPlayerPed(client).velocity = velocity; + } +} + +// =========================================================================== + +function getPlayerVelocity(client) { + if(typeof getPlayerPed(client).velocity != "undefined") { + return getPlayerPed(client).velocity; + } + return toVector3(0.0, 0.0, 0.0); +} + +// =========================================================================== + +function getElementDimension(element) { + if(typeof element.dimension != "undefined") { + return element.dimension; + } + return 0; +} + +// =========================================================================== + +function setElementDimension(element, dimension) { + if(typeof element.dimension != "undefined") { + logToConsole(LOG_VERBOSE, `Setting element ${element} (${element.id}) dimension to ${dimension}`); + element.dimension = dimension; + return true; + } + return false; +} + +// =========================================================================== + +function setElementRotation(element, rotation) { + if(typeof element.setRotation != "undefined") { + element.setRotation(rotation); + } else { + return element.rotation = rotation; + } +} + +// =========================================================================== + +function givePlayerHealth(client, amount) { + if(getPlayerHealth(client)+amount > 100) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s health to 100`); + setPlayerHealth(client, 100); + } else { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s health to ${getPlayerHealth(client)+amount}`); + setPlayerHealth(client, getPlayerHealth(client)+amount); + } +} + +// =========================================================================== + +function givePlayerArmour(client, amount) { + if(getPlayerArmour(client)+amount > 100) { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s armour to 100`); + setPlayerArmour(client, 100); + } else { + logToConsole(LOG_DEBUG, `Setting ${getPlayerDisplayForConsole(client)}'s armour to ${getPlayerArmour(client)+amount}`); + setPlayerArmour(client, getPlayerArmour(client)+amount); + } +} + +// =========================================================================== + +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 getServerName() { + return server.name; +} + +// =========================================================================== + +function createGamePickup(modelIndex, position, type) { + if(!isGameFeatureSupported("pickups")) { + return false; + } + return game.createPickup(modelIndex, position, type); +} + +// =========================================================================== + +function createGameBlip(position, type = 0, colour = toColour(255, 255, 255, 255)) { + if(!isGameFeatureSupported("blips")) { + return false; + } + return game.createBlip(type, position, 1, colour); +} + +// =========================================================================== + +function createGameObject(modelIndex, position) { + if(!isGameFeatureSupported("objects")) { + return false; + } + return game.createObject(getGameConfig().objects[getGame()][modelIndex][0], position); +} + +// =========================================================================== + +function setElementOnAllDimensions(element, state) { + if(!isNull(element) && element != false) { + if(typeof element.netFlags != "undefined") { + if(typeof element.netFlags.onAllDimensions != "undefined") { + element.netFlags.onAllDimensions = state; + } + } else { + if(typeof element.onAllDimensions != "undefined") { + element.onAllDimensions = state; + } + } + } +} + +// =========================================================================== + +function destroyGameElement(element) { + if(!isNull(element) && element != false) { + destroyElement(element); + } +} + +// =========================================================================== + +function isMeleeWeapon(weaponId, gameId = getGame()) { + return (getGameConfig().meleeWeapons[gameId].indexOf(weaponId) != -1); +} + +// =========================================================================== + +function getPlayerLastVehicle(client) { + return getPlayerData(client).lastVehicle; +} + +// =========================================================================== + +function isVehicleObject(vehicle) { + if(vehicle == null || vehicle == undefined) { + return false; + } + return (vehicle.type == ELEMENT_VEHICLE); +} + +// =========================================================================== + +function repairVehicle(vehicle) { + vehicle.fix(); +} + +// =========================================================================== + +function setVehicleLights(vehicle, lights) { + setEntityData(vehicle, "vrr.lights", lights, true); + sendNetworkEventToPlayer("vrr.veh.lights", null, vehicle.id, lights); +} + +// =========================================================================== + +function setVehicleEngine(vehicle, engine) { + vehicle.engine = engine; + setEntityData(vehicle, "vrr.engine", engine, true); +} + +// =========================================================================== + +function setVehicleLocked(vehicle, locked) { + vehicle.locked = locked; +} + +// =========================================================================== + +function setVehicleSiren(vehicle, siren) { + vehicle.siren = siren; +} + +// =========================================================================== + +function getVehicleLights(vehicle) { + return vehicle.lights; +} + +// =========================================================================== + +function getVehicleEngine(vehicle) { + return vehicle.engine; +} + +// =========================================================================== + +function getVehicleLocked(vehicle) { + return vehicle.lockedStatus; +} + +// =========================================================================== + +function getVehicleSiren(vehicle) { + return vehicle.siren; +} + +// =========================================================================== + +function setVehicleColours(vehicle, colour1, colour2, colour3 = -1, colour4 = -1) { + vehicle.colour1 = colour1; + vehicle.colour2 = colour2; + + if(colour3 != -1) { + vehicle.colour3 = colour3; + } + + if(colour4 != -1) { + vehicle.colour4 = colour4; + } +} + +// =========================================================================== + +function createGameVehicle(modelIndex, position, heading) { + if(areServerElementsSupported()) { + return mp.vehicles.new(getGameConfig().vehicles[getGame()][modelIndex][0], position, { + heading: heading, + numberPlate: "", + alpha: 255, + color: [[255, 255, 255], [255, 255, 255]], + locked: false, + engine: false, + dimension: 0 + }); + } +} + +// =========================================================================== + +function createGameCivilian(modelIndex, position, heading) { + if(areServerElementsSupported()) { + return mp.peds.new(getGameConfig().skins[getGame()][modelIndex][1], position, heading, 0); + } + + return false; +} + +// =========================================================================== + +function getIsland(position) { + return 0; +} + +// =========================================================================== + +function isValidVehicleModel(model) { + if(getVehicleModelIndexFromModel(model) != false) { + return true; + } + + return false; +} + +// =========================================================================== + +function setGameTime(hour, minute, minuteDuration = 1000) { + if(isTimeSupported()) { + game.time.hour = hour; + game.time.minute = minute; + game.time.minuteDuration = minuteDuration; + } +} + +// =========================================================================== + +function setGameWeather(weather) { + if(isWeatherSupported()) { + mp.world.weather = weather; + } +} + +// =========================================================================== + +function setPlayerFightStyle(client, fightStyleId) { + return false; +} + +// =========================================================================== + +function isPlayerAtGym(client) { + return true; +} + +// =========================================================================== + +function getPlayerElement(client) { + return client.player; +} + +// =========================================================================== + +function setElementPosition(element, position) { + sendNetworkEventToPlayer("vrr.elementPosition", null, element.id, position); +} + +// =========================================================================== + +function getElementPosition(element) { + return element.position; +} + +// =========================================================================== + +function getElementHeading(element) { + return element.heading; +} + +// =========================================================================== + +function setElementInterior(element, interior) { + return false; +} + +// =========================================================================== + +function setElementCollisionsEnabled(element, state) { + //sendNetworkEventToPlayer("vrr.elementCollisions", null, element.id, state); +} + +// =========================================================================== + +function isTaxiVehicle(vehicle) { + if(getGameConfig().taxiModels[getGame()].indexOf(vehicle.modelIndex) != -1) { + return true; + } + + return false; +} + +// =========================================================================== + +function getVehicleName(vehicle) { + let model = getElementModel(vehicle); + return getVehicleNameFromModel(model) || "Unknown"; +} + +// =========================================================================== + +function getElementModel(element) { + if(typeof element.model != "undefined") { + return element.model; + } +} + +// =========================================================================== + +function givePlayerWeaponAmmo(client, ammo) { + client.setWeaponAmmo(ammo); +} + +// =========================================================================== + +function getPlayerWeapon(client) { + return client.weapon; +} + +// =========================================================================== + +function connectToDatabase() { + if(getDatabaseConfig().usePersistentConnection) { + if(persistentDatabaseConnection == null) { + logToConsole(LOG_DEBUG, `[VRR.Database] Initializing database connection ...`); + persistentDatabaseConnection = module.mysql.connect(getDatabaseConfig().host, getDatabaseConfig().user, getDatabaseConfig().pass, getDatabaseConfig().name, getDatabaseConfig().port); + if(persistentDatabaseConnection.error) { + logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`); + persistentDatabaseConnection = null; + return false; + } + + logToConsole(LOG_DEBUG, `[VRR.Database] Database connection successful!`); + return persistentDatabaseConnection; + } else { + logToConsole(LOG_DEBUG, `[VRR.Database] Using existing database connection.`); + return persistentDatabaseConnection; + } + } else { + let databaseConnection = mysql.createConnection({ + host: getDatabaseConfig().host, + user: getDatabaseConfig().user, + password: getDatabaseConfig().pass, + database: getDatabaseConfig().name, + port: getDatabaseConfig().port + }); + + if(databaseConnection.error) { + logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`); + return false; + } else { + return databaseConnection; + } + } +} + +// =========================================================================== + +function disconnectFromDatabase(dbConnection) { + if(!getDatabaseConfig().usePersistentConnection) { + try { + dbConnection.close(); + logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`); + } catch(error) { + logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`); + } + } + return true; +} + +// =========================================================================== + +function queryDatabase(dbConnection, queryString, useThread = false) { + logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); + if(useThread == true) { + Promise.resolve().then(() => { + let queryResult = dbConnection.query(queryString); + return queryResult; + }); + } else { + return dbConnection.query(queryString); + } +} + +// =========================================================================== + +function escapeDatabaseString(dbConnection, unsafeString = "") { + if(!dbConnection) { + dbConnection = connectToDatabase(); + } + + if(typeof unsafeString == "string") { + return dbConnection.escape(unsafeString); + } + return unsafeString; +} + +// =========================================================================== + +function getDatabaseInsertId(dbConnection) { + return dbConnection.insertId; +} + +// =========================================================================== + +function getQueryNumRows(dbQuery) { + return dbQuery.numRows; +} + +// =========================================================================== + +function getDatabaseError(dbConnection) { + return dbConnection.error; +} + +// =========================================================================== + +function freeDatabaseQuery(dbQuery) { + if(dbQuery != null) { + dbQuery.free(); + } + return; +} + +// =========================================================================== + +function fetchQueryAssoc(queryString) { + let queryResult = dbConnection.query(queryString, function(error, result, fields) { + resolve(result); + }); + + return queryResult; +} + +// =========================================================================== + +function quickDatabaseQuery(queryString) { + let dbConnection = connectToDatabase(); + let insertId = 0; + if(dbConnection) { + //logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`); + let dbQuery = queryDatabase(dbConnection, queryString); + if(getDatabaseInsertId(dbConnection)) { + insertId = getDatabaseInsertId(dbConnection); + logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`); + } + + if(dbQuery) { + try { + freeDatabaseQuery(dbQuery); + logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`); + } catch(error) { + logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`); + } + } + + disconnectFromDatabase(dbConnection); + + if(insertId != 0) { + return insertId; + } + + return true; + } + return false; +} + +// =========================================================================== + +function sendNetworkEventToPlayer(eventName, client, ...args) { + let argsArray = [eventName, client]; + argsArray = argsArray.concat(args); + triggerNetworkEvent.apply(null, argsArray); +} + +// =========================================================================== + +function addNetworkEventHandler(eventName, handlerFunction) { + addNetworkHandler(eventName, handlerFunction); +} + +// =========================================================================== + +function getElementId(element) { + return element.id; +} + +// =========================================================================== + +function getClientFromIndex(index) { + let clients = getClients(); + for(let i in clients) { + if(clients[i].index == index) { + return clients[i]; + } + } +} + +// =========================================================================== + +function getClientsInRange(position, distance) { + return getPlayersInRange(position, distance); +} + +// =========================================================================== + +function getCiviliansInRange(position, distance) { + return getElementsByTypeInRange(ELEMENT_PED, position, distance).filter(x => !x.isType(ELEMENT_PLAYER)); +} + +// =========================================================================== + +function getPlayersInRange(position, distance) { + return getClients().filter(x => getDistance(position, getPlayerPosition(x)) <= distance); +} + +// =========================================================================== + +function getElementsByTypeInRange(elementType, position, distance) { + return getElementsByType(elementType).filter(x => getDistance(position, getElementPosition(x)) <= distance); +} + +// =========================================================================== + +function getClosestCivilian(position) { + return getClosestElementByType(ELEMENT_PED, position).filter(ped => !ped.isType(ELEMENT_PLAYER)); +} + +// =========================================================================== + +function getVehiclesInRange(position, range) { + if(getGame() == VRR_GAME_GTA_IV) { + return getServerData().vehicles.reduce((i, j) => (getDistance(position, i.syncPosition) <= getDistance(position, j.syncPosition)) ? i : j); + } + return getElementsByTypeInRange(ELEMENT_VEHICLE, position, range); +} + +// =========================================================================== + +function getClosestVehicle(position) { + return getClosestElementByType(ELEMENT_VEHICLE, position); +} + +// =========================================================================== + +function getClosestElementByType(elementType, position) { + return getElementsByType(elementType).reduce((i, j) => (getDistance(position, getElementPosition(i)) <= getDistance(position, getElementPosition(j))) ? i : j); +} + +// =========================================================================== + +function getVehicleFirstEmptySeat(vehicle) { + for(let i = 0; i <= 4; i++) { + if(vehicle.getOccupant(i) == null) { + return i; + } + } + + return false; +} + +// =========================================================================== + +function isVehicleTrain(vehicle) { + // To-do + return false +} + +// =========================================================================== + +function warpPedIntoVehicle(ped, vehicle, seatId) { + ped.putIntoVehicle(vehicle, seatId); +} + +// =========================================================================== + +function getPlayerPing(client) { + return client.ping; +} + +// =========================================================================== + +function setVehicleHealth(vehicle, health) { + vehicle.health = health; +} + +// =========================================================================== + +function givePlayerWeapon(client, weaponId, ammo, active = true) { + //logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`); + //sendNetworkEventToPlayer("vrr.giveWeapon", client, weaponId, ammo, active); + client.giveWeapon(weaponId, ammo); +} + +// =========================================================================== + +function setPlayerWantedLevel(client, wantedLevel) { + //sendNetworkEventToPlayer("vrr.wantedLevel", client, wantedLevel); + return true; +} + +// =========================================================================== + +function setElementStreamInDistance(element, distance) { + return false; +} + +// =========================================================================== + +function setElementStreamOutDistance(element, distance) { + return false; +} + +// =========================================================================== + +function getPlayerPed(client) { + return client; +} + +// =========================================================================== + +function setEntityData(entity, dataName, dataValue, syncToClients = true) { + if(entity != null) { + if(areServerElementsSupported()) { + if(syncToClients) { + return entity.setVariable(dataName, dataValue); + } else { + return entity.setOwnVariable(dataName, dataValue); + } + } + } + return false; +} + +// =========================================================================== + +function removeEntityData(entity, dataName) { + if(entity != null) { + if(areServerElementsSupported()) { + return entity.setVariable(dataName, null); + } + } + return false; +} + +// =========================================================================== + +function doesEntityDataExist(entity, dataName) { + if(entity != null) { + if(areServerElementsSupported()) { + return (entity.getVariable(dataName) != null); + } else { + return false; + } + } + return null; +} + +// =========================================================================== + +function disconnectPlayer(client) { + //client.disconnect(); + client.kick(); +} + +// =========================================================================== + +function getPlayerId(client) { + return client.id; +} + +// =========================================================================== + +function getPlayerIP(client) { + return client.ip; +} + +// =========================================================================== + +function getPlayerGameVersion(client) { + //client.gameVersion; + return "0"; +} + +// =========================================================================== + +function setPlayerNativeAdminState(client, state) { + //client.administrator = state; + return false; +} + +// =========================================================================== + +function despawnPlayer(client) { + return false; +} + +// =========================================================================== + +function getGame() { + return VRR_GAME_GTA_V; +} + +// =========================================================================== + +function getCountryNameFromIP(ip) { + //if(module.geoip.getCountryName(ip)) { + // return module.geoip.getCountryName(ip); + //} + return ""; +} + +// =========================================================================== + +function getSubdivisionNameFromIP(ip) { + //if(module.geoip.getSubdivisionName(ip)) { + // return module.geoip.getSubdivisionName(ip); + //} + return ""; +} + +// =========================================================================== + +function getCityNameFromIP(ip) { + //if(module.geoip.getCityNameFromIP(ip)) { + // return module.geoip.getCityNameFromIP(ip); + //} + return ""; +} + +// =========================================================================== + +function getServerPort() { + return server.port; +} + +// =========================================================================== + +function serverBanIP(ip) { + //server.banIP(ip); +} + +// =========================================================================== + +function setVehicleTrunkState(vehicle, trunkState) { + //sendNetworkEventToPlayer("vrr.veh.trunk", null, getVehicleForNetworkEvent(vehicle), trunkState); +} + +// =========================================================================== + +function addAllEventHandlers() { + addServerEventHandler("onResourceStart", onResourceStart); + addServerEventHandler("onResourceStop", onResourceStop); + addServerEventHandler("onServerStop", onResourceStop); + + addServerEventHandler("onProcess", onProcess); + addServerEventHandler("onEntityProcess", onEntityProcess); + + addServerEventHandler("onPlayerConnect", onInitialConnectionToServer); + addServerEventHandler("playerJoin", onPlayerJoin); + addServerEventHandler("onPlayerJoined", onPlayerJoined); + addServerEventHandler("onPlayerChat", onPlayerChat); + addServerEventHandler("onPlayerQuit", onPlayerQuit); + addServerEventHandler("onElementStreamIn", onElementStreamIn); + addServerEventHandler("onElementStreamOut", onElementStreamOut); + + addServerEventHandler("onPedSpawn", onPedSpawn); + addServerEventHandler("onPedEnterVehicle", onPedEnteringVehicle); + addServerEventHandler("onPedExitVehicle", onPedExitingVehicle); + + addServerEventHandler("onPedEnteringVehicle", onPedEnteringVehicle); + addServerEventHandler("onPedExitingVehicle", onPedExitingVehicle); +} + +// =========================================================================== + +function addServerCommandHandler(command, handlerFunction) { + mp.events.addCommand(command, function(client, ...args) { + handlerFunction.call(command, args.join(" "), client); + }); +} + +// =========================================================================== + +function addServerEventHandler(eventName, handlerFunction) { + mp.events.add(eventName, function(event, ...args) { + let result = handlerFunction.apply(this, args); + }); +} + +// =========================================================================== + +function bindServerEventHandler(eventName, bindTo, handlerFunction) { + mp.events.add(eventName, function(event, ...args) { + let result = handlerFunction.apply(this, args); + }); +} + +// =========================================================================== \ No newline at end of file diff --git a/scripts/server/npc.js b/scripts/server/npc.js index b43d749b..9985913a 100644 --- a/scripts/server/npc.js +++ b/scripts/server/npc.js @@ -59,14 +59,11 @@ function loadNPCsFromDatabase() { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM npc_main WHERE npc_server = ${getServerId()} AND npc_enabled = 1`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempNPCData = new NPCData(dbAssoc); - tempNPCData.triggers = loadNPCTriggersFromDatabase(); - tempNPCs.push(tempNPCData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempNPCData = new NPCData(dbAssoc[i]); + tempNPCData.triggers = loadNPCTriggersFromDatabase(); + tempNPCs.push(tempNPCData); } disconnectFromDatabase(dbConnection); } @@ -84,15 +81,12 @@ function loadNPCTriggersFromDatabase(npcDatabaseId) { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM npc_trig WHERE npc_trig_npc = ${npcDatabaseId} AND npc_trig_enabled = 1`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempNPCTriggerData = new NPCTriggerData(dbAssoc); - tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId); - tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId); - tempNPCTriggers.push(tempNPCTriggerData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempNPCTriggerData = new NPCTriggerData(dbAssoc[i]); + tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId); + tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId); + tempNPCTriggers.push(tempNPCTriggerData); } disconnectFromDatabase(dbConnection); } @@ -110,13 +104,10 @@ function loadNPCTriggerConditionsFromDatabase(npcTriggerDatabaseId) { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM npc_cond WHERE npc_cond_trig = ${npcTriggerDatabaseId} AND npc_cond_enabled = 1`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc); - tempNPCTriggerConditions.push(tempNPCTriggerConditionData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc[i]); + tempNPCTriggerConditions.push(tempNPCTriggerConditionData); } disconnectFromDatabase(dbConnection); } @@ -134,13 +125,10 @@ function loadNPCTriggerResponsesFromDatabase(npcTriggerDatabaseId) { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM npc_resp WHERE npc_resp_trig = ${npcTriggerDatabaseId} AND npc_resp_enabled = 1`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc); - tempNPCTriggerResponses.push(tempNPCTriggerResponseData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc[i]); + tempNPCTriggerResponses.push(tempNPCTriggerResponseData); } disconnectFromDatabase(dbConnection); } diff --git a/scripts/server/radio.js b/scripts/server/radio.js index 30390046..4464f554 100644 --- a/scripts/server/radio.js +++ b/scripts/server/radio.js @@ -27,13 +27,10 @@ function loadRadioStationsFromDatabase() { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM radio_main`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempRadioStationData = new RadioStationData(dbAssoc); - tempRadioStations.push(tempRadioStationData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempRadioStationData = new RadioStationData(dbAssoc[i]); + tempRadioStations.push(tempRadioStationData); } disconnectFromDatabase(dbConnection); } diff --git a/scripts/server/subaccount.js b/scripts/server/subaccount.js index 7d5658ee..1ed2f23d 100644 --- a/scripts/server/subaccount.js +++ b/scripts/server/subaccount.js @@ -20,13 +20,9 @@ function loadSubAccountFromName(firstName, lastName) { firstName = escapeDatabaseString(dbConnection, firstName); lastName = escapeDatabaseString(dbConnection, lastName); let dbQueryString = `SELECT * FROM sacct_main INNER JOIN sacct_svr ON sacct_svr.sacct_svr_sacct=sacct_main.sacct_id AND sacct_svr.sacct_svr_server=${getServerId()} WHERE sacct_name_first = '${firstName}' AND sacct_name_last = '${lastName}' LIMIT 1;`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - let dbAssoc = fetchQueryAssoc(dbQuery); - freeDatabaseQuery(dbQuery); - return new SubAccountData(dbAssoc); - } + let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); disconnectFromDatabase(dbConnection); + return new SubAccountData(dbAssoc[0]); } return false; @@ -38,13 +34,9 @@ function loadSubAccountFromId(subAccountId) { let dbConnection = connectToDatabase(); if(dbConnection) { let dbQueryString = `SELECT * FROM sacct_main INNER JOIN sacct_svr ON sacct_svr.sacct_svr_sacct=sacct_main.sacct_id AND sacct_svr.sacct_svr_server=${getServerId()} WHERE sacct_id = ${subAccountId} LIMIT 1;`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - let dbAssoc = fetchQueryAssoc(dbQuery); - freeDatabaseQuery(dbQuery); - return new SubAccountData(dbAssoc); - } + let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); disconnectFromDatabase(dbConnection); + return new SubAccountData(dbAssoc[0]); } return false; @@ -59,35 +51,32 @@ function loadSubAccountsFromAccount(accountId) { let dbConnection = connectToDatabase(); if(dbConnection) { let dbQueryString = `SELECT * FROM sacct_main INNER JOIN sacct_svr ON sacct_svr.sacct_svr_sacct=sacct_main.sacct_id AND sacct_svr.sacct_svr_server=${getServerId()} WHERE sacct_acct = ${accountId} AND sacct_server = ${getServerId()}`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempSubAccount = new SubAccountData(dbAssoc); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempSubAccount = new SubAccountData(dbAssoc[i]); - // Make sure skin is valid - if(tempSubAccount.skin == -1) { - tempSubAccount.skin = getServerConfig().newCharacter.skin; - } + // Make sure skin is valid + if(tempSubAccount.skin == -1) { + tempSubAccount.skin = getServerConfig().newCharacter.skin; + } - // Check if clan and rank are still valid - if(tempSubAccount.clan != 0) { - let clanId = getClanIdFromDatabaseId(tempSubAccount.clan); - if(!getClanData(clanId)) { - tempSubAccount.clan = 0; + // Check if clan and rank are still valid + if(tempSubAccount.clan != 0) { + let clanId = getClanIdFromDatabaseId(tempSubAccount.clan); + if(!getClanData(clanId)) { + tempSubAccount.clan = 0; + tempSubAccount.clanRank = 0; + tempSubAccount.clanTitle = ""; + tempSubAccount.clanFlags = 0; + } else { + let rankId = getClanRankIdFromDatabaseId(clanId, tempSubAccount.clanRank); + if(!getClanRankData(clanId, rankId)) { tempSubAccount.clanRank = 0; - tempSubAccount.clanTitle = ""; - tempSubAccount.clanFlags = 0; - } else { - let rankId = getClanRankIdFromDatabaseId(clanId, tempSubAccount.clanRank); - if(!getClanRankData(clanId, rankId)) { - tempSubAccount.clanRank = 0; - } } } - - tempSubAccounts.push(tempSubAccount); } - freeDatabaseQuery(dbQuery); + + tempSubAccounts.push(tempSubAccount); } disconnectFromDatabase(dbConnection); } diff --git a/scripts/server/vehicle.js b/scripts/server/vehicle.js index bde82d92..afca9265 100644 --- a/scripts/server/vehicle.js +++ b/scripts/server/vehicle.js @@ -28,13 +28,10 @@ function loadVehiclesFromDatabase() { let dbAssoc; if(dbConnection) { let dbQueryString = `SELECT * FROM veh_main WHERE veh_server = ${getServerId()} AND veh_deleted = 0`; - let dbQuery = queryDatabase(dbConnection, dbQueryString); - if(dbQuery) { - while(dbAssoc = fetchQueryAssoc(dbQuery)) { - let tempVehicleData = new VehicleData(dbAssoc); - tempVehicles.push(tempVehicleData); - } - freeDatabaseQuery(dbQuery); + dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString); + for(let i in dbAssoc) { + let tempVehicleData = new VehicleData(dbAssoc[i]); + tempVehicles.push(tempVehicleData); } disconnectFromDatabase(dbConnection); }