Skip to content

Anti-cheat

Anti-cheat

모든 자금 및 재고 관련 결정은 서버에서 이루어집니다. 클라이언트는 주유기를 렌더링하고 발생한 일만 보고할 뿐, 어떤 항목의 비용이 얼마인지 또는 얼마나 주입되었는지를 스스로 결정하지 않습니다.

서버가 강제하는 사항

  • 주유 세션. 주유기를 열면 서버에 세션 토큰을 요청합니다. 결제하려면 해당 토큰이 필요하며, 청구되는 리터 수는 설정된 유속에 따라 세션이 실제로 열려 있던 시간으로 제한됩니다. 주유기가 물리적으로 공급할 수 있는 양보다 더 많은 양을 주장하는 클라이언트는 타이머가 허용하는 수준으로 조정됩니다.
  • 세션 만료. 토큰은 일회용이며, 이를 연 플레이어에게 귀속되고 PumpSessionTimeout 이후에 폐기됩니다. 만료된 세션은 아무것도 청구하지 않습니다.
  • 거리 확인. 구매, 주유, 충전, 배터리 교환, 제리캔 채우기, 재고 주문 및 모든 대시보드 작업은 플레이어가 실제로 해당 주유소에 있는지 서버에서 재확인하며, 보행자(ped) 위치 지연을 위해 DistanceSlack 미터의 오차 범위를 허용합니다.
  • 속도 제한(Rate limiting). 모든 이벤트와 콜백은 PerSecond 주기로 리필되고 Burst를 초과하여 쌓이지 않는 플레이어별 버킷에서 토큰을 소모합니다. 멈춘 키바인딩은 계속 작동하지만, 스팸 루프는 거의 즉시 차단됩니다.
  • 값 클램핑. 가격, 임금, 주문, 출금 및 입금은 모두 서버 측에서 범위 검증과 타입 검증을 거칩니다. MaxAmount를 초과하는 값은 전혀 허용되지 않으며, 가격은 Config.Refuel.PriceLimits 내에 유지됩니다.
  • 모든 작업에 대한 권한 검증. 스태프 권한은 UI를 신뢰하지 않고 요청마다 서버 측에서 다시 검증됩니다. 고용, 해고 및 employees 권한을 가진 사람의 편집은 오직 소유자(owner)만 가능하므로, 직원이 스스로 승진할 수 없습니다. 이전 및 재판매는 소유자만 가능하며 주유소 이름을 다시 입력해야 합니다.
  • 재고와 은행은 서버 상태입니다. 판매는 주유소에 실제로 해당 리터 수가 있고 고객에게 실제로 돈이 있는 경우에만 발생하며, 양측 모두 동일한 서버 측 단계에서 처리됩니다.
config.lua
Config.AntiCheat = {
    RateLimit = { Burst = 14, PerSecond = 6 },
    MaxLitresPerPay = 200.0,
    LitreGrace = 3.0,
    PumpSessionTimeout = 900,
    DistanceSlack = 15.0,
    MaxAmount = 100000000,
    MaxWage = 25000,
    JerryPourTimeout = 600,
}
설정 (Setting) 용도 (Purpose)
RateLimit 플레이어별 이벤트 버킷의 버스트 크기 및 리필 속도
MaxLitresPerPay 타이밍과 상관없이 단일 주유기 또는 충전기 세션에 대한 엄격한 상한선
LitreGrace 리터 단위의 타이밍 검정 오차 범위. 렉이 걸린 틱을 커버함
PumpSessionTimeout 세션이 유효한 상태로 유지되는 시간(초)
DistanceSlack 주유소 반경 외에 추가로 허용되는 미터 거리
MaxAmount 클라이언트로부터 허용되는 모든 금액 값의 상한선
MaxWage 소유자가 직원에게 지정할 수 있는 최고 임금
JerryPourTimeout 완료되지 않은 주유가 기억되어 남은 양을 더 이상 청구할 수 없게 되기까지의 시간(초)

튜닝

기본값은 일반적인 서버에 적합합니다. 조정해 볼 가치가 있는 두 가지 설정:

  • LitreGrace — 연결 상태가 나쁜 플레이어들이 주유소에서 손해를 보는 경우 1~2리터 정도 높이세요. 낮게 유지하세요. 공짜 연료입니다.
  • RateLimit.Burst — 실제로 혼잡한 주유소에서 작업 거부가 발생하기 시작하면 높이세요. 더 엄격하게 제한하고 싶다면 낮추세요.

MaxLitresPerPay 또는 DistanceSlack을 크게 완화하면 해당 검증들이 존재하는 이유인 상한선이 사라집니다. 선량한 플레이어가 눈에 띄게 차단되는 경우에만 변경하세요.