Hikayeler

Reklam vermek için turkmmo@gmail.com
Kaynak ikonu

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

indirmek için izniniz yok

Silverhand

SilveriusPanel
TC Kimlik Numarası Doğrulanmış Üye
Moderator
Katılım
26 Eki 2021
Konular
132
Mesajlar
825
Online süresi
3ay 5g
Reaksiyon Skoru
936
Altın Konu
39
Başarım Puanı
184
Yaş
28
TM Yaşı
4 Yıl 5 Ay 26 Gün
MmoLira
4,736
DevLira
6

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. 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.
 
Paylaşım için teşekkürler :)
 
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