Avresi Lisans Sistemi - Kurulum Rehberi

🚀 YENİ: Otomatik Setup Sistemi

Artık lisans sistemini kurmak çok daha kolay! Panelden "Setup Oluştur" sayfasına giderek özelleştirilmiş bir setup dosyası indirebilirsiniz. Bu setup:

  • ✅ Tüm dosyaları otomatik kopyalar
  • ✅ Tüm resource'lara dependency ekler
  • ✅ Framework'lere (qb-core, es_extended, ox_lib, qbox) lisans kontrolü ekler
  • ✅ Tüm Lua dosyalarını otomatik şifreler
  • ✅ server.cfg'yi otomatik günceller
  • ✅ Tek tıkla kurulum (.bat dosyası ile)

Kullanım: Panel > Setup Oluştur > Setup Dosyası İndir > ZIP'i çıkar > KURULUM.bat çalıştır

ÖNEMLİ UYARI:
- Bu sayfadaki kodları mutlaka Luraph veya benzeri bir obfuscator ile şifreleyin!

- Hem avresi-lisans scriptini hem de önemli scriptlerinize ekleyeceğiniz kısa kodları ekledikten sonra önemli scriptlerinizin tamamını da obfuscate edin yani şifreleyin.

- Aksi takdirde müşterileriniz lisans korumasını kolayca devre dışı bırakabilir.

- Scriptin adını (klasör adı) "avresi-lisans" yapın yoksa çalışmaz.

- Sürekli test ederek ilerleyin tüm scriptlerin aynı anda şifrelemek yerine teker teker şifreleyin bu sayede hata yapmamış olursunuz. - Kodları obfuscate ederken fivem destekleyen bir obfuscator kullanın bütçeniz varsa script başına 2 dolar vererek(client.lua 1 dolar server.lua 1 dolar) luraph kullanabilirsiniz fakat bunun size toplam maliyeti 20 script+avresi-lisans ile birlikte en az 42dolar(1700tl) olur. (tek seferlik ücrettir.) Para ödemek istemezseniz de ücretsiz bulabilirsiniz fivem destekleyen bir obfuscator. Ama luraph kadar kaliteli olmaz.

- Kodları şifrelemeden önce tüm paketi yedek alın sonraki güncellemelerde sıkıntı yaşamazsınız.

📦 Otomatik Setup Kullanımı (Önerilen)

Adım 1: Setup Dosyası Oluşturun

  1. Developer panelinize giriş yapın
  2. Sol menüden "Setup Oluştur" sayfasına gidin
  3. "Setup Dosyası Oluştur ve İndir" butonuna tıklayın
  4. ZIP dosyası otomatik olarak indirilecektir

Adım 2: Setup Dosyasını Kurun

