爱东东

VS.NET,IT,个人,个人网站 爱东东 http://www.idongdong.net

 

对于十字佣兵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的 头文件修改。

posted on 2008-03-09 20:34  爱东东  阅读(685)  评论(0编辑  收藏  举报

导航