cgthrowbombhandler.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 379 行

CPP
379
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGThrowBombHandler.cc// Written By  : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "CGThrowBomb.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Slayer.h"	#include "ZoneUtil.h"	#include "SkillUtil.h"	#include "ItemUtil.h"	#include <list>	#include "item/Bomb.h"	#include "skill/Sniping.h"	#include "Gpackets/GCThrowBombOK1.h"	#include "Gpackets/GCThrowBombOK2.h"	#include "Gpackets/GCThrowBombOK3.h"	#include "Gpackets/GCSkillFailed1.h"	#include "Gpackets/GCSkillFailed2.h"	#include "Gpackets/GCStatusCurrentHP.h"#endif	// __GAME_SERVER__#ifdef __GAME_SERVER__// 鸥涝// 规氢// 付胶农int BombMask[5][9][9] ={	// 0锅 鸥涝 气藕	{		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }	},	// 1锅 鸥涝 气藕	{		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }	},	// 2锅 鸥涝 气藕	{		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 100, 0, 0, 0, 0 },		{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }	},	// 3锅 鸥涝 气藕	{		{ 0, 50, 0, 0, 100, 0, 0, 50, 0 },		{ 50, 0, 0, 0, 100, 0, 0, 0, 50 },		{ 0, 0, 0, 50, 100, 50, 0, 0, 0 },		{ 0, 0, 50, 0, 100, 0, 50, 0, 0 },		{ 0, 50, 0, 0, 100, 0, 0, 50, 0 },		{ 50, 0, 0, 0, 100, 0, 0, 0, 50 },		{ 0, 0, 0, 50, 100, 50, 0, 0, 0 },		{ 0, 0, 50, 0, 100, 0, 50, 0, 0 },		{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }	},	// 4锅 鸥涝 气藕	{		{ 0, 50, 0, 50, 100, 50, 0, 50, 0 },		{ 50, 0, 50, 0, 100, 0, 50, 0, 50 },		{ 0, 50, 0, 50, 100, 50, 0, 50, 0 },		{ 50, 0, 50, 0, 100, 0, 50, 0, 50 },		{ 0, 50, 0, 50, 100, 50, 0, 50, 0 },		{ 50, 0, 50, 0, 100, 0, 50, 0, 50 },		{ 0, 50, 0, 50, 100, 50, 0, 50, 0 },		{ 50, 0, 50, 0, 100, 0, 50, 0, 50 },		{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }	}};#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGThrowBombHandler::execute(CGThrowBomb* pPacket , Player* pPlayer)	 throw (Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	// 霸烙 敲饭捞绢狼 惑怕啊 沥惑捞 酒聪扼搁 傲 府畔茄促.	GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);	if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return;	Creature* pCreature = pGamePlayer->getCreature();	Assert(pCreature != NULL);	// 敲饭捞绢啊 浇饭捞绢啊 酒聪扼搁 傲 府畔茄促.	if (!pCreature->isSlayer()) return;	Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);	Zone* pZone = pCreature->getZone();	Assert(pZone != NULL);	int ZoneX = pPacket->getZoneX();	int ZoneY = pPacket->getZoneY();	int BombX = pPacket->getBombX();	int BombY = pPacket->getBombY();	Inventory* pInventory = pSlayer->getInventory();	Assert(pInventory != NULL);	// 肯傈 救傈瘤措扼搁 扁贱 荤侩 阂啊. by sigi. 2002.11.14	ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pSlayer->getX(), pSlayer->getY());	if ((ZoneLevel & COMPLETE_SAFE_ZONE)		|| (BombX >= pInventory->getWidth() || BombY >= pInventory->getHeight()))	{		GCSkillFailed1 _GCSkillFailed1;		_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB);		pPlayer->sendPacket(&_GCSkillFailed1);		return;	}	ObjectID_t slayerObjectID = pCreature->getObjectID();	bool bAttackSlayer = (pPacket->getAttackSlayerFlag() != 0) ? true : false;	try	{		if (pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) 		{			g_Sniping.checkRevealRatio(pCreature, 20, 10);		}		Item* pItem = pInventory->getItem(BombX, BombY);				// 酒捞袍捞 澄捞芭唱 气藕捞 酒聪扼搁...		if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BOMB)		{			GCSkillFailed1 _GCSkillFailed1;			//_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB);			pPlayer->sendPacket(&_GCSkillFailed1);			return;		}		/*		// 6篮 烙狼狼 荤沥 芭府促...		// 荤沥 芭府焊促 钢府 带瘤妨绊 窍搁, 绢痘霸 窍绰 巴捞 亮阑鳖?		if (!verifyDistance(pSlayer, ZoneX, ZoneY, 6))		{			GCSkillFailed1 _GCSkillFailed1;			//_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB);			pPlayer->sendPacket(&_GCSkillFailed1);			return;		}		*/		// 气藕狼 阿辆 沥焊甫 掘绢柯促.		Bomb* pBomb = dynamic_cast<Bomb*>(pItem);		ItemType_t BombType = pBomb->getItemType();		Damage_t MinDamage = pBomb->getMinDamage();		Damage_t MaxDamage = pBomb->getMaxDamage();		SkillSlot * pSkillSlot = pSlayer->hasSkill(SKILL_THROW_BOMB);		SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_THROW_BOMB);		Level_t SkillLevel = pSkillSlot->getExpLevel();		Damage_t RealDamage = MinDamage + ( max ( 0, ( (int)MaxDamage * (int)SkillLevel / 100 ) - MinDamage ) );		// 荤侩磊狼 困摹客 带龙 镑狼 困摹肺 规氢阑 拌魂茄促.		ZoneCoord_t myX = pSlayer->getX();		ZoneCoord_t myY = pSlayer->getY();		Dir_t dir = calcDirection(myX, myY, ZoneX, ZoneY);		int count = 0;		bool bHit = false;		bool bRaceCheck = true;;		list<Creature*> cList;		GCThrowBombOK1 _GCThrowBombOK1;		GCThrowBombOK2 _GCThrowBombOK2;		GCThrowBombOK3 _GCThrowBombOK3;		int  RequiredMP  = (int)pSkillInfo->getConsumeMP();		bool bManaCheck  = hasEnoughMana(pSlayer, RequiredMP);		bool bTimeCheck  = verifyRunTime(pSkillSlot);		bool bRangeCheck = verifyDistance(pSlayer, ZoneX, ZoneY, 6);		// 嘎电 嘎瘤 臼疽电 气藕狼 箭磊绰 临咯林绢具 茄促.		decreaseItemNum(pBomb, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, BombX, BombY);		if( bManaCheck && bTimeCheck && bRangeCheck ) {		} else {			GCSkillFailed1 _GCSkillFailed1;			//_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB);			pPlayer->sendPacket(&_GCSkillFailed1);			return;		}		decreaseMana(pSlayer, RequiredMP, _GCThrowBombOK1);		// 阿阿狼 鸥老阑 倒搁辑 洒飘 眉农甫 茄促.		for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++)		{			for (int tileX = ZoneX-1; tileX <= ZoneX+1; tileX++, count++)			{				// 棵官弗 粮 谅钎啊 酒聪扼搁, continue				if (!isValidZoneCoord(pZone, tileX, tileY)) continue;				// mask啊 0捞扼搁, 溜 洒飘费阑 且 鞘夸啊 绝促搁 continue				int Mask = BombMask[BombType][dir][count];				if (Mask == 0) continue;				Tile& tile = pZone->getTile(tileX, tileY);				checkMine( pZone, tileX, tileY );								list<Creature*> targetList;				if (tile.hasCreature(Creature::MOVE_MODE_WALKING))				{					Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);					// NoSuch力芭. by sigi. 2002.5.2					if (pCreature!=NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA))						targetList.push_back(pCreature);				}				if (tile.hasCreature(Creature::MOVE_MODE_BURROWING))				{					Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING);					// NoSuch力芭. by sigi. 2002.5.2					if (pCreature!=NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA))						targetList.push_back(pCreature);				}				list<Creature*>::iterator itr = targetList.begin();				for(; itr != targetList.end(); itr++)				{					Creature* pTargetCreature = (*itr);					Assert(pTargetCreature != NULL);					bool bHitRoll = true;					if (pTargetCreature->isSlayer() && !bAttackSlayer) bHitRoll = false;					else if (pTargetCreature->isNPC()) bHitRoll = false;					if (!bHitRoll) continue;					bool bPK         = verifyPK(pSlayer, pTargetCreature);					bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature);					// 荤侩磊啊 鸥百捞扼搁 版氰摹甫 救棵副妨备 畴仿 茄促.					// 个户捞 积败朝 荐 乐扁 锭巩捞促.					if( tileX == ZoneX && tileY == ZoneY ) {						if( pTargetCreature->isSlayer() ) {							bRaceCheck      = false;						}					}					if (HitRoll::isSuccess(pSlayer, pTargetCreature, 50) && bPK && bZoneLevelCheck )					{						Damage_t Damage = getPercentValue(RealDamage, Mask);						setDamage(pTargetCreature, Damage, pSlayer, 0, NULL, &_GCThrowBombOK1);						computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCThrowBombOK1);						increaseAlignment(pSlayer, pTargetCreature, _GCThrowBombOK1);						bHit = true;						cList.push_back(pTargetCreature);						ObjectID_t targetObjectID = pTargetCreature->getObjectID();						_GCThrowBombOK1.addCListElement(targetObjectID);						_GCThrowBombOK2.addCListElement(targetObjectID);						_GCThrowBombOK3.addCListElement(targetObjectID);									}				}			}		} // for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++)		// 葛电 鸥老 眉农啊 场车栏聪, 版氰摹甫 距埃 棵府绊, 酒捞袍 箭磊甫 临咯霖促.		if (bHit && bRaceCheck )		{			shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCThrowBombOK1);			increaseDomainExp(pSlayer, SKILL_DOMAIN_GUN, pSkillInfo->getPoint(), _GCThrowBombOK1);						// 胶懦阑 荤侩且 荐 乐阑 锭父 胶懦 版氰摹甫 棵妨霖促.			// 2003. 1. 12 by bezz			if ( pSkillSlot->canUse() )				increaseSkillExp(pSlayer, SKILL_DOMAIN_GUN, pSkillSlot, pSkillInfo, _GCThrowBombOK1);//			increaseAlignment(pSlayer, SKILL_DOMAIN_GUN, _GCThrowBombOK1);			//shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCSkillToTileOK1);			// 捞 何盒俊辑 菩哦阑 焊郴拎具 窍绰单..		}		_GCThrowBombOK1.setXYDir(ZoneX, ZoneY, dir);		_GCThrowBombOK1.setItemType(BombType);		_GCThrowBombOK2.setXYDir(ZoneX, ZoneY, dir);		_GCThrowBombOK2.setObjectID(slayerObjectID);		_GCThrowBombOK2.setItemType(BombType);		_GCThrowBombOK3.setXYDir(ZoneX, ZoneY, dir);		_GCThrowBombOK3.setObjectID(slayerObjectID);		_GCThrowBombOK3.setItemType(BombType);		for(list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++)		{			Creature* pTargetCreature = *itr;			_GCThrowBombOK2.clearList();			HP_t targetHP = 0;			if (pTargetCreature->isSlayer())			{				targetHP = (dynamic_cast<Slayer*>(pTargetCreature))->getHP();			}			else if (pTargetCreature->isVampire())			{				targetHP = (dynamic_cast<Vampire*>(pTargetCreature))->getHP();			}			else if (pTargetCreature->isOusters())			{				targetHP = (dynamic_cast<Ousters*>(pTargetCreature))->getHP();			}			_GCThrowBombOK2.addShortData(MODIFY_CURRENT_HP, targetHP);			// 酒捞袍狼 郴备仿阑 冻绢哆赴促.			decreaseDurability(NULL, pTargetCreature, 10, NULL, &_GCThrowBombOK2);			if (pTargetCreature->isPC())			{				pTargetCreature->getPlayer()->sendPacket(&_GCThrowBombOK2);			}		}		pPlayer->sendPacket(&_GCThrowBombOK1);		cList.push_back(pSlayer);		pZone->broadcastPacket(ZoneX, ZoneY, &_GCThrowBombOK3, cList);	}	catch (Throwable& t)	{		GCSkillFailed1 _GCSkillFailed1;		GCSkillFailed2 failpkt2;		failpkt2.setObjectID(slayerObjectID);		failpkt2.setSkillType(SKILL_THROW_BOMB); 		pZone->broadcastPacket(ZoneX, ZoneY, &failpkt2, pSlayer);		pPlayer->sendPacket(&_GCSkillFailed1);	}#endif	// __GAME_SERVER__			__END_DEBUG_EX __END_CATCH}

⌨️ 快捷键说明

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