Windows Kullanıcıları:

  1. İndirdiğiniz ZIP dosyasını FiveM server klasörünüze çıkarın (server.cfg'nin olduğu klasör)
  2. KURULUM.bat dosyasına çift tıklayın
  3. Kurulum otomatik olarak tamamlanacaktır

Linux/Mac Kullanıcıları:

  1. İndirdiğiniz ZIP dosyasını FiveM server klasörünüze çıkarın
  2. Terminal'de şu komutları çalıştırın:
chmod +x kurulum.sh
./kurulum.sh

Adım 3: Server'ı Başlatın

Kurulum tamamlandıktan sonra server'ı yeniden başlatın. Tüm resource'lar otomatik olarak korunacaktır!

💡 İpucu: Setup dosyası şunları otomatik yapar:
  • Tüm resource'lara avresi-lisans dependency'si ekler
  • qb-core, es_extended, ox_lib, qbox gibi framework'lere lisans kontrolü ekler
  • Tüm Lua dosyalarını şifreler
  • server.cfg'yi günceller

📝 Manuel Kurulum (İleri Seviye)

Eğer otomatik setup kullanmak istemiyorsanız, aşağıdaki adımları takip ederek manuel olarak kurabilirsiniz:

Sistem Nasıl Çalışır?

Bu lisans sistemi 2 parçadan oluşur:

  1. avresi-lisans: Ana lisans kontrolcüsü. Bu script her dakika paneli kontrol eder ve lisans geçerli mi değil mi öğrenir. Eğer lisans geçersizse sunucudaki tüm oyuncuları atar ve yeni oyuncu girişini engeller.
  2. Peki ya avresi-lisans'ı silerlerse? Diğer önemli scriptlerinize ekleyeceğiniz kısa kodlar avresi-lisans silindi mi diye kontrol eder. Eğer avresi-lisans silindiyse kendisini kapatır.

ADIM 1: avresi-lisans Klasörünü Oluşturun

FiveM sunucunuzun resources klasörüne gidin ve yeni bir klasör oluşturun.
Klasör adı: avresi-lisans

Örnek yol: \resources\avresi-lisans\

ADIM 2: fxmanifest.lua Dosyası Oluşturun

avresi-lisans klasörünün içine fxmanifest.lua isimli bir dosya oluşturun.
Aşağıdaki kodu bu dosyaya kopyalayın:

fx_version 'cerulean'
game 'gta5'
lua54 'yes'

author 'Avresi'
description 'Crengarl Lisans Sistemi'
version '1.0.0'

server_scripts {
    'server.lua'
}

ADIM 3: server.lua Dosyası Oluşturun

avresi-lisans klasörünün içine server.lua isimli bir dosya oluşturun.
Aşağıdaki kodu bu dosyaya kopyalayın:

NOT: Aşağıdaki kodda LICENSE_KEY kısmı otomatik olarak sizin API anahtarınız ile değişmiştir.

local LICENSE_KEY = "BURAYA_API_ANAHTARINIZI_YAZIN"
local VERIFY_URL = "https://lisans.avresi.com/api/verify.php"

local kontrol_suresi = 60000
local baslangic_bekleme = 3000
local hata_bekleme = 15000
local oyuncu_atma_suresi = 20000

local lisans_durumu = {
    gecerli = false,
    sebep = "kontrol_ediliyor",
    son_kontrol = 0
}

local function GlobalStateGuncelle(gecerli, sebep)
    lisans_durumu.gecerli = gecerli
    lisans_durumu.sebep = sebep or "bilinmiyor"
    lisans_durumu.son_kontrol = os.time()

    GlobalState.AVRESI_LICENSE = {
        valid = gecerli,
        state = gecerli and "valid" or "invalid",
        reason = lisans_durumu.sebep,
        timestamp = os.time()
    }
end

local function LisansKontrol()
    PerformHttpRequest('https://api.ipify.org?format=text', function(status_code, server_ip)
        if status_code ~= 200 or not server_ip or server_ip == "" then
            GlobalStateGuncelle(false, "ip_alinamadi")
            SetTimeout(hata_bekleme, LisansKontrol)
            return
        end

        server_ip = server_ip:gsub("%s+", "")

        local post_data = json.encode({
            license_key = LICENSE_KEY,
            ip = server_ip,
            player_count = #GetPlayers()
        })

        PerformHttpRequest(VERIFY_URL, function(status, response)
            if status ~= 200 then
                GlobalStateGuncelle(false, "api_hatasi")
                SetTimeout(hata_bekleme, LisansKontrol)
                return
            end

            local data = json.decode(response or "{}") or {}

            if data.status == "valid" or data.status == "expiring" then
                GlobalStateGuncelle(true, data.status)
                SetTimeout(kontrol_suresi, LisansKontrol)

            elseif data.status == "expired" then
                GlobalStateGuncelle(false, "suresi_doldu")

                CreateThread(function()
                    Wait(oyuncu_atma_suresi)
                    for _, oyuncu in ipairs(GetPlayers()) do
                        DropPlayer(oyuncu, "[Avresi] Sunucu lisansının süresi doldu.")
                    end
                end)

            elseif data.status == "banned" then
                GlobalStateGuncelle(false, "yasaklandi")

                CreateThread(function()
                    Wait(oyuncu_atma_suresi)
                    for _, oyuncu in ipairs(GetPlayers()) do
                        DropPlayer(oyuncu, "[Avresi] Sunucu lisansı yasaklandı.")
                    end
                end)

            else
                GlobalStateGuncelle(false, "gecersiz_lisans")

                CreateThread(function()
                    Wait(oyuncu_atma_suresi)
                    for _, oyuncu in ipairs(GetPlayers()) do
                        DropPlayer(oyuncu, "[Avresi] Sunucu lisansı geçersiz.")
                    end
                end)
            end
        end, "POST", post_data, {["Content-Type"] = "application/json"})
    end, "GET")
end

CreateThread(function()
    GlobalStateGuncelle(false, "kontrol_ediliyor")
    Wait(baslangic_bekleme)
    LisansKontrol()
end)

AddEventHandler('onResourceStop', function(resourceName)
    if resourceName == GetCurrentResourceName() then
        GlobalState.AVRESI_LICENSE = nil
    end
end)

exports('permit', function()
    return lisans_durumu.gecerli == true
end)

exports('getLicenseStatus', function()
    return lisans_durumu
end)

AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
    deferrals.defer()
    Wait(100)

    local license_state = GlobalState.AVRESI_LICENSE

    if not license_state or not license_state.valid then
        deferrals.done("[Avresi] Sunucu lisansı geçersiz. Lütfen daha sonra tekrar deneyin.")
    else
        deferrals.done()
    end
end)

ADIM 4: server.cfg Dosyasını Düzenleyin

FiveM sunucunuzun ana klasöründeki server.cfg dosyasını açın.
Dosyanın en altına şu satırı ekleyin:

ensure avresi-lisans

ADIM 5: Koruma Kodunu Scriptlerinize Ekleyin

Şimdi sıra geldi diğer scriptlerinizi korumaya. Bu adımı MUTLAKA yapmalısınız, yoksa avresi-lisans hiç bir işe yaramaz.

Server Tarafı Koruma

Korumak istediğiniz scriptlerin server dosyasını açın, içindeki kodu başka bir yere kopyalayın ve dosyanın içini boşaltın.
Ardından aşağıdaki kodu yapıştırın, aşağıdaki kodda buradan sonra kendi kodlarınız yazan yer göreceksiniz oraya kopyaladığınız orjinal client kodlarını yapıştırın. Bunu tüm scriptlerde tekrarlamanız gerekecek.

local RESOURCE_NAME = GetCurrentResourceName()
local LISANS_SCRIPT = "avresi-lisans"

local function ScriptBaslat()

-- === BURADAN SONRA KENDİ KODLARINIZ ===
-- Tüm kodlarınızı buraya yapıştırın

end -- ScriptBaslat fonksiyonunun sonu

CreateThread(function()
    local kontrol_sayisi = 0
    local max_kontrol = 70

    while kontrol_sayisi < max_kontrol do
        Wait(500)
        kontrol_sayisi = kontrol_sayisi + 1

        local resource_state
        local basarili, sonuc
        local license_state

        resource_state = GetResourceState(LISANS_SCRIPT)

        if resource_state ~= "started" and resource_state ~= "starting" then
            if kontrol_sayisi > 10 then
                return
            end
            goto continue
        end

        basarili, sonuc = pcall(function()
            return exports[LISANS_SCRIPT]:permit()
        end)

        if not basarili then
            goto continue
        end

        if sonuc ~= true then
            goto continue
        end

        license_state = GlobalState.AVRESI_LICENSE
        if not license_state or not license_state.valid then
            goto continue
        end

        ScriptBaslat()
        goto monitoring

        ::continue::
    end

    do
        return
    end

    ::monitoring::
    Wait(5000)
    while true do
        Wait(30000)

        if GetResourceState(LISANS_SCRIPT) ~= "started" then
            -- TÜM OYUNCULARI AT
            local allPlayers = GetPlayers()
            for _, playerId in ipairs(allPlayers) do
                DropPlayer(playerId, "[Avresi] Sunucu lisansı aktif değil.")
            end

            StopResource(RESOURCE_NAME)
            return
        end

        local basarili2, sonuc2 = pcall(function()
            return exports[LISANS_SCRIPT]:permit()
        end)

        if not basarili2 or sonuc2 ~= true then
            -- TÜM OYUNCULARI AT
            local allPlayers = GetPlayers()
            for _, playerId in ipairs(allPlayers) do
                DropPlayer(playerId, "[Avresi] Sunucu lisansı aktif değil.")
            end

            StopResource(RESOURCE_NAME)
            return
        end
    end
end)

AddEventHandler('onResourceStop', function(resourceName)
    if resourceName == LISANS_SCRIPT then
        -- TÜM OYUNCULARI AT
        local allPlayers = GetPlayers()
        for _, playerId in ipairs(allPlayers) do
            DropPlayer(playerId, "[Avresi] Sunucu lisansı aktif değil.")
        end

        StopResource(RESOURCE_NAME)
    end
end)

