游戏乐悠悠网游开发网

标题: 傻瓜式的无限转生 [打印本页]

作者: mythosdev    时间: 2015-9-22 09:32
标题: 傻瓜式的无限转生
本帖最后由 mythosdev 于 2015-9-22 09:36 编辑

这个转生由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;
}
}
///////////////////////////////////////////////






搜索
int        AddGPPoint( int nAddGPPoint );///在Mover.h内
这个函数
在其上 添加
//////////////////////////////////////
int        GetGPPoint();
///////////////////////////////////////







进入
WORLDSERVER  下的 FunctionsInfo.h

typedef int (WINAPI *PFAddGPPoint)( NPCDIALOG_INFO* pInfo , int nAddGPPoint);   
其下加上
/////////////////////////////////
typedef int (WINAPI *PFGetGPPoint)( NPCDIALOG_INFO* pInfo );   
///////////////////////////////////
在struct Functions这个结构中最下面加上
///////////////////////////////////
PFGetGPPoint GetGPPoint;
///////////////////////////////////






进入  _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;
/////////////////////////////



这样就构造了一个简单的查看GP点的函数  


在进入\_Common\Mover.h文件中
搜索
void        ProcessBuff();
这个函数
在其上添加
////////////////////////
BOOL        Equip();//这个函数是用来检查是否穿的有装备的
////////////////////////
进入
_Common\MoverSkill.cpp
文件中
搜索
BOOL CMoverUseItemWarp( 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;
}
////////////////////////////////////
作者: mythosdev    时间: 2015-9-22 09:56
进入_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 );
}
}
///////////////////////////


好了,在后台程序中已经完了所需函数的创造
我们开始实现如何转生
///////////////////////////////
进入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 );
}
////////////////////////

这里就能进行转生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 );
}
}
////////////////////////

这样就实现了,当你80级了就去帕里点击仓库与其对话就OK了
当然还有一些问题.就是素质卷的问题
有二种解决方法
一、是不用
二、当然现有的资源是不能浪费的所以只能去修改素质卷的控制函数
这里只举例子


这个例子是  素质重置卷轴
搜索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
}
/////////////////////////////

我自测没bug,希望有人找出BUG来,发出来,进一步完善我的添加谢谢

作者: dianpula    时间: 2018-12-20 10:00
资源甚好,感谢楼主。。




欢迎光临 游戏乐悠悠网游开发网 (http://bbs.yxlyy.club/) Powered by Discuz! X3.2