D 1
delimuratt
melankolıa18 1
melankolıa18
shrpnl 1
shrpnl
Fethi Polat 1
Fethi Polat
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Best Studio 1
Best Studio
Agora Metin2 1
Agora Metin2
raderde 1
raderde
Cannn6161 1
Cannn6161
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com
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

Silverhand

SilveriusPanel
TC Kimlik Numarası Doğrulanmış Üye
Moderator
Katılım
26 Eki 2021
Konular
132
Mesajlar
827
Çözüm
6
Online süresi
3mo 5d
Reaksiyon Skoru
938
Altın Konu
39
Başarım Puanı
184
Yaş
28
MmoLira
4,960
DevLira
6
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ 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