古拉巴什擲斧者 利斧亂舞
哈卡萊祭司 範圍恐懼,魔法免疫護盾,死後冒出巫毒之魂
哈卡萊飲血者 範圍攻擊並附帶吸血效果,每攻擊到一個玩家會吸1500HP
哈卡萊勇士 衝鋒技能
暗影獵手 亂射
哈卡萊高階祭司 會幫同伴進行持續性的補血
哈卡萊暗影祭司 會使用法力燃燒和暗影箭雨,箭雨傷約1000左右
古拉巴什獵頭者 橫掃攻擊和遠距離擲斧...皺縮詛咒
古拉巴什狂暴者 平時移動很慢,進入戰鬥後會變超快,會使用範圍擊飛,範圍恐懼
拉沙希奎蛇 會使用毒液噴射,每2秒造成100點傷害
拉沙希毒蛇 寧神毒藥,穿刺護甲
覓血蝙蝠 衝鋒
自暴蝙蝠
拉札希毒液蜘蛛 減速毒藥,興奮毒液
拉札希寡婦蜘蛛 包覆之網,死掉後會再生4支拉札希誘捕者
拉札希誘捕者 沒什麼特別技能,移動速度超快,一次4支的團體行動
拉札希迅猛龍 感染撕咬
祖利安雌獵虎 4-6支成群
祖利安徘徊者
祖利安幼虎
祖利安猛虎
祖利安鱷魚 緩速技
眼鏡王蛇 穿刺護甲
大蛇 吸取生命,被吸取者會進入沉默狀態
哈卡之子 範圍擊倒,死後噴擴散毒雲
侏儒 火雨,召喚煉獄魔
衰老的侍女 驅散魔法,邪惡狂暴
阿塔萊侍女 痛擊,血之詛咒
==========================================================================
1王蝙蝠王
HP 50%以上蝙蝠型態 50%以下食人妖型態
第一階段
衝鋒,範圍沉默,蝠群召喚
第二階段
血之詛咒,治療術,暗言術:痛,燃燒彈攻擊
對白:
我命令你把這些入侵者燒成灰燼!
開始施放強效治療術!
2王蛇王
HP 50%以上食人妖型態 50%以下蛇型態
第一階段
神聖怒火,連鎖新星
第二階段
毒雲術
3王蜘蛛王
開場:食人妖型態 血量80% 之後會在2種型態間不定時轉換
人型:毒液噴灑,召喚蜘蛛,吸血
蜘蛛:灑網
對白:
來幫助我吧,我的孩子們!
沙德拉,讓我成為你的化身!
4王血領主曼多基爾
無限升級-只要一有玩家死亡就獲得exp然後漸漸升級
狂怒
衝鋒+旋風斬
威懾凝視(對白:xxx!我正在監視你)
5王虎王
分2階段(1)3王之亂(2)虎王再臨
第一階段
古拉巴什食腐者 - 致死打擊+暴擊
狂熱者札斯 - 鑿擊
狂熱者洛卡恩 - 閃電盾 補血
3支需在10秒內同時一起死亡,否則互相復活
第二階段
虎王跳躍攻擊:40碼內玩家皆受到衝擊波傷害,會跌倒,中斷施法
6王豹王
第一階段:源源不絕的黑豹群 第二階段:神出鬼沒的豹王
第一階段
暗言術,旋風斬,印記
第二階段
消失
對白:
吞噬xxx的軀體吧,我的小可愛們!
7王哈卡
心靈控制
生命虹吸
腐化之血
減速
狂怒
對白:
驕傲會將你送上絕路。來吧,凡人!品嘗靈魂掠奪者的憤怒吧!
8王金度
治療圖騰
洗腦圖騰
召喚鬼影
傳送
變形-把人變青蛙
妖術師金度施放了召喚洗腦圖騰。
妖術師金度施放了強力治療結界。
^(.+)受到(.*)金度的欺騙 <--不知道全句是什麼@@
2007年4月10日 星期二
2007年4月7日 星期六
mangos 奧妮克希亞的AI
這基本上都是ScriptDev2裏的程式碼,我改成中文的
測試的感覺是,如果公主第2階段飛在空中時能再飛高一點,換位置時不要跑到地面上...就蠻不錯的了^^
還有召小龍的功能沒有@@
.addspawn 10184 <==如果進副本沒發現奧妮克西亞時,試試看這個指令能不能把它請出來^^
17136 變身成奧妮克希亞的外觀
17647 Create Onyxia Spawner(沒用@@)
18391 Onyxia Speed Burst(也沒什麼作用@@)
20279 召喚玩家 召喚一個敵人來面對奧妮克希亞的怒火
22905 放置未淬火的劍(我不知道這做什麼用的@@)
22906 刺殺奧妮克希亞(我不知道這做什麼用的@@)
18387 奧妮克希亞(點了也是沒反應@@)
18596 吐息 會冒煙的吐息術喔
21139 火息術 不會冒煙的吐火
11010 懸浮 變成龍可以飛蠻高的
17131 懸浮 好像不能用
//scripts/zone/onyxias_lair/sc_boss_onyxia.cpp
測試的感覺是,如果公主第2階段飛在空中時能再飛高一點,換位置時不要跑到地面上...就蠻不錯的了^^
還有召小龍的功能沒有@@
.addspawn 10184 <==如果進副本沒發現奧妮克西亞時,試試看這個指令能不能把它請出來^^
17136 變身成奧妮克希亞的外觀
17647 Create Onyxia Spawner(沒用@@)
18391 Onyxia Speed Burst(也沒什麼作用@@)
20279 召喚玩家 召喚一個敵人來面對奧妮克希亞的怒火
22905 放置未淬火的劍(我不知道這做什麼用的@@)
22906 刺殺奧妮克希亞(我不知道這做什麼用的@@)
18387 奧妮克希亞(點了也是沒反應@@)
18596 吐息 會冒煙的吐息術喔
21139 火息術 不會冒煙的吐火
11010 懸浮 變成龍可以飛蠻高的
17131 懸浮 好像不能用
//scripts/zone/onyxias_lair/sc_boss_onyxia.cpp
#include "../../sc_defines.h"
// **** 這個script尚在開發中 ****
#define SPELL_WINGBUFFET 18500 //龍翼攻擊 錐形區域造成563-937的傷害並擊退
#define SPELL_FLAMEBREATH 18435 //火息術
#define SPELL_CLEAVE 26350 //順劈斬
#define SPELL_TAILSWEEP 15847 //25653 英文版的龍尾掃擊 15847中文版
#define SPELL_FIREBALL 20692 //不用法力的火球術
#define SPELL_DEEPBREATH 18596 //吐息術,火息術 21139好像也行
#define SPELL_BELLOWINGROAR 18431 //低沉咆哮 大範圍的恐懼
//召喚雛龍功能尚未被核心實作出來
#define SPELL_SUMMONWHELP 17646 //10碼的召喚奧妮克希亞雛龍
#define SPELL_SUMMON_MULTI_WHELPS 20171 //召喚奧妮克希亞雛龍(被動技)
//#define SAY_AGGRO "How fortuitous. Usually, I must leave my lair to feed."
//#define SAY_KILL "Learn your place mortal!"
//#define SAY_PHASE_2_TRANS "I'll incinerate you from above!"
//#define SAY_PHASE_3_TRANS "It seems you'll need another lesson"
#define SAY_AGGRO "真幸運,通常我要離開巢穴才能找到食物."
#define SAY_KILL "要知道你的處境,凡人!"
#define SAY_PHASE_2_TRANS "這毫無意義的行動讓我很厭煩。我會從上空把你們都燒成灰!"
#define SAY_PHASE_3_TRANS "看起來需要再給你一次教訓,凡人!"
struct MANGOS_DLL_DECL boss_onyxiaAI : public ScriptedAI
{
boss_onyxiaAI(Creature *c) : ScriptedAI(c) {Reset();}
uint32 swingcounter;
uint32 flamebreath_timer;
uint32 cleave_timer;
uint32 tailsweep_timer;
uint32 movement_timer;
uint32 fireball_timer;
uint32 whelpspawn_timer;
uint32 bellowingroar_timer;
uint32 reset_timer;
uint32 phase;
void Reset()
{
swingcounter = 0;
flamebreath_timer = 20000;
cleave_timer = 15000;
tailsweep_timer = 10000;
movement_timer = 10000;
fireball_timer = 5000;
whelpspawn_timer = 45000;
bellowingroar_timer = 0;
phase = 1;
if (m_creature)
{
m_creature->InterruptSpell();
m_creature->SetHover(false);
(*m_creature)->Clear(false);
EnterEvadeMode();
}
}
void KilledUnit(Unit* victim)
{
if (rand()%5) //亂數決定是否要公主說話
return;
DoYell(SAY_KILL,LANG_UNIVERSAL,NULL);
}
void AttackStart(Unit *who)
{
if (!who)
return;
if (m_creature->getVictim() == NULL && who->isTargetableForAttack() && who != m_creature)
{
//開始攻擊
DoStartMeleeAttack(who);
//最一開始攻擊時,黑龍公主說的第一句話
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
}
}
void MoveInLineOfSight(Unit *who)
{
if (!who || m_creature->getVictim())
return;
if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who))
{
float attackRadius = m_creature->GetAttackDistance(who);
if (m_creature->IsWithinDist(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE)
{
if(who->HasStealthAura())
who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
//開始攻擊
DoStartMeleeAttack(who);
//最一開始攻擊時,黑龍公主說的第一句話
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
}
}
}
void UpdateAI(const uint32 diff)
{
//If we had a target and it wasn't cleared then it means the target died from some unknown soruce
//But we still need to reset
if (!m_creature->SelectHostilTarget())
{
Reset();//黑龍公主重置
return;
}
//檢查是否有玩家存活著
if( m_creature->getVictim() && m_creature->isAlive())
{
//第1及第3階段的施法
if (phase == 1 || phase == 3)
{
//每15秒1次火焰吐息
if (flamebreath_timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_FLAMEBREATH);
flamebreath_timer = 15000;
}else flamebreath_timer -= diff;
//每20秒一次順劈斬
if (cleave_timer < diff)
{
DoCast(m_creature->getVictim(),SPELL_CLEAVE);
cleave_timer = 20000;
}else cleave_timer -= diff;
//每10秒神龍擺尾一次
if (tailsweep_timer < diff)
{
//如果有人在公主擺尾的範圍內,則進行神龍擺尾的特攻
if (!m_creature->HasInArc( M_PI, m_creature->getVictim()))
DoCast(m_creature->getVictim(),SPELL_TAILSWEEP);
tailsweep_timer = 20000;
}else tailsweep_timer -= diff;
}
//第2階段
if (phase == 2)
{
//如果不是在盤旋的話,則飛起來
if (!m_creature->isHover())
{
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->SetHover(true);
}
//每10秒亂數移動位置一次
if (movement_timer < diff)
{
//不管是否在施法中一律中斷並移動到亂數選到的位置去
m_creature->InterruptSpell();
uint32 position = rand()%9;
switch (position)
{
case 0:
SpecialMove(-65.8444,-213.809,-84.2985,5000);
m_creature->Relocate(-65,-213,-84,0);
break;
case 1:
SpecialMove(22.8739,-217.152,-85.0548,5000);
m_creature->Relocate(22,-217,-85,0);
break;
case 2:
SpecialMove(-33.5561,-182.682,-88.9457,5000);
m_creature->Relocate(-33,-182,-88,0);
break;
case 3:
SpecialMove(-31.4963,-250.123,-89.1278,5000);
m_creature->Relocate(-31,-250,-89,0);
break;
case 4:
SpecialMove(-2.78999,-181.431,-86.8962,5000);
m_creature->Relocate(-2,-181,-86,0);
break;
case 5:
SpecialMove(-54.9415,-232.242,-85.5555,5000);
m_creature->Relocate(-54,-232,-85,0);
break;
case 6:
SpecialMove(-65.2653,-194.879,-84.6718,5000);
m_creature->Relocate(-65,-194,-84,0);
break;
case 7:
SpecialMove(10.5665,-241.478,-85.9426,5000);
m_creature->Relocate(10,-241,-85,0);
break;
case 8:
//1/9的機會施展一次深呼,否則的話移動位置
//DoTextEmote("takes a deep breath...",NULL);
//DoYell("Deep Breath would go here!", LANG_UNIVERSAL,NULL);
DoTextEmote("深深地吸了一口氣...",NULL);
DoYell("奧妮克希亞深呼吸即將出現!", LANG_UNIVERSAL,NULL);
break;
}
DoCast(m_creature,11010);//懸浮?
movement_timer = 10000;
}else movement_timer -= diff;
//每5秒亂數決定吐火球
if (fireball_timer < diff)
{
//應該要隨機選一個目標但是因沒有仇恨列表所以直接對現有的目標進行攻擊
DoCast(m_creature->getVictim(),SPELL_FIREBALL);
fireball_timer = 5000;
}else fireball_timer -= diff;
//每45秒重生一次小龍
if (whelpspawn_timer < diff)
{
//不過核心還不支援所以只顯示重生訊息
DoYell("小龍重生!",LANG_UNIVERSAL,NULL); //召喚小龍還沒有實作
whelpspawn_timer = 450000;
}else whelpspawn_timer -= diff;
}
//第3階段才會出現的特攻
if (phase == 3)
{
//每10-30秒出現一次
if (bellowingroar_timer < diff && phase == 3)
{
//大範圍恐懼,如果沒修正恐懼Bug的話請將下一行拿掉
DoCast(m_creature->getVictim(),SPELL_BELLOWINGROAR);
bellowingroar_timer = 10000 + rand()%20000;
}else bellowingroar_timer -= diff;
}
//第1階段到第2階段轉換時機為血低於60%
if ( phase == 1 && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 60)
{
phase = 2;
m_creature->InterruptSpell();
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
(*m_creature)->Clear(false);
(*m_creature)->Idle();
DoCast(m_creature,11010);//懸浮?...
m_creature->SetHover(true);
DoCast(m_creature,18430);//公主空中盤旋? 學到的技能是龍類懸浮@@
DoYell(SAY_PHASE_2_TRANS,LANG_UNIVERSAL,NULL);
}
//第2階段到第3階段轉換時機為血低於40%
if ( phase == 2 && (m_creature->GetHealth()*100) / m_creature->GetMaxHealth() < 40)
{
phase = 3;
m_creature->InterruptSpell();
//m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,EMOTE_STATE_STAND);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->SetHover(false);
(*m_creature)->Clear(false);
(*m_creature)->Mutate(new TargetedMovementGenerator(*m_creature->getVictim()));
DoYell(SAY_PHASE_3_TRANS,LANG_UNIVERSAL,NULL);
}
//如果正處於跟公主的混戰範圍又不在第二階段
if( phase!=2 && m_creature->getVictim() && m_creature->IsWithinDist(m_creature->getVictim(), ATTACK_DIST))
{
if( m_creature->isAttackReady() )
{
m_creature->AttackerStateUpdate(m_creature->getVictim());
m_creature->resetAttackTimer();
//在第1階段及第3階段每12次攻擊後做出一次龍翼打擊
if (swingcounter > 12 && m_creature->getVictim())
{
DoCast(m_creature->getVictim(),SPELL_WINGBUFFET);
swingcounter = 0;
}else swingcounter++;
}
}
}
}
void SpecialMove(float X, float Y, float Z, uint32 Time)
{
WorldPacket data( SMSG_MONSTER_MOVE, (41+m_creature->GetPackGUID().size()) );
data.append(m_creature->GetPackGUID());
data << m_creature->GetPositionX() << m_creature->GetPositionY() << m_creature->GetPositionZ();
// unknown field - unrelated to orientation
// seems to increment about 1000 for every 1.7 seconds
// for now, we'll just use mstime
data << getMSTime();
data << uint8(0); // walkback when walking from A to B
data << uint32(0x0200); // 旗標
/* 旗標:
512: 漂著, 或不是以跑或走的型態移動
*/
data << Time; // Time in between points
data << uint32(1); // 1 single waypoint
data << X << Y << Z; // the single waypoint Point B
m_creature->SendMessageToSet( &data, true );
}
};
CreatureAI* GetAI_boss_onyxiaAI(Creature *_Creature)
{
return new boss_onyxiaAI (_Creature);
}
void AddSC_boss_onyxia()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_onyxia";
newscript->GetAI = GetAI_boss_onyxiaAI;
m_scripts[nrscripts++] = newscript;
}
2007年4月6日 星期五
mangos 2.0.10 patch
還不知道能不能用,不過感覺上如果patch了...資料庫似乎要變動蠻大的@@等過些時候再來研究吧@@
而且好像並沒有實作的很完整,作者有提到說是很粗糙的patch的樣子唷!
Known bugs :-
- Item template query still needs to be fixed (will do shortly)
- Quest query still needs to be fixes
- Cubes/boxes on npcs (needs a field pushed forward)
- Authpacket change (needs to be done to enable new races)
Known working :- (Fixed stuff)
- Groups
- Channels
- Full 2.0.10 support
- No advertisement bullshit
- DBC structures updated to 2.0.x
I'll post a new patch shortly with the item/quest stuff fixed, as at the moment I am extremely busy with quite a few things on my mind (mainly my own server/emu, which has just undergone a lot of massive core changes).
I repeat: this is *NOT* EspireEmu/mmorpg4free's emu. That is my other (main) project that I spend my time on. This is merely an effort on my part to correct what I may have offended some members of the community and to help you guys out.
Download link: http://filebeam.com/33dd97a00fc6c7b12c0db2610bf57b51
* This is a source .patch file. It is not a binary. I'll leave compiling up to you guys, providing binaries in my opinion is bad because it leaves the way to viruses/trojans. Simply apply this patch to the LATEST svn, and recompile, and you should be good. *
*** UPDATE ***
Fixed:
* Item prototypes -> should fix encanting etc professions, use my item sql.
* Creature templates -> fixes all cubes on mobs, use my creature sql.
* TBC Races enable
* Quest query packet
* Item query packet
* Negative aura cancel
creature_template.sql -> http://filebeam.com/919ba963cb981e61a13228016a27a66f
item_template.sql -> http://filebeam.com/49c95f98b5290e096dad442f8acfca14
mangos-2.0.10-2.rar -> http://filebeam.com/61f9a9501462cd4eb032ef5d85ccf7c8
原文出處:
http://forum.ragezone.com/world-warcraft/mangos-v2-0-10-burning-crusade-server-228833.html
而且好像並沒有實作的很完整,作者有提到說是很粗糙的patch的樣子唷!
Known bugs :-
- Item template query still needs to be fixed (will do shortly)
- Quest query still needs to be fixes
- Cubes/boxes on npcs (needs a field pushed forward)
- Authpacket change (needs to be done to enable new races)
Known working :- (Fixed stuff)
- Groups
- Channels
- Full 2.0.10 support
- No advertisement bullshit
- DBC structures updated to 2.0.x
I'll post a new patch shortly with the item/quest stuff fixed, as at the moment I am extremely busy with quite a few things on my mind (mainly my own server/emu, which has just undergone a lot of massive core changes).
I repeat: this is *NOT* EspireEmu/mmorpg4free's emu. That is my other (main) project that I spend my time on. This is merely an effort on my part to correct what I may have offended some members of the community and to help you guys out.
Download link: http://filebeam.com/33dd97a00fc6c7b12c0db2610bf57b51
* This is a source .patch file. It is not a binary. I'll leave compiling up to you guys, providing binaries in my opinion is bad because it leaves the way to viruses/trojans. Simply apply this patch to the LATEST svn, and recompile, and you should be good. *
*** UPDATE ***
Fixed:
* Item prototypes -> should fix encanting etc professions, use my item sql.
* Creature templates -> fixes all cubes on mobs, use my creature sql.
* TBC Races enable
* Quest query packet
* Item query packet
* Negative aura cancel
creature_template.sql -> http://filebeam.com/919ba963cb981e61a13228016a27a66f
item_template.sql -> http://filebeam.com/49c95f98b5290e096dad442f8acfca14
mangos-2.0.10-2.rar -> http://filebeam.com/61f9a9501462cd4eb032ef5d85ccf7c8
原文出處:
http://forum.ragezone.com/world-warcraft/mangos-v2-0-10-burning-crusade-server-228833.html
2007年4月4日 星期三
mangos DBC File Format
http://wowdev.org/wiki/index.php/DBC
DBC 文件格式說明:
Header(5個資料,共20 bytes)
Offset Type Description
0x00 char[4] (ident:固定為WDBC4個英文字) always 'WDBC'
0x04 uint32 (rows:這個資料表的行數,也就是說共有幾筆資料)nRecords - number of records in the file
0x08 uint32 (cols:這個資料表的列數,也就是共有幾個欄位) nFields - number of 4-byte fields per record
0x0C uint32 (rlen:一筆資料所佔的大小)recordSize = nFields * 4 (not always true!)
0x10 uint32 (slen:字串區的大小)string block size
data:(rows*rlen byes)(總共的資料大小)
row1(rlen bytes)
....
....
....
text:(slen bytes)(它是使用UTF8格式儲存的
'\0'(1 bytes) -->始終為'\0',表示一空字串
text1 (?byest) -->以'\0'結束的字串符號
....
....
....
如果想研究怎麼寫這段程式,可以至
http://wowmapview.cvs.sourceforge.net/wowmapview/wowmapview/
裏面有個dbcfile.cpp,dbcfile.h可以參考,它是用C++寫的
Spell.dbc 欄位意義
http://www.e9sky.com/bbs/read.php?tid=98
===========================================================
[轉載]使用DBC編輯器,增強你的裝備綠字效果!!
小小研究了一下綠字效果的增強~
大家一起來玩玩看,至於編輯器...本來打算放附件裡,可是好像限制大小太小了,放不下@@
找了找我也沒啥空間..就先放RS的好了
http://rapidshare.de/files/34056676/DBCedit.rar
呃,因為我沒上GF很久了,看了林碧大的回帖才發現好像是這樣...
如果有玩GF的建議不要改~~除非是用另外一個資料夾做私服客戶端~
至於EMU的東西...沒碰過所以不清楚@@
下面是自己亂摸來的~要是有什麼錯誤希望高手們幫忙訂正!! 感激~
首先,備份DBC底下的 spell.dbc
重要!!不然到時候要復原可是要搞老半天的...
接著用DBC編輯器打開模擬器底下的DBC資料夾,找到 spell.dbc
開啟需要一小段時間,沒出現資料的地方要稍微等一下~
右下方顯示打開文件完成後,即可按照「 技能編號 」的地方尋找你要修改的spellid
以下舉例較常用到的3項:
1.所有法術和治療效果提升最多XX點
法師要玩的爽,又不想把全部法術效果調高?
那就靠這個綠字效果了~
舉個大元帥之杖的spellid為例 (23929:全部法術和治療效果提升最多71點)
在技能編號的位置找到23929之後,往後拉拉拉...
大約在74和75欄位的地方(每個人的DBC不同,所以這裡應該不一定,總之是兩個數值70的地方)
※由於法術系的效果都是由1開始,就算你打1它也是增加2,所以你要找的數值全都是遊戲裡顯示的數值-1
把這兩行裡面的70都改為9999 (當然你要打幾個9都行...)
然後按下滑鼠右鍵,選擇「 當前行寫入 」等系統出現 "XXXX行 寫入完成" 時,改好囉
但是等等~ 我們還要修改一個地方,你在遊戲裡才能也看見這個數值,不然雖然有效果,但是遊戲裡不會顯示出來。
就是客戶端~這點倒是有點麻煩...
一樣打開DBC編輯文件,選擇客戶端內 \DBFilesClient\spell.dbc (或任何你放的地方)
接下來的步驟和上面一模一樣~
改好後~進入遊戲~
恭喜你...用奧爆清副本吧~很快樂的...
2.提昇你致命一擊的機率x%
因為武器的殺傷力或防禦力都可直接從裝備下手,所以比較需要的綠字效果應該只有爆擊率了~
以下舉例 spellid:7597 (使你造成致命一擊的機率上升1%)
一樣找到技能編號7597,往後拉拉拉....
這有點複雜,每個對應的地方不一定一樣,但一定差不多..
沒特別改過DBC的人,應該都在62.65這兩個欄位裡面。
62是你的最大增值效果,65是你的最小增值效果。
62保持1,65改成100 (或任何數值)
一樣右鍵,當前行寫入~
你的爆擊率就會變成提升 100 % 囉..
那要是你把62也改100會怎樣呢...?
答案是會變成暴擊機率從 100 % 到 10000 %
也就是說,最大值是會乘以最小值的喔
所以最大值通常用1就可以了
然後當然也一樣,客戶端改一改~
上線爆擊去吧..@@
3.提升法術致命一擊的機率x%
因為法術的致命和一般的致命放的位置有些許不同,所以稍為提一下~
以下舉例 spellid:18382 (使你的法術爆擊率增加2%)
找到18382,拉拉拉...
在欄位74的地方,有個1,把它改成99~
(法術系的效果皆為1開始,所以填入數值後會自動+1)
右鍵,當前行寫入~ 然後改客戶端~ 搞定。
差不多會用到的就這三個了~DBC可以研究的東西太多了@@
想改啥就改啥..再配合class可以把魔獸改的亂七八糟= =
不過小弟還沒研究那麼深入...新手咩~~囧rz
希望想玩綠字的人一起研究囉~
=======================================================
http://www.bitscn.com/wb/gameserver/200609/77187.html
關於WOW的DBC文件內容的介紹
對wow的dbc文件已經學習很久了,而且已經有點成果了,現在一個一個的給大家介紹。 先从简单的开始:先從簡單的開始:
第一个:WorldSafeLocs.dbc第一個:WorldSafeLocs.dbc
从字面上理解是游戏中的安全位置数据從字面上理解是遊戲中的安全位置數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来设置复活点 作用 : 用來設置復活點
第一列 : 编号 用来 调用此复活点 (对于游戏中调用复活点机制是用的编号调用 还是位置调用 因为手头上没有将浮点数转换为16进制的工具 所以没有测试)第一列 :編號 用來 調用此復活點(對於遊戲中調用複活點機制是用的編號調用 還是位置調用 因為手頭上沒有將浮點數轉換為16進制的工具 所以沒有測試)
第二列 : 此复活点所在 地图编号
第三列 : 此复活点所在 编号地图中的x值
第四列 : 此复活点所在 编号地图中的y值
第五列 : 此复活点所在 编号地图中的z值
第六列 : 此复活点所在地点名称
第十四列 : 此复活点数据结束标志
当游戏人物 死掉后 程序会根据 游戏人物的位置 在WorldSafeLocs.dbc中查找合适的位置
把游戏人物传到此位置 而该位置附近应该设置复活天使 SF的天使设置也应该按照这些位置设置 其实这些位置 都在一个公墓里面
在研究这个文件时发现 一个现象 当游戏人物复活后 在复活位置 不能施放魔法 而且血 魔 都不恢复
对于 热衷修改游戏的朋友 可以自己将 第 二 三 四 五 列修改 达到修改复活位置的目的
因为现在没有找到向dbc文件中添加工具 所以还无法扩充dbc文件第二列 :此復活點所在 地圖編號
第三列 :此復活點所在 編號地圖中的x值
第四列 :此復活點所在 編號地圖中的y值
第五列 :此復活點所在 編號地圖中的z值
第六列 :此復活點所在地點名稱
第十四列 :此復活點數據結束標誌
當遊戲人物 死掉後 程序會根據 遊戲人物的位置 在WorldSafeLocs.dbc中查找合適的位置
把遊戲人物傳到此位置 而該位置附近應該設置復活天使 SF的天使設置也應該按照這些位置設置 其實這些位置 都在一個公墓裡面
在研究這個文件時發現 一個現象 當遊戲人物復活後 在復活位置 不能施放魔法而且血 魔 都不恢復
對於 熱衷修改遊戲的朋友 可以自己將 第 二 三 四 五 列修改 達到修改復活位置的目的
因為現在沒有找到向dbc文件中添加工具 所以還無法擴充dbc文件
第二个:TaxiNodes.dbc第二個:TaxiNodes.dbc
从字面上理解是出租车点数据,其实就是飞机传送点的数据從字面上理解是出租車點數據,其實就是飛機傳送點的數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来定义飞机传送点 作用 : 用來定義飛機傳送點
第一列 : 编号 用来 调用此飞机传送点
第二列 : 此飞机传送点所在 地图编号
第三列 : 此飞机传送点所在 编号地图中的x值
第四列 : 此飞机传送点所在 编号地图中的y值
第五列 : 此飞机传送点所在 编号地图中的z值
第六列 : 此飞机传送点所在地点名称
第十四列 : 此飞机传送点数据结束标志第一列 :編號 用來 調用此飛機傳送點
第二列 :此飛機傳送點所在 地圖編號
第三列 :此飛機傳送點所在 編號地圖中的x值
第四列 :此飛機傳送點所在 編號地圖中的y值
第五列 :此飛機傳送點所在 編號地圖中的z值
第六列 :此飛機傳送點所在地點名稱
第十四列 :此飛機傳送點數據結束標誌
SF中飞机传送员的位置设置可以根据 此文件来设置
传送员传送的路线是 模拟器根据传送员的位置 自动设置的SF中飛機傳送員的位置設置可以根據 此文件來設置
傳送員傳送的路線是 模擬器根據傳送員的位置 自動設置的
第三个 TaxiPath.dbc第三個 TaxiPath.dbc
从字面上理解是出租车路线数据,其实就是飞机传送路线的数据從字面上理解是出租車路線數據,其實就是飛機傳送路線的數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来定义飞机路线的编号 也是飞艇和船的路线编号作用 : 用來定義飛機路線的編號也是飛艇和船的路線編號
第一列 : 路线编号 用来调用此飞机路线
第二列 : 此飞机传送路线的端点A 编号
第三列 : 此飞机传送路线的端点B 编号、端点、编号定义见 TaxiNodes.dbc 内容的介绍
第四列 : 乘坐此飞机传送路线所需费用,单位铜币。第一列 :路線編號 用來調用此飛機路線
第二列 :此飛機傳送路線的端點A 編號
第三列 :此飛機傳送路線的端點B 編號、端點、編號定義見TaxiNodes.dbc內容的介紹
第四列 :乘坐此飛機傳送路線所需費用,單位銅幣。 如果为0,则此路线免费,能够免费的好像只有飞艇和船。如果為0,則此路線免費,能夠免費的好像只有飛艇和船。 SF中飞艇和船在gameobjects.scp中有其定义,大家看看飞艇和船的属性,sound0=XXX,其实XXX就是该飞艇或船的路线定义编号SF中飛艇和船在gameobjects.scp中有其定義,大家看看飛艇和船的屬性,sound0=XXX,其實XXX就是該飛艇或船的路線定義編號
第四个 TaxiPathNode.dbc第四個 TaxiPathNode.dbc
从字面上理解是出租车路线点数据,其实就是飞机传送路线点的数据從字面上理解是出租車路線點數據,其實就是飛機傳送路線點的數據
位置 : 位于dbc.mpq patch.mpq 中 位置 : 位於dbc.mpqpatch.mpq中
作用 : 用来定义飞机路线的每个路线点 也是飞艇和船的路线点作用 : 用來定義飛機路線的每個路線點也是飛艇和船的路線點
第一列 :此路线点总流水编号
第二列 : 此飞机传送路线编号 路线编号 定义见TaxiPath.dbc 内容的介绍
第三列 : 此飞机传送路线中路线点编号
第四列 : 此飞机传送路线点所在地图编号
第五列 : 此飞机传送 路线中路线点的X值
第六列 : 此飞机传送 路线中路线点的Y值
第七列 : 此飞机传送 路线中路线点的Z值
第八列 : 未知
第九列 : 未知第一列 :此路線點總流水編號
第二列 :此飛機傳送路線編號 路線編號 定義見TaxiPath.dbc內容的介紹
第三列 :此飛機傳送路線中路線點編號
第四列 : 此飛機傳送路線點所在地圖編號
第五列 : 此飛機傳送路線中路線點的X值
第六列 : 此飛機傳送路線中路線點的Y值
第七列 : 此飛機傳送路線中路線點的Z值
第八列 : 未知
第九列 : 未知
对于第一列路线点总流水编号,观查可以发现,即使在同一路线中也有编号不连续的现象。對於第一列路線點總流水編號,觀查可以發現,即使在同一路線中也有編號不連續的現象。 再看这前后不连续点的坐标值出现突变,所以估计这个总流水编号也是有一定其它作用的再看這前後不連續點的坐標值出現突變,所以估計這個總流水編號也是有一定其它作用的
第五个 SpellCastTimes.dbc第五個 SpellCastTimes.dbc
从字面上理解是法术施放时间数据從字面上理解是法術施放時間數據
位置 : 位于dbc.mpq 中模拟器的scripts目录下面位置 : 位於dbc.mpq中模擬器的scripts目錄下面
作用 : 用来定义法术施放时间
第一列 : 施放时间编号,用来调用此施放时间,调用编号在spell.dbc中是第15列
第二列 : 此编号的施放时间
第三列 : 未知 估计与商业技能的制作时间有关
第四列 : 此编号的施放时间作用 : 用來定義法術施放時間
第一列 :施放時間編號,用來調用此施放時間,調用編號在spell.dbc中是第15列
第二列 :此編號的施放時間
第三列 :未知 估計與商業技能的製作時間有關
第四列 :此編號的施放時間
DBC 文件格式說明:
Header(5個資料,共20 bytes)
Offset Type Description
0x00 char[4] (ident:固定為WDBC4個英文字) always 'WDBC'
0x04 uint32 (rows:這個資料表的行數,也就是說共有幾筆資料)nRecords - number of records in the file
0x08 uint32 (cols:這個資料表的列數,也就是共有幾個欄位) nFields - number of 4-byte fields per record
0x0C uint32 (rlen:一筆資料所佔的大小)recordSize = nFields * 4 (not always true!)
0x10 uint32 (slen:字串區的大小)string block size
data:(rows*rlen byes)(總共的資料大小)
row1(rlen bytes)
....
....
....
text:(slen bytes)(它是使用UTF8格式儲存的
'\0'(1 bytes) -->始終為'\0',表示一空字串
text1 (?byest) -->以'\0'結束的字串符號
....
....
....
如果想研究怎麼寫這段程式,可以至
http://wowmapview.cvs.sourceforge.net/wowmapview/wowmapview/
裏面有個dbcfile.cpp,dbcfile.h可以參考,它是用C++寫的
Spell.dbc 欄位意義
http://www.e9sky.com/bbs/read.php?tid=98
===========================================================
[轉載]使用DBC編輯器,增強你的裝備綠字效果!!
小小研究了一下綠字效果的增強~
大家一起來玩玩看,至於編輯器...本來打算放附件裡,可是好像限制大小太小了,放不下@@
找了找我也沒啥空間..就先放RS的好了
http://rapidshare.de/files/34056676/DBCedit.rar
呃,因為我沒上GF很久了,看了林碧大的回帖才發現好像是這樣...
如果有玩GF的建議不要改~~除非是用另外一個資料夾做私服客戶端~
至於EMU的東西...沒碰過所以不清楚@@
下面是自己亂摸來的~要是有什麼錯誤希望高手們幫忙訂正!! 感激~
首先,備份DBC底下的 spell.dbc
重要!!不然到時候要復原可是要搞老半天的...
接著用DBC編輯器打開模擬器底下的DBC資料夾,找到 spell.dbc
開啟需要一小段時間,沒出現資料的地方要稍微等一下~
右下方顯示打開文件完成後,即可按照「 技能編號 」的地方尋找你要修改的spellid
以下舉例較常用到的3項:
1.所有法術和治療效果提升最多XX點
法師要玩的爽,又不想把全部法術效果調高?
那就靠這個綠字效果了~
舉個大元帥之杖的spellid為例 (23929:全部法術和治療效果提升最多71點)
在技能編號的位置找到23929之後,往後拉拉拉...
大約在74和75欄位的地方(每個人的DBC不同,所以這裡應該不一定,總之是兩個數值70的地方)
※由於法術系的效果都是由1開始,就算你打1它也是增加2,所以你要找的數值全都是遊戲裡顯示的數值-1
把這兩行裡面的70都改為9999 (當然你要打幾個9都行...)
然後按下滑鼠右鍵,選擇「 當前行寫入 」等系統出現 "XXXX行 寫入完成" 時,改好囉
但是等等~ 我們還要修改一個地方,你在遊戲裡才能也看見這個數值,不然雖然有效果,但是遊戲裡不會顯示出來。
就是客戶端~這點倒是有點麻煩...
一樣打開DBC編輯文件,選擇客戶端內 \DBFilesClient\spell.dbc (或任何你放的地方)
接下來的步驟和上面一模一樣~
改好後~進入遊戲~
恭喜你...用奧爆清副本吧~很快樂的...
2.提昇你致命一擊的機率x%
因為武器的殺傷力或防禦力都可直接從裝備下手,所以比較需要的綠字效果應該只有爆擊率了~
以下舉例 spellid:7597 (使你造成致命一擊的機率上升1%)
一樣找到技能編號7597,往後拉拉拉....
這有點複雜,每個對應的地方不一定一樣,但一定差不多..
沒特別改過DBC的人,應該都在62.65這兩個欄位裡面。
62是你的最大增值效果,65是你的最小增值效果。
62保持1,65改成100 (或任何數值)
一樣右鍵,當前行寫入~
你的爆擊率就會變成提升 100 % 囉..
那要是你把62也改100會怎樣呢...?
答案是會變成暴擊機率從 100 % 到 10000 %
也就是說,最大值是會乘以最小值的喔
所以最大值通常用1就可以了
然後當然也一樣,客戶端改一改~
上線爆擊去吧..@@
3.提升法術致命一擊的機率x%
因為法術的致命和一般的致命放的位置有些許不同,所以稍為提一下~
以下舉例 spellid:18382 (使你的法術爆擊率增加2%)
找到18382,拉拉拉...
在欄位74的地方,有個1,把它改成99~
(法術系的效果皆為1開始,所以填入數值後會自動+1)
右鍵,當前行寫入~ 然後改客戶端~ 搞定。
差不多會用到的就這三個了~DBC可以研究的東西太多了@@
想改啥就改啥..再配合class可以把魔獸改的亂七八糟= =
不過小弟還沒研究那麼深入...新手咩~~囧rz
希望想玩綠字的人一起研究囉~
=======================================================
http://www.bitscn.com/wb/gameserver/200609/77187.html
關於WOW的DBC文件內容的介紹
對wow的dbc文件已經學習很久了,而且已經有點成果了,現在一個一個的給大家介紹。 先从简单的开始:先從簡單的開始:
第一个:WorldSafeLocs.dbc第一個:WorldSafeLocs.dbc
从字面上理解是游戏中的安全位置数据從字面上理解是遊戲中的安全位置數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来设置复活点 作用 : 用來設置復活點
第一列 : 编号 用来 调用此复活点 (对于游戏中调用复活点机制是用的编号调用 还是位置调用 因为手头上没有将浮点数转换为16进制的工具 所以没有测试)第一列 :編號 用來 調用此復活點(對於遊戲中調用複活點機制是用的編號調用 還是位置調用 因為手頭上沒有將浮點數轉換為16進制的工具 所以沒有測試)
第二列 : 此复活点所在 地图编号
第三列 : 此复活点所在 编号地图中的x值
第四列 : 此复活点所在 编号地图中的y值
第五列 : 此复活点所在 编号地图中的z值
第六列 : 此复活点所在地点名称
第十四列 : 此复活点数据结束标志
当游戏人物 死掉后 程序会根据 游戏人物的位置 在WorldSafeLocs.dbc中查找合适的位置
把游戏人物传到此位置 而该位置附近应该设置复活天使 SF的天使设置也应该按照这些位置设置 其实这些位置 都在一个公墓里面
在研究这个文件时发现 一个现象 当游戏人物复活后 在复活位置 不能施放魔法 而且血 魔 都不恢复
对于 热衷修改游戏的朋友 可以自己将 第 二 三 四 五 列修改 达到修改复活位置的目的
因为现在没有找到向dbc文件中添加工具 所以还无法扩充dbc文件第二列 :此復活點所在 地圖編號
第三列 :此復活點所在 編號地圖中的x值
第四列 :此復活點所在 編號地圖中的y值
第五列 :此復活點所在 編號地圖中的z值
第六列 :此復活點所在地點名稱
第十四列 :此復活點數據結束標誌
當遊戲人物 死掉後 程序會根據 遊戲人物的位置 在WorldSafeLocs.dbc中查找合適的位置
把遊戲人物傳到此位置 而該位置附近應該設置復活天使 SF的天使設置也應該按照這些位置設置 其實這些位置 都在一個公墓裡面
在研究這個文件時發現 一個現象 當遊戲人物復活後 在復活位置 不能施放魔法而且血 魔 都不恢復
對於 熱衷修改遊戲的朋友 可以自己將 第 二 三 四 五 列修改 達到修改復活位置的目的
因為現在沒有找到向dbc文件中添加工具 所以還無法擴充dbc文件
第二个:TaxiNodes.dbc第二個:TaxiNodes.dbc
从字面上理解是出租车点数据,其实就是飞机传送点的数据從字面上理解是出租車點數據,其實就是飛機傳送點的數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来定义飞机传送点 作用 : 用來定義飛機傳送點
第一列 : 编号 用来 调用此飞机传送点
第二列 : 此飞机传送点所在 地图编号
第三列 : 此飞机传送点所在 编号地图中的x值
第四列 : 此飞机传送点所在 编号地图中的y值
第五列 : 此飞机传送点所在 编号地图中的z值
第六列 : 此飞机传送点所在地点名称
第十四列 : 此飞机传送点数据结束标志第一列 :編號 用來 調用此飛機傳送點
第二列 :此飛機傳送點所在 地圖編號
第三列 :此飛機傳送點所在 編號地圖中的x值
第四列 :此飛機傳送點所在 編號地圖中的y值
第五列 :此飛機傳送點所在 編號地圖中的z值
第六列 :此飛機傳送點所在地點名稱
第十四列 :此飛機傳送點數據結束標誌
SF中飞机传送员的位置设置可以根据 此文件来设置
传送员传送的路线是 模拟器根据传送员的位置 自动设置的SF中飛機傳送員的位置設置可以根據 此文件來設置
傳送員傳送的路線是 模擬器根據傳送員的位置 自動設置的
第三个 TaxiPath.dbc第三個 TaxiPath.dbc
从字面上理解是出租车路线数据,其实就是飞机传送路线的数据從字面上理解是出租車路線數據,其實就是飛機傳送路線的數據
位置 : 位于dbc.mpq patch.mpq中模拟器的scripts目录下面位置 : 位於dbc.mpqpatch.mpq中模擬器的scripts目錄下面
作用 : 用来定义飞机路线的编号 也是飞艇和船的路线编号作用 : 用來定義飛機路線的編號也是飛艇和船的路線編號
第一列 : 路线编号 用来调用此飞机路线
第二列 : 此飞机传送路线的端点A 编号
第三列 : 此飞机传送路线的端点B 编号、端点、编号定义见 TaxiNodes.dbc 内容的介绍
第四列 : 乘坐此飞机传送路线所需费用,单位铜币。第一列 :路線編號 用來調用此飛機路線
第二列 :此飛機傳送路線的端點A 編號
第三列 :此飛機傳送路線的端點B 編號、端點、編號定義見TaxiNodes.dbc內容的介紹
第四列 :乘坐此飛機傳送路線所需費用,單位銅幣。 如果为0,则此路线免费,能够免费的好像只有飞艇和船。如果為0,則此路線免費,能夠免費的好像只有飛艇和船。 SF中飞艇和船在gameobjects.scp中有其定义,大家看看飞艇和船的属性,sound0=XXX,其实XXX就是该飞艇或船的路线定义编号SF中飛艇和船在gameobjects.scp中有其定義,大家看看飛艇和船的屬性,sound0=XXX,其實XXX就是該飛艇或船的路線定義編號
第四个 TaxiPathNode.dbc第四個 TaxiPathNode.dbc
从字面上理解是出租车路线点数据,其实就是飞机传送路线点的数据從字面上理解是出租車路線點數據,其實就是飛機傳送路線點的數據
位置 : 位于dbc.mpq patch.mpq 中 位置 : 位於dbc.mpqpatch.mpq中
作用 : 用来定义飞机路线的每个路线点 也是飞艇和船的路线点作用 : 用來定義飛機路線的每個路線點也是飛艇和船的路線點
第一列 :此路线点总流水编号
第二列 : 此飞机传送路线编号 路线编号 定义见TaxiPath.dbc 内容的介绍
第三列 : 此飞机传送路线中路线点编号
第四列 : 此飞机传送路线点所在地图编号
第五列 : 此飞机传送 路线中路线点的X值
第六列 : 此飞机传送 路线中路线点的Y值
第七列 : 此飞机传送 路线中路线点的Z值
第八列 : 未知
第九列 : 未知第一列 :此路線點總流水編號
第二列 :此飛機傳送路線編號 路線編號 定義見TaxiPath.dbc內容的介紹
第三列 :此飛機傳送路線中路線點編號
第四列 : 此飛機傳送路線點所在地圖編號
第五列 : 此飛機傳送路線中路線點的X值
第六列 : 此飛機傳送路線中路線點的Y值
第七列 : 此飛機傳送路線中路線點的Z值
第八列 : 未知
第九列 : 未知
对于第一列路线点总流水编号,观查可以发现,即使在同一路线中也有编号不连续的现象。對於第一列路線點總流水編號,觀查可以發現,即使在同一路線中也有編號不連續的現象。 再看这前后不连续点的坐标值出现突变,所以估计这个总流水编号也是有一定其它作用的再看這前後不連續點的坐標值出現突變,所以估計這個總流水編號也是有一定其它作用的
第五个 SpellCastTimes.dbc第五個 SpellCastTimes.dbc
从字面上理解是法术施放时间数据從字面上理解是法術施放時間數據
位置 : 位于dbc.mpq 中模拟器的scripts目录下面位置 : 位於dbc.mpq中模擬器的scripts目錄下面
作用 : 用来定义法术施放时间
第一列 : 施放时间编号,用来调用此施放时间,调用编号在spell.dbc中是第15列
第二列 : 此编号的施放时间
第三列 : 未知 估计与商业技能的制作时间有关
第四列 : 此编号的施放时间作用 : 用來定義法術施放時間
第一列 :施放時間編號,用來調用此施放時間,調用編號在spell.dbc中是第15列
第二列 :此編號的施放時間
第三列 :未知 估計與商業技能的製作時間有關
第四列 :此編號的施放時間
2007年4月3日 星期二
mangos 恐懼的修正
發現在打2王時..它一放恐懼結果我的人物上下到處亂跑,最後掉下來摔死@@
底下是修正的程式碼,不過有缺點...變成被恐懼後...並不會到處跑@@
看討論是說,不應該用SendMonsterMove或Relocate這2個函式
不過我試了Map::CreatureRelocation及Map::PlayerRelocation一樣也是不行@@
感覺上都是Z座標在作怪,一點點問題就會造成Server Crash掉.
底下是修正的程式碼,不過有缺點...變成被恐懼後...並不會到處跑@@
看討論是說,不應該用SendMonsterMove或Relocate這2個函式
不過我試了Map::CreatureRelocation及Map::PlayerRelocation一樣也是不行@@
感覺上都是Z座標在作怪,一點點問題就會造成Server Crash掉.
Index: src/game/FearedMovementGenerator.cpp
===================================================================
--- src/game/FearedMovementGenerator.cpp (revision 0)
+++ src/game/FearedMovementGenerator.cpp (revision 0)
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2005,2006 MaNGOS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "Creature.h"
+#include "MapManager.h"
+#include "Opcodes.h"
+#include "FearedMovementGenerator.h"
+#include "DestinationHolderImp.h"
+
+void
+FearedMovementGenerator::Initialize(Creature &creature)
+{
+}
+
+void
+FearedMovementGenerator::Initialize(Creature &creature, WorldObject *caster)
+{
+ float distance,dist;
+ float x,y,z,z2,angle;
+ x = creature.GetPositionX();
+ y = creature.GetPositionY();
+ z = creature.GetPositionZ();
+ angle = caster->GetAngle((WorldObject*)&creature);
+ uint32 mapid=creature.GetMapId();
+ i_caster=caster;
+ creature.setMoveRunFlag(true);
+ i_nextMove = 0;
+
+ Map* map = MapManager::Instance().GetMap(mapid);
+ z2 = map->GetHeight(x,y);
+ if( abs( z2 - z ) > 5 )
+ {
+ CreatureTraveller traveller(creature);
+ i_destinationHolder.SetDestination(traveller, x, y, z); //override setdest tergetedmovementgen
+ return;
+ }
+
+
+ distance = 5;
+ int leftright=urand(0,1);
+ bool is_water_ok = creature.isCanSwimOrFly();
+ bool is_land_ok = creature.isCanWalkOrFly();
+
+ for(unsigned int idx=0; idx < MAX_FEAR_WAYPOINTS+1; ++idx)
+ {
+
+ if(urand(0,100)<30)
+ {
+ angle=angle+(M_PI*(float)rand()/RAND_MAX/2-M_PI/4);
+ leftright=urand(0,1);
+ }
+ if(idx>0)
+ {
+ dist=caster->GetDistanceSq(i_waypoints[idx-1][0],i_waypoints[idx-1][1],i_waypoints[idx-1][2]);
+ if(dist>40*40)
+ {
+ float dx = caster->GetPositionX() - i_waypoints[idx-1][0];
+ float dy = caster->GetPositionY() - i_waypoints[idx-1][1];
+ float ang = atan2(dy, dx);
+ ang = (ang >= 0) ? ang : 2 * M_PI + ang;
+ if(leftright)angle=ang+M_PI*(float)rand()/RAND_MAX/6+5*M_PI/12;
+ else angle=ang-M_PI*(float)rand()/RAND_MAX/6-5*M_PI/12;
+ }
+ i_waypoints[idx][0] = i_waypoints[idx-1][0] + distance*cos(angle);
+ i_waypoints[idx][1] = i_waypoints[idx-1][1] + distance*sin(angle);
+ }
+ else
+ {
+ dist=caster->GetDistanceSq(x,y,z);
+ if(dist>40*40)
+ {
+ float dx = caster->GetPositionX() - x;
+ float dy = caster->GetPositionY() - y;
+ float ang = atan2(dy, dx);
+ ang = (ang >= 0) ? ang : 2 * M_PI + ang;
+ if(leftright)angle=ang+M_PI*(float)rand()/RAND_MAX/6+5*M_PI/12;
+ else angle=ang-M_PI*(float)rand()/RAND_MAX/6-5*M_PI/12;
+ }
+ i_waypoints[idx][0] = x + distance*cos(angle);
+ i_waypoints[idx][1] = y + distance*sin(angle);
+ }
+
+ // prevent invalid coordinates generation
+ MaNGOS::NormalizeMapCoord(i_waypoints[idx][0]);
+ MaNGOS::NormalizeMapCoord(i_waypoints[idx][1]);
+
+ bool is_water = map->IsInWater(i_waypoints[idx][0],i_waypoints[idx][1]);
+
+ // if generated wrong path just ignore
+ if( is_water && !is_water_ok || !is_water && !is_land_ok )
+ {
+ i_waypoints[idx][0] = idx > 0 ? i_waypoints[idx-1][0] : x;
+ i_waypoints[idx][1] = idx > 0 ? i_waypoints[idx-1][1] : y;
+ }
+
+ z2 = map->GetHeight(i_waypoints[idx][0],i_waypoints[idx][1]);
+ if( abs( z2 - z ) < 5 )
+ z=z2;
+ i_waypoints[idx][2] = z;
+ }
+
+ CreatureTraveller traveller(creature);
+ i_nextMove = 0;
+ i_destinationHolder.SetDestination(traveller, i_waypoints[i_nextMove][0], i_waypoints[i_nextMove][1], i_waypoints[i_nextMove][2]);
+
+}
+
+
+void
+FearedMovementGenerator::Reset(Creature &creature)
+{
+}
+
+bool
+FearedMovementGenerator::Update(Creature &creature, const uint32 &diff)
+{
+ if(!&creature)
+ return true;
+ if(creature.hasUnitState(UNIT_STAT_ROOT) || creature.hasUnitState(UNIT_STAT_STUNDED))
+ return true;
+
+ float x,y,z,z2;
+ x = creature.GetPositionX();
+ y = creature.GetPositionY();
+ z = creature.GetPositionZ();
+ uint32 mapid=creature.GetMapId();
+ Map* map = MapManager::Instance().GetMap(mapid);
+ z2 = map->GetHeight(x,y);
+ if( abs( z2 - z ) > 5 )
+ return true;
+
+ CreatureTraveller traveller(creature);
+
+ if(i_destinationHolder.HasArrived())
+ {
+ if(i_needUpdate)
+ {
+ if(!i_caster)return true;
+ Initialize(creature,i_caster);
+ i_needUpdate=false;
+ }
+ else if(i_nextMove < MAX_FEAR_WAYPOINTS)
+ {
+ i_destinationHolder.SetDestination(traveller, i_waypoints[i_nextMove][0], i_waypoints[i_nextMove][1], i_waypoints[i_nextMove][2]);
+ i_nextMove++;
+ }
+ else
+ {
+ if(!i_caster)return true;
+ Initialize(creature,i_caster);
+ }
+ }
+
+ if(i_destinationHolder.UpdateTraveller(traveller,diff,false))
+ {
+ i_destinationHolder.ResetUpdate(50);
+ }
+
+ return true;
+}
+
+int
+FearedMovementGenerator::Permissible(const Creature *creature)
+{
+ return FEARED_MOTION_TYPE;
+}
Index: src/game/FearedMovementGenerator.h
===================================================================
--- src/game/FearedMovementGenerator.h (revision 0)
+++ src/game/FearedMovementGenerator.h (revision 0)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2005,2006 MaNGOS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef MANGOS_FEAREDMOVEMENTGENERATOR_H
+#define MANGOS_FEAREDMOVEMENTGENERATOR_H
+
+#include "MovementGenerator.h"
+#include "DestinationHolder.h"
+#include "Traveller.h"
+
+#define MAX_FEAR_WAYPOINTS 15
+
+class MANGOS_DLL_DECL FearedMovementGenerator : public MovementGenerator
+{
+ public:
+ FearedMovementGenerator(const Creature &) {}
+
+ void Initialize(Creature &);
+ void Initialize(Creature &creature, WorldObject *caster);
+ void Reset(Creature &);
+ bool Update(Creature &, const uint32 &);
+ MovementGeneratorType GetMovementGeneratorType() { return FEARED_MOTION_TYPE; }
+ void NeedUpdate() {i_needUpdate = true;};
+ static int Permissible(const Creature *);
+ private:
+ float i_waypoints[MAX_FEAR_WAYPOINTS+1][3];
+ DestinationHolder< CreatureTraveller > i_destinationHolder;
+ uint32 i_nextMove;
+ WorldObject* i_caster;
+ bool i_needUpdate;
+
+};
+#endif
Index: src/game/MovementGenerator.h
===================================================================
--- src/game/MovementGenerator.h (revision 3326)
+++ src/game/MovementGenerator.h (working copy)
@@ -40,7 +40,8 @@
CONFUSED_MOTION_TYPE = 4, // ConfusedMovementGenerator.h
TARGETED_MOTION_TYPE = 5, // TargetedMovementGenerator.h
TAXI_MOTION_TYPE = 6, // TaxiMovementGenerator.h
- HOME_MOTION_TYPE = 7 // HomeMovementGenerator.h
+ HOME_MOTION_TYPE, // HomeMovementGenerator.h
+ FEARED_MOTION_TYPE
};
class MANGOS_DLL_SPEC MovementGenerator
Index: src/game/Spell.cpp
===================================================================
--- src/game/Spell.cpp (revision 3326)
+++ src/game/Spell.cpp (working copy)
@@ -1058,7 +1058,8 @@
// check for incapacitating player states
if( m_caster->hasUnitState(UNIT_STAT_STUNDED) ||
m_caster->hasUnitState(UNIT_STAT_ROOT) ||
- m_caster->hasUnitState(UNIT_STAT_CONFUSED) )
+ m_caster->hasUnitState(UNIT_STAT_CONFUSED) ||
+ m_caster->hasUnitState(UNIT_STAT_FLEEING))
cancel();
// check if player has turned if flag is set
Index: src/game/SpellAuras.cpp
===================================================================
--- src/game/SpellAuras.cpp (revision 3326)
+++ src/game/SpellAuras.cpp (working copy)
@@ -42,6 +42,8 @@
#include "Creature.h"
#include "ConfusedMovementGenerator.h"
#include "Formulas.h"
+#include "FearedMovementGenerator.h"
+#include "TargetedMovementGenerator.h"
pAuraHandler AuraHandler[TOTAL_AURAS]=
{
@@ -366,25 +368,13 @@
pos_y = m_target->GetPositionY();
uint32 mapid = m_target->GetMapId();
pos_z = MapManager::Instance().GetMap(mapid)->GetHeight(pos_x,pos_y);
- // Control the max Distance; 20 for temp.
- if(m_target->IsWithinDist(caster, 20))
- {
- if( m_target->GetPositionX() < caster->GetPositionX() || m_target->GetPositionY() > caster->GetPositionY() )
- x = m_target->GetPositionX() + speed*diff * sin(angle)/1000;
- else
- x = m_target->GetPositionX() - speed*diff * sin(angle)/1000;
- y = m_target->GetPositionY() - speed*diff * cos(angle)/1000;
- mapid = m_target->GetMapId();
- z = MapManager::Instance().GetMap(mapid)->GetHeight(x,y);
- // Control the target to not climb or drop when dz > |x|,x = 1.3 for temp.
- // fixed me if it needs checking when the position will be in water?
- if(z <= pos_z+1.3 && z>=pos_z-1.3)
- {
- m_target->SendMonsterMove(x,y,z,false,true,diff);
- if(m_target->GetTypeId() != TYPEID_PLAYER)
- m_target->Relocate(x,y,z,m_target->GetOrientation());
- }
- }
+ z = MapManager::Instance().GetMap(m_target->GetMapId())->GetHeight(pos_x,pos_y);
+ if( (abs( z - pos_z ) < 5) && m_target->IsWithinDist(caster,15) && (m_target->GetTypeId() == TYPEID_UNIT))
+ {
+ static_cast< FearedMovementGenerator *>((*(Creature*)m_target)->top())->NeedUpdate();
+ }
+ if(m_target->GetTypeId()==TYPEID_PLAYER)
+ m_target->SendMonsterMove(pos_x,pos_y,pos_z,false,true,diff);
}
}
@@ -1537,12 +1527,21 @@
uint32 apply_stat = UNIT_STAT_FLEEING;
if( Apply )
{
+ Unit* caster = GetCaster();
+ if(!caster)return;
+
m_target->addUnitState(UNIT_STAT_FLEEING);
// m_target->AttackStop();
m_target->SetFlag(UNIT_FIELD_FLAGS,(apply_stat << 16));
- // only at real add aura
+ if (m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ (*(Creature*)m_target)->Mutate(new FearedMovementGenerator(*(Creature*)m_target));
+ static_cast((*(Creature*)m_target)->top())->Initialize(*((Creature*)m_target),(WorldObject*)caster);
+ }
+
+ // only at real add aura
if(Real)
{
WorldPacket data(SMSG_DEATH_NOTIFY_OBSOLETE, 9);
@@ -1556,6 +1555,16 @@
m_target->clearUnitState(UNIT_STAT_FLEEING);
m_target->RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat << 16));
+ if (m_target->GetTypeId() == TYPEID_UNIT)
+ {
+ (*(Creature*)m_target)->MovementExpired();
+ static_cast< TargetedMovementGenerator *>((*(Creature*)m_target)->top())->Reset(*(Creature*)m_target);
+ }
+ m_target->RemoveFlag(UNIT_FIELD_FLAGS,(apply_stat << 16));
+
+ if(m_target->GetTypeId() != TYPEID_PLAYER)
+ m_target->Attack(GetCaster());
+
// only at real remove aura
if(Real)
{
--- /home/matt/mangos-cvs/src/game/SpellAuras.cpp 2007-01-04 15:30:04.000000000 -0700
+++ SpellAuras.cpp 2007-01-03 23:15:30.000000000 -0700
@@ -372,8 +372,7 @@
speed = m_target->GetSpeed(MOVE_RUN);
pos_x = m_target->GetPositionX();
pos_y = m_target->GetPositionY();
- uint32 mapid = m_target->GetMapId();
- pos_z = MapManager::Instance().GetMap(mapid)->GetHeight(pos_x,pos_y);
+ pos_z = m_target->GetPositionZ();
// Control the max Distance; 20 for temp.
if(m_target->IsWithinDist(caster, 20))
{
@@ -382,8 +381,7 @@
else
x = m_target->GetPositionX() - speed*diff * sin(angle)/1000;
y = m_target->GetPositionY() - speed*diff * cos(angle)/1000;
- mapid = m_target->GetMapId();
- z = MapManager::Instance().GetMap(mapid)->GetHeight(x,y);
+ z = m_target->GetPositionZ();
// Control the target to not climb or drop when dz > |x|,x = 1.3 for temp.
// fixed me if it needs checking when the position will be in water?
if(z<=pos_z+1.3 && z>=pos_z-1.3)
mangos 解決怪物陣營問題
在MC打boss 1王時,1王放出大範圍法術時,連護衛都一起放到了@@
這個patch就是用來修正這個問題
原帖地址:http://www.mangosproject.org/forum/index.php?showtopic=9957&st=0&gopid=71501entry71501
patch内容:
Copy code
這個patch就是用來修正這個問題
原帖地址:http://www.mangosproject.org/forum/index.php?showtopic=9957&st=0&gopid=71501entry71501
patch内容:
Copy code
index: Spell.h
===================================================================
--- Spell.h (revision 3356)
+++ Spell.h (working copy)
@@ -31,6 +31,8 @@
class Group;
class Aura;
+#define IS_AoEABLE(p) ((p)->getFaction() == 1 || (p)->getFaction() == 2 || (p)->getFaction() == 3 || (p)->getFaction() == 4 || (p)->getFaction() == 5 || (p)->getFaction() == 6 || (p)->getFaction() == 115 || (p)->getFaction() == 116)
+
enum SpellCastTargetFlags
{
/*TARGET_FLAG_NONE = 0x0000,
@@ -622,6 +624,9 @@
if (i_spell.m_caster->IsFriendlyTo( itr->second ))
continue;
+
+ if(!IS_AoEABLE(i_spell.m_caster) && !IS_AoEABLE((Unit*)(itr->second)))
+ continue;
switch(i_push_type)
{
2007年4月2日 星期一
mangos 傳送寶石[整理版]
傳送寶石[整理版-繁體中文-stenly]
原始的Mangos+ScriptDev2中如何加入傳送寶石的程式(整理版)-感謝以前很多的大大們把它們寫出來^^
不過我一直沒看到完整的教學文章,東拼西拼的終於把它弄出來了
這些Code其實在十字佣兵裏發佈的源碼裏都有,我只是把它整理出來而以^^
主要是給有興趣的人一起研究囉^^看懂之後對傳送寶石的實作會了解的更多^^
功能說明:
你會覺得在魔獸裏老是要找坐標位置很麻煩嗎?隨身的傳送寶石是一個超級方便的物品^^有了它想去那就去那再也不用找坐標打命令了!
魔獸工資領取很有趣的一個功能,這裏是設定成你只要在遊戲裏每待60秒以上,再按一下"魔獸工資領取",人物就會領到10G@@
也包含了個人隨身銀行,靈魂醫者復活功能
底下開始就都是要修改的程式碼了^^
傳送寶石[整理版-繁體中文-stenly]
原始的Mangos+ScriptDev2中如何加入傳送寶石的程式(整理版)-感謝以前很多的大大們把它們寫出來^^
不過我一直沒看到完整的教學文章,東拼西拼的終於把它弄出來了
這些Code其實在十字佣兵裏發佈的源碼裏都有,我只是把它整理出來而以^^
主要是給有興趣的人一起研究囉^^看懂之後對傳送寶石的實作會了解的更多^^
功能說明:
你會覺得在魔獸裏老是要找坐標位置很麻煩嗎?隨身的傳送寶石是一個超級方便的物品^^有了它想去那就去那再也不用找坐標打命令了!
魔獸工資領取很有趣的一個功能,這裏是設定成你只要在遊戲裏每待60秒以上,再按一下"魔獸工資領取",人物就會領到10G@@
也包含了個人隨身銀行,靈魂醫者復活功能
底下開始就都是要修改的程式碼了^^
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
進入src/bindings/ScriptDev2/scripts/item裏:
先備份sc_item_test.cpp然後編輯它機乎全部改寫了,我就直接貼Code了
====================================================================
#include "../sc_defines.h"
bool GossipHello_Item(Player *player, Item *_Item)
{
player->ADD_GOSSIP_ITEM( 3, " 世界主城傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 3, " 初級副本傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 3, " 中級副本傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 3, " 團隊副本傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 3, " 野外BOSS傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 3, " 三大戰場傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 3, " 世界風景傳送 " , 1, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 3, " 開通我的飛行點 " , 6, GOSSIP_ACTION_INFO_DEF + 8);
player->ADD_GOSSIP_ITEM( 3, " 我的個人銀行 " , 8, GOSSIP_ACTION_INFO_DEF + 9);
player->ADD_GOSSIP_ITEM( 3, " 魔獸工資領取 " , 7, GOSSIP_ACTION_INFO_DEF + 10);
player->ADD_GOSSIP_ITEM( 3, " 靈魂醫者復活 " , 12, GOSSIP_ACTION_INFO_DEF + 12);
player->SEND_GOSSIP_MENU(99990,_Item->GetGUID());
return true;
}
void SendDefaultMenu_Item(Player *player, Item *_Item, uint32 action)
{
switch(action) {
// 主城
case GOSSIP_ACTION_INFO_DEF + 1 :
player->ADD_GOSSIP_ITEM( 0, " 聯盟 暴風城 " , 2, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " 聯盟 鐵爐堡 " , 2, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " 聯盟 達納蘇斯 " , 2, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " 部落 奧格瑞瑪 " , 2, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " 部落 雷霆崖 " , 2, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " 部落 幽暗城 " , 2, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " 中立 棘齒城 " , 2, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 0, " 中立 藏寶海灣 " , 2, GOSSIP_ACTION_INFO_DEF + 8);
player->SEND_GOSSIP_MENU(99991,_Item->GetGUID());
break;
// 初級副本
case GOSSIP_ACTION_INFO_DEF + 2 :
player->ADD_GOSSIP_ITEM( 0, " •[14] 怒焰裂谷 " , 3, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " •[19] 死亡礦坑 " , 3, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " •[22] 哀嚎洞穴 " , 3, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " •[24] 影牙城堡 " , 3, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " •[26] 黑暗深淵 " , 3, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " •[27] 暴風城監獄 " , 3, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " •[31] 剃刀沼澤 " , 3, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 0, " •[33] 諾莫瑞根 " , 3, GOSSIP_ACTION_INFO_DEF + 8);
player->ADD_GOSSIP_ITEM( 0, " •[40] 血色修道院 " , 3, GOSSIP_ACTION_INFO_DEF + 9);
player->ADD_GOSSIP_ITEM( 0, " •[42] 剃刀高地 " , 3, GOSSIP_ACTION_INFO_DEF + 10);
player->ADD_GOSSIP_ITEM( 0, " •[45] 奧達曼 " , 3, GOSSIP_ACTION_INFO_DEF + 11);
player->SEND_GOSSIP_MENU(99992,_Item->GetGUID());
break;
// 中級副本
case GOSSIP_ACTION_INFO_DEF + 3 :
player->ADD_GOSSIP_ITEM( 0, " •[46] 祖爾法拉克 " , 4, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " •[49] 馬拉頓 " , 4, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " •[53] 失落的神廟 " , 4, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " •[57] 黑石深淵 " , 4, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " •[60] 通靈學院 " , 4, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " •[60] 厄運之槌 (北區) " , 4, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " •[60] 厄運之槌 (東區) " , 4, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 0, " •[60] 厄運之槌 (西區) " , 4, GOSSIP_ACTION_INFO_DEF + 8);
player->ADD_GOSSIP_ITEM( 0, " •[60] 斯坦索姆 " , 4, GOSSIP_ACTION_INFO_DEF + 9);
player->ADD_GOSSIP_ITEM( 0, " •[60] 黑石塔 " , 4, GOSSIP_ACTION_INFO_DEF + 10);
player->SEND_GOSSIP_MENU(99993,_Item->GetGUID());
break;
// 高級副本
case GOSSIP_ACTION_INFO_DEF + 4 :
player->ADD_GOSSIP_ITEM( 0, " •[團] 溶火之心 " , 5, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " •[團] 黑石塔 " , 5, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " •[團] 祖爾格拉布 " , 5, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " •[團] 黑翼之巢 " , 5, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " •[團] 安其拉神廟 " , 5, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " •[團] 安其拉廢墟 " , 5, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " •[團] 奧妮克希亞的巢穴 " , 5, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 0, " •[團] 納克薩瑪斯 " , 5, GOSSIP_ACTION_INFO_DEF + 8);
player->ADD_GOSSIP_ITEM( 0, " •[團] 冰龍巢穴 " , 5, GOSSIP_ACTION_INFO_DEF + 9);
player->SEND_GOSSIP_MENU(99994,_Item->GetGUID());
break;
// 野外BOSS傳送
case GOSSIP_ACTION_INFO_DEF + 5 :
player->ADD_GOSSIP_ITEM( 0, " 暮色森林 " , 9, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " 辛特蘭 " , 9, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " 梣谷 " , 9, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " 艾薩拉 " , 9, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " 菲拉斯 " , 9, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " 詛咒之地 " , 9, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " 水晶穀 " , 9, GOSSIP_ACTION_INFO_DEF + 7);
player->SEND_GOSSIP_MENU(99995,_Item->GetGUID());
break;
// 三大戰場傳送
case GOSSIP_ACTION_INFO_DEF + 6 :
player->ADD_GOSSIP_ITEM( 0, " 古拉巴什競技場 " , 10, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " 奧特蘭戰場 " , 10, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " 戰歌峽穀 " , 10, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " 阿拉希戰場 " , 10, GOSSIP_ACTION_INFO_DEF + 4);
player->SEND_GOSSIP_MENU(99996,_Item->GetGUID());
break;
// 風景傳送
case GOSSIP_ACTION_INFO_DEF + 7 :
player->ADD_GOSSIP_ITEM( 0, " 海加爾山 " , 11, GOSSIP_ACTION_INFO_DEF + 1);
player->ADD_GOSSIP_ITEM( 0, " 翡翠聖地 " , 11, GOSSIP_ACTION_INFO_DEF + 2);
player->ADD_GOSSIP_ITEM( 0, " 時光之穴 " , 11, GOSSIP_ACTION_INFO_DEF + 3);
player->ADD_GOSSIP_ITEM( 0, " 黑暗之門 " , 11, GOSSIP_ACTION_INFO_DEF + 4);
player->ADD_GOSSIP_ITEM( 0, " 雙塔山 " , 11, GOSSIP_ACTION_INFO_DEF + 5);
player->ADD_GOSSIP_ITEM( 0, " 夢境之樹 " , 11, GOSSIP_ACTION_INFO_DEF + 6);
player->ADD_GOSSIP_ITEM( 0, " GM之島 " , 11, GOSSIP_ACTION_INFO_DEF + 7);
player->ADD_GOSSIP_ITEM( 0, " 海加爾山 - 暴雪路障 " , 11, GOSSIP_ACTION_INFO_DEF + 8);
player->ADD_GOSSIP_ITEM( 0, " 天涯海灘 " , 11, GOSSIP_ACTION_INFO_DEF + 9);
player->ADD_GOSSIP_ITEM( 0, " 安戈洛環形山 " , 11, GOSSIP_ACTION_INFO_DEF + 10);
player->ADD_GOSSIP_ITEM( 0, " 比吉爾的飛艇殘骸 " , 11, GOSSIP_ACTION_INFO_DEF + 11);
player->ADD_GOSSIP_ITEM( 0, " 石堡瀑布" , 11, GOSSIP_ACTION_INFO_DEF + 12);
player->ADD_GOSSIP_ITEM( 0, " 地鐵海底" , 11, GOSSIP_ACTION_INFO_DEF + 13);
player->ADD_GOSSIP_ITEM( 0, " 工程師之島" , 11, GOSSIP_ACTION_INFO_DEF + 14);
player->ADD_GOSSIP_ITEM( 0, " 卡拉贊" , 11, GOSSIP_ACTION_INFO_DEF + 15);
player->SEND_GOSSIP_MENU(99997,_Item->GetGUID());
break;
}
}
bool GossipSelect_Item(Player *player, Item *_Item, uint32 sender, uint32 action )
{
switch(sender) {
// 主選單
case GOSSIP_SENDER_MAIN :
SendDefaultMenu_Item(player, _Item, action);
break;
// 各大主城
case 2 :
uint32 price_city;
price_city= 10000; //city
switch(action) {
// 暴風城 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(0,-9065,434,94,0);
break;
// 鐵爐堡
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(0,-5032,-819,495,0);
break;
// 達納蘇斯
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(1,9961,2055,1329,0);
break;
// 奧格瑞瑪
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(1,1317,-4383,27,0);
break;
// 雷霆崖
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(1,-1391,140,23,0);
break;
// 幽暗城
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(0,1909,235,53,0);
break;
// 棘齒城
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(1,-977,-3788,6,0);
break;
// 藏寶海灣
case GOSSIP_ACTION_INFO_DEF + 8 :
player->TeleportTo(0,-14302,518,9,0);
break;
}
break;
// 初級副本
case 3:
switch(action) {
// •[14] 怒焰裂谷 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(389,2.024650,-10.021000,-16.187500,0);
break;
// •[19] 死亡礦井
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(36,-16.4,-383.07,61.78,0);
break;
// •[22] 哀嚎洞穴
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(43,-161.841995,133.266998,-73.866203,0);
break;
// •[24] 影牙城堡
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(33,-228.19,2110.56,76.89,0);
break;
// •[26] 黑暗深淵
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(48,-150.367004,102.995003,-40.555801,0);
break;
// •[27] 暴風城監獄
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(34,48.29,0.45,-16.14,0);
break;
// •[31] 剃刀沼澤
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(47,1943,1544,82,0);
break;
// •[33] 諾莫瑞根
case GOSSIP_ACTION_INFO_DEF + 8 :
player->TeleportTo(90,-332.562988,-3.445,-152.845993,0);
break;
// •[40] 血色修道院
case GOSSIP_ACTION_INFO_DEF + 9 :
player->TeleportTo(189,855.903992,1321.939941,18.673000,0);
break;
// •[42] 剃刀高地
case GOSSIP_ACTION_INFO_DEF + 10 :
player->TeleportTo(129,2593.209961,1109.459961,51.093300,0);
break;
// •[45] 奧達曼
case GOSSIP_ACTION_INFO_DEF + 11 :
player->TeleportTo(70,-227.529007,45.009800,-46.019600,0);
break;
}
break;
// 中級副本
case 4:
switch(action) {
// •[46] 祖爾法拉克 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(209,1213,841,8.9,0);
break;
// •[49] 瑪拉頓
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(349,1012.700012,-459.317993,-43.547100,0);
break;
// •[53] 失落的神廟
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(109,-313.369995,99.955399,-131.848999,0);
break;
// •[57] 黑石深淵
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(230,456.928986,34.927700,-69.388100,0);
break;
// •[60] 通靈學院
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(289,199,126,135,0);
break;
// •[60] 厄運之槌 (北區)
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(429,255.164001,-17.024200,-2.560600,0);
break;
// •[60] 厄運之槌 (東區)
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(429,46.24,-155.53,-2.71349,0);
break;
// •[60] 厄運之槌 (西區)
case GOSSIP_ACTION_INFO_DEF + 8 :
player->TeleportTo(429,32.722599,159.417007,-3.470170,0);
break;
// •[60] 斯坦索姆
case GOSSIP_ACTION_INFO_DEF + 9 :
player->TeleportTo(329,3392,-3379,143,0);
break;
// •[60] 黑石塔下
case GOSSIP_ACTION_INFO_DEF + 10 :
player->TeleportTo(229,78.19,-227.63,49.72,0);
break;
}
break;
// 高級副本
case 5:
uint32 price;
price = 100000;
switch(action) {
// •[團] 溶火之心 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(409,1089.601685,-470.190247,-106.413055,0);
break;
// •[團] 黑石塔上
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(229,78.339836,-227.793518,49.7103,0);
break;
// •[團] 祖爾格拉布
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(309,-11916,-1251.469971,92.32,0);
break;
// •[團] 黑翼之巢
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(469,-7674.470215,-1108.380005,396.649994,0);
break;
// •[團] 安其拉神廟
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(531,-8212.002930,2034.474854,129.141342,0);
break;
// •[團] 安其拉廢墟
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(509,-8443.475586,1518.648560,31.906958,0);
break;
// •[團] 奧妮克希亞的巢穴
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(249,30.010290,-58.840508,-5.325367,0);
break;
//•[團] 納克薩瑪斯
case GOSSIP_ACTION_INFO_DEF + 8 :
player->TeleportTo(533,3005.87,-3435.01,293.882,0);
break;
// •[團] 冰龍巢穴
case GOSSIP_ACTION_INFO_DEF + 9 :
player->TeleportTo(533,3700.35,-5185.92,143.957,4.403038,0);
break;
}
break;
// 野外BOSS座標
case 9:
uint32 price_worldboss;
price_worldboss = 100000;
switch(action) {
// 暮色森林 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(0,-10526.168945,-434.996796,50.894821,0);
break;
// 辛特蘭
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(0,759.605713,-3893.341309,116.475304,0);
break;
// 梣谷
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(1,3120.289307,-3439.444336,139.566345,1);
break;
// 艾薩拉
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(1,2622.219971,-5977.930176,100.562897,1);
break;
// 菲拉斯
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(1,-2741.290039,2009.481323,31.877323,1);
break;
// 詛咒之地
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(0,-12234.000000,-2474.000000,-3.000000,0);
break;
//水晶谷
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(1,-6292.463379,1578.029053,0.155348,1);
break;
}
break;
// 三大戰場座標
case 10 :
switch(action) {
// 古拉巴什競技場 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(0,-13289.353516,118.628067,24.414938,1.047498);
break;
// 奧特蘭戰場(部落)
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(30,390.553680,-283.560547,-42.987301,3.135666);
break;
// 戰歌峽谷(部落)
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(489,1123.168823,1462.474976,315.564148,3.464511);
break;
// 阿拉希戰場(部落)
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(529,855.156128,828.636108,-57.707348,2.812707);
break;
}
break;
// 風景傳送
case 11 :
switch(action) {
//海加爾山 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 1 :
player->TeleportTo(1,4603.946777,-3879.250977,944.183472,1);
break;
//翡翠聖地 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 2 :
player->TeleportTo(1,3968.264648,-1290.036011,240.326889,5.927989);
break;
//時光之穴 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 3 :
player->TeleportTo(1,-8173.930176,-4737.463867,33.777351,4.772119);
break;
//黑暗之門 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 4 :
player->TeleportTo(0,-11849.031250,-3201.170654,-28.885090,3.280838);
break;
//雙塔山 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 5 :
player->TeleportTo(1,-3331.353271,2225.728271,30.987701,6.267522);
break;
//夢境之樹 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 6 :
player->TeleportTo(1,-2914.756104,1902.199341,34.741035,5.690404);
break;
//GM之島 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 7 :
player->TeleportTo(1, 16222.1 ,16252.1,12.5872,1);
break;
//暴雪建設公司路障 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 8 :
player->TeleportTo(1,5478.060059,-3730.850098,1593.439941,5.610376);
break;
//天涯海灘 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 9 :
player->TeleportTo(1,-9851.617188,-3608.474121,8.939731,2.513388);
break;
//安戈洛環形山 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 10 :
player->TeleportTo(1,-8562.096680,-2106.056641,8.852538,0.090425);
break;
//比吉爾的飛艇殘骸 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 11 :
player->TeleportTo(1,-4014.003418,-3768.186523,42.123295,5.220697);
break;
//石堡瀑布 統一格式說明:(MapID, X, Y, Z, 0);
case GOSSIP_ACTION_INFO_DEF + 12 :
player->TeleportTo(0,-9481.493164,-3326.915283,8.864347,0.846896);
break;
//地鐵海底
case GOSSIP_ACTION_INFO_DEF + 13 :
player->TeleportTo(369, -9.96166,1238.17,-126.102,0);
break;
//工程師之島
case GOSSIP_ACTION_INFO_DEF + 14 :
player->TeleportTo(451, 16299.464844, 16272.843750, 69.443901 ,0);
break;
//卡拉贊
case GOSSIP_ACTION_INFO_DEF + 15 :
player->TeleportTo(0, 11037.7 ,1999.49, 92.9823 ,0);
break;
}
break;
//開飛行點
case 6:
uint32 price_flags;
price_flags = 300000; //收10G的錢
if (player->GetMoney() >= price_flags) {
player->ModifyMoney(-int32(price_flags));
for (uint8 i=0; i<8; i++)
{ player->SetTaximask(i, 0xFFFFFFFF); }
player->SEND_GOSSIP_MENU(99995,_Item->GetGUID());
}
else player->SEND_GOSSIP_MENU(99997,_Item->GetGUID());
break;
//銀行
case 8 :
player->GetSession()->SendShowBank( player->GetGUID() );
break;
// 靈魂醫者復活
case 12 :
player-> GetSession()->SendSpiritResurrect();
break;
//魔獸工資領取,這個功能看起來比較算是測試用的,造理說不應該把玩家在線時間歸零的
case 7 :
if(player->GetLevelPlayedTime() > 60) // 條件檢查你線上時間大於60秒.這可以自己改
{
player->ModifyMoney(int32(100000)); //滿足條件獲得金幣
player->SetInGameTime(uint32(NULL)); //將玩家在線時間歸零
}else{
player->SEND_GOSSIP_MENU(99998,_Item->GetGUID());
}
break;
}
return true;
}
void AddSC_item_test()
{
Script *newscript;
newscript = new Script;
newscript->Name="item_test";
newscript->pItemUse = GossipHello_Item;
newscript->pGossipSelect_Item = GossipSelect_Item; //<--這個在十字佣兵裏的程式是寫&GossipSelect_Item沒當真的蠻神奇的@@
m_scripts[nrscripts++] = newscript;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/bindings/ScriptDev2/ScriptMgr.h
====================================================================
原始:
Script() :
pGossipHello(NULL), pQuestAccept(NULL), pGossipSelect(NULL), pGossipSelectWithCode(NULL),
pQuestSelect(NULL), pQuestComplete(NULL), pNPCDialogStatus(NULL), pChooseReward(NULL),
pItemHello(NULL), pGOHello(NULL), pAreaTrigger(NULL), pItemQuestAccept(NULL), pGOQuestAccept(NULL),
pGOChooseReward(NULL),pReceiveEmote(NULL),pItemUse(NULL), GetAI(NULL)
{}
改成:
Script() :
pGossipHello(NULL), pQuestAccept(NULL), pGossipSelect(NULL), pGossipSelectWithCode(NULL),
pQuestSelect(NULL), pQuestComplete(NULL), pNPCDialogStatus(NULL), pChooseReward(NULL),
pItemHello(NULL), pGOHello(NULL), pAreaTrigger(NULL), pItemQuestAccept(NULL), pGOQuestAccept(NULL),
pGOChooseReward(NULL),pReceiveEmote(NULL),pItemUse(NULL), pGossipSelect_Item(NULL),GetAI(NULL)
{}
//只是多加一個pGossipSelect_Item(NULL)
再找到底下這2行:
bool (*pGOChooseReward )(Player *player, GameObject *_GO, Quest *_Quest, uint32 opt );
CreatureAI* (*GetAI)(Creature *_Creature);
在中間補1行變成:
bool (*pGOChooseReward )(Player *player, GameObject *_GO, Quest *_Quest, uint32 opt );
bool (*pGossipSelect_Item )(Player *player, Item *_Item, uint32 sender, uint32 action );
CreatureAI* (*GetAI)(Creature *_Creature);
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/bindings/ScriptDev2/ScriptMgr.cpp
====================================================================
在底下的2個函式中間:
MANGOS_DLL_EXPORT
bool GossipSelectWithCode( Player *player, Creature *_Creature, uint32 sender, uint32 action, char* sCode )
{...}
MANGOS_DLL_EXPORT
bool QuestAccept( Player *player, Creature *_Creature, Quest *_Quest )
{...}
加入底下的一個函式:
MANGOS_DLL_EXPORT
bool GossipSelect_Item( Player *player, Item *_Item,uint32 sender, uint32 action )
{
Script *tmpscript = NULL;
printf("action: %d\n",action);
player->PlayerTalkClass->ClearMenus();
tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
if(!tmpscript || !tmpscript->pGossipSelect_Item) return false;
return tmpscript->pGossipSelect_Item(player,_Item,sender,action);
}
修改底下ItemUse的函式:
MANGOS_DLL_EXPORT
bool ItemUse( Player *player, Item* _Item)
{
Script *tmpscript = NULL;
tmpscript = GetScriptByName(_Item->GetProto()->ScriptName);
if(!tmpscript || !tmpscript->pItemUse) return false;
player->PlayerTalkClass->ClearMenus();
return tmpscript->pItemUse(player,_Item);
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/game/ScriptCalls.cpp
===================================================================
找到底下4行:
||!(testScript->ItemQuestAccept =(scriptCallItemQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ItemQuestAccept" ))
||!(testScript->GOQuestAccept =(scriptCallGOQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GOQuestAccept" ))
||!(testScript->ReceiveEmote =(scriptCallReceiveEmote )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ReceiveEmote" ))
||!(testScript->GetAI =(scriptCallGetAI )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GetAI" ))
修改成:
||!(testScript->ItemQuestAccept =(scriptCallItemQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ItemQuestAccept" ))
||!(testScript->GOQuestAccept =(scriptCallGOQuestAccept )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GOQuestAccept" ))
||!(testScript->ReceiveEmote =(scriptCallReceiveEmote )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ReceiveEmote" ))
||!(testScript->ItemUse =(scriptCallItemUse )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"ItemUse" ))
||!(testScript->GossipSelect_Item =(scriptCallGossipSelect_Item )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GossipSelect_Item" ))
||!(testScript->GetAI =(scriptCallGetAI )MANGOS_GET_PROC_ADDR(testScript->hScriptsLib,"GetAI" ))
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/game/ScriptCalls.h
===================================================================
找到底下3行:
typedef bool(MANGOS_IMPORT * scriptCallGOChooseReward)(Player *player, GameObject *, Quest *, uint32 opt );
typedef bool(MANGOS_IMPORT * scriptCallReceiveEmote) ( Player *player, Creature *_Creature, uint32 emote );
typedef CreatureAI* (MANGOS_IMPORT * scriptCallGetAI) ( Creature *_Creature );
在底下補上下面這兩行:
typedef bool(MANGOS_IMPORT * scriptCallItemUse) ( Player *player, Item* _Item);
typedef bool(MANGOS_IMPORT * scriptCallGossipSelect_Item)(Player *player, Item *_Item, uint32 sender, uint32 action);
找到底下3行:
scriptCallGOQuestAccept GOQuestAccept;
scriptCallReceiveEmote ReceiveEmote;
scriptCallGetAI GetAI;
在底下補上下面這兩行:
scriptCallItemUse ItemUse;
scriptCallGossipSelect_Item GossipSelect_Item;
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/game/ItemHandler.cpp
====================================================================
#include "ScriptCalls.h" //<---在檔案最上面的#include xxx底下加入此行,然後修改底下的HandleReadItem函式
void WorldSession::HandleReadItem( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,1+1);
//sLog.outDebug( "WORLD: CMSG_READ_ITEM");
WorldPacket data;
uint8 bag, slot;
recv_data >> bag >> slot;
//sLog.outDetail("STORAGE: Read bag = %u, slot = %u", bag, slot);
Item *pItem = _player->GetItemByPos( bag, slot );
if( pItem && pItem->GetProto()->PageText )
{
uint8 msg = _player->CanUseItem( pItem );
if(!Script->ItemUse(GetPlayer(),pItem)){ //加入此行,不加這裏的話會造成使用傳送寶石不會出現選單,會要你去接任務@@
if( msg == EQUIP_ERR_OK ){
data.Initialize (SMSG_READ_ITEM_OK, 8);
sLog.outDetail("STORAGE: Item page sent");
}else{
data.Initialize( SMSG_READ_ITEM_FAILED, 8 );
sLog.outDetail("STORAGE: Unable to read item");
_player->SendEquipError( msg, pItem, NULL );
}
data << pItem->GetGUID();
SendPacket(&data);
} //加入此行
}
else
_player->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL );
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
編輯: src/game/NPCHandler.cpp <---這個不改的話會造成無法使用到GossipSelect_Item函式喔
====================================================================
找到底下的HandleGossipSelectOptionOpcode函式:
void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,8+4);
sLog.outDetail("WORLD: CMSG_GOSSIP_SELECT_OPTION");
uint32 option;
uint64 guid;
recv_data >> guid >> option;
uint16 pos = _player->GetPosByGuid(guid);//加入此行
Item *pItem = _player->GetItemByPos( pos ); //加入此行
Creature *unit = ObjectAccessor::Instance().GetNPCIfCanInteractWith(*_player, guid,UNIT_NPC_FLAG_NONE);
//底下程式要修正,請注意看
if (unit){
if(!Script->GossipSelect( _player, unit, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option )) )
unit->OnGossipSelect( _player, option );
}else{
if (!Script->GossipSelect_Item( _player, pItem, _player->PlayerTalkClass->GossipOptionSender( option ), _player->PlayerTalkClass->GossipOptionAction( option )))
{
sLog.outDebug( "WORLD: HandleGossipSelectOptionOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
return;
}
}
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
====================================================================
最後在你的資料庫裏增加一筆資料如下
INSERT INTO `item_template` VALUES (’31023′, ‘12′, ‘0′, ‘傳送寶石’, ‘傳送寶石’, ‘傳送寶石’, ‘傳送寶石’, ‘29691′, ‘1′, ‘0′, ‘1′, ‘0′, ‘0′, ‘0′, ‘-1′, ‘-1′, ‘1′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘1′, ‘1′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘4′, ”, ‘78′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘0′, ‘item_test’);
然後就可以使用.additem 31023產生這個物件使用傳送寶石囉^^
好了收工囉,快去體驗結果吧^^
////////////////////////////////////////////////////////////////////////////////
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
修改Formulas.h中的打怪獲得經驗值 - 主要是修改萬一等級差超過5級後會沒有任何經驗值
如果覺得差5級以上本來就不需要經驗值者就不需要變動
可是如果有開放到60級以上的話...就可能要改了...不然打到70級可能就升不上去了
===================================================================
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(( (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;
}
}
Mangos 簡介
Mangos 簡介
底下的簡介文章是轉載來的:
mangos不是一個魔獸私服模擬器,它是一個開源的自由軟體專案,是用c++和C#編程語言,實現的一個支援大型多人線上角色扮演遊戲伺服器的程式框架,在這個框架下,它理論上應該支援任何用戶端的網路遊戲,由於現在很多人使用魔獸世界來對它進行測試,所以針對魔獸世界的腳本和資料庫檔比較完善,很多人就利用這個開源項目來實現魔獸私服。
首先,mangos專案是一個開源的自由軟體(如同linux或者firefox),並且遵守其中最為嚴格的GPL協議,也就是保證源代碼絕對的自由,要瞭解什麼是開源軟體,自由軟體請自己搜索這方面的資料。
其次開發小組一再強調,這是個研究,教育性質的對怎樣開發大型網遊的伺服器端有好處的項目,是一個技術細節毫無保留向公眾開放的軟體,是一件很有意義的事情,如果你使用它作為盈利目的,那你本身就違反了軟體的協定。所以任何利用mangos專案進行私服活動的組織和個人都違反了mangos的宗旨,mangos項目也不會對它們負責。mangos的技術細節上是這樣的,核心部分是個和特定遊戲沒有關係的核心框架程式,主要是進行進程調度,創造世界,建立心跳機制,處理網路接入等。資料庫也是使用的開源資料庫軟體MySQL,編譯器使用的是GCC。至於遊戲內容資料庫,遊戲人物,時間,世界腳本,都是由這個核心程式所支援的擴展腳本來實現,所以有一些獨立出來的專案專門模擬魔獸世界來開發支援mangos的核心程式。現在mangos的核心程式已經放到著名的協同開發網站sourceforge上開發了,使用的開發工具是subversion。大家都可以從sourceforge的subversion資料庫中下載最新的源代碼程式。
另外有點要注意的是,開源專案是很容易被利用的,有時候有的公司開發了一個軟體說是自己做的其實內核都是別人的開源內核,但是公司又不承認,利用了別人的勞動成果賺錢不說,既不回報社區,也對開源自由軟體造成了很大的傷害。所以大家注意了,如果看到一個和魔獸世界很像的什麼網路遊戲?要想想是不是利用的mangos的核心程式。
官方討論區:http://www.mangosproject.org/forum/
心動了嗎?想不想抓下來測看看呢?首先當然要先裝subversion
然後mangos的主程式 它可以使用linux g++或是windows 2003/2005去編譯
svn co https://svn.sourceforge.net/svnroot/mangos/trunk mangos
下載好後進入mangos目錄..如果是使用linux者..它並沒有附上makefile for linux
所以請執行
autoreconf -v -i -f --install
./configure --prefix=/usr/local/mangos -sysconfdir=/usr/local/mangos/etc -with-python -enable-cli -enable-ra
make
make install
執行方式:
./mangos-worldd -c mangosd.conf <--Server的主程式會進入命令列模式
./mangos-realmd -c realmd.conf <--Login Server程式
如果需要怪物AI系統的話還需要再下載ScriptDev2
svn co https://svn.sourceforge.net/svnroot/scriptdev2 ScriptDev2
把它整合到mangos裏一起build比較方便
它會產生libmangosscript--version-info.so讓mangos使用
當然啦...單純的只有ScriptDev2是沒用的..最好還要再配合資料庫
最後目前我好像只有看正支援到client 1.12.3
最新的版板是有人在說,不過沒看到有人整理出來@@
詳細的安裝方法請看:
https://svn.mangosproject.org/trac/MaNGOS/wiki/UsersGuide/Tutorial/GettingStarted
另外這個Server是使用MySQL當做資料庫的唷!
底下的簡介文章是轉載來的:
mangos不是一個魔獸私服模擬器,它是一個開源的自由軟體專案,是用c++和C#編程語言,實現的一個支援大型多人線上角色扮演遊戲伺服器的程式框架,在這個框架下,它理論上應該支援任何用戶端的網路遊戲,由於現在很多人使用魔獸世界來對它進行測試,所以針對魔獸世界的腳本和資料庫檔比較完善,很多人就利用這個開源項目來實現魔獸私服。
首先,mangos專案是一個開源的自由軟體(如同linux或者firefox),並且遵守其中最為嚴格的GPL協議,也就是保證源代碼絕對的自由,要瞭解什麼是開源軟體,自由軟體請自己搜索這方面的資料。
其次開發小組一再強調,這是個研究,教育性質的對怎樣開發大型網遊的伺服器端有好處的項目,是一個技術細節毫無保留向公眾開放的軟體,是一件很有意義的事情,如果你使用它作為盈利目的,那你本身就違反了軟體的協定。所以任何利用mangos專案進行私服活動的組織和個人都違反了mangos的宗旨,mangos項目也不會對它們負責。mangos的技術細節上是這樣的,核心部分是個和特定遊戲沒有關係的核心框架程式,主要是進行進程調度,創造世界,建立心跳機制,處理網路接入等。資料庫也是使用的開源資料庫軟體MySQL,編譯器使用的是GCC。至於遊戲內容資料庫,遊戲人物,時間,世界腳本,都是由這個核心程式所支援的擴展腳本來實現,所以有一些獨立出來的專案專門模擬魔獸世界來開發支援mangos的核心程式。現在mangos的核心程式已經放到著名的協同開發網站sourceforge上開發了,使用的開發工具是subversion。大家都可以從sourceforge的subversion資料庫中下載最新的源代碼程式。
另外有點要注意的是,開源專案是很容易被利用的,有時候有的公司開發了一個軟體說是自己做的其實內核都是別人的開源內核,但是公司又不承認,利用了別人的勞動成果賺錢不說,既不回報社區,也對開源自由軟體造成了很大的傷害。所以大家注意了,如果看到一個和魔獸世界很像的什麼網路遊戲?要想想是不是利用的mangos的核心程式。
官方討論區:http://www.mangosproject.org/forum/
心動了嗎?想不想抓下來測看看呢?首先當然要先裝subversion
然後mangos的主程式 它可以使用linux g++或是windows 2003/2005去編譯
svn co https://svn.sourceforge.net/svnroot/mangos/trunk mangos
下載好後進入mangos目錄..如果是使用linux者..它並沒有附上makefile for linux
所以請執行
autoreconf -v -i -f --install
./configure --prefix=/usr/local/mangos -sysconfdir=/usr/local/mangos/etc -with-python -enable-cli -enable-ra
make
make install
執行方式:
./mangos-worldd -c mangosd.conf <--Server的主程式會進入命令列模式
./mangos-realmd -c realmd.conf <--Login Server程式
如果需要怪物AI系統的話還需要再下載ScriptDev2
svn co https://svn.sourceforge.net/svnroot/scriptdev2 ScriptDev2
把它整合到mangos裏一起build比較方便
它會產生libmangosscript--version-info.so讓mangos使用
當然啦...單純的只有ScriptDev2是沒用的..最好還要再配合資料庫
最後目前我好像只有看正支援到client 1.12.3
最新的版板是有人在說,不過沒看到有人整理出來@@
詳細的安裝方法請看:
https://svn.mangosproject.org/trac/MaNGOS/wiki/UsersGuide/Tutorial/GettingStarted
另外這個Server是使用MySQL當做資料庫的唷!
訂閱:
文章 (Atom)
-
昨天差點昏倒, 因為Chrome Browser一開啟後居然一片白畫面. 雖然還有IE可以用, 但就是習慣Chrome了啊, 然後開始Google別人如何解決, 不過看起來不少人遇到相同的問題, 但都沒什麼解決方法. 什麼掃毒啦, 重新安裝Chrome啦, 砍掉Default啦....
-
股市之神是川銀藏 從30歲的70日元開始投資,到成為叱吒風雲的日本股神,是川銀藏僅小學畢業,卻憑著在股市的驚人業績設立「是川經濟研究所」,登上大學教壇。他以「只吃八分飽」、「烏龜三原則」與「股票投資五原則」的簡單哲學屢創股市奇蹟。 只吃八分飽 是川認為,投資股票賣出比買進要難得多...
-
I/O mapped I/O(port-mapped I/O或Direct I/O) I/O與memory均擁有自己的記憶體空間 需要特別的指令來處理I/O 好處是完全不用考慮記憶體空間被I/O佔用,缺點需要額外的指令專門處理I/O存取。 Memory Mapped I/O I/...
一個小故事讓我們明白資金流通的意義
“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...