现在的位置: 首页 > 综合 > 正文

MANGOS脚本例子

2013年02月03日 ⁄ 综合 ⁄ 共 4043字 ⁄ 字号 评论关闭

一些mangos脚本的函数
NPC卖东西的函数 player->SEND_VENDORLIST( _Creature->GetGUID() );

SEND_VENDORLIST(_Creature->GetGUID() ) 卖东西npc
SEND_TRAINERLIST(_Creature->GetGUID() 训练师
SEND_BANKERLIST(_Creature->GetGUID() ) 银行
SEND_TABARDLIST(_Creature->GetGUID() ) 不知道
SEND_AUCTIONLIST(_Creature->GetGUID() ) 拍卖行
SEND_TAXILIST(_Creature->GetGUID() ) 飞行师

SEND_SPRESURRECT() 灵魂医者复活

更多的查看Mangos_Source\src\bindings\universal\Scripts\sc_defines.h
--------------------------------------------------------------------
MANGOS(非EMU)怪物AI教程狂投
简单的怪物AI教程,都来DIY自己的怪物AI

简单的怪物AI教程,都来DIY自己的怪物AI

前置知识:C++代码作用,最少要清楚“与”,“或”,“非”之类的最基础代码。
需要工具:MANGOS代码,脚本代码,.net2003,人一个,电脑一台,可乐,薯条…………

估计大家已经打物理怪打到想呕了吧?那我们就来简单编个会发魔法的怪吧。

首先大家可以打开\ScriptDev\src\bindings\universal\Scripts\custom\AI里面可以发现有一怪物的AI,狗头人的AI,名字为sc_kobold.cpp。
然后用VC打开后,可以看到里面的代码。

QUOTE:
#include"../../sc_defines.h"\\这个是必须包含的头文件

structMANGOS_DLL_DECLKoboldAI:publicScriptedAI\\这个是声明AI
{
KoboldAI(Creature*c):ScriptedAI(c){}\\照抄,换个名字就行了,不解释。
voidAttackStart(Unit*who)\\获得攻击目标
{
if(m_creature->getVictim()==NULL)\\还是照抄

{
DoCast(who,3110);//Fireboltcastingonattacker(3110-IDofSpell)这里是使用魔法,ID为3110
if(who->GetTypeId()==TYPEID_PLAYER)\\是说明ID是不是攻击玩家
{
debug_log("Koboldiscastingspellonplayer%s",((Player*)who)->GetName());
}
else
{
debug_log("Koboldiscastingspelloncreature");
}
DoStartAttack(who);\\运行上面的脚本攻击

}
}
}:

CreatureAI*GetAI_Kobold(Creature*_Creature)\\不解释,反正照抄改名
{
returnnewKoboldAI(_Creature);
}

voidAddSC_kobold()\\不解释,反正照抄改名

{
Script*newscript;
newscript=newScript;
newscript->Name="kobold";
newscript->GetAI=GetAI_Kobold;
m_scripts[nrscripts++]=newscript;
}

那需要让怪攻击玩家的话就可以在if(who->GetTypeId()==TYPEID_PLAYER)后面做文章,只要判断出是玩家就进行他下面的攻击,例如:

QUOTE:
if(who->GetTypeId()==TYPEID_PLAYER)\\是说明ID是不是攻击玩家
{
DoCast(who,3110);\\这样就可以判断出是玩家是使出火球攻击
}
else
{
DoGoHome();\\不是的话让怪跑回自己的出生点
}
当然,让怪连续放魔法不是好事,那就获取怪物的血和魔量,利用这个简单实现一下放魔法的规则。

QUOTE:
if(who->GetTypeId()==TYPEID_PLAYER)\\判断出攻击的是玩家
{uint32cHealth=m_creature->GetHealth();\\获取怪物当前血量
uint32cMaxHealth=m_creature->GetMaxHealth();\\获取怪物最大血量
uint32cPower=m_creature->GetPower(POWER_MANA);\\获取怪物当前魔法量
uint32cMaxPower=m_creature->GetMaxPower(POWER_MANA);\\获取怪物最大魔法量

if((cPower)>(cMaxPower*0.8))\\看明白吗?如果怪现在的魔法量大于其最大魔法量乘0.8,也就是大于80%的话,就执行下面的脚本,下面的是什么?自己看

{
DoCast(who,3110);\\使出火球攻击
}
else\\如果不是,对上面的如果判断出不符,攻击的也不是玩家,那就不放出来。执行下面的脚本。
{
DoGoHome();\\怪跑回自己的出生点
}

}

当然,也可以结合来判断,例如怪的HP到总数80%同时魔法量大于总数80%。

QUOTE:
if((cHealth<(cMaxHealth*0.8))&&(cPower>(cMaxPower*0.8)))\\怪当前HP少于总HP的80%和魔法量大于总数80%

if((cHealth<(cMaxHealth*0.5))&&(cHealth>(cMaxHealth*0.3)))\\怪当前HP少于50%但大于30%,也就是怪的HP在50%到30%这段期间

写一个完整的吧,不再翻译了,看完上面的还要翻译那我觉得我真是很失败了。

QUOTE:
#include"../../sc_defines.h"

structMANGOS_DLL_DECLdragonmmAI:publicScriptedAI
{
dragonmmAI(Creature*c):ScriptedAI(c){}

voidAttackStart(Unit*who)
{
if(m_creature->getVictim()==NULL)

{
DoCast(who,3110);
if(who->GetTypeId()==TYPEID_PLAYER)
{
uint32cHealth=m_creature->GetHealth();
uint32cMaxHealth=m_creature->GetMaxHealth();
uint32cPower=m_creature->GetPower(POWER_MANA);
uint32cMaxPower=m_creature->GetMaxPower(POWER_MANA);

if((cHealth<(cMaxHealth*0.99))&&(cHealth>(cMaxHealth*0.65)))
{

if((cMaxPower)<(cMaxPower*0.8))
{
m_creature->Say("Dark!",LANG_UNIVERSAL);
DoCast(who,26029);

}

else
{
DoGoHome();
}

DoStartAttack(who);

}
}
}
}
};

CreatureAI*GetAI_dragonmm(Creature*_Creature)
{
returnnewdragonmmAI(_Creature);
}

voidAddSC_dragonmm()

{
Script*newscript;
newscript=newScript;
newscript->Name="dragonmm";
newscript->GetAI=GetAI_dragonmm;
m_scripts[nrscripts++]=newscript;
}
知道如何写了吧?好,那就打开.net2003,然后打开mangos的解决方案,当然,要集成了脚本代码。然后在右边点进script项目的scripts里面的ai,点ai文件夹按鼠标右键,然后添加-添加新项-放好位置改好名,模板那边点c++文件(*.cpp)。然后就开始加你的代码吧。
写好AI后,还要在script\ScriptMgr.cpp添加你的AI脚本名,否则就无法加载。

找到

QUOTE:
//CreatureAI
externvoidAddSC_kobold();

在下面新增以下代码

QUOTE:
externvoidAddSC_dragonmm();

再往下找到

QUOTE:
//CreatureAI
AddSC_kobold();

在下面新增以下代码

QUOTE:
AddSC_dragonmm();

当然,脚本名本来可变,随便你改,只要对号就行了。

好了,然后就是编译,只要语法没错基本就没问题了。吃吃薯条喝喝可乐,编译好后放回MANGOS。然后嘛,去MYSQL打开mangos数据库,进入creature_template里面,找到要加脚本的怪,然后在它的最后一行加上你的脚本名称,OK了,进游戏试试吧。

现在用脚本让怪放法术有两大问题,一是怪物放的魔法方向不对,第二就是一些人用了没事的技能,怪用了会当。不过小小DIY满足一下自己的欲望没坏。
作业:编写出一个以上的会释放法术的怪,要求怪在HP为100%-80%,80%-60%,60%-20%,分别能放出不同的魔法,在自身魔法值少于50%时就不再施放。

下课!
------------------------------------------------------------------------------

抱歉!评论已关闭.