parent
134bfbe986
commit
c9aaf540bf
@ -927,7 +927,10 @@
|
|||||||
// Enchant UI
|
// Enchant UI
|
||||||
829: Enchanting is not possible for your item's enchant grade.
|
829: Enchanting is not possible for your item's enchant grade.
|
||||||
|
|
||||||
//830-899 free
|
// @reloadbarterdb
|
||||||
|
830: Barter database has been reloaded.
|
||||||
|
|
||||||
|
//831-899 free
|
||||||
|
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
// More atcommands message
|
// More atcommands message
|
||||||
|
@ -1419,6 +1419,7 @@ This will also send a packet to clients causing them to close.
|
|||||||
@reloadstatusdb
|
@reloadstatusdb
|
||||||
@reloadachievementdb
|
@reloadachievementdb
|
||||||
@reloadattendancedb
|
@reloadattendancedb
|
||||||
|
@reloadbarterdb
|
||||||
|
|
||||||
Reloads a database or configuration file.
|
Reloads a database or configuration file.
|
||||||
|
|
||||||
@ -1427,10 +1428,11 @@ Databases:
|
|||||||
-- itemdb: Item Database
|
-- itemdb: Item Database
|
||||||
-- mobdb: Monster Database
|
-- mobdb: Monster Database
|
||||||
-- questdb: Quest Database
|
-- questdb: Quest Database
|
||||||
-- script: NPC Scripts
|
-- script: NPC Scripts and Barter Database
|
||||||
-- skilldb: Skill Database
|
-- skilldb: Skill Database
|
||||||
-- achievementdb: Achievement Database
|
-- achievementdb: Achievement Database
|
||||||
-- attendancedb: Attendance Database
|
-- attendancedb: Attendance Database
|
||||||
|
-- barterdb: Barter Database
|
||||||
|
|
||||||
Configuration files:
|
Configuration files:
|
||||||
-- atcommand: Atcommand Settings
|
-- atcommand: Atcommand Settings
|
||||||
@ -1450,11 +1452,12 @@ Affected files:
|
|||||||
-- msgconf: atcommands.yml
|
-- msgconf: atcommands.yml
|
||||||
-- pcdb: statpoint.yml, job_exp.yml, skill_tree.yml, attr_fix.yml, job_stats.yml, job_basepoints.yml, level_penalty.yml
|
-- pcdb: statpoint.yml, job_exp.yml, skill_tree.yml, attr_fix.yml, job_stats.yml, job_basepoints.yml, level_penalty.yml
|
||||||
-- questdb: quest_db.yml
|
-- questdb: quest_db.yml
|
||||||
-- script: /npc/*.txt, /npc/*.conf
|
-- script: /npc/*.txt, /npc/*.conf, /npc/barters.yml
|
||||||
-- skilldb: skill_db.yml, skill_nocast_db.txt, skill_changematerial_db.txt, skill_damage_db.txt, abra_db.yml, create_arrow_db.yml, produce_db.txt, spellbook_db.yml, magicmushroom_db.yml
|
-- skilldb: skill_db.yml, skill_nocast_db.txt, skill_changematerial_db.txt, skill_damage_db.txt, abra_db.yml, create_arrow_db.yml, produce_db.txt, spellbook_db.yml, magicmushroom_db.yml
|
||||||
-- statusdb: attr_fix.yml, size_fix.yml, refine.yml
|
-- statusdb: attr_fix.yml, size_fix.yml, refine.yml
|
||||||
-- achievementdb: achievement_db.yml
|
-- achievementdb: achievement_db.yml
|
||||||
-- attendancedb: attendance.yml
|
-- attendancedb: attendance.yml
|
||||||
|
-- barterdb: /npc/barters.yml
|
||||||
|
|
||||||
Restriction:
|
Restriction:
|
||||||
- Used from 'atcommand' or 'useatcmd'. For @reload & @reloadscript
|
- Used from 'atcommand' or 'useatcmd'. For @reload & @reloadscript
|
||||||
|
@ -4319,6 +4319,9 @@ ACMD_FUNC(reload) {
|
|||||||
} else if (strstr(command, "attendancedb") || strncmp(message, "attendancedb", 4) == 0) {
|
} else if (strstr(command, "attendancedb") || strncmp(message, "attendancedb", 4) == 0) {
|
||||||
attendance_db.reload();
|
attendance_db.reload();
|
||||||
clif_displaymessage(fd, msg_txt(sd, 795)); // Attendance database has been reloaded.
|
clif_displaymessage(fd, msg_txt(sd, 795)); // Attendance database has been reloaded.
|
||||||
|
}else if( strstr( command, "barterdb" ) || strncmp( message, "barterdb", 4 ) == 0 ){
|
||||||
|
barter_db.reload();
|
||||||
|
clif_displaymessage(fd, msg_txt(sd, 830)); // Barter database has been reloaded.
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -10951,6 +10954,7 @@ void atcommand_basecommands(void) {
|
|||||||
ACMD_DEF2("reloadinstancedb", reload),
|
ACMD_DEF2("reloadinstancedb", reload),
|
||||||
ACMD_DEF2("reloadachievementdb",reload),
|
ACMD_DEF2("reloadachievementdb",reload),
|
||||||
ACMD_DEF2("reloadattendancedb",reload),
|
ACMD_DEF2("reloadattendancedb",reload),
|
||||||
|
ACMD_DEF2("reloadbarterdb",reload),
|
||||||
ACMD_DEF(partysharelvl),
|
ACMD_DEF(partysharelvl),
|
||||||
ACMD_DEF(mapinfo),
|
ACMD_DEF(mapinfo),
|
||||||
ACMD_DEF(dye),
|
ACMD_DEF(dye),
|
||||||
|
104
src/map/npc.cpp
104
src/map/npc.cpp
@ -410,6 +410,7 @@ uint64 BarterDatabase::parseBodyNode( const ryml::NodeRef& node ){
|
|||||||
if( !exists ){
|
if( !exists ){
|
||||||
barter = std::make_shared<s_npc_barter>();
|
barter = std::make_shared<s_npc_barter>();
|
||||||
barter->name = npcname;
|
barter->name = npcname;
|
||||||
|
barter->npcid = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this->nodeExists( node, "Map" ) ){
|
if( this->nodeExists( node, "Map" ) ){
|
||||||
@ -729,8 +730,54 @@ void BarterDatabase::loadingFinished(){
|
|||||||
|
|
||||||
std::shared_ptr<s_npc_barter> barter = pair.second;
|
std::shared_ptr<s_npc_barter> barter = pair.second;
|
||||||
|
|
||||||
|
bool extended = false;
|
||||||
|
|
||||||
|
// Check if it has to use the extended barter feature or not
|
||||||
|
for( const auto& itemPair : barter->items ){
|
||||||
|
// Normal barter cannot have zeny requirements
|
||||||
|
if( itemPair.second->price > 0 ){
|
||||||
|
extended = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal barter needs to have exchange items defined
|
||||||
|
if( itemPair.second->requirements.empty() ){
|
||||||
|
extended = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal barter can only exchange 1:1
|
||||||
|
if( itemPair.second->requirements.size() > 1 ){
|
||||||
|
extended = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal barter cannot handle refine
|
||||||
|
for( const auto& requirement : itemPair.second->requirements ){
|
||||||
|
if( requirement.second->refine >= 0 ){
|
||||||
|
extended = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if a refine requirement has been set in the loop above
|
||||||
|
if( extended ){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( extended && !battle_config.feature_barter_extended ){
|
||||||
|
#ifndef BUILDBOT
|
||||||
|
ShowError( "Barter %s uses extended mechanics but this is not enabled.\n", barter->name.c_str() );
|
||||||
|
#endif
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
struct npc_data* nd = npc_create_npc( barter->m, barter->x, barter->y );
|
struct npc_data* nd = npc_create_npc( barter->m, barter->x, barter->y );
|
||||||
|
|
||||||
|
// Store the npcid for the destructor
|
||||||
|
barter->npcid = nd->bl.id;
|
||||||
|
|
||||||
npc_parsename( nd, barter->name.c_str(), nullptr, nullptr, __FILE__ ":" QUOTE(__LINE__) );
|
npc_parsename( nd, barter->name.c_str(), nullptr, nullptr, __FILE__ ":" QUOTE(__LINE__) );
|
||||||
|
|
||||||
nd->class_ = barter->sprite;
|
nd->class_ = barter->sprite;
|
||||||
@ -739,48 +786,7 @@ void BarterDatabase::loadingFinished(){
|
|||||||
nd->bl.type = BL_NPC;
|
nd->bl.type = BL_NPC;
|
||||||
nd->subtype = NPCTYPE_BARTER;
|
nd->subtype = NPCTYPE_BARTER;
|
||||||
|
|
||||||
nd->u.barter.extended = false;
|
nd->u.barter.extended = extended;
|
||||||
|
|
||||||
// Check if it has to use the extended barter feature or not
|
|
||||||
for( const auto& itemPair : barter->items ){
|
|
||||||
// Normal barter cannot have zeny requirements
|
|
||||||
if( itemPair.second->price > 0 ){
|
|
||||||
nd->u.barter.extended = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normal barter needs to have exchange items defined
|
|
||||||
if( itemPair.second->requirements.empty() ){
|
|
||||||
nd->u.barter.extended = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normal barter can only exchange 1:1
|
|
||||||
if( itemPair.second->requirements.size() > 1 ){
|
|
||||||
nd->u.barter.extended = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normal barter cannot handle refine
|
|
||||||
for( const auto& requirement : itemPair.second->requirements ){
|
|
||||||
if( requirement.second->refine >= 0 ){
|
|
||||||
nd->u.barter.extended = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if a refine requirement has been set in the loop above
|
|
||||||
if( nd->u.barter.extended ){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( nd->u.barter.extended && !battle_config.feature_barter_extended ){
|
|
||||||
#ifndef BUILDBOT
|
|
||||||
ShowError( "Barter %s uses extended mechanics but this is not enabled.\n", nd->name );
|
|
||||||
#endif
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( nd->bl.m >= 0 ){
|
if( nd->bl.m >= 0 ){
|
||||||
map_addnpc( nd->bl.m, nd );
|
map_addnpc( nd->bl.m, nd );
|
||||||
@ -840,6 +846,20 @@ void BarterDatabase::loadingFinished(){
|
|||||||
TypesafeYamlDatabase::loadingFinished();
|
TypesafeYamlDatabase::loadingFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s_npc_barter::~s_npc_barter(){
|
||||||
|
if( this->npcid != 0 ){
|
||||||
|
struct npc_data* nd = map_id2nd( this->npcid );
|
||||||
|
|
||||||
|
// Check if the NPC still exists or has been removed already
|
||||||
|
if( nd != nullptr ){
|
||||||
|
// Delete the NPC
|
||||||
|
npc_unload( nd, true );
|
||||||
|
// Update NPC event database
|
||||||
|
npc_read_event_script();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BarterDatabase barter_db;
|
BarterDatabase barter_db;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,6 +104,9 @@ struct s_npc_barter{
|
|||||||
uint8 dir;
|
uint8 dir;
|
||||||
int16 sprite;
|
int16 sprite;
|
||||||
std::map<uint16, std::shared_ptr<s_npc_barter_item>> items;
|
std::map<uint16, std::shared_ptr<s_npc_barter_item>> items;
|
||||||
|
int32 npcid;
|
||||||
|
|
||||||
|
~s_npc_barter();
|
||||||
};
|
};
|
||||||
|
|
||||||
class BarterDatabase : public TypesafeYamlDatabase<std::string, s_npc_barter>{
|
class BarterDatabase : public TypesafeYamlDatabase<std::string, s_npc_barter>{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user