您当前的位置:首页 > 其他技术 > 其他技术

RO仙镜宠物情缘版Athena增加自定义数据

本文出处:网游动力作者:本站发布时间:2011-07-14阅读次数:

目的:
在char_athena.conf和login_athena.conf中增加设定,可以方便修改数据表的名字而不用重复修改源码。

方法:
修改char.c和login.c,通过读取char_athena.conf和login_athena.conf文件中的设定值,修改几个静态变量的值。

分析:
在char.c中有一段:
引用:
static int char_server_port = 3306;
static char char_server_ip[32] = "127.0.0.1";
static char char_server_id[32] = "ragnarok";
static char char_server_pw[32] = "ragnarok";
static char char_server_db[32] = "ragnarok";
static char char_server_charset[32] = "";

char char_db[256] = "char";
char reg_db[256] = "global_reg_value";
char friend_db[256] = "friend";
static char cart_db[256] = "cart_inventory";
static char inventory_db[256] = "inventory";
static char charlog_db[256] = "charlog";
// static char interlog_db[256] = "interlog";
static char skill_db[256] = "skill";
static char memo_db[256] = "memo";


其中 char_server_port,char_server_ip,char_server_id,char_server_pw,char_server_db,char_server_charset 这几个原来的char_athena.conf中已经可以修改了。那么只要仿照原来的方法,增加几个设置,就可以达到目的。

具体实现:
打开char.c,修改char_sql_config_read_sub函数,在
else if(strcmpi(w1,"char_server_charset")==0){
strcpy(char_server_charset, w2);
}
末尾加入:
代码:
/* 增加读取自定义数据表设定 */
else if(strcmpi(w1,"char_db_name")==0){
strcpy(char_db, w2);
}
else if(strcmpi(w1,"reg_db_name")==0){
strcpy(reg_db, w2);
}
else if(strcmpi(w1,"friend_db_name")==0){
strcpy(friend_db, w2);
}
else if(strcmpi(w1,"cart_db_name")==0){
strcpy(cart_db, w2);
}
else if(strcmpi(w1,"inventory_db_name")==0){
strcpy(inventory_db, w2);
}
else if(strcmpi(w1,"charlog_db_name")==0){
strcpy(charlog_db, w2);
}
/*  else if(strcmpi(w1,"interlog_db_name")==0){
strcpy(interlog_db, w2);
}
*/  else if(strcmpi(w1,"skill_db_name")==0){
strcpy(skill_db, w2);
}
else if(strcmpi(w1,"memo_db_name")==0){
strcpy(memo_db, w2);
}

 

然后只要在char_athena.conf中增加相应的设置即可。如:

代码: 5uwl.net
char_db_name: char
reg_db_name: global_reg_value
friend_db_name: friend
cart_db_name: cart_inventory
inventory_db_name: inventory
charlog_db_name: charlog
interlog_db_name: interlog
skill_db_name: skill
memo_db_name: memo

 

 

 

同样的方法,修改login.c
找到login_sql_config_read_sub函数
加入:
代码:
/* 增加读取自定义数据表设定 */
else if(strcmpi(w1,"login_db_name")==0){
strcpy(login_db, w2);
}
else if(strcmpi(w1,"loginlog_db_name")==0){
strcpy(loginlog_db, w2);
}

 

然后在login_athena.conf中增加相应的设置即可。如:
代码:
login_db_name: login
loginlog_db_name: loginlog

 

这里要注意一点,就是要检查一下,是不是所有地方都已经使用了变量来代替数据表名字。
可以用查找功能来查一下代码。

发现有一处loginlog没有用变量。
引用:
sprintf(
tmp_sql,"INSERT INTO `loginlog` (`time`,`log`) VALUES (NOW(),′%s′)",
strecpy(buf,log)
);

可以修改成:
代码:
sprintf(
tmp_sql,"INSERT INTO `%s` (`time`,`log`) VALUES (NOW(),′%s′)",
loginlog_db, strecpy(buf,log)
);

 


至此,已经初步完成目标,但可以发现,现在还没有把全部表都添加自定义设置。接下来需要把其他表也完善起来

要注意char和login是相对独立的,所以两个项目都要分别检查所有表名是否使用了变量替换。用VC的查找功能可以很方便的检查整个项目。

下面以完善login为例:

分析:
Athena使用的数据表如下:
引用:

`cart_inventory`,`char`,`charlog`,`global_reg_value`,`storage`,friend,`homunculus`,`homunculus_skill`,`status_change`,
`guild`,`guild_alliance`,`guild_castle`,`guild_expulsion`,`guild_member`,`guild_position`,`guild_skill`,`guild_storage`,
`interlog`,`inventory`,`ipbanlist`,`login`,`login_error`,`loginlog`,`memo`,`party`,`pet`,`ragsrvinfo`,`skill`,`sstatus`


我们要一个一个来查找,看看程序中有没有调用这些数据表.如果找到了,就修改,用变量来代替它.(注意查找范围是当前项目)

很快,我们找到了`global_reg_value`相关操作,
引用:
sprintf(tmp_sql,"DELETE FROM `global_reg_value` WHERE `type`=′1′ AND `account_id`=′%d′",account_id);
if(mysql_query(mysql_handle, tmp_sql)) {
printf("DB server Error - %sn", mysql_error(mysql_handle));
}


修改一下:
代码:
sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=′1′ AND `account_id`=′%d′",reg_db,account_id);
if(mysql_query(mysql_handle, tmp_sql)) {
printf("DB server Error - %sn", mysql_error(mysql_handle));
}

 

其他所有类似的都修改好,然后就和上面的步骤差不多:

引用:
int login_server_port = 3306;
char login_server_ip[32] = "127.0.0.1";
char login_server_id[32] = "ragnarok";
char login_server_pw[32] = "ragnarok";
char login_server_db[32] = "ragnarok";
char login_server_charset[32] = "";
char login_db[256] = "login";
char loginlog_db[256] = "loginlog";

下面增加:
代码:
char reg_db[ 256 ] = "global_reg_value";

在login_sql_config_read_sub函数内也加入:

代码:
else if(strcmpi(w1,"reg_db_name")==0){
strcpy(reg_db, w2);
}


最后在login_athena.conf中增加相应的设置

代码:
reg_db_name: global_reg_value


这样就完成global_reg_value表的自定义设置。

其他表用同样的方法可以全部完善。这里不作一一介绍了。