一、背景
60 魔獸經(jīng)典舊世是最經(jīng)典的版本,遺憾的是 60 年代時(shí)還在大學(xué)讀書,窮得很,買不起點(diǎn)卡,后來工作了,大概 70 年代開始玩的。
多年以前,玩游戲時(shí),一直非常期望能夠自己控制角色的屬性級(jí)別,得到各種裝備。
多年以后,在這款純粹的開源服務(wù)器問世后,終于如愿以償。
直到如今,都 2020 年,魔獸世界游戲的服務(wù)端源碼項(xiàng)目在開源界依然非?;钴S。
讓我們重溫經(jīng)典吧。
二、demo
客戶端下載wow-1.12.3版本,只需要修改一處配置文件 realmlist.wtf
SET realmlist wow.whyalive.org
指向上面的服務(wù)器地址即可。
測(cè)試帳號(hào):
test1/123
wow/123
如果你懶得 DIY 自行編譯安裝,可以用上面給的 demo 賬號(hào)和環(huán)境,下載客戶端,修改配置文件,就可以登錄游戲了。
三、服務(wù)器端
下面的編譯安裝過程比較多,但我已經(jīng)盡可能完整的整理出來。基本上沒有疏漏。
1、編譯服務(wù)端有版本要求
?
2、升級(jí) cmake
mkdir -p /usr/local/src/wow/
cd /usr/local/src/wow/
wget --no-check-certificate \
https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz
tar -zxvf cmake-3.5.2.tar.gz
cd cmake-3.5.2
./configure --prefix=/usr/local/cmake-3.5.2
make -j16
make install
3、升級(jí) GCC
yum -y install glibc-devel.i686
tar -jxvf gcc-4.8.2.tar.bz2
cd gcc-4.8.2
./contrib/download_prerequisites
mkdir build
cd build
../configure --prefix=/usr/local/gcc-4.8.2
make -j16
make install
4、安裝 boost
在 centos6.5 上用 yum 安裝的 boost 版本太低,必須重新編譯安裝。
最好直接安裝在默認(rèn)路徑。
wget http://netcologne.dl.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2
tar -jxvf boost_1_60_0.tar.bz2
cd boost_1_60_0
./bootstrap.sh
./b2
./b2 install
5、編譯安裝
先拿到源碼,
然后開始編譯并安裝 (必須要指定環(huán)境變量 LD_LIBRARY_PATH 為新版本 g++ 的庫):
cd /usr/local/src/wow/
git clone https://github.com/geektcp/elf-wow.git
export LD_LIBRARY_PATH=/usr/local/gcc-4.9.3/lib64/
export BASE_DIR=/usr/local/wow_mangos_bot_2017.10.2
mkdir -p /usr/local/src/wow/ClassicWOW/build/ &&
rm -rf /usr/local/src/wow/ClassicWOW/build/* &&
cd /usr/local/src/wow/ClassicWOW/build &&
/usr/local/cmake-3.5.2/bin/cmake ../ \
-DCMAKE_INSTALL_PREFIX=$BASE_DIR \
-DCONF_DIR=$BASE_DIR/etc \
-DPCH=1 \
-DDEBUG=0 \
-DCMAKE_C_COMPILER=/usr/local/gcc-4.9.3/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/local/gcc-4.9.3/bin/g++ &&
time make -j16 &&
make install &&
chown -R wow.wow -R $BASE_DIR
6、地圖文件生成
map 文件包括 maps,mmaps,vmaps,dbc 四個(gè)部分。,每個(gè)文件夾下面有大量地圖文件。
這些地圖文件是從哪里來的呢?
是從客戶端的安裝文件里面的抽取出來的。
抽取方式,先從服務(wù)器端的源碼里面找到如下目錄:
ls /usr/local/src/wow/mangos-classic/contrib/extractor_binary
ad.exe
ExtractResources.sh
MoveMapGen.exe
MoveMapGen.sh
offmesh.txt
README.txt
vmap_assembler.exe
vmapExtractor.exe
將上米娜的 exe 文件都拷貝 windows 環(huán)境的 wow 客戶端下,跟 wow.exe 同一級(jí)目錄
然后依次直接按如下步驟運(yùn)行:
1、生成?dbc?和?maps?文件
ad.exe
2、創(chuàng)建?vmaps?空文件夾并生成文件
md vmaps
vmap_assembler.exe Buildings vmaps
3、創(chuàng)建?mmpas?文件夾并生成文件,這一步可能要很久,一兩個(gè)小時(shí)。
md mmaps
MoveMapGen.exe
?最后,如過不想一步一步完成,可以使用批處理?(寫入到?generateMap.bat?文件中):
ad.exe
md vmaps
vmap_assembler.exe Buildings vmaps
md mmaps
MoveMapGen.exe
7、數(shù)據(jù)庫初始化
wow mangos classic 經(jīng)典版本的數(shù)據(jù)庫數(shù)據(jù)來源于:
/usr/local/src/wow/mangos-classic/sql
另一部分存在于源碼目錄下:
git clone git://github.com/cmangos/classic-db.git
創(chuàng)建數(shù)據(jù)庫賬號(hào):
grant all on *.* to mangos@'%' IDENTIFIED by 'mangos';
創(chuàng)建?wow?數(shù)據(jù)庫:
CREATE DATABASE `mangos` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `characters` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `realmd` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
然后進(jìn)入源碼目錄下的 sql 目錄:
導(dǎo)入對(duì)應(yīng)的 sql 到對(duì)應(yīng)的數(shù)據(jù)庫:
git clone??
ls?cmangos/mangos-classic/tree/master/sql/base
characters.sql? mangos.sql? realmd.sql
8、配置文件
mangosd.conf 的關(guān)鍵配置項(xiàng)如下:
# 監(jiān)聽端口
WorldServerPort = 8085
# 監(jiān)聽網(wǎng)卡IP
BindIP = "0.0.0.0"
# 是否啟用控制臺(tái)
Console.Enable = 0
# 日志級(jí)別
LogLevel = 1
另外還有數(shù)據(jù)庫連接方式的參數(shù):
LoginDatabaseInfo = "10.10.10.10;3310;mangos;mangos;realmd"
WorldDatabaseInfo = "10.10.10.10;3310;mangos;mangos;mangos"
CharacterDatabaseInfo = "10.10.10.10;3310;mangos;mangos;characters"
標(biāo)準(zhǔn)可用的配置文件如下:
cat /usr/local/wow_mangos/etc/mangosd.conf |grep -v ^# |grep -v ^$?
[MangosdConf]
ConfVersion=2015090801
RealmID = 1
DataDir = "/usr/local/wow_mangos/data/"
LogsDir = "/usr/local/wow_mangos/logs/"
LoginDatabaseInfo = "10.10.10.10;3310;mangos;mangos;realmd"
WorldDatabaseInfo = "10.10.10.10;3310;mangos;mangos;mangos"
CharacterDatabaseInfo = "10.10.10.10;3310;mangos;mangos;characters"
LoginDatabaseConnections = 1
WorldDatabaseConnections = 1
CharacterDatabaseConnections = 1
MaxPingTime = 30
WorldServerPort = 8085
BindIP = "0.0.0.0"
SD2ErrorLogFile = "SD2Errors.log"
UseProcessors = 0
ProcessPriority = 1
Compression = 1
PlayerLimit = 100
SaveRespawnTimeImmediately = 1
MaxOverspeedPings = 2
GridUnload = 1
LoadAllGridsOnMaps = ""
GridCleanUpDelay = 300000
MapUpdateInterval = 100
ChangeWeatherInterval = 600000
PlayerSave.Interval = 900000
PlayerSave.Stats.MinLevel = 0
PlayerSave.Stats.SaveOnlyOnLogout = 1
vmap.enableLOS = 1
vmap.enableHeight = 1
vmap.ignoreSpellIds = "7720"
vmap.enableIndoorCheck = 1
DetectPosCollision = 1
TargetPosRecalculateRange = 1.5
mmap.enabled = 1
mmap.ignoreMapIds = ""
UpdateUptimeInterval = 10
MaxCoreStuckTime = 0
AddonChannel = 1
CleanCharacterDB = 1
LogSQL = 1
PidFile = ""
LogLevel = 1
LogTime = 0
LogFile = "Server.log"
LogTimestamp = 0
LogFileLevel = 0
LogFilter_TransportMoves = 1
LogFilter_CreatureMoves = 1
LogFilter_VisibilityChanges = 1
LogFilter_Weather = 1
LogFilter_DbStrictedCheck = 1
LogFilter_Pathfinding = 1
LogFilter_MapsLoading = 1
LogFilter_EventAiDev = 1
LogFilter_PeriodicAffects = 0
LogFilter_PlayerMoves = 1
LogFilter_SQLText = 1
LogFilter_AIAndMovegens = 0
LogFilter_PlayerStats = 0
LogFilter_Damage = 0
LogFilter_Combat = 0
LogFilter_SpellCast = 0
WorldLogFile = ""
WorldLogTimestamp = 0
DBErrorLogFile = "DBErrors.log"
EventAIErrorLogFile = "EventAIErrors.log"
CharLogFile = "Char.log"
CharLogTimestamp = 0
CharLogDump = 0
GmLogFile = ""
GmLogTimestamp = 0
GmLogPerAccount = 0
RaLogFile = ""
LogColors = ""
GameType = 1
RealmZone = 1
DBC.Locale = 255
DeclinedNames = 0
StrictPlayerNames = 0
StrictCharterNames = 0
StrictPetNames = 0
MinPlayerName = 2
MinCharterName = 2
MinPetName = 2
CharactersCreatingDisabled = 0
CharactersPerAccount = 50
CharactersPerRealm = 10
SkipCinematics = 0
MaxPlayerLevel = 60
StartPlayerLevel = 1
StartPlayerMoney = 0
MaxHonorPoints = 75000
StartHonorPoints = 0
MinHonorKills = 15
MaintenanceDay = 3
InstantLogout = 1
AllFlightPaths = 0
AlwaysMaxSkillForLevel = 0
ActivateWeather = 1
CastUnstuck = 1
MaxSpellCastsInChain = 20
RabbitDay = 0
Instance.IgnoreLevel = 0
Instance.IgnoreRaid = 0
Instance.ResetTimeHour = 4
Instance.UnloadDelay = 1800000
Quests.LowLevelHideDiff = 4
Quests.HighLevelHideDiff = 7
Quests.IgnoreRaid = 0
Guild.EventLogRecordsCount = 100
TimerBar.Fatigue.GMLevel = 4
TimerBar.Fatigue.Max = 60
TimerBar.Breath.GMLevel = 4
TimerBar.Breath.Max = 60
TimerBar.Fire.GMLevel = 4
TimerBar.Fire.Max = 1
MaxPrimaryTradeSkill = 2
TradeSkill.GMIgnore.MaxPrimarySkillsCount = 4
TradeSkill.GMIgnore.Level = 4
TradeSkill.GMIgnore.Skill = 4
MinPetitionSigns = 9
MaxGroupXPDistance = 74
MailDeliveryDelay = 3600
MassMailer.SendPerTick = 10
PetUnsummonAtMount = 0
Event.Announce = 0
BeepAtStart = 1
ShowProgressBars = 0
WaitAtStartupError = 0
Motd = "Welcome to the Continued Massive Network Game Object Server."
PlayerCommands = 1
AllowTwoSide.Accounts = 0
AllowTwoSide.Interaction.Chat = 0
AllowTwoSide.Interaction.Channel = 0
AllowTwoSide.Interaction.Group = 0
AllowTwoSide.Interaction.Guild = 0
AllowTwoSide.Interaction.Trade = 0
AllowTwoSide.Interaction.Auction = 0
AllowTwoSide.Interaction.Mail = 0
AllowTwoSide.WhoList = 0
AllowTwoSide.AddFriend = 0
TalentsInspecting = 1
ThreatRadius = 100
Rate.Creature.Aggro = 1
CreatureRespawnAggroDelay = 5000
CreatureFamilyFleeAssistanceRadius = 30
CreatureFamilyAssistanceRadius = 10
CreatureFamilyAssistanceDelay = 1500
CreatureFamilyFleeDelay = 7000
WorldBossLevelDiff = 3
Corpse.EmptyLootShow = 1
Corpse.Decay.NORMAL = 300
Corpse.Decay.RARE = 900
Corpse.Decay.ELITE = 600
Corpse.Decay.RAREELITE = 1200
Corpse.Decay.WORLDBOSS = 3600
Rate.Corpse.Decay.Looted = 0.0
Rate.Creature.Normal.Damage = 1
Rate.Creature.Elite.Elite.Damage = 1
Rate.Creature.Elite.RAREELITE.Damage = 1
Rate.Creature.Elite.WORLDBOSS.Damage = 1
Rate.Creature.Elite.RARE.Damage = 1
Rate.Creature.Normal.SpellDamage = 1
Rate.Creature.Elite.Elite.SpellDamage = 1
Rate.Creature.Elite.RAREELITE.SpellDamage = 1
Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1
Rate.Creature.Elite.RARE.SpellDamage = 1
Rate.Creature.Normal.HP = 1
Rate.Creature.Elite.Elite.HP = 1
Rate.Creature.Elite.RAREELITE.HP = 1
Rate.Creature.Elite.WORLDBOSS.HP = 1
Rate.Creature.Elite.RARE.HP = 1
ListenRange.Say = 40
ListenRange.TextEmote = 40
ListenRange.Yell = 300
GuidReserveSize.Creature = 100
GuidReserveSize.GameObject = 100
ChatFakeMessagePreventing = 0
ChatStrictLinkChecking.Severity = 0
ChatStrictLinkChecking.Kick = 0
ChatFlood.MessageCount = 10
ChatFlood.MessageDelay = 1
ChatFlood.MuteTime = 10
Channel.SilentlyGMJoin = 0
GM.LoginState = 2
GM.Visible = 2
GM.AcceptTickets = 2
GM.Chat = 2
GM.WhisperingTo = 2
GM.InGMList.Level = 3
GM.InWhoList.Level = 3
GM.LogTrade = 1
GM.StartLevel = 1
GM.LowerSecurity = 0
GM.InvisibleAura = 31748
Visibility.GroupMode = 0
Visibility.Distance.Continents = 90
Visibility.Distance.Instances = 120
Visibility.Distance.BG = 180
Visibility.Distance.InFlight = 100
Visibility.Distance.Grey.Unit = 1
Visibility.Distance.Grey.Object = 10
Visibility.RelocationLowerLimit = 10
Visibility.AIRelocationNotifyDelay = 1000
Rate.Health = 1
Rate.Mana = 1
Rate.Rage.Income = 1
Rate.Rage.Loss = 1
Rate.Focus = 1
Rate.Loyalty = 1
Rate.Energy = 1
Rate.Skill.Discovery = 1
Rate.Drop.Item.Poor = 1
Rate.Drop.Item.Normal = 1
Rate.Drop.Item.Uncommon = 1
Rate.Drop.Item.Rare = 1
Rate.Drop.Item.Epic = 1
Rate.Drop.Item.Legendary = 1
Rate.Drop.Item.Artifact = 1
Rate.Drop.Item.Referenced = 1
Rate.Drop.Money = 1
Rate.XP.Kill = 1
Rate.XP.Quest = 1
Rate.XP.Explore = 1
Rate.Rest.InGame = 1
Rate.Rest.Offline.InTavernOrCity = 1
Rate.Rest.Offline.InWilderness = 1
Rate.Damage.Fall = 1
Rate.Auction.Time = 1
Rate.Auction.Deposit = 1
Rate.Auction.Cut = 1
Auction.Deposit.Min = 0
Rate.Honor = 1
Rate.Mining.Amount = 1
Rate.Mining.Next = 1
Rate.Talent = 1
Rate.Reputation.Gain = 1
Rate.Reputation.LowLevel.Kill = 0.2
Rate.Reputation.LowLevel.Quest = 1
Rate.InstanceResetTime = 1
SkillGain.Crafting = 1
SkillGain.Defense = 1
SkillGain.Gathering = 1
SkillGain.Weapon = 1
SkillChance.Orange = 100
SkillChance.Yellow = 75
SkillChance.Green = 25
SkillChance.Grey = 0
SkillChance.MiningSteps = 0
SkillChance.SkinningSteps = 0
SkillFail.Loot.Fishing = 0
SkillFail.Gain.Fishing = 0
SkillFail.Possible.FishingPool = 1
DurabilityLossChance.Damage = 0.5
DurabilityLossChance.Absorb = 0.5
DurabilityLossChance.Parry = 0.05
DurabilityLossChance.Block = 0.05
Death.SicknessLevel = 11
Death.CorpseReclaimDelay.PvP = 1
Death.CorpseReclaimDelay.PvE = 1
Death.Bones.World = 1
Death.Bones.Battleground = 1
Death.Ghost.RunSpeed.World = 1.0
Death.Ghost.RunSpeed.Battleground = 1.0
Battleground.CastDeserter = 1
Battleground.QueueAnnouncer.Join = 0
Battleground.QueueAnnouncer.Start = 0
Battleground.ScoreStatistics = 0
Battleground.InvitationType = 0
BattleGround.PrematureFinishTimer = 300000
BattleGround.PremadeGroupWaitForMatch = 0
OutdoorPvp.SIEnabled = 1
OutdoorPvp.EPEnabled = 1
Network.Threads = 1
Network.OutKBuff = -1
Network.OutUBuff = 65536
Network.TcpNodelay = 1
Network.KickOnBadPacket = 0
Console.Enable = 0
Ra.Enable = 0
Ra.IP = 0.0.0.0
Ra.Port = 3443
Ra.MinLevel = 3
Ra.Secure = 1
Ra.Stricted = 1
SOAP.Enabled = 0
SOAP.IP = 10.10.10.10
SOAP.Port = 7878
CharDelete.Method = 0
CharDelete.MinLevel = 0
CharDelete.KeepDays = 30
cat /usr/local/wow_mangos/etc/realmd.conf |grep -v ^# |grep -v ^$
[RealmdConf]
ConfVersion=2010062001
LoginDatabaseInfo = "10.10.10.10;3310;mangos;mangos;realmd"
LogsDir = ""
MaxPingTime = 30
RealmServerPort = 3724
BindIP = "0.0.0.0"
PidFile = ""
LogLevel = 0
LogTime = 0
LogFile = "Realmd.log"
LogTimestamp = 0
LogFileLevel = 0
LogColors = ""
UseProcessors = 0
ProcessPriority = 1
WaitAtStartupError = 0
RealmsStateUpdateDelay = 20
WrongPass.MaxCount = 0
WrongPass.BanTime = 600
WrongPass.BanType = 0
9、啟動(dòng)服務(wù)器
cat /usr/local/wow_mangos/bin/startup.sh
啟動(dòng)腳本內(nèi)容如下:
#!/bin/sh
# usage : sh shutdown.sh
# author : nagle
# date : Sat Jan 21 16:10:11 CST 2017
# website: https://github.com/geektcp
base_dir=`dirname $0`/..
cd $base_dir/bin/
export LD_LIBRARY_PATH=/usr/local/gcc-4.9.3/lib64/:$base_dir/lib
nohup $base_dir/bin/realmd 2>&1 >> $base_dir/logs/nohup_realmd.out &
$base_dir/bin/mangosd
cat /usr/local/wow_mangos/bin/shutdown.sh
關(guān)閉腳本內(nèi)容:
#!/bin/sh
# usage : sh shutdown.sh
# author : nagle
# date : Sat Jan 21 16:10:11 CST 2017
# website: https://github.com/geektcp
ps -ef |grep wow_mangos |grep wow|grep -v grep |grep -v local|awk '{print $2}' |xargs -t -i kill -9 {}
alais 環(huán)境變量 (方便啟動(dòng),可以忽略):
cat ~/.bash_profile
alias startmangos='screen -S thy -X screen su - wow -c /usr/local/wow_mangos/bin/startup.sh'
alias stopmanos='screen -S thy -X screen su - wow -c /usr/local/wow_mangos/bin/shutdown.sh'
10、創(chuàng)建賬號(hào)
如果啟動(dòng) mangosd 服務(wù)端時(shí),配置文件指定了啟用控制臺(tái),那么可以在控制臺(tái)輸入命令:
account create nagle 123
即可創(chuàng)建一個(gè)帳號(hào)為 nagle,密碼為 123 的帳號(hào)了。文章來源:http://www.zghlxwxcb.cn/news/detail-446365.html
另外通過數(shù)據(jù)庫也可以創(chuàng)建賬號(hào),對(duì)應(yīng)的 sql 語句是:文章來源地址http://www.zghlxwxcb.cn/news/detail-446365.html
SET
@username = "test1",
@password = "123",
@email = "test@163.com",
@expansion = 0, -- 0表示經(jīng)典舊時(shí), 1表示70年代,一次類推
@gmlevel = 0, -- 0 = player, 1=GM, 2=Moderator, 3=Admin, 4=Console
@realmid = 1;
INSERT INTO account
(username, sha_pass_hash, gmlevel, email, expansion, active_realm_id)
VALUES (
UPPER(@username),
(SHA1(CONCAT(UPPER(@username),
':', UPPER (@password))) ),
@gmlevel,
@email,
@expansion,
@realmid
);
INSERT INTO `realmd`.`realmcharacters` (`realmid`, `acctid`) VALUES ('1', '5');
到了這里,關(guān)于魔獸世界60級(jí)1.12私服搭建架設(shè)教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!