📄 effecthprecovery.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 + -