-- ============================================
-- LİSANS KONTROLÜ - YENİ OYUNCU GİRİŞİ
-- ============================================
-- Yeni oyuncuların girmesini engelle (lisans yoksa/geçersizse)
AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
    deferrals.defer()

    Wait(100)

    -- avresi-lisans resource durumunu kontrol et
    local resource_state = GetResourceState(LISANS_SCRIPT)

    if resource_state ~= "started" and resource_state ~= "starting" then
        deferrals.done("[Avresi] Sunucu lisansı aktif değil.")
        return
    end

    -- GlobalState kontrolü
    local license_state = GlobalState.AVRESI_LICENSE

    if not license_state or not license_state.valid then
        deferrals.done("[Avresi] Sunucu lisansı aktif değil.")
    else
        deferrals.done()
    end
end)

Client Tarafı Koruma

Korumak istediğiniz scriptlerin client dosyasını açın, içindeki kodu başka bir yere kopyalayın ve dosyanın içini boşaltın.
Ardından aşağıdaki kodu yapıştırın, aşağıdaki kodda buradan sonra kendi kodlarınız yazan yer göreceksiniz oraya kopyaladığınız orjinal client kodlarını yapıştırın. Bunu tüm scriptlerde tekrarlamanız gerekecek.

local RESOURCE_NAME = GetCurrentResourceName()

local function ScriptBaslat()

-- === BURADAN SONRA KENDİ KODLARINIZ ===
-- Tüm kodlarınızı buraya yapıştırın

end -- ScriptBaslat fonksiyonunun sonu

CreateThread(function()
    local kontrol_sayisi = 0
    local max_kontrol = 70

    while kontrol_sayisi < max_kontrol do
        Wait(500)
        kontrol_sayisi = kontrol_sayisi + 1

        local license_state = GlobalState.AVRESI_LICENSE

        if license_state and license_state.valid and license_state.state == "valid" then
            ScriptBaslat()

            Wait(5000)
            while true do
                Wait(30000)
                local ls = GlobalState.AVRESI_LICENSE

                if not ls or not ls.valid or ls.state ~= "valid" then
                    break
                end
            end
            return
        end
    end
end)

Sistem Nasıl Çalışır? (Basit Anlatım)

  1. avresi-lisans scripti çalışır ve panele bağlanır
  2. Panel size "Lisans geçerli" veya "Lisans geçersiz" der
  3. Durum tüm sunucuya yayınlanır (GlobalState)
  4. Diğer scriptleriniz başlarken bu durumu kontrol eder
  5. Eğer lisans geçersizse, scriptler çalışmaz ve oyuncular sunucuya giremez

Hangi Scriptlere Koruma Kodu Eklemeliyim?

Önemli/Kritik scriptlerinize koruma kodu ekleyin. Örneğin:

  • Envanter (inventory) sistemi
  • Banka sistemi
  • Araç garaj sistemi
  • Admin menü
  • Multichar
  • Meslekler
  • Ekonomi sistemi

Tavsiye: En az 20-30 önemli scriptinize ekleyin. Ne kadar çok scripte eklerseniz o kadar güvenli olur. Ben 40 tane falan ekledim.

Güvenlik Önerileri

  • MUTLAKA: Tüm kodları Luraph veya ücretsiz lua obfuscator ile şifreleyin!
  • MUTLAKA: API anahtarınızı kimseyle paylaşmayın: BURAYA_API_ANAHTARINIZI_YAZIN
  • TAVSİYE: Kodları şifreledikten sonra orijinal kodları silin

Sık Sorulan Sorular

1. Sunucuların lisans süresi dolarsa ne olur?

Lisansın süresi dolduğunda sistem 60 saniye içinde tüm oyuncuları sunucudan atar ve yeni oyuncu girişlerini engeller. Scriptlerde artık çalışmaz.

2. Müşterim kodları silerse ne olur?

Eğer müşteriniz avresi-lisans klasörünü silerse diğer scriptler çalışmayı durduracaktır. Ama kodları obfuscate etmezseniz müşterileriniz diğer scriptlere koyduğunuz kodları çıkartarak lisans sistemini yok edebilir!

3. Her scripte koymak zorunda mıyım?

Hayır, sadece önemli/kritik scriptlere koymanız yeterli. Ama ne kadar çok yere koyarsanız o kadar güvenli olur.

4. Lisans kontrolü performansı etkiler mi?

Hayır. Sistem sadece sunucu başladığında kontrol yapar ve sonra her 60 saniyede bir. Performans etkisi yok denecek kadar azdır.

5. Panelden lisansı nasıl takip ederim?

Panele giriş yapın, "Lisanslarım" sayfasına gidin. Orada tüm lisanslarınızın durumunu, son bağlanma zamanını ve oyuncu sayısını görebilirsiniz.