阅读:3046回复:11
【源码编译】傻瓜式的无限转生
这个转生由GP点控制
搜索 int CMover::AddGPPoint( int nAddGPPoint )///在mover.cpp内 这个函数 在其上添加 ////////////////////////////////////////////////// int CMover::GetGPPoint() { ASSERT( m_nRemainGP >= 0 ); ///////////////////转生用此函数 if(Equip()) { RemoveDebufBuffs(TRUE); int NowGP = GetDex() + GetStr() + GetInt() + GetSta() - 60; m_nRemainGP += NowGP; return m_nRemainGP; }else { return 0; } } /////////////////////////////////////////////// |
|
100% |
沙发#
发布于:2014-03-23 08:22
搜索
int AddGPPoint( int nAddGPPoint );///在Mover.h内 这个函数 在其上 添加 ////////////////////////////////////// int GetGPPoint(); /////////////////////////////////////// |
|
板凳#
发布于:2014-03-23 08:24
进入
WORLDSERVER 下的 FunctionsInfo.h 在 typedef int (WINAPI *PFAddGPPoint)( NPCDIALOG_INFO* pInfo , int nAddGPPoint); 其下加上 ///////////////////////////////// typedef int (WINAPI *PFGetGPPoint)( NPCDIALOG_INFO* pInfo ); /////////////////////////////////// 在struct Functions这个结构中最下面加上 /////////////////////////////////// PFGetGPPoint GetGPPoint; /////////////////////////////////// |
|
地板#
发布于:2014-03-23 08:28
进入 _Common下的 ScriptLib.cpp文件中
搜索 int APIENTRY AddGPPoint( NPCDIALOG_INFO* pInfo , int nAddGPPoint ) 在其上添加 ////////////////////////// int APIENTRY GetGPPoint( NPCDIALOG_INFO* pInfo ) { CUser* pUser = prj.GetUser( pInfo->GetPcId() ); return pUser->GetGPPoint(); } ///////////////////////////// 再搜索 void InitDialogFunctions() 这个函数 在其工作区最下面添加 ////////////////////////////// g_functions.GetGPPoint = GetGPPoint; ///////////////////////////// |
|
4楼#
发布于:2014-03-23 08:30
这样就构造了一个简单的查看GP点的函数
|
|
5楼#
发布于:2014-03-23 08:37
在进入\_Common\Mover.h文件中
搜索 void ProcessBuff(); 这个函数 在其上添加 //////////////////////// BOOL Equip();//这个函数是用来检查是否穿的有装备的 //////////////////////// 进入 _Common\MoverSkill.cpp 文件中 搜索 BOOL CMover:oUseItemWarp( ItemProp* pItemProp, CItemElem* pItemElem ) 在其#ifdef __WORLDSERVER上添加 ///////////////////////////// BOOL CMover::Equip()//检查装备 { for( DWORD dwParts = 0; dwParts < MAX_HUMAN_PARTS; dwParts++ ) { CItemElem* pArmor = m_Inventory.GetEquip( dwParts ); if( pArmor ) { return FALSE; } } return TRUE; } //////////////////////////////////// |
|
6楼#
发布于:2014-03-23 08:44
进入_Common\Mover.h中
搜索 void RemoveDebufBuffs(); 在其上添加,也可以在 BOOL Equip();上添加 /////////////////////////////// void RemoveDebufBuffs(BOOL SW); /////////////////////////////// 进入_Common\moverbuff.cpp中 搜索 void CMover::RemoveDebufBuffs() 在其上添加 /////////////////////////// void CMover::RemoveDebufBuffs(BOOL SW)/////删除所有状态 { if( SW = TRUE ) { RemoveAllBuff(); }else { m_buffs.RemoveBuffs( RBF_DEBUF ); } } /////////////////////////// |
|
7楼#
发布于:2014-03-23 08:50
好了,在后台程序中已经完了所需函数的创造
我们开始实现如何转生 /////////////////////////////// 进入WORLDDIALOG\NpcScript.h中 注意中WORLDDIALOG 搜索void AddGPPoint( int nAddGPPoint ); 在其上添加 /////////////////////// int GetGPPoint(); //////////////////// 进入WORLDDIALOG\FunctionsInfo.h中 搜索typedef int (WINAPI *PFAddGPPoint)( NPCDIALOG_INFO* pInfo , int nAddGPPoint ); 在其上添加 //////////////////////////////////////// typedef int (WINAPI *PFGetGPPoint)( NPCDIALOG_INFO* pInfo ); ///////////////////////////////////////// 在struct Functions最下面添加 //////////////////////////// PFGetGPPoint GetGPPoint; //////////////////////////// 进入WORLDDIALOG\NpcScriptHelper.cpp中 搜索void CNpcScript::AddGPPoint( int nAddGPPoint ) 在其上添加 //////////////////////// int CNpcScript::GetGPPoint() { Functions* pTable = m_pInfo->GetFunctions(); return pTable->GetGPPoint( m_pInfo ); } //////////////////////// |
|
8楼#
发布于:2014-03-23 08:57
这里就能进行转生NPC的实现了,这里也可以自己设置
随便的一个NPC 比如 mafl_juria///也就是帕里的仓库 NPC 搜索void CNpcScript::mafl_juria_5() 在其内添加 ///////////////////////// if( GetPlayerLvl() == 80 && GetGPPoint() != 0) { int GP = GetGPPoint(); int i = 1000; i = i-GP; if( GetGPPoint()<=1000 ) { if(GetGPPoint()>=900) { AddGPPoint(i); }else { (int)GP = GP-300;//316为零点 多了为负 少了为正 每次增加定义的(n-316)*2 AddGPPoint(GP); SetLevel(1); } }else { AddKey( 10 ); } } //////////////////////// |
|
9楼#
发布于:2014-03-23 09:03
这样就实现了,当你80级了就去帕里点击仓库与其对话就OK了
当然还有一些问题.就是素质卷的问题 有二种解决方法 一、是不用 二、当然现有的资源是不能浪费的所以只能去修改素质卷的控制函数 这里只举例子 |
|
10楼#
发布于:2014-03-23 09:10
这个例子是 素质重置卷轴
搜索void CMover::ReState() 覆盖 ///////////////////////////// void CMover::ReState() { #ifdef __WORLDSERVER int GP = GetGPPoint(); m_nStr = m_nSta = m_nDex = m_nInt = 15; m_nRemainGP = 0; int nLevelFor = m_nLevel; if( m_nLevel < m_nDeathLevel ) nLevelFor = m_nDeathLevel; #if __VER >= 10 // __LEGEND // 9瞒 傈铰矫胶袍 Neuz, World, Trans for( int i = 1 ; i < nLevelFor ; i++ ) { m_nRemainGP += prj.m_aExpCharacter[ i + 1 ].dwLPPoint; if( ( IsMaster() || IsHero() ) && i > 59 ) m_nRemainGP++; if( IsHero() && i == MAX_LEVEL) m_nRemainGP+=12; } #else //__LEGEND // 9瞒 傈铰矫胶袍 Neuz, World, Trans for( int i = 1 ; i < nLevelFor ; i++ ) m_nRemainGP += prj.m_aExpCharacter[ i + 1 ].dwLPPoint; #endif //__LEGEND // 9瞒 傈铰矫胶袍 Neuz, World, Trans if( m_nRemainGP < GP ) { m_nRemainGP = GP; } SetHitPoint( GetMaxHitPoint() ); SetManaPoint( GetMaxManaPoint() ); SetFatiguePoint( GetMaxFatiguePoint() ); ((CUser*)this)->AddSetState( m_nStr, m_nSta, m_nDex, m_nInt, m_nRemainGP ); // ((CUser*)this)->AddSetState( m_nStr, m_nSta, m_nDex, m_nInt, m_nRemainGP ); #if __VER >= 13 // __HONORABLE_TITLE // 崔牢 ((CUser*)this)->CheckHonorStat(); ((CUser*)this)->AddHonorListAck(); g_UserMng.AddHonorTitleChange( this, m_nHonor); #endif // __HONORABLE_TITLE // 崔牢 #endif // __WORLDSERVER } ///////////////////////////// |
|
11楼#
发布于:2014-03-23 09:12
我自测没bug,希望有人找出BUG来,发出来,进一步完善我的添加谢谢
|
|