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?
Ö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:
arse(std::ifstream(LocaleService_GetBasePath() + "/blend.json"), nullptr, true, true);
return true;
}
catch (const nlohmann::json:
arse_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;
Ş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?
- Kullanmakta olduğunuz derleyicinin en az C++11'i desteklediğinden emin olun.
- JSON ayrıştırıcısını (parser) kurun.
- Eski blend_item.h ve blend_item.cpp dosyalarını yeni olanlarla değiştirin, hepsi bu kadar.
- 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:
return true;
}
catch (const nlohmann::json:
{
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;