轉: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的 標頭檔修改。