Skip to content

krs ​

Framework do servidor: contas, personagens, grupos, inventário, dinheiro, status, veículos e anticheat. Os outros scripts acessam tudo pelo krs_helper ou pelo @krs/import.lua.

Precisa de: oxmysql

Instalação ​

cfg
ensure oxmysql
ensure ox_lib
ensure krs
ensure krs_helper

O krs não cria as próprias tabelas. Importe o database.sql da base no banco antes do primeiro start. Ele precisa de accounts, characters, character_groups, hwid, entitydata, playerdata, permissions, avatars e vehicles. Veja a ordem no server.cfg.

Para dar o primeiro acesso de staff, use o setgroup do admin.

Entrada no servidor ​

Ao conectar, o krs segue esta ordem:

  1. Lê a conta pelo identificador de BaseMode. Sem esse identificador, recusa.
  2. Com Maintenance em forma de lista, só as contas da lista entram.
  3. Cria a conta, se ela não existir.
  4. Recusa conta banida, e também computador ou rede ligados a uma conta banida.
  5. Com Whitelisted = true, conta não liberada recebe um código e fica de fora.
  6. Com Whitelisted = false, conta não liberada passa pela checagem de confiança. Se reprovar, recebe um código e fica de fora.

A staff libera o código com /liberar, do admin.

lua
-- config/Global.lua
Maintenance = {
	["identificador_da_conta"] = true
}

A checagem de confiança usa os limites de Security.Trust:

OpçãoO que confere
DiscordDaysIdade mínima da conta do Discord, em dias
SteamDaysIdade mínima da conta da Steam, em dias
BanDaysJanela, em dias, de ban VAC ou de jogo na Steam

A checagem da Steam só roda com o convar steam_webApiKey.

Teclas ​

O jogador pode trocar as teclas nas configurações do FiveM.

TeclaO que faz
F6Cancela as ações
F7Enquanto segura, mostra o passaporte de quem está a até 10 m
XLevanta as mãos
BAponta os dedos
Left CtrlAgacha
ZLiga o veículo
LTranca e destranca
1 a 4Usam os botões do inventário
Numpad 1 a Numpad 9Tocam as animações salvas com /binds
Numpad 0Derruba o personagem

Comandos ​

ComandoO que faz
/andar [número]Troca o estilo de andar. Sem número, volta ao normal
/binds <1-9> <animação>Salva uma animação numa tecla do teclado numérico

Os comandos de staff ficam no admin.

Grupos ​

Os grupos ficam em Groups, em config/Global.lua:

lua
Petshop = {
	Permission = {
		Petshop = true
	},
	Hierarchy = { "Dono","Gerente","Veterinário","Atendente" },
	Salary = { 3500,3000,2750,2250 }
}

O primeiro nome de Hierarchy é o nível 1, o cargo mais alto. Por padrão, existem estes grupos:

TipoGrupos
StaffAdmin, Freecam
PolíciaLSPD, BCSO, SAPR
SaúdeParamedico
FacçõesBallas, Vagos, Families, Marabunta, Aztecas, Lester
EmpresasBennys, Bahamas, Restaurante, Petshop, Imobiliaria
PostosFuelStation01 a FuelStation27
AtividadesCorredor, Boosting
AgrupadoresPolicia, Emergencia
MembrosOuro, Prata, Bronze, Booster, Kayfy
CampoO que faz
PermissionGrupos que contam como este. Policia lista LSPD, BCSO e SAPR, então quem está num deles passa em Has("Policia")
HierarchyNome dos cargos
SalarySalário por cargo
BackpackPeso extra na mochila, por cargo
ServiceEntra em serviço ao carregar o personagem
BannedSai de serviço ao ser banido por tempo
TypeTipo do grupo, consultado por Groups.OfType
BlockFica fora da lista de /leaders

Configuração ​

Os arquivos ficam em config/.

ArquivoConteúdo
Global.luaRegras gerais, grupos e tema
Item.luaLista de itens
Vehicle.luaLista de veículos
vehicles/Fotos dos veículos, em .webp
textures/Texturas dos marcadores

config/Global.lua ​

OpçãoPadrãoO que muda
BaseMode"steam"Tipo de identificador que define a conta. Outro valor, como license, muda a mensagem de erro para Rockstar
Whitelistedfalsetrue exige liberação de toda conta
Liberation"Token"Campo da conta mostrado como código de liberação
MaintenancefalseLista de contas que entram durante a manutenção
ServerName"Kroma Systems"Nome nos avisos
ServerLinklink do DiscordBotão "Abrir Discord" na tela de conexão. Troque pelo seu
ServerAvatarimagem em base64Imagem da tela de conexão
Currency"$"Símbolo do dinheiro
NameDefault"Indivíduo Indigente"Nome de quem não tem personagem
SpawnCoordsum pontoPontos de nascimento. Sorteia um
PrisonCoordsvec3(1896.15,2604.44,45.75)Local da prisão
Banned.MutetrueSilencia quem foi banido por tempo
Banned.Route9999998Routing bucket de quem foi banido por tempo
Banned.Leavevec3(242.77,-392.07,46.3)Destino ao sair do banimento
MinimumWeight15Peso base da mochila
CharacterItenssoda, identity, hamburgerItens do personagem novo
SkinshopInit, BarbershopInitum por modeloRoupa e rosto do personagem novo
Themever arquivoCores e opções da interface

Itens ​

lua
["engine_v8"] = {
	AdminLevel = 1,
	Index = "engine_v8",
	Name = "Motor V8 6.5L",
	Description = "Motor V8 aspirado com estouros na desaceleração. Instalado por mecânico.",
	Type = "Consumível",
	Weight = 20.00,
	Economy = 65000
}

Veículos ​

lua
dinghy2 = {
	Name = "Dinghy 2",
	Weight = 40,
	Price = 90000,
	Mode = "Cars",
	Gemstone = 0,
	Trailer = true,
	Class = "Embarcações"
}

Convars ​

ConvarTipoPadrãoO que faz
krs_security_modesetObserveEnforce aplica as punições do anticheat. Em Observe, ele só registra, exceto nas categorias de Security.Always
krs_security_fowsetr01 liga a checagem de visão do anticheat. Quem tem Admin fica de fora
discord_logssetvazioWebhook padrão dos logs
discord_log_<Canal>setvazioWebhook de um canal. Tem prioridade sobre discord_logs
discord_screenshotsetvazioWebhook das capturas de tela
steam_webApiKeysetvazioChave da Steam para a checagem de confiança
midia_apisetvazioEndereço do serviço de envio de mídia
midia_keysetvazioChave do serviço de mídia
midia_hostsetvazioDomínio aceito nas URLs de mídia
krs_imagenssetrvazioEndereço das imagens lido pela interface
krs_profilersetfalsetrue mede as exports e libera ProfilerReport

Logs ​

cfg
set discord_logs "https://discord.com/api/webhooks/..."
set discord_log_Ban "https://discord.com/api/webhooks/..."

Sem webhook, o console avisa uma vez por canal e a mensagem não é enviada.

Anticheat ​

As regras ficam em server/security_config.lua, na tabela Security. Cada detecção soma pontos ao jogador, conforme Security.Weights, e os pontos caem com o tempo.

OpçãoPadrãoO que muda
ImmuneAdminGrupos que não recebem punição
LogOnlyEconomyCategorias que só geram registro, sem pontos
Score.DecayPerMinute5Pontos perdidos por minuto
Score.Warn20Pontos para o aviso
Score.Kick45Pontos para a expulsão
Score.Ban80Pontos para o banimento
Score.KicksBeforeBan2Expulsões automáticas até virar banimento
Score.BanMinutes0Duração do banimento. 0 é permanente

Comece em Observe, confira o console e depois passe para Enforce:

cfg
set krs_security_mode "Enforce"

Para programadores ​

Import ​

lua
-- fxmanifest.lua
shared_scripts { "@krs/import.lua" }
lua
-- servidor
local CharId = KRS.Player.CharId(source)
if CharId and KRS.Groups.Has(CharId,"Admin",2) then
	KRS.Money.AddBank(CharId,500)
end

Em script que deve rodar em outros frameworks, use o krs_helper.

Funções de servidor ​

As funções do framework também existem como export com o nome Dominio.Funcao, como Player.CharId. KRS.Db e os atalhos que só chamam o cliente, como KRS.UI.Request e KRS.Status.Revive, existem só pelo import.

DomínioFunções
KRS.PlayerCharId(source), Source(CharId), List(), Profile(CharId), Name(CharId, Mode), SetName(CharId, Name, Lastname), Data(CharId), Get(CharId, Key), Set(CharId, Key, Value), SetModel(CharId, Hash), Kick(source, Reason, Admin), Logout(source), Teleport(source, Coords, Heading), Bucket(source, Mode, Route), Avatar(CharId, Permission), Prison(CharId, Amount, Admin), PrisonRelease(CharId), FinishCreation(CharId), Login(source, CharId, Model)
KRS.AccountGet(License), Of(CharId), License(source), NewToken(), IsBanned(source, Account), Trust(source), Approve(Token, Admin), Ban(CharId, Minutes, Reason, Admin), ReduceBan(CharId, Amount, Admin), Unban(CharId, Admin)
KRS.GroupsHas(CharId, Permission, Level), HasDirect(CharId, Permission, Level), HasAny(CharId, List), Which(CharId, Permission), OnDuty(CharId, Permission, Level), Of(CharId), DutyOf(CharId), OfType(CharId, Type), Set(CharId, Permission, Level, Mode), Remove(CharId, Permission), Wipe(Permission), Members(Permission, Tree), MembersCount(Permission), OnDutyList(Permission, Level), OnDutyCount(Permission, Level), SetDuty(source, CharId, Permission, State, Silenced), Hierarchy(Permission), LevelName(Permission, Level), Info(Permission), Salary(CharId), PlayTime(CharId, Permission), ResetPlayTime()
KRS.OrgsGet(Permission, Field), Update(Permission, Field, Mode, Amount)
KRS.InventoryBuild(CharId, Item), Give(CharId, Item, Amount, Notify, Slot), GiveRaw(CharId, Item, Amount, Notify, Slot), Take(CharId, Item, Amount, Notify, Slot), Remove(CharId, Item, Amount, Notify), Find(CharId, Item), Has(CharId, Item, Amount), Count(CharId, Item), Weight(CharId), MaxWeight(CharId, Base), CanCarry(CharId, Item, Amount), AddMaxWeight(CharId, Amount), Slots(CharId), AddSlots(CharId, Amount), Get(CharId), Slot(CharId, Slot), ClearSlot(CharId, Slot), UseCharge(CharId, Item, Slot), Confiscate(CharId), Clear(CharId, KeepWeight), Sort(CharId)
KRS.StorageCount(Key, Item, Save), Weight(Key, Save), CanStore(Key, Item, Amount, Save), Take(CharId, Key, Amount, Slot, Target, Save), Store(CharId, Key, Amount, Weight, Slot, Target, Save, Max), Move(CharId, Key, Slot, Target, Amount, Save), ClearSlot(Key, Slot, Save), Fill(CharId, Key, List, Multiplier, Save, Percentage, Dollars)
KRS.MoneyBank(CharId), AddBank(CharId, Amount, Notify), RemoveBank(CharId, Amount), PayBank(CharId, Amount, Notify), HasCard(CharId), Pay(CharId, Amount, Notify), PayCard(CharId, Amount, Notify), Withdraw(CharId, Amount), Gems(CharId), AddGems(CharId, Amount), PayGems(CharId, Amount)
KRS.DataGet(Key, Save), Set(Key, Data, Save), Delete(Key, Ignore), Keys(Prefix), Player(CharId, Key, Preloaded), SetPlayer(CharId, Key, Value), Commit(Key, CharId)
KRS.StatusGet(CharId, Name), Add(CharId, Name, Amount), Health(source), SetArmour(source, Amount), AddArmour(source, Amount), SetHealth(source, Health, Death), AddHealth(source, Amount), Revive(source, Health, Arena)
KRS.EffectsGet(CharId, Name), Set(CharId, Name, Minutes)
KRS.ProgressExperience(CharId, Work), AddExperience(CharId, Work, Amount), SetDaily(CharId, Daily)
KRS.BattlepassGet(CharId), Buy(CharId), Pay(CharId, Mode, Amount), AddPoints(CharId, Amount)
KRS.VehiclesOwned(CharId, Model), OwnerOf(Plate), NewPlate(), HasKey(CharId, Plate, Network), RevokeKeys(Plate), Allow(source, Models, Amount, Seconds), List(), Exist(Model), Name(Model), Weight(Model), Price(Model), Mode(Model), Gemstone(Model), Class(Model), Stock(Model), Trailer(Model)
KRS.ItemsList(), Exist(Item), TypeCheck(Item, Mode), Index(Item), Name(Item), Type(Item), Weight(Item), Description(Item), Rarity(Item), Damaged(Item)
KRS.UIRequest(source, Title, Message), Task(source, Amount, Speed), LetterGame(source, Duration, Speed), Keyboard(source, Kind, ...), CallPolice(Table)
KRS.MediaUploadUrl(source, Type), Valid(Url)
KRS.SecurityFlag(source, Category, Reason, Weight), Allow(source, Kind, Models, Amount, Seconds), Grace(source, Milliseconds), Score(source), Immune(source)
KRS.DbPrepare(Name, Query), Query(Name, Params), Single(Name, Params), Scalar(Name, Params), Update(Name, Params), Insert(Name, Params), Transaction(List)

Regras:

  • Groups.Has e Groups.HasDirect aceitam "Policia-2". Nível 1 é o cargo mais alto, e o nível pede aquele cargo ou acima.
  • Groups.Has considera Permission. Groups.HasDirect olha só o próprio grupo.
  • Account.Ban com 0 minutos ou menos é permanente.
  • Security.Allow libera a criação de Ped ou Object pelo cliente, para os modelos, a quantidade e o tempo informados.
  • Security.Grace pausa a checagem de movimento do jogador, em ms.

Funções de cliente ​

DomínioFunções
KRS.PlayerCharId(), Name(), Reload(), ApplySkin(Hash), Setup()
KRS.GroupsHas(Group, Level), OnDuty(Group, Level)
KRS.StatePlayer(Key, Value), Entity(Handle, Key, Value)
KRS.AnimPlay(Upper, Sequence, Loop), Stop(Upper), Release(), IsPlaying(Dictionary, Animation), Prop(Dict, Anim, Prop, Flag, Hands, Height, Pos1, Pos2, Pos3, Pos4, Pos5), Clear(Mode), Persist(ItemName, Animation)
KRS.ObjectsPlace(Model, Rotate, Align, Distance, Bottom, Start), SprayExist(Distance)
KRS.PedsAdd(List)
KRS.IplTheme(Suite, Theme)

Callbacks ​

lua
-- servidor: até 10 chamadas por segundo, por jogador. O limite é opcional
KRS.Callback.Register("loja:Comprar",function(source,Item)
	return true
end,2)

-- cliente: devolve nil depois de 10 s
local Ok = KRS.Callback.Await("loja:Comprar","water")
local Lento = KRS.Callback.AwaitFor(30000,"loja:Lista")

No servidor, KRS.Callback.Await(source,nome,...) e KRS.Callback.AwaitFor(timeout,source,nome,...) chamam o cliente.

Eventos ​

Eventos locais do servidor, para escutar com AddEventHandler. O último argumento, quando é Resource, diz quem fez a alteração.

EventoArgumentos
krs:player:LoadedCharId, source, First
krs:player:UnloadedCharId, source, License, Reason, Coords
krs:player:KickedCharId, source, Reason, Admin, Resource
krs:player:PrisonCharId, Amount, Admin, Resource
krs:account:ApprovedAccount, Admin, Resource
krs:account:BannedCharId, Duration, Reason, Admin, Resource
krs:account:BanReducedCharId, Reduce, Remaining, Admin, Resource
krs:account:UnbannedCharId, Admin, Resource
krs:account:HeldAccount, Reasons
krs:groups:ChangedCharId, Permission, Value, Mode, Resource
krs:duty:ChangedCharId, Permission, State
krs:money:ChangedCharId, Bank, Amount, Mode, Resource
krs:gems:ChangedCharId, Amount, Mode, Resource
krs:inventory:ChangedCharId, Item, Amount, Resource
krs:inventory:ClearedCharId, Resource
krs:security:PunishedCharId, source, Action, Score, Reason, Enforce

Para pedir um salvamento geral: TriggerEvent("krs:save",false). Com true, o salvamento é silencioso. Para somar pontos no anticheat, use KRS.Security.Flag.

Exports de relatório ​

Não há comando ligado a estas exports. Chame de outro script do servidor.

lua
-- modo atual e pontos de todos
exports.krs:SecurityReport({})

-- pontos de um source
exports.krs:SecurityReport({ 12 })

-- só com krs_profiler ligado: as 30 exports mais pesadas
exports.krs:ProfilerReport({})

-- zera as medições
exports.krs:ProfilerReport({ "reset" })

exports.krs:Log(canal, mensagem) envia ao Discord. Mensagem em tabela vira campos. Mensagem em texto vira descrição.

Problemas comuns ​

MensagemO que fazer
log ... sem webhook: set discord_logs ou discord_log_...Defina um dos dois convars, ou ignore se não quiser esse log
Discord recusou logConfira a URL do webhook
[krs] import: ... não encontradoConfirme que o resource se chama krs e está inteiro
export ... não existe em ...O resource chamado não está ligado. Confira a ordem dos ensure
Sem conexão com a SteamO jogador precisa abrir a Steam antes de conectar, ou troque BaseMode
a API da Steam não respondeu; entrada conferida sem a Steam.Falha temporária ou chave errada em steam_webApiKey
O envio de mídia não está configurado no servidor.Defina midia_api e midia_key