⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 effecthprecovery.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Filename    : EffectHPRecovery.cpp// Written by  : elca// Description : //////////////////////////////////////////////////////////////////////////////#include "EffectHPRecovery.h"#include "Assert.h"#include "Zone.h"#include "DB.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "Player.h"#include "Creature.h"#include "Gpackets/GCHPRecoveryEndToSelf.h"#include "Gpackets/GCHPRecoveryEndToOthers.h"#include "Gpackets/GCModifyInformation.h"EffectHPRecovery::EffectHPRecovery () 	throw (Error){	__BEGIN_TRY	// 辑滚 傈侩 Effect捞促. by sigi. 2002.11.14	m_bBroadcastingEffect = false;	__END_CATCH}EffectHPRecovery::EffectHPRecovery (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Creature* pCreature , Turn_t delay) 	throw (Error): Effect(pZone,x,y,pCreature,delay) {	__BEGIN_TRY	Assert(getZone() != NULL);	Assert(getTarget() != NULL);	// 辑滚 傈侩 Effect捞促. by sigi. 2002.11.14	m_bBroadcastingEffect = false;	__END_CATCH}EffectHPRecovery::~EffectHPRecovery () 	throw (Error){	__BEGIN_TRY	__END_CATCH}void EffectHPRecovery::affect()	throw(Error){	__BEGIN_TRY	setNextTime(m_Delay);	Creature* pCreature = dynamic_cast<Creature*>(m_pTarget);	affect(pCreature);	__END_CATCH}void EffectHPRecovery::affect(Creature* pCreature)	throw(Error){	__BEGIN_TRY	Timeval CurrentTime;	getCurrentTime(CurrentTime);	if (pCreature->isSlayer())	{		Turn_t timegapSec =  m_Deadline.tv_sec - CurrentTime.tv_sec;		Turn_t timegapUSec = m_Deadline.tv_usec - CurrentTime.tv_usec;		Turn_t timegap = timegapSec* 1000000 + timegapUSec;		int RecoveryPeriod = (timegap / (m_Delay* 100000));		Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);		bool bHPCheck     = pSlayer->getHP(ATTR_CURRENT) < pSlayer->getHP(ATTR_MAX);		bool bPeriodCheck = m_Period != 0;		bool bAliveCheck  = pSlayer->isAlive();		bool bComaCheck   = pSlayer->isFlag(Effect::EFFECT_CLASS_COMA);		if (bHPCheck && bPeriodCheck && bAliveCheck && !bComaCheck) 		{			// 敲饭弊 吧蓖			pSlayer->setFlag(Effect::EFFECT_CLASS_HP_RECOVERY);			// 茄 畔俊 倔付唱 雀汗 矫懦 巴牢啊.			HP_t CurrentHP = pSlayer->getHP(ATTR_CURRENT);			HP_t NewHP     = min((int)(pSlayer->getHP(ATTR_MAX)), (int)(CurrentHP + m_HPQuantity * (m_Period - RecoveryPeriod)));			pSlayer->setHP(NewHP, ATTR_CURRENT);		}		else 		{			// unaffect窍搁辑 菩哦捞 朝酒哎 抛聪鳖....			setDeadline(0);		}		m_Period = RecoveryPeriod;	}	else if (pCreature->isVampire())	{		Turn_t timegapSec =  m_Deadline.tv_sec - CurrentTime.tv_sec;		Turn_t timegapUSec = m_Deadline.tv_usec - CurrentTime.tv_usec;		Turn_t timegap = timegapSec* 1000000 + timegapUSec;		int RecoveryPeriod = (timegap / (m_Delay* 100000));		Vampire* pVampire = dynamic_cast<Vampire*>(pCreature);		bool bHPCheck     = pVampire->getHP(ATTR_CURRENT) < pVampire->getHP(ATTR_MAX);		bool bPeriodCheck = m_Period != 0;		bool bAliveCheck  = pVampire->isAlive();		bool bComaCheck   = pVampire->isFlag(Effect::EFFECT_CLASS_COMA);		if (bHPCheck && bPeriodCheck && bAliveCheck && !bComaCheck) 		{			// 敲饭弊 吧蓖			pVampire->setFlag(Effect::EFFECT_CLASS_HP_RECOVERY);			// 茄 畔俊 倔付唱 雀汗 矫懦 巴牢啊.			HP_t CurrentHP = pVampire->getHP(ATTR_CURRENT);			HP_t NewHP     = min((int)(pVampire->getHP(ATTR_MAX)), CurrentHP + m_HPQuantity);			pVampire->setHP(NewHP, ATTR_CURRENT);			// 趋没狼 版快俊绰 篮 单固瘤甫 摹丰茄促.			if (pVampire->getSilverDamage() > 0)			{				Silver_t silverRecovery  = max(1, m_HPQuantity / 2);				Silver_t newSilverDamage = max(0, (int)(pVampire->getSilverDamage() - silverRecovery));				//printf("泅犁篮单固瘤:%d\n", pVampire->getSilverDamage());				//printf("篮单固瘤雀汗樊:%d\n", (int)(m_HPQuantity/2));				//printf("货肺款角滚单固瘤:%d\n", newSilverDamage);				pVampire->saveSilverDamage(newSilverDamage);				GCModifyInformation GCMI;				GCMI.addShortData(MODIFY_SILVER_DAMAGE, newSilverDamage);								pVampire->getPlayer()->sendPacket(&GCMI);			}		} 		else		{			// unaffect窍搁辑 菩哦捞 朝酒哎 抛聪鳖....			setDeadline(0);		}		m_Period = RecoveryPeriod;	}	else if (pCreature->isOusters())	{		Turn_t timegapSec =  m_Deadline.tv_sec - CurrentTime.tv_sec;		Turn_t timegapUSec = m_Deadline.tv_usec - CurrentTime.tv_usec;		Turn_t timegap = timegapSec* 1000000 + timegapUSec;		int RecoveryPeriod = (timegap / (m_Delay* 100000));		Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);		bool bHPCheck     = pOusters->getHP(ATTR_CURRENT) < pOusters->getHP(ATTR_MAX);		bool bPeriodCheck = m_Period != 0;		bool bAliveCheck  = pOusters->isAlive();		bool bComaCheck   = pOusters->isFlag(Effect::EFFECT_CLASS_COMA);		if (bHPCheck && bPeriodCheck && bAliveCheck && !bComaCheck) 		{			// 敲饭弊 吧蓖			pOusters->setFlag(Effect::EFFECT_CLASS_HP_RECOVERY);			// 茄 畔俊 倔付唱 雀汗 矫懦 巴牢啊.			HP_t CurrentHP = pOusters->getHP(ATTR_CURRENT);			HP_t NewHP     = min( (int)(pOusters->getHP(ATTR_MAX) - pOusters->getSilverDamage()), (int)(CurrentHP + ( m_HPQuantity * (m_Period - RecoveryPeriod))));			pOusters->setHP(NewHP, ATTR_CURRENT);			// 篮 单固瘤甫 摹丰茄促./*			if ( pOusters->getSilverDamage() > 0 )			{				Silver_t silverRecovery  = max( 1, m_HPQuantity / 2 );				Silver_t newSilverDamage = max( 0, (int)(pOusters->getSilverDamage() - silverRecovery));				pOusters->saveSilverDamage(newSilverDamage);				GCModifyInformation GCMI;				GCMI.addShortData( MODIFY_SILVER_DAMAGE, newSilverDamage );				pOusters->getPlayer()->sendPacket( &GCMI );			}*/		} 		else		{			// unaffect窍搁辑 菩哦捞 朝酒哎 抛聪鳖....			setDeadline(0);		}		m_Period = RecoveryPeriod;	}	__END_CATCH}void EffectHPRecovery::affect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget)	throw (Error){	__BEGIN_TRY	throw UnsupportedError();		__END_CATCH}void EffectHPRecovery::unaffect()	throw(Error){	__BEGIN_TRY	Creature* pCreature = dynamic_cast<Creature*>(m_pTarget);	unaffect(pCreature);	__END_CATCH}void EffectHPRecovery::unaffect(Creature* pCreature)	throw(Error){	__BEGIN_TRY		if (pCreature->isSlayer())	{		Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);		Zone* pZone = pSlayer->getZone();		// 畔捞 巢酒乐绊, 混酒乐绰 版快俊父 HP甫 雀汗矫挪促.		if (m_Period != 0 && pCreature->isAlive())		{			HP_t CurrentHP = pSlayer->getHP(ATTR_CURRENT);			HP_t NewHP     = min((int)(pSlayer->getHP(ATTR_MAX)), (int)(CurrentHP + m_HPQuantity* m_Period));			pSlayer->setHP(NewHP, ATTR_CURRENT);		} 		// 泅犁 HP甫 宏肺靛某胶泼茄促.		// 捞力 雀汗捞 场车唱绰 巴阑 舅府档废 茄促.		// 磊脚俊霸 刚历		GCHPRecoveryEndToSelf gcEffectHPRecoveryEndToSelf;		gcEffectHPRecoveryEndToSelf.setCurrentHP(pSlayer->getHP(ATTR_CURRENT));		pSlayer->getPlayer()->sendPacket(&gcEffectHPRecoveryEndToSelf);		// 林函荤恩俊霸档..		GCHPRecoveryEndToOthers gcEffectHPRecoveryEndToOthers;		gcEffectHPRecoveryEndToOthers.setObjectID(pSlayer->getObjectID());		gcEffectHPRecoveryEndToOthers.setCurrentHP(pSlayer->getHP(ATTR_CURRENT));		pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcEffectHPRecoveryEndToOthers, pSlayer);		pSlayer->removeFlag(Effect::EFFECT_CLASS_HP_RECOVERY);	}	else if (pCreature->isVampire())	{		Vampire* pVampire = dynamic_cast<Vampire*>(pCreature);		Zone* pZone = pVampire->getZone();		// 畔捞 巢酒乐绊, 混酒乐绰 版快俊父 HP甫 雀汗矫挪促.		if (m_Period != 0 && pCreature->isAlive()) 		{			HP_t CurrentHP = pVampire->getHP(ATTR_CURRENT);			HP_t NewHP     = min((int)(pVampire->getHP(ATTR_MAX)), (int)(CurrentHP + m_HPQuantity* m_Period));			pVampire->setHP(NewHP, ATTR_CURRENT);		} 		// 泅犁 HP甫 宏肺靛某胶泼茄促.		// 捞力 雀汗捞 场车唱绰 巴阑 舅府档废 茄促.		// 磊脚俊霸 刚历		GCHPRecoveryEndToSelf gcEffectHPRecoveryEndToSelf;		gcEffectHPRecoveryEndToSelf.setCurrentHP(pVampire->getHP(ATTR_CURRENT));		pVampire->getPlayer()->sendPacket(&gcEffectHPRecoveryEndToSelf);		// 林函荤恩俊霸档..		GCHPRecoveryEndToOthers gcEffectHPRecoveryEndToOthers;		gcEffectHPRecoveryEndToOthers.setObjectID(pVampire->getObjectID());		gcEffectHPRecoveryEndToOthers.setCurrentHP(pVampire->getHP(ATTR_CURRENT));		pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcEffectHPRecoveryEndToOthers, pVampire);		pVampire->removeFlag(Effect::EFFECT_CLASS_HP_RECOVERY);	}	else if (pCreature->isOusters())	{		Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);		Zone* pZone = pOusters->getZone();		// 畔捞 巢酒乐绊, 混酒乐绰 版快俊父 HP甫 雀汗矫挪促.		if (m_Period != 0 && pCreature->isAlive()) 		{			HP_t CurrentHP = pOusters->getHP(ATTR_CURRENT);			HP_t NewHP     = min((int)(pOusters->getHP(ATTR_MAX)), (int)(CurrentHP + m_HPQuantity* m_Period));			pOusters->setHP(NewHP, ATTR_CURRENT);		} 		// 泅犁 HP甫 宏肺靛某胶泼茄促.		// 捞力 雀汗捞 场车唱绰 巴阑 舅府档废 茄促.		// 磊脚俊霸 刚历		GCHPRecoveryEndToSelf gcEffectHPRecoveryEndToSelf;		gcEffectHPRecoveryEndToSelf.setCurrentHP(pOusters->getHP(ATTR_CURRENT));		pOusters->getPlayer()->sendPacket(&gcEffectHPRecoveryEndToSelf);		// 林函荤恩俊霸档..		GCHPRecoveryEndToOthers gcEffectHPRecoveryEndToOthers;		gcEffectHPRecoveryEndToOthers.setObjectID(pOusters->getObjectID());		gcEffectHPRecoveryEndToOthers.setCurrentHP(pOusters->getHP(ATTR_CURRENT));		pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &gcEffectHPRecoveryEndToOthers, pOusters);		pOusters->removeFlag(Effect::EFFECT_CLASS_HP_RECOVERY);	}	__END_CATCH}void EffectHPRecovery::unaffect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget)	throw (Error){	__BEGIN_TRY	__END_CATCH}string EffectHPRecovery::toString () const 	throw (){	StringStream msg;	if (m_pZone != NULL) 	{		msg << "EffectHPRecovery("			<< "ZoneID:" << (int)m_pZone->getZoneID()			<< ",X:"     << (int)getX()			<< ",Y:"     << (int)getY();	}	if (m_pTarget != NULL)	{		msg << ",Target:" << m_pTarget->toString();	}	else	{		msg << ",Target:NULL";	}	msg << ",Deadline:" << (int)m_Deadline.tv_sec 		<< "." << (int)m_Deadline.tv_usec		<< ")";	return msg.toString();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -