📄 effectgunshotguidanceaim.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : EffectGunShotGuidanceAim.cpp// Written by : bezz//////////////////////////////////////////////////////////////////////////////#include "EffectGunShotGuidanceAim.h"#include "Slayer.h"#include "Vampire.h"#include "Monster.h"#include "GamePlayer.h"#include "PCFinder.h"#include "ZoneUtil.h"#include "ZoneInfoManager.h"#include "SkillInfo.h"#include "SkillUtil.h"#include "HitRoll.h"#include "Gpackets/GCRemoveEffect.h"#include "Gpackets/GCAddEffectToTile.h"#include "Gpackets/GCSkillToObjectOK2.h"#include "Gpackets/GCSkillToObjectOK4.h"#include "Gpackets/GCStatusCurrentHP.h"int GSGDamageModify[5][5] ={ { 50, 50, 50, 50, 50 }, { 50, 75, 75, 75, 50 }, { 50, 75, 100, 75, 50 }, { 50, 75, 75, 75, 50 }, { 50, 50, 50, 50, 50 }};////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////EffectGunShotGuidanceAim::EffectGunShotGuidanceAim(Creature* pCreature, Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) throw(Error){ __BEGIN_TRY setTarget(pCreature); m_pZone = pZone; m_X = x; m_Y = y; __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectGunShotGuidanceAim::affect(Creature* pCreature) throw(Error){ __BEGIN_TRY __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) throw(Error){ __BEGIN_TRY Assert(pCastCreature != NULL); // 捞棋飘 敲饭弊啊 绝促搁 磷菌促芭唱 窍绰 巩力肺 transport 窍瘤 臼摆促绰吧 狼固茄促. if ( !pCastCreature->isFlag( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM ) ) return; Player* pPlayer = pCastCreature->getPlayer(); Assert( pPlayer != NULL ); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert( pGamePlayer != NULL ); if ( !pCastCreature->isSlayer() ) return; Slayer* pSlayer = dynamic_cast<Slayer*>(pCastCreature); Assert( pSlayer != NULL ); SkillSlot* pSkillSlot = pSlayer->hasSkill( SKILL_GUN_SHOT_GUIDANCE ); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo( SKILL_GUN_SHOT_GUIDANCE ); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); // Effect甫 绝局绊 舅赴促. pCastCreature->removeFlag( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM ); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID( pCastCreature->getObjectID() ); gcRemoveEffect.addEffectList( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM ); m_pZone->broadcastPacket( pCastCreature->getX(), pCastCreature->getY(), &gcRemoveEffect ); VSRect rect( 0, 0, m_pZone->getWidth()-1, m_pZone->getHeight()-1 ); // -1 眠啊 by sigi. 2003.1.10 bool bIncreaseExp = pSlayer->isRealWearingEx( Slayer::WEAR_RIGHTHAND ); bool bHit = false; Damage_t maxDamage=0; GCSkillToObjectOK2 gcSkillToObjectOK2; GCSkillToObjectOK4 gcSkillToObjectOK4; for ( int x=-2; x<=2; x++ ) { for ( int y=-2; y<=2; y++ ) { int X = m_X + x; int Y = m_Y + y; if ( !rect.ptInRect( X, Y ) ) continue; // 鸥老救俊 粮犁窍绰 坷宏璃飘甫 啊廉柯促. Tile& tile = m_pZone->getTile( X, Y ); const slist<Object*>& oList = tile.getObjectList(); slist<Object*>::const_iterator itr = oList.begin(); int DamageModifier = GSGDamageModify[x+2][y+2]; Damage_t Damage = getPercentValue( m_Damage, DamageModifier ); for ( ; itr != oList.end(); itr++ ) { Object* pObject = *itr; Assert( pObject != NULL ); if ( pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE ) { Creature* pCreature = dynamic_cast<Creature*>(pObject); Assert( pCreature != NULL ); // 磊脚篮 嘎瘤 臼绰促. 公利档 救 嘎绰促. 浇饭捞绢绰 嘎瘤 臼绰促. if ( pCreature == m_pTarget || pCreature->isFlag( Effect::EFFECT_CLASS_NO_DAMAGE ) || pCreature->isFlag( Effect::EFFECT_CLASS_COMA ) || pCreature->isSlayer() ) { continue; } bool bPK = verifyPK( pSlayer, pCreature ); bool bZoneLevelCheck = checkZoneLevelToHitTarget( pCreature ); bool bHitRoll = HitRoll::isSuccess( pSlayer, pCreature, SkillLevel ); if ( bPK && bZoneLevelCheck && bHitRoll ) { // 盔贰 单固瘤客 胶懦 单固瘤 焊呈胶甫 歹茄 弥辆 单固瘤甫 备茄促. bool bCriticalHit = false; Damage_t FinalDamage = 0; FinalDamage = computeDamage( pSlayer, pCreature, SkillLevel/2, bCriticalHit ); FinalDamage += Damage; if ( pCreature->isVampire() || pCreature->isOusters() ) {// Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); GCModifyInformation gcMI; ::setDamage( pCreature, FinalDamage, pCastCreature, SKILL_GUN_SHOT_GUIDANCE, &gcMI ); // ::眠啊 by Sequoia pCreature->getPlayer()->sendPacket( &gcMI ); // 嘎绰 悼累阑 焊咯霖促. gcSkillToObjectOK2.setObjectID( 1 ); // 狼固 绝促. gcSkillToObjectOK2.setSkillType( SKILL_ATTACK_MELEE ); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); } else if ( pCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pCreature); ::setDamage( pMonster, FinalDamage, pCastCreature, SKILL_GUN_SHOT_GUIDANCE ); // ::眠啊 by Sequoia pMonster->addEnemy( pCastCreature ); } gcSkillToObjectOK4.setTargetObjectID( pCreature->getObjectID() ); gcSkillToObjectOK4.setSkillType( SKILL_ATTACK_MELEE ); gcSkillToObjectOK4.setDuration( 0 ); m_pZone->broadcastPacket( X, Y, &gcSkillToObjectOK4, pCreature ); bHit = true; if ( FinalDamage > maxDamage ) maxDamage = FinalDamage; } } } } } if ( bIncreaseExp && bHit ) { GCModifyInformation gcMI; shareAttrExp( pSlayer, maxDamage, 1, 8, 1, gcMI ); increaseDomainExp( pSlayer, DomainType, pSkillInfo->getPoint(), gcMI ); increaseSkillExp( pSlayer, DomainType, pSkillSlot, pSkillInfo, gcMI ); pSlayer->getPlayer()->sendPacket( &gcMI ); } // 器拜 捞棋飘甫 焊咯林档废 茄促. GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setObjectID( pCastCreature->getObjectID() ); gcAddEffectToTile.setEffectID( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_FIRE ); // EffectID_t俊促啊 EffectClass甫 持绢拎具 等促. 笛狼 瞒捞绰? by Sequoia gcAddEffectToTile.setXY( m_X, m_Y ); gcAddEffectToTile.setDuration( 10 ); // 喊 狼固绝促. 傲 1檬 m_pZone->broadcastPacket( m_X, m_Y, &gcAddEffectToTile ); __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void EffectGunShotGuidanceAim::unaffect() throw(Error){ __BEGIN_TRY Creature* pCreature = dynamic_cast<Creature*>(m_pTarget); // by Sequoia Assert( pCreature != NULL ); if ( m_pZone != NULL && m_pZone == pCreature->getZone() ) { unaffect(pCreature); } else { // 炼霖 档吝 磷菌芭唱 捞悼沁促绰 狼固捞骨肺 捞棋飘甫 绝局绊 宏肺靛某胶泼茄促. // Effect甫 绝局绊 舅赴促. Zone* pZone = pCreature->getZone(); Assert( pZone != NULL ); pCreature->removeFlag( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM ); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID( pCreature->getObjectID() ); gcRemoveEffect.addEffectList( Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM ); pZone->broadcastPacket( pCreature->getX(), pCreature->getY(), &gcRemoveEffect ); } __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////string EffectGunShotGuidanceAim::toString() const throw(){ __BEGIN_TRY StringStream msg; msg << "EffectGunShotGuidanceAim(" << "Zone:" << g_pZoneInfoManager->getZoneInfo( m_pZone->getZoneID() )->getFullName() << ",X:" << (int)m_X << ",Y:" << (int)m_Y << ",Damage:" << (int)m_Damage << ")"; return msg.toString(); __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -