_cgthrowbombhandler.cpp

来自「dk1游戏的原代码文件,完整.编译系统redhat7.3,mysql 3.23 」· C++ 代码 · 共 386 行

CPP
386
字号
//////////////////////////////////////////////////////////////////////////////// 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;	Zone* pZone = pCreature->getZone();	Assert(pZone != NULL);	int ZoneX = pPacket->getZoneX();	int ZoneY = pPacket->getZoneY();	int BombX = pPacket->getBombX();	int BombY = pPacket->getBombY();	bool bAttackSlayer = (pPacket->getAttackSlayerFlag() != 0) ? true : false;	try	{		if (pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) 		{			g_Sniping.checkRevealRatio(pCreature, 20, 10);		}		Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);		Inventory* pInventory = pSlayer->getInventory();		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();		Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)) + pSlayer->getDEX(ATTR_CURRENT)/10;		// 荤侩磊狼 困摹客 带龙 镑狼 困摹肺 规氢阑 拌魂茄促.		ZoneCoord_t myX = pSlayer->getX();		ZoneCoord_t myY = pSlayer->getY();		Dir_t dir = calcDirection(myX, myY, ZoneX, ZoneY);		int count = 0;		bool bHit = false;		list<Creature*> cList;		GCThrowBombOK1 _GCThrowBombOK1;		GCThrowBombOK2 _GCThrowBombOK2;		GCThrowBombOK3 _GCThrowBombOK3;		// 嘎电 嘎瘤 臼疽电 气藕狼 箭磊绰 临咯林绢具 茄促.		decreaseItemNum(pBomb, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, BombX, BombY);		// 阿阿狼 鸥老阑 倒搁辑 洒飘 眉农甫 茄促.		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);								list<Creature*> targetList;				if (tile.hasCreature(Creature::MOVE_MODE_WALKING))				{					Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);					targetList.push_back(pCreature);				}				if (tile.hasCreature(Creature::MOVE_MODE_BURROWING))				{					Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING);					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;					if (HitRoll::isSuccess(pSlayer, pTargetCreature, 0))					{						Damage_t Damage = getPercentValue(RealDamage, Mask);						//setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1);						//setDamage(pTargetCreature, Damage, pSlayer, 0, NULL, &_GCSkillToTileOK1);						//computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1);						//increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1);						bHit = true;						cList.push_back(pTargetCreature);					}				}			}		} // for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++)		// 葛电 鸥老 眉农啊 场车栏聪, 版氰摹甫 距埃 棵府绊, 酒捞袍 箭磊甫 临咯霖促.		if (bHit)		{			//shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCSkillToTileOK1);		}		// 捞 何盒俊辑 菩哦阑 焊郴拎具 窍绰单..	}	catch (Throwable& t)	{	}	/*	try 	{		ObjectID_t slayerObjectID = pSlayer->getObjectID();		ZoneCoord_t slayerX = pSlayer->getX(), slayerY = pSlayer->getY();		// 疙吝 登菌促搁, 单固瘤甫 霖促..		if (ToHit > Random(0, 100))		{			int explosionType = 0;			switch(itemType)			{				case 0://ACER					explosionType = 0;					break;				case 1://Bulls					explosionType = 0;					break;				case 2://Cyclone					explosionType = 1;					break;				case 3://Pylone					explosionType = 2;					break;				case 4://Crossbow					explosionType = 1;					break;				case 5://Twister					explosionType = 3;					break;			}			Dir_t Dir = calcDirection(slayerX, slayerY, X, Y);			int tileX, tileY;			const int* xOffsetEType = NULL, *yOffsetEType = NULL;			int tiles = 0;			getExplosionTypeXYOffset(explosionType, Dir, xOffsetEType, yOffsetEType, tiles);						for(int tileI = 0; tileI < tiles; tileI++)			{				tileX = X + xOffsetEType[ tileI];				tileY = Y + yOffsetEType[ tileI];								if (isValidZoneCoord(pZone, tileX, tileY) && pZone->getZoneLevel(tileX, tileY)) 				{					Tile& tile = pZone->getTile(tileX, tileY);					const slist<Object*>& oList = tile.getObjectList();					// tile困狼 葛电 坷宏璃飘俊 措秦辑 炼荤甫 茄促.					for(slist<Object*>::const_iterator itr = oList.begin(); itr != oList.end(); itr++)					{						// 炼扒阑 犬牢						Object* pObject = *itr;						if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) 						{							// Damage甫 涝绰 巴甸父 cList俊 眠啊矫挪促.							Creature* pTargetCreature = dynamic_cast<Creature*>(pObject);							if (pTargetCreature->isSlayer()) 							{								//Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature);							}								else if (pTargetCreature->isVampire()) 							{								//Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature);								cList.push_back(pTargetCreature);							} 							else if (pTargetCreature->isMonster()) 							{								//Monster* pTargetMonster = dynamic_cast<Monster*>(pTargetCreature);								cList.push_back(pTargetCreature);							}							else								continue;							ObjectID_t targetObjectID = pTargetCreature->getObjectID();							_GCThrowBombOK1.addCListElement(targetObjectID);							_GCThrowBombOK2.addCListElement(targetObjectID);							_GCThrowBombOK3.addCListElement(targetObjectID);						}					}				}			}			_GCThrowBombOK1.setXYDir(X, Y, Dir);			_GCThrowBombOK1.setItemType(itemType);			_GCThrowBombOK2.setXYDir(X, Y, Dir);			_GCThrowBombOK2.setObjectID(slayerObjectID);			_GCThrowBombOK2.setItemType(itemType);			_GCThrowBombOK3.setXYDir(X, Y, Dir);			_GCThrowBombOK3.setObjectID(slayerObjectID);			_GCThrowBombOK3.setItemType(itemType);			for(list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++)			{				Creature* pTargetCreature = *itr;				_GCThrowBombOK2.clearList();				setDamage(pTargetCreature, Damage, NULL, 0, &_GCThrowBombOK2);				if (pTargetCreature->isPC())				{					pTargetCreature->getPlayer()->sendPacket(&_GCThrowBombOK2);				}			}			pPlayer->sendPacket(&_GCThrowBombOK1);			cList.push_back(pSlayer);			pZone->broadcastPacket(slayerX, slayerY, &_GCThrowBombOK3, cList);		}		else // 带瘤扁俊 角菩沁阑 版快...		{			GCSkillFailed1 _GCSkillFailed1;			GCSkillFailed2 failpkt2;			failpkt2.setObjectID(slayerObjectID);			failpkt2.setSkillType(SKILL_INVISIBILITY+19); 			pZone->broadcastPacket(slayerX, slayerY, &failpkt2, pSlayer);			pPlayer->sendPacket(&_GCSkillFailed1);		}		pInventory->deleteItem(bombObjectID);		pBomb->destroy();		SAFE_DELETE(pBomb);	} 	catch (Throwable & t) 	{ 		//cout << t.toString() << endl; 	}	*/#endif	// __GAME_SERVER__			__END_DEBUG_EX __END_CATCH}

⌨️ 快捷键说明

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