对于十字佣兵3285版本的代码分析
转:coronanimo
对于十字佣兵3285版本的代码分析
这是简单的对服务端的分析,由于ScriptDev2只是增加了gem和teleport和守卫汉化,大家都明白,所以就不分析了。
非常感谢xren社区的开放源码精神。发这个帖子,一方面是为了给初入mangos代码研究的朋友一个参考。另一方面我想说,大家没有必要去发布那么多的版本,多做一些patch,多把代码发到论坛上来才是王道。你编译了的东西,给别人只能是一个娱乐。当然,我这里并没有考虑准备开服赚钱的朋友。
希望xren社区以后能够作出更多更好的patch。也希望某些误入歧途的家伙们早点做点实在的事情。一句话,大家多交流才能进步。
发出这篇文章,我还是考虑了很长一段时间的,因为我怕因为发了这个,出现很多很多“新版本”,从而让xren对于这种不尊重版权的行为失去热情。
希望大家能够在用道这些,特别是经验设置的时候,想到xren。因为这些代码并不麻烦,但是可以提供一种思路,就是不需要重新编译的情况下更改参数设置。
其实MangosCript对lua的支持很值得称道。
罗嗦多了,下面是正文。
对于十字佣兵版本代码分析(服务端部分)
工具:SVN/Check Modifications.
1.Shared:
a)comment.h
-#define EXPECTED_MANGOS_CLIENT_BUILD {5875,6005,0}
+#define EXPECTED_MANGOS_CLIENT_BUILD {5875,6005,6141,0}
增加6141版本支持(即1.12.3)
2.realmd
改变了一些提示信息。
3.mangosd
改变了一些提示信息
4.game
a)creature.cpp
-m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0),
+m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(sWorld.getConfig(CONFIG_CROPSE_DELAY)), m_respawnradius(0.0),
作用:从配置文件里读取尸体消失时间
b)forumula.h
- inline uint32 BaseGain(uint32 pl_level, uint32 mob_level)
- {
- if( mob_level >= pl_level )
- return ((pl_level*5 + 45) * (20 + mob_level - pl_level)/10 + 1)/2;
- else
- {
- uint32 gray_level = GetGrayLevel(pl_level);
- if( mob_level > gray_level )
- {
- uint32 ZD = GetZeroDifference(pl_level);
- return (pl_level*5 + 45) * (ZD + mob_level - pl_level)/ZD;
- }
- return 0;
- }
- }
+inline uint32 BaseGain(uint32 pl_level, uint32 mob_level)
+ {
+ if( pl_level == mob_level )
+ return (pl_level*5 + 45);
+ else if( mob_level > pl_level )
+ return static_cast<uint32>(( (pl_level*5 + 45) * (1 + 0.05*(mob_level - pl_level)) ) + 0.5);
+ else
+ {
+ uint32 gray_level = GetGrayLevel(pl_level);
+ if( mob_level > gray_level )
+ {
+ uint32 ZD = GetZeroDifference(pl_level);
+ return ( (pl_level*5 + 45) * (1 - (pl_level - mob_level)/ZD) );
+ }
+ return 100/(pl_level-mob_level); //???return 0;
+ }
+ }
这一段的作用是更改超过5级没有经验。但是在最新的Mangos版本里面已经修正了这一点。并且经验的获得公式更加客观。
可以考虑根据最新的版本来进行更改。上述的return 0处加上自己的经验代码。
+ //会员经验翻倍 普通会员级别
+ if ( pl->GetSession()->GetSecurity() >=1 )
+ return (uint32)(xp_gain*sWorld.getRate(RATE_VIP_XP_KILL)*sWorld.getRate(RATE_XP_KILL));
+ else if ( pl->getLevel() < sWorld.getConfig(RATE_USER_MAX_LEVEL) )
+ return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
+ else
+ return (uint32)(xp_gain*sWorld.getRate(RATE_USER_MAX_XP));
- return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
这个的作用就是增加会员经验功能。如果超过了非会员等级那么只能够得到10RATE_USER_MAX_XP的经验。 个人感觉没有必要。
c)guild.cpp
将一些英文的提示信息更改为UTF8中文。这里就不一一列举了。
在第64行和91行
d)level0.cpp
最新版本已经没有更改。
e)player.cpp
- InitStatsForLevel(1,false,false);
+ InitStatsForLevel(sWorld.getConfig(CONFIG_LEVEL_FIRST) ,false,false);//初始出生人物等级
出生人物等级,不解释。
-
- uint16 dest;
+
+ uint16 dest;
+ SetMoney(sWorld.getConfig(CONFIG_MY_MONEY)); //初始人物金钱
348行处,出生人物金钱,不解释
- GiveXP( XP , NULL );
+ if ( this->GetSession()->GetSecurity() >=1 || this->getLevel() < sWorld.getConfig(RATE_USER_MAX_LEVEL))
+ {
+ GiveXP( XP , NULL );
+ }
+ else
+ {
+ GiveXP( 88 , NULL );
+ }
8951行,这个地方是用来控制会员和非会员级别的。如果不是会员而且等级达到最高等级,那么就只能够得到88点经验。
f)World.cpp
-
+ rate_values[RATE_VIP_XP_KILL] = sConfig.GetFloatDefault("Rate.VIP_XP.Kill", 2); //会员经验翻倍
+ rate_values[RATE_USER_MAX_LEVEL] = sConfig.GetFloatDefault("Rate.user_max.level", 90); //非会员等级设置
+ rate_values[RATE_USER_MAX_XP] = sConfig.GetFloatDefault("Rate.user_max.xp", 100); //非会员最大经验设置
+ m_configs[CONFIG_MY_MONEY] =sConfig.GetIntDefault("mymoney", 8);//初始人物金钱
+ m_configs[CONFIG_LEVEL_FIRST] = sConfig.GetIntDefault("LevelFirst", 1);//初始出生人物等级
+ m_configs[CONFIG_CROPSE_DELAY] = sConfig.GetIntDefault("MyCropseDelay", 60);//初始怪物尸体停留时间
这里是增加几个配置读取,后面来用 。
g)World.h
+ CONFIG_MY_MONEY,//初始人物金钱
+ CONFIG_LEVEL_FIRST,//初始出生人物等级
+ CONFIG_CROPSE_DELAY,//初始怪物尸体停留时间
+ RATE_VIP_XP_KILL, //会员经验翻倍
+ RATE_USER_MAX_LEVEL, //非会员等级设置
+ RATE_USER_MAX_XP, //非会员最大经验设置
+ MAX_RATES
这里是对应world.cpp的 头文件修改。
对于十字佣兵3285版本的代码分析
这是简单的对服务端的分析,由于ScriptDev2只是增加了gem和teleport和守卫汉化,大家都明白,所以就不分析了。
非常感谢xren社区的开放源码精神。发这个帖子,一方面是为了给初入mangos代码研究的朋友一个参考。另一方面我想说,大家没有必要去发布那么多的版本,多做一些patch,多把代码发到论坛上来才是王道。你编译了的东西,给别人只能是一个娱乐。当然,我这里并没有考虑准备开服赚钱的朋友。
希望xren社区以后能够作出更多更好的patch。也希望某些误入歧途的家伙们早点做点实在的事情。一句话,大家多交流才能进步。
发出这篇文章,我还是考虑了很长一段时间的,因为我怕因为发了这个,出现很多很多“新版本”,从而让xren对于这种不尊重版权的行为失去热情。
希望大家能够在用道这些,特别是经验设置的时候,想到xren。因为这些代码并不麻烦,但是可以提供一种思路,就是不需要重新编译的情况下更改参数设置。
其实MangosCript对lua的支持很值得称道。
罗嗦多了,下面是正文。
对于十字佣兵版本代码分析(服务端部分)
工具:SVN/Check Modifications.
1.Shared:
a)comment.h
-#define EXPECTED_MANGOS_CLIENT_BUILD {5875,6005,0}
+#define EXPECTED_MANGOS_CLIENT_BUILD {5875,6005,6141,0}
增加6141版本支持(即1.12.3)
2.realmd
改变了一些提示信息。
3.mangosd
改变了一些提示信息
4.game
a)creature.cpp
-m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0),
+m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(sWorld.getConfig(CONFIG_CROPSE_DELAY)), m_respawnradius(0.0),
作用:从配置文件里读取尸体消失时间
b)forumula.h
- inline uint32 BaseGain(uint32 pl_level, uint32 mob_level)
- {
- if( mob_level >= pl_level )
- return ((pl_level*5 + 45) * (20 + mob_level - pl_level)/10 + 1)/2;
- else
- {
- uint32 gray_level = GetGrayLevel(pl_level);
- if( mob_level > gray_level )
- {
- uint32 ZD = GetZeroDifference(pl_level);
- return (pl_level*5 + 45) * (ZD + mob_level - pl_level)/ZD;
- }
- return 0;
- }
- }
+inline uint32 BaseGain(uint32 pl_level, uint32 mob_level)
+ {
+ if( pl_level == mob_level )
+ return (pl_level*5 + 45);
+ else if( mob_level > pl_level )
+ return static_cast<uint32>(( (pl_level*5 + 45) * (1 + 0.05*(mob_level - pl_level)) ) + 0.5);
+ else
+ {
+ uint32 gray_level = GetGrayLevel(pl_level);
+ if( mob_level > gray_level )
+ {
+ uint32 ZD = GetZeroDifference(pl_level);
+ return ( (pl_level*5 + 45) * (1 - (pl_level - mob_level)/ZD) );
+ }
+ return 100/(pl_level-mob_level); //???return 0;
+ }
+ }
这一段的作用是更改超过5级没有经验。但是在最新的Mangos版本里面已经修正了这一点。并且经验的获得公式更加客观。
可以考虑根据最新的版本来进行更改。上述的return 0处加上自己的经验代码。
+ //会员经验翻倍 普通会员级别
+ if ( pl->GetSession()->GetSecurity() >=1 )
+ return (uint32)(xp_gain*sWorld.getRate(RATE_VIP_XP_KILL)*sWorld.getRate(RATE_XP_KILL));
+ else if ( pl->getLevel() < sWorld.getConfig(RATE_USER_MAX_LEVEL) )
+ return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
+ else
+ return (uint32)(xp_gain*sWorld.getRate(RATE_USER_MAX_XP));
- return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
这个的作用就是增加会员经验功能。如果超过了非会员等级那么只能够得到10RATE_USER_MAX_XP的经验。 个人感觉没有必要。
c)guild.cpp
将一些英文的提示信息更改为UTF8中文。这里就不一一列举了。
在第64行和91行
d)level0.cpp
最新版本已经没有更改。
e)player.cpp
- InitStatsForLevel(1,false,false);
+ InitStatsForLevel(sWorld.getConfig(CONFIG_LEVEL_FIRST) ,false,false);//初始出生人物等级
出生人物等级,不解释。
-
- uint16 dest;
+
+ uint16 dest;
+ SetMoney(sWorld.getConfig(CONFIG_MY_MONEY)); //初始人物金钱
348行处,出生人物金钱,不解释
- GiveXP( XP , NULL );
+ if ( this->GetSession()->GetSecurity() >=1 || this->getLevel() < sWorld.getConfig(RATE_USER_MAX_LEVEL))
+ {
+ GiveXP( XP , NULL );
+ }
+ else
+ {
+ GiveXP( 88 , NULL );
+ }
8951行,这个地方是用来控制会员和非会员级别的。如果不是会员而且等级达到最高等级,那么就只能够得到88点经验。
f)World.cpp
-
+ rate_values[RATE_VIP_XP_KILL] = sConfig.GetFloatDefault("Rate.VIP_XP.Kill", 2); //会员经验翻倍
+ rate_values[RATE_USER_MAX_LEVEL] = sConfig.GetFloatDefault("Rate.user_max.level", 90); //非会员等级设置
+ rate_values[RATE_USER_MAX_XP] = sConfig.GetFloatDefault("Rate.user_max.xp", 100); //非会员最大经验设置
+ m_configs[CONFIG_MY_MONEY] =sConfig.GetIntDefault("mymoney", 8);//初始人物金钱
+ m_configs[CONFIG_LEVEL_FIRST] = sConfig.GetIntDefault("LevelFirst", 1);//初始出生人物等级
+ m_configs[CONFIG_CROPSE_DELAY] = sConfig.GetIntDefault("MyCropseDelay", 60);//初始怪物尸体停留时间
这里是增加几个配置读取,后面来用 。
g)World.h
+ CONFIG_MY_MONEY,//初始人物金钱
+ CONFIG_LEVEL_FIRST,//初始出生人物等级
+ CONFIG_CROPSE_DELAY,//初始怪物尸体停留时间
+ RATE_VIP_XP_KILL, //会员经验翻倍
+ RATE_USER_MAX_LEVEL, //非会员等级设置
+ RATE_USER_MAX_XP, //非会员最大经验设置
+ MAX_RATES
这里是对应world.cpp的 头文件修改。
爱东东
我的各类资源收集收集网站 http://tag.iddgame.com
我的实验性技术网站 http://www.iddgame.com
我的魔兽世界网站 http://www.iddwow.com.cn