noisiv 1
noisiv
Manwe Work 1
Manwe Work
farkmt2official 1
farkmt2official
mavzermete 1
mavzermete
dreamstone 1
dreamstone
Fethi Polat 1
Fethi Polat
Bvural41 1
Bvural41
Hikaye Ekle
Kaynak ikonu

[C++] Blend Item Renewal [JSON] 2025-06-04

indirmek için izniniz yok
  • Konuyu başlatan Konuyu başlatan Silverhand
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 3
  • Görüntüleme Görüntüleme 1K

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Merhaba,

Şebnem öğelerini JSON kullanarak yüklemek için tamamen yeni ve taze bir yaklaşım. Önceki versiyonlardan daha mı iyi? Sanırım öyle. Bu versiyona ait kaynak sadece 50 satır civarında, bu yüzden oldukça hafif.

YMIR kodlama stiline uymaya karar verildi, bu yüzden sınıflar veya yapılar (struct) yok.

Peki, bu "sistemi" nasıl kuracaksınız?
  1. Kullanmakta olduğunuz derleyicinin en az C++11'i desteklediğinden emin olun.
  2. JSON ayrıştırıcısını (parser) kurun.
  3. Eski blend_item.h ve blend_item.cpp dosyalarını yeni olanlarla değiştirin, hepsi bu kadar.
  4. Eğer JSON dosyasının "hot-reload" (anında güncellenmesi) işlevini istiyorsanız, cmd_gm.cpp kısmını ekleyebilirsiniz (önerilir).

Örnek blend.json içeriği
Kod:
{
    "50821": {
        "type": "CRITICAL_PCT",
        "value": [ 8, 10, 12, 15, 20 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "50822": {
        "type": "PENETRATE_PCT",
        "value": [ 8, 10, 12, 15, 20 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "50823": {
        "type": "ATTACK_SPEED",
        "value": [ 2, 3, 4, 5, 8 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "50824": {
        "type": "RESIST_MAGIC",
        "value": [ 8, 10, 12, 15, 20 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "50825": {
        "type": "ATT_BONUS",
        "value": [ 30, 50, 70, 90, 120 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "50826": {
        "type": "DEF_BONUS",
        "value": [ 40, 70, 100, 150, 200 ],
        "duration": [ 60, 120, 180, 300, 600 ]
    },

    "51002": {
        "type": "ENERGY",
        "value": [ 1, 3, 5, 7, 10 ],
        "duration": 1800 // It is possible to use only one duration (and value).
    }
}

blend_item.cpp
Kod:
#include "stdafx.h"
#include "constants.h"
#include "blend_item.h"
#include "locale_service.h"

#include <fstream>

nlohmann::json json_blend;

bool Blend_Item_init()
{
    try
    {
        json_blend = nlohmann::json::parse(std::ifstream(LocaleService_GetBasePath() + "/blend.json"), nullptr, true, true);
        return true;
    }
    catch (const nlohmann::json::parse_error& message)
    {
        sys_err("%s", message.what());
        return false;
    }
}

bool Blend_Item_find(const uint32_t item)
{
    return json_blend.contains(std::to_string(item));
}

int32_t Blend_Item_verify(const nlohmann::json& item, const bool can_string)
{
    if (item.is_number())
        return item.get<int32_t>();

    return can_string ? FN_get_apply_type(item.get<std::string>().c_str()) : item.at(number(0, item.size() - 1)).get<int32_t>();
}

void Blend_Item_set_value(const LPITEM item)
{
    if (!item)
        return;

    try
    {
        const auto& find = json_blend.find(std::to_string(item->GetVnum())).value();
        item->SetSocket(0, Blend_Item_verify(find.at("type"), true));
        item->SetSocket(1, Blend_Item_verify(find.at("value"), false));
        item->SetSocket(2, Blend_Item_verify(find.at("duration"), false));
    }
    catch (const nlohmann::json::exception& message)
    {
        sys_err("%s", message.what());
    }
}

blend_item.h
Kod:
#pragma once

#include "item.h"

#include <cstdint>
#include <nlohmann/json.hpp>

bool Blend_Item_init();
bool Blend_Item_find(uint32_t item);
int32_t Blend_Item_verify(const nlohmann::json& item, bool can_string);
void Blend_Item_set_value(LPITEM item);

Reload için cmd_gm.cpp
Kod:
// Add:
#include "blend_item.h"

// Find:
            case 'c':    // cube

                Cube_init ();
                break;

// Paste (under):
            case 'b':
                {
                    if (Blend_Item_init())
                        ch->ChatPacket(CHAT_TYPE_INFO, "Blend items reloaded.");
                    else
                        ch->ChatPacket(CHAT_TYPE_INFO, "Something went wrong while loading blend items, check syserr.txt!");
                }
                break;
Alıntıdır.
 
GameSource dosyanız JSON eklentisini desteklemezse hatta verecektir oo yüzden json destekliyen bir filesden direk çekebilirsiniz.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst