本文檔是原創(chuàng)的,具有可操作性,不是網(wǎng)絡(luò)上互相抄襲的博客。
覺得有用就贊一個(gè)。
項(xiàng)目官網(wǎng):?http://everwar.cn
同名原創(chuàng)文章(界面樣式更簡(jiǎn)潔一些):
開源魔獸世界私服搭建 - 狂奔的駱駝 - 博客園
一、背景
60魔獸經(jīng)典舊世是最經(jīng)典的版本,遺憾的是60年代時(shí)還在大學(xué)讀書,窮得很,買不起點(diǎn)卡,后來工作了,大概70年代開始玩的。
多年以前,玩游戲時(shí),一直非常期望能夠自己控制角色的屬性級(jí)別,得到各種裝備。
多年以后,在這款純粹的開源服務(wù)器問世后,終于如愿以償。
直到如今,都2023年了,魔獸世界游戲的服務(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)境,下載客戶端,修改配置文件,就可以登錄游戲了。
三、客戶端
魔獸世界經(jīng)典舊世客戶端1.12.3下載地址:
https://pan.baidu.com/s/1BgIYpZEmfTiAmeD_lMB1Sg
四、服務(wù)器端
下面的編譯安裝過程比較多,但我已經(jīng)盡可能完整的整理出來。基本上沒有疏漏。
說明:
由于資金和時(shí)間精力的關(guān)系,本人最近幾個(gè)月暫時(shí)沒有時(shí)間發(fā)布支持CentOS7.x的版本
但我把我之前基于CentOS6.5的版本的詳細(xì)的編譯過程發(fā)布成這個(gè)文檔,
另外把編譯后的安裝版本發(fā)布并上傳到本開源項(xiàng)目的release1版本里。
https://github.com/geektcp/Namjagbarwa-wow/releases/tag/1.0
有興趣的高手可以直接用這個(gè)release版本,
也可以參考本文檔自行編譯基于CentOS6.X或者CentOS7.x的版本。
計(jì)劃:
感謝各位的star,支持和關(guān)注,接下來這個(gè)項(xiàng)目也會(huì)進(jìn)行持續(xù)的更新,大家可以留意動(dòng)態(tài)。
2023年會(huì)發(fā)布一個(gè)新版本,基于CentOS7.x的版本,并部署到公網(wǎng),到時(shí)候方便大家直接使用。
?
1、編譯服務(wù)端有版本要求
env | version |
---|---|
os | CentOS 6.5 |
Namjagbarwa-wow | master |
gcc | 4.9.3 |
cmake | 3.5 |
boost | 1.60 |
dbc and map | 1.12.3 |
wow client | 1.12.3 ? |
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、地圖文件生成
服務(wù)端部署時(shí)必須的map文件包括maps,mmaps,vmaps,dbc四個(gè)部分。
每個(gè)文件夾下面有大量地圖文件。這些地圖文件含有艾澤拉斯世界的各個(gè)地圖的信息。非常關(guān)鍵。
這些地圖文件是從哪里來的呢?
答案是:從客戶端的安裝文件里面的抽取出來的。
抽取方式,先從服務(wù)器端的源碼里面找到如下目錄:
https://github.com/geektcp/Namjagbarwa-wow/contrib/extractor_binary
ls ./contrib/extractor_binary
ad.exe
ExtractResources.sh
MoveMapGen.exe
MoveMapGen.sh
offmesh.txt
README.txt
vmap_assembler.exe
vmapExtractor.exe
注意上面這幾個(gè)exe文件,只有我用的這個(gè)版本才有,最新的cmangos-classic沒有對(duì)應(yīng)的可執(zhí)行文件,而這幾個(gè)可執(zhí)行文件是用來生成map文件的,而服務(wù)器端啟動(dòng)時(shí)必須依賴map文件。
網(wǎng)上找到的下載1.12版本的map文件很難找到,沒有下載地址,有也是無效的鏈接,或者下載下來不能用的。
有個(gè)簡(jiǎn)單的辦法,其實(shí)這些完整的map文件其實(shí)我已經(jīng)導(dǎo)出來了,和第一個(gè)release版本一起發(fā)布的。也是這個(gè)地址,直接用即可。
https://github.com/geektcp/Namjagbarwa-wow/releases/tag/1.0
如果要自行導(dǎo)出map文件將上面的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文章來源地址http://www.zghlxwxcb.cn/news/detail-645360.html
創(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??https://github.com/cmangos/mangos-classic/tree/master/sql/base
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/geektcpbase_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/geektcpps -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)了。
另外通過數(shù)據(jù)庫也可以創(chuàng)建賬號(hào),對(duì)應(yīng)的sql語句是:
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');
11、客戶端連接
找到wow.exe同一級(jí)目錄下的配置文件,沒有用記事本新建一個(gè),重命名為realmlist.wtf
寫入內(nèi)容(其中如果不是默認(rèn)端口3724,可以在后面添加端口,比如:13724):
SET realmlist wow.whyalive.org
三、擴(kuò)展功能
這個(gè)版本支持機(jī)器人,也是可以自行創(chuàng)建若干玩家一起玩。
常用配置項(xiàng)
開啟所有飛行點(diǎn)
AllFlightPaths=1
機(jī)器人用法
對(duì)應(yīng)的機(jī)器人命令(魔獸世界登錄后,在聊天窗口輸入指令):
https://github.com/geektcp/Namjagbarwa-wow/blob/master/doc/playerbot/commands.txt
查看機(jī)器人狀態(tài):
/t 夜之眼 stats
/t 夜之眼 info
召喚機(jī)器人:
.bot add 夜之眼
.bot add 索拉查的笛聲
保持位置不動(dòng):
/t 夜之眼 stay
/t 索拉查的笛聲 stay
/t 夜之眼 cast 1243
其他命令:
.bot remove 索拉查的笛聲
.bot add 小牛
.bot add 塞拉摩
.bot add 愛在西元前
/t 愛在西元前 orders combat heal
/t 塞拉摩 orders combat protect
/t 小牛 orders combat resistfire
/t 小牛 orders combat assist
.bot remove 夜之眼
.bot remove 索拉查的笛聲
/t 夜之眼 orders combat heal
/t 夜之眼 help
/t 夜之眼 follow near
/t 夜之眼 follow far
/t 索拉查的笛聲 follow near
/t 索拉查的笛聲 follow near
/t 索拉查的笛聲 follow info
/t 愛在西元前 orders combat attack
.bot remove??愛在西元前
.bot remove 塞拉摩
常用GM命令
21級(jí)血?dú)⒏?/p>
.additem 13016
盾牌24級(jí):
.additem 12997
.additem 13032
學(xué)會(huì)所有法術(shù):
.learn all
傳送
傳送門
添加傳送門(如果對(duì)應(yīng)的id不存在,或者填錯(cuò)了,就會(huì)增加一個(gè)空的物體):
.gobject add [entry]
刪除傳送門:
.gobject delete [guid]
entry是物體模板id,可以按同一個(gè)模塊添加多個(gè)同樣的物體,
所以刪除時(shí)必須刪除物體id
添加物體后,控制臺(tái)界面(聊天窗口)會(huì)返回GUID信息,這個(gè)GUID就是物體的id,根據(jù)這個(gè)id刪除物體即可。
傳送門entry對(duì)應(yīng) 表是gameobject_template
傳送門guid對(duì)應(yīng)的表是gameobject
查看guid和entry對(duì)應(yīng)關(guān)系:
SELECT t.entry,t.name,o.id, o.guid,
o.position_x,o.position_y,o.position_z,o.map
FROM gameobject o,gameobject_template t
WHERE o.id=[entry]
比如:
SELECT t.entry,t.name,o.id, o.guid,
o.position_x,o.position_y,o.position_z,o.map
FROM gameobject o,gameobject_template t
WHERE o.id =176499
序號(hào) |
添加物體 |
命令 |
備注 |
0 |
刪除傳送門 |
.gobject delete 90007 |
|
1 |
奧格瑞瑪傳送門 |
.gobject add 176499 |
|
2 |
暴風(fēng)傳送門 |
.gobject add 176296 |
|
3 |
鐵爐堡傳送門 |
.gobject add 176497 |
|
4 |
達(dá)納蘇斯傳送門 |
.gobject add 176498 |
|
5 |
奧格瑪傳送門 |
.gobject add 176499 |
|
6 |
雷霆崖傳送門 |
.gobject add 176500 |
|
7 |
幽暗城傳送門 |
.gobject add 176501 |
|
8 |
末日傳送門 |
.gobject add 177193 |
|
9 |
半人馬傳送門01 |
.gobject add 178386 |
|
10 |
集合石傳送門 |
.gobject add 179944 |
|
11 |
卡拉贊傳送門 |
.gobject add 181146 |
|
12 |
暗夜村落傳送門 |
.gobject add 182061 |
|
13 |
部落營(yíng)地傳送門 |
.gobject add 182060 |
|
14 |
黑石塔之傳送門 |
.gobject add 184247 |
|
15 |
召喚傳送門(黃球) |
.gobject add 181810 |
|
16 |
瑪拉頓的傳送門 |
.gobject add 178400 |
|
.gobject activate 90072 |
坐標(biāo)
序號(hào) |
目的地 |
命令 |
備注 |
1 |
奧格瑞瑪鳥點(diǎn) |
.go 1652 -4331 62 1 |
主城 |
2 |
奧格 武器大師 |
.go 1637 2091 -4822 1 |
主城 |
3 |
幽暗城門口 |
.go 1909 235 53 0 |
主城 |
4 |
幽暗城鳥點(diǎn) |
.go 1567 268 -43 0 |
主城 |
5 |
雷霆崖 |
.go -1391 140 23 1 |
主城 |
6 |
暴風(fēng)城門口 |
.go -9065 434 94 0 |
主城 |
7 |
暴風(fēng)城銀行 |
.go -8832 627 94 0 |
主城 |
8 |
鐵爐堡門口 |
.go -5032 -819 495 0 |
主城 |
9 |
鐵爐堡銀行 |
.go -4927 -947 502 0 |
主城 |
10 |
鐵爐堡最高峰(屋頂) |
.go -4866 -1445 580 0 |
主城 |
11 |
達(dá)納蘇斯 |
.go 9961 2055 1329 1 |
主城 |
12 |
GM島 |
.go 16222.1 16252.1 12.5872 1 |
主城 |
13 |
藏寶海灣 |
.go -14302 518 9 0 |
副城 |
14 |
棘齒城 |
.go -977 -3788 6 1 |
副城 |
15 |
牛頭出生地 |
.go -2254 -758 8.2 1 |
|
16 |
塔倫米爾: |
.go -36 -927 55 0 |
|
17 |
陶拉祖營(yíng)地: |
.go -2375 -1880 96 1 |
|
18 |
灰谷: |
.go 2324 -1668 125 1 |
|
19 |
千針石林山頂 |
.go -4885 -1596 101 1 |
|
四、常見問題
編譯安裝通常是正常的,問題往往處在map文件的獲取,及map文件和當(dāng)前編譯版本不匹配,或者是數(shù)據(jù)庫表,由于不完整,或者不同版本雜亂在一起導(dǎo)致沒法正常啟動(dòng)。
1、代碼調(diào)試方法
打印日志,以打印std:string類型的字符串name為例:
sLog.outError("111111: %s", name. c_str());
2、map和sql的版本問題
map文件必須跟服務(wù)器端的版本匹配,目前我的客戶端是1.12.3版本
服務(wù)器端的版本是老的mangos-classic,這個(gè)源碼也不記得從哪里搞的,反正現(xiàn)在的官方的github下的mangos-classic是沒有可執(zhí)行文件生成map,而且用本文檔提供的方式生成的map也跟github上的官方源碼版本是不匹配的,這個(gè)地方要注意。
只能用我的git下的服務(wù)端源碼下的用于抽取的可執(zhí)行文件,來抽取我的客戶端版本1.12.3下的map文件,服務(wù)器才能正常啟動(dòng),另外數(shù)據(jù)庫初始化數(shù)據(jù)也必須用我的git下的初始化sql。
報(bào)錯(cuò)如下
Using DataDir ../data/
WORLD: VMap support included. LineOfSight:1, getHeight:1, indoorCheck:1
WORLD: VMap data directory is: ../data/vmaps
WORLD: MMap pathfinding enabled
VMap file '../data/vmaps/000.vmtree' is missing or point to wrong version vmap file, redo vmaps with latest vmap_assembler.exe program
Correct *.map files not found in path '../data/maps' or *.vmtree/*.vmtile files in '../data/vmaps'. Please place *.map and vmap files in appropriate directories or correct the DataDir value in the mangosd.conf file.
可能原因
這個(gè)問題可能跟map文件的版本也有關(guān),但是從網(wǎng)上下別人的機(jī)器人端的map文件也提示報(bào)這個(gè)錯(cuò),我懷疑是數(shù)據(jù)庫里面某個(gè)字段對(duì)應(yīng)的版本號(hào)有關(guān)系,導(dǎo)致提示這個(gè)錯(cuò)誤。
待研究。
解決辦法
重要找出問題原因了,原來是mangos啟動(dòng)時(shí)會(huì)檢查地圖的版本,如果不匹配直接退出,就沒有啟動(dòng)成功了。
在代碼src/game/GridMap.cpp里面有個(gè)判斷語句,用到檢查方法是:
vim /usr/local/src/wow/portalclassic/src/game/GridMap.cpp
bool GridMap::ExistVMap(uint32 mapid, int gx, int gy)
{
??? if (VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager())
??? {
??????? if (vmgr->isMapLoadingEnabled())
??????? { bool exists = vmgr->existsMap((sWorld.GetDataPath() + "vmaps").c_str(),? mapid, gx, gy);
??????????? ?if (!exists)
??????????? {
??????????????? std::string name = vmgr->getDirFileName(mapid, gx, gy);
??????????????? sLog.outError("VMap file '%s' is missing or point to wrong version vmap file, redo vmaps with latest vmap_assembler.exe program", (sWorld.GetDataPath() + "vmaps/" + name).c_str());
??????????????? return false;
??????????? }
...
臨時(shí)解決方案:
vim /usr/local/src/wow/portalclassic/src/game/vmap/MapTree.cpp
// const char VMAP_MAGIC[] = "VMAP_6.0";
// 修改bug,因?yàn)榈貓D版本不同導(dǎo)致啟動(dòng)不了的問題
const char VMAP_MAGIC[] = "VMAP_5.0";
const char RAW_VMAP_MAGIC[] = "VMAP005";
vim /usr/local/src/wow/portalclassic/src/game/vmap/VMapDefinitions.h
// const char VMAP_MAGIC[] = "VMAP_6.0";?????? // used in final vmap files
// 修改bug,因?yàn)榈貓D版本不同導(dǎo)致啟動(dòng)不了的問題
const char VMAP_MAGIC[] = "VMAP_5.0";
?// used in extracted vmap files with raw data
const char RAW_VMAP_MAGIC[] = "VMAP005";?
3、獵人寵物過段時(shí)間直接消失
鎖表后查日志,發(fā)現(xiàn),確實(shí)是服務(wù)器程序自動(dòng)刪除了數(shù)據(jù)庫的一條記錄導(dǎo)致:
vim /usr/local/src/wow/portalclassic/src/game/Pet.cpp
注釋掉下面兩行,測(cè)試:
465???????? //SqlStatement stmt = CharacterDatabase.CreateStatement(delPet, "DELETE FROM character_pet WHERE owner = ? AND id = ?");
?466???????? //stmt.PExecute(ownerLow, m_charmInfo->GetPetNumber());
上面的方法會(huì)引起bug。
解決辦法:
這其實(shí)不是bug,而是60年代的獵人的精細(xì)設(shè)計(jì)一個(gè)體現(xiàn),寵物一定時(shí)間不喂養(yǎng),就會(huì)逃跑,因?yàn)轲I死了,或者忠誠度太低導(dǎo)致。
修改配置文件:
vim mangosd.conf
# 啟用寵物忠誠度,小于等于1,包括0,都會(huì)導(dǎo)致空閑寵物10分鐘多一點(diǎn)的時(shí)間不喂食就逃跑了,改10以上即可。
Rate.Loyalty = 100
4、添加機(jī)器人報(bào)錯(cuò)
添加或者移除機(jī)器人時(shí)報(bào)錯(cuò):
.bot add 索拉查的笛聲
.bot remove 索拉查的笛聲
界面提示:
指令語法格式錯(cuò)誤
后臺(tái)報(bào)錯(cuò):
tailf /usr/local/wow_mangos_bot/logs/Server.log
2017-01-28 17:58:00 ERROR:MMAP:loadMap: 0003337.mmtile was built with generator v4, expected v5
原因還是地圖版本問題導(dǎo)致:
因?yàn)楫?dāng)前源碼的版本默認(rèn)編譯安裝使用的題圖版本是5,而我用extractor.exe之類的抽取程序抽取的map是4的版本,服務(wù)器啟動(dòng)會(huì)檢查map,vmap,mmap版。
vim /usr/local/src/wow/portalclassic/src/game/MoveMapSharedDefines.h
找到如下一行:
#define MMAP_VERSION 5
修改為:
#define MMAP_VERSION 4
語法格式錯(cuò)誤的解決方式:
修改mangos的mangos_string表的entry為10的記錄,即把內(nèi)容:
指令語法格式錯(cuò)誤
設(shè)置為空,然后重啟服務(wù)器即可,這個(gè)表示在服務(wù)器啟動(dòng)時(shí)就讀取到內(nèi)存的。
5、傳送門已鎖
添加傳送門后,提示傳送門鎖定
待解決
vim /usr/local/src/wow/ClassicWOW/src/scriptdev2/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp
五、參考鏈接
我的服務(wù)端源碼地址(含可用的mysql初始化數(shù)據(jù)):
https://github.com/geektcp/mangos-classic
客戶端下載地址:
http://pan.baidu.com/s/1hslkRVQ
官方服務(wù)端下載地址(不能用):
https://github.com/cmangos/mangos-classic
sql下載地址(可用):
https://github.com/keyshuwen/Classicdb/
部署參考鏈接:
https://github.com/cmangos/issues/wiki
官方部署文檔(有參考價(jià)值):
https://github.com/cmangos/issues/wiki/Installation-Instructions
其他參考鏈接:
http://www.mangoscn.com/forum.php?mod=viewthread&tid=180042
60年代其他參考版本:
https://github.com/TrinityZero/TrinityZero
其他相關(guān)下載服務(wù)端:
git clone git://github.com/cmangos/mangos-classic.git ? mangos_server
git clone git://github.com/scriptdev2/scriptdev2-classic.git ?? mangos_scriptdev2
git clone git://github.com/ACID-Scripts/Classic.git ??? mangos_acid
git clone git://github.com/classicdb/database.git ????? mangos_classicdb文章來源:http://www.zghlxwxcb.cn/news/detail-645360.html
git clone git://github.com/cmangos/classic-db.git
到了這里,關(guān)于開源魔獸世界服務(wù)器everwar搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!