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
ensure oxmysql
ensure ox_lib
ensure krs
ensure krs_helperO 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:
- Lê a conta pelo identificador de
BaseMode. Sem esse identificador, recusa. - Com
Maintenanceem forma de lista, só as contas da lista entram. - Cria a conta, se ela não existir.
- Recusa conta banida, e também computador ou rede ligados a uma conta banida.
- Com
Whitelisted = true, conta não liberada recebe um código e fica de fora. - 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.
-- config/Global.lua
Maintenance = {
["identificador_da_conta"] = true
}A checagem de confiança usa os limites de Security.Trust:
| Opção | O que confere |
|---|---|
DiscordDays | Idade mínima da conta do Discord, em dias |
SteamDays | Idade mínima da conta da Steam, em dias |
BanDays | Janela, 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.
| Tecla | O que faz |
|---|---|
F6 | Cancela as ações |
F7 | Enquanto segura, mostra o passaporte de quem está a até 10 m |
X | Levanta as mãos |
B | Aponta os dedos |
Left Ctrl | Agacha |
Z | Liga o veículo |
L | Tranca e destranca |
1 a 4 | Usam os botões do inventário |
Numpad 1 a Numpad 9 | Tocam as animações salvas com /binds |
Numpad 0 | Derruba o personagem |
Comandos
| Comando | O 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:
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:
| Tipo | Grupos |
|---|---|
| Staff | Admin, Freecam |
| Polícia | LSPD, BCSO, SAPR |
| Saúde | Paramedico |
| Facções | Ballas, Vagos, Families, Marabunta, Aztecas, Lester |
| Empresas | Bennys, Bahamas, Restaurante, Petshop, Imobiliaria |
| Postos | FuelStation01 a FuelStation27 |
| Atividades | Corredor, Boosting |
| Agrupadores | Policia, Emergencia |
| Membros | Ouro, Prata, Bronze, Booster, Kayfy |
| Campo | O que faz |
|---|---|
Permission | Grupos que contam como este. Policia lista LSPD, BCSO e SAPR, então quem está num deles passa em Has("Policia") |
Hierarchy | Nome dos cargos |
Salary | Salário por cargo |
Backpack | Peso extra na mochila, por cargo |
Service | Entra em serviço ao carregar o personagem |
Banned | Sai de serviço ao ser banido por tempo |
Type | Tipo do grupo, consultado por Groups.OfType |
Block | Fica fora da lista de /leaders |
Configuração
Os arquivos ficam em config/.
| Arquivo | Conteúdo |
|---|---|
Global.lua | Regras gerais, grupos e tema |
Item.lua | Lista de itens |
Vehicle.lua | Lista de veículos |
vehicles/ | Fotos dos veículos, em .webp |
textures/ | Texturas dos marcadores |
config/Global.lua
| Opção | Padrão | O que muda |
|---|---|---|
BaseMode | "steam" | Tipo de identificador que define a conta. Outro valor, como license, muda a mensagem de erro para Rockstar |
Whitelisted | false | true exige liberação de toda conta |
Liberation | "Token" | Campo da conta mostrado como código de liberação |
Maintenance | false | Lista de contas que entram durante a manutenção |
ServerName | "Kroma Systems" | Nome nos avisos |
ServerLink | link do Discord | Botão "Abrir Discord" na tela de conexão. Troque pelo seu |
ServerAvatar | imagem em base64 | Imagem da tela de conexão |
Currency | "$" | Símbolo do dinheiro |
NameDefault | "Indivíduo Indigente" | Nome de quem não tem personagem |
SpawnCoords | um ponto | Pontos de nascimento. Sorteia um |
PrisonCoords | vec3(1896.15,2604.44,45.75) | Local da prisão |
Banned.Mute | true | Silencia quem foi banido por tempo |
Banned.Route | 9999998 | Routing bucket de quem foi banido por tempo |
Banned.Leave | vec3(242.77,-392.07,46.3) | Destino ao sair do banimento |
MinimumWeight | 15 | Peso base da mochila |
CharacterItens | soda, identity, hamburger | Itens do personagem novo |
SkinshopInit, BarbershopInit | um por modelo | Roupa e rosto do personagem novo |
Theme | ver arquivo | Cores e opções da interface |
Itens
["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
dinghy2 = {
Name = "Dinghy 2",
Weight = 40,
Price = 90000,
Mode = "Cars",
Gemstone = 0,
Trailer = true,
Class = "Embarcações"
}Convars
| Convar | Tipo | Padrão | O que faz |
|---|---|---|---|
krs_security_mode | set | Observe | Enforce aplica as punições do anticheat. Em Observe, ele só registra, exceto nas categorias de Security.Always |
krs_security_fow | setr | 0 | 1 liga a checagem de visão do anticheat. Quem tem Admin fica de fora |
discord_logs | set | vazio | Webhook padrão dos logs |
discord_log_<Canal> | set | vazio | Webhook de um canal. Tem prioridade sobre discord_logs |
discord_screenshot | set | vazio | Webhook das capturas de tela |
steam_webApiKey | set | vazio | Chave da Steam para a checagem de confiança |
midia_api | set | vazio | Endereço do serviço de envio de mídia |
midia_key | set | vazio | Chave do serviço de mídia |
midia_host | set | vazio | Domínio aceito nas URLs de mídia |
krs_imagens | setr | vazio | Endereço das imagens lido pela interface |
krs_profiler | set | false | true mede as exports e libera ProfilerReport |
Logs
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ção | Padrão | O que muda |
|---|---|---|
Immune | Admin | Grupos que não recebem punição |
LogOnly | Economy | Categorias que só geram registro, sem pontos |
Score.DecayPerMinute | 5 | Pontos perdidos por minuto |
Score.Warn | 20 | Pontos para o aviso |
Score.Kick | 45 | Pontos para a expulsão |
Score.Ban | 80 | Pontos para o banimento |
Score.KicksBeforeBan | 2 | Expulsões automáticas até virar banimento |
Score.BanMinutes | 0 | Duração do banimento. 0 é permanente |
Comece em Observe, confira o console e depois passe para Enforce:
set krs_security_mode "Enforce"Para programadores
Import
-- fxmanifest.lua
shared_scripts { "@krs/import.lua" }-- servidor
local CharId = KRS.Player.CharId(source)
if CharId and KRS.Groups.Has(CharId,"Admin",2) then
KRS.Money.AddBank(CharId,500)
endEm 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ínio | Funções |
|---|---|
KRS.Player | CharId(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.Account | Get(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.Groups | Has(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.Orgs | Get(Permission, Field), Update(Permission, Field, Mode, Amount) |
KRS.Inventory | Build(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.Storage | Count(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.Money | Bank(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.Data | Get(Key, Save), Set(Key, Data, Save), Delete(Key, Ignore), Keys(Prefix), Player(CharId, Key, Preloaded), SetPlayer(CharId, Key, Value), Commit(Key, CharId) |
KRS.Status | Get(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.Effects | Get(CharId, Name), Set(CharId, Name, Minutes) |
KRS.Progress | Experience(CharId, Work), AddExperience(CharId, Work, Amount), SetDaily(CharId, Daily) |
KRS.Battlepass | Get(CharId), Buy(CharId), Pay(CharId, Mode, Amount), AddPoints(CharId, Amount) |
KRS.Vehicles | Owned(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.Items | List(), Exist(Item), TypeCheck(Item, Mode), Index(Item), Name(Item), Type(Item), Weight(Item), Description(Item), Rarity(Item), Damaged(Item) |
KRS.UI | Request(source, Title, Message), Task(source, Amount, Speed), LetterGame(source, Duration, Speed), Keyboard(source, Kind, ...), CallPolice(Table) |
KRS.Media | UploadUrl(source, Type), Valid(Url) |
KRS.Security | Flag(source, Category, Reason, Weight), Allow(source, Kind, Models, Amount, Seconds), Grace(source, Milliseconds), Score(source), Immune(source) |
KRS.Db | Prepare(Name, Query), Query(Name, Params), Single(Name, Params), Scalar(Name, Params), Update(Name, Params), Insert(Name, Params), Transaction(List) |
Regras:
Groups.HaseGroups.HasDirectaceitam"Policia-2". Nível 1 é o cargo mais alto, e o nível pede aquele cargo ou acima.Groups.HasconsideraPermission.Groups.HasDirectolha só o próprio grupo.Account.Bancom 0 minutos ou menos é permanente.Security.Allowlibera a criação dePedouObjectpelo cliente, para os modelos, a quantidade e o tempo informados.Security.Gracepausa a checagem de movimento do jogador, em ms.
Funções de cliente
| Domínio | Funções |
|---|---|
KRS.Player | CharId(), Name(), Reload(), ApplySkin(Hash), Setup() |
KRS.Groups | Has(Group, Level), OnDuty(Group, Level) |
KRS.State | Player(Key, Value), Entity(Handle, Key, Value) |
KRS.Anim | Play(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.Objects | Place(Model, Rotate, Align, Distance, Bottom, Start), SprayExist(Distance) |
KRS.Peds | Add(List) |
KRS.Ipl | Theme(Suite, Theme) |
Callbacks
-- 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.
| Evento | Argumentos |
|---|---|
krs:player:Loaded | CharId, source, First |
krs:player:Unloaded | CharId, source, License, Reason, Coords |
krs:player:Kicked | CharId, source, Reason, Admin, Resource |
krs:player:Prison | CharId, Amount, Admin, Resource |
krs:account:Approved | Account, Admin, Resource |
krs:account:Banned | CharId, Duration, Reason, Admin, Resource |
krs:account:BanReduced | CharId, Reduce, Remaining, Admin, Resource |
krs:account:Unbanned | CharId, Admin, Resource |
krs:account:Held | Account, Reasons |
krs:groups:Changed | CharId, Permission, Value, Mode, Resource |
krs:duty:Changed | CharId, Permission, State |
krs:money:Changed | CharId, Bank, Amount, Mode, Resource |
krs:gems:Changed | CharId, Amount, Mode, Resource |
krs:inventory:Changed | CharId, Item, Amount, Resource |
krs:inventory:Cleared | CharId, Resource |
krs:security:Punished | CharId, 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.
-- 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
| Mensagem | O 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 log | Confira a URL do webhook |
[krs] import: ... não encontrado | Confirme 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 Steam | O 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 |
