cgaddzonetomousehandler.cpp

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

CPP
472
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGAddZoneToMouseHandler.cc// Written By  : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "CGAddZoneToMouse.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Zone.h"	#include "Slayer.h"	#include "Inventory.h"	#include "Item.h"	#include "ItemUtil.h"	#include "CreatureUtil.h"	#include "Timeval.h"	#include "Relic.h"	#include "RelicUtil.h"	#include "EffectManager.h"	#include "EffectPrecedence.h"	//#include "EffectCombatMessage2.h"	#include "EffectHasSlayerRelic.h"	#include "EffectHasVampireRelic.h"	#include "EffectRelicPosition.h"	#include "EffectHasSweeper.h"	#include "ZoneUtil.h"	#include "CombatInfoManager.h"	#include "ZoneGroupManager.h"	#include "BloodBible.h"	#include "StringPool.h"	#include "ShrineInfoManager.h"	#include "Belt.h"	#include "Sweeper.h"	#include "OustersArmsband.h"	#include "Gpackets/GCDeleteandPickUpOK.h"	#include "Gpackets/GCDeleteObject.h"	#include "Gpackets/GCCannotAdd.h"	#include "Gpackets/GCSystemMessage.h"	#include "Gpackets/GCAddEffect.h"	#include <stdio.h>#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	bool        Success     = false;	try 	{		GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);		Creature*   pCreature   = pGamePlayer->getCreature();		if (pCreature == NULL) return;		PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature);		Zone*       pZone   = pPC->getZone();		ZoneCoord_t ZoneX   = pPacket->getZoneX();		ZoneCoord_t ZoneY   = pPacket->getZoneY();		// 官款靛甫 逞绢啊瘤绰 臼绰瘤 眉农茄促.		if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) goto ERROR;		Tile& _Tile = pZone->getTile(ZoneX, ZoneY);		// 鸥老俊 酒捞袍捞 绝促搁 寸楷洒 歹且 荐 绝促.		if (!_Tile.hasItem()) goto ERROR;		// 酒捞袍 器牢磐啊 澄捞芭唱, 林阑 荐 绝绰 酒捞袍捞扼搁 林阑 荐 绝促.		Item* pItem = _Tile.getItem();		if (pItem == NULL || !isPortableItem(pItem)) goto ERROR;		if (!isAbleToPickupItem(pPC, pItem)) goto ERROR;		// 乔狼 己辑老 版快 林匡 荐 乐绰瘤 犬牢茄促. --> isAbleToPickupItem 郴何俊 持菌促.		ObjectID_t ItemObjectID = pItem->getObjectID();		// 酒捞袍狼 ObjectID啊 老摹窍绰瘤 眉农茄促.		if (ItemObjectID == pPacket->getObjectID()) 		{			Item* pExtraItem = pPC->getExtraInventorySlotItem();			// 捞固 公攫啊甫 甸绊 乐促搁, 酒捞袍阑 歹且 荐 绝促.			if (pExtraItem != NULL) goto ERROR;			// 快急鼻捞 嘿绢乐绰 酒捞袍老 版快俊绰 林牢 肚绰 林牢颇萍啊 酒聪扼搁 林阑 荐 绝促.			if (pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE))			{				Timeval currentTime;				getCurrentTime(currentTime);				EffectManager& rEffectManager = pItem->getEffectManager();				EffectPrecedence* pEffectPrecedence = dynamic_cast<EffectPrecedence*>(rEffectManager.findEffect(Effect::EFFECT_CLASS_PRECEDENCE));				Assert(pEffectPrecedence != NULL);				// Relic捞搁 酒公唱 林匡 荐 乐促.				if (isRelicItem( pItem )					|| pEffectPrecedence->getDeadline() < currentTime)				{					// 矫埃捞 瘤车促搁 酒公唱 林阑 荐 乐促. 歹阂绢 咯扁辑 捞棋飘甫 昏力秦霖促.					rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE);					pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE);				}				else				{					// 矫埃捞 酒流 瘤唱瘤 臼疽促搁, 林牢 肚绰 林牢 颇萍父捞 林阑 荐 乐促.					if ((pEffectPrecedence->getHostName() == pPC->getName()) || 						(pPC->getPartyID() != 0 && pPC->getPartyID() == pEffectPrecedence->getHostPartyID()))					{						// 林阑 荐 乐促. 捞棋飘甫 昏力秦 霖促.						rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE);						pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE);					}					else					{						// 林阑 荐 绝促.						goto ERROR;					}				}			}/*#ifdef __XMAS_EVENT_CODE__			Inventory* pInventory = pPC->getInventory();			// 林栏妨绰 酒捞袍捞 踌祸 急拱 惑磊扼搁,			// 牢亥配府俊 踌祸 急拱 惑磊甫 啊瘤绊 乐促搁 林阑 荐 绝促.			if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX &&				pItem->getItemType() == 0 &&				pInventory->hasGreenGiftBox()) goto ERROR;#endif*/			pItem->whenPCTake(pPC);			Item::ItemClass itemclass = pItem->getItemClass();			//ItemType_t itemtype = pItem->getItemType();			// relic牢 版快绰 捞固 爱绊 乐绰 relic辆幅甫 肚 啊龙 荐绰 绝促.			// 啊龙 荐 乐促搁 relic阑 啊脸促绰 effect甫 吧绢林绊			// CombatInfoManager俊 家蜡磊 蔼阑 汲沥秦霖促.			if (isRelicItem( itemclass ))			{				addRelicEffect( pPC, pItem );								deleteEffectRelicPosition( pItem );			}			// Flag牢 版快浚 Flag 甫 嘿咯霖促.			if ( pItem->isFlagItem() )			{				addSimpleCreatureEffect( pPC, Effect::EFFECT_CLASS_HAS_FLAG );			}			if ( pItem->getItemClass() == Item::ITEM_CLASS_SWEEPER )			{				EffectHasSweeper* pEffect = new EffectHasSweeper( pPC );				pEffect->setPart( pItem->getItemType() );				pPC->setFlag( pEffect->getEffectClass() );				pPC->addEffect( pEffect );//				addSimpleCreatureEffect( pPC, (Effect::EffectClass)(Effect::EFFECT_CLASS_HAS_SWEEPER + pItem->getItemType()) );				GCAddEffect gcAddEffect;				gcAddEffect.setObjectID( pPC->getObjectID() );				gcAddEffect.setEffectID( pEffect->getSendEffectClass() );				pZone->broadcastPacket( pPC->getX(), pPC->getY(), &gcAddEffect );				// 林奎栏搁 粮俊 矫胶袍 皋技瘤 谎妨霖促				char race[15];				if ( pCreature->isSlayer() )				{					sprintf( race, g_pStringPool->c_str( STRID_SLAYER ) );				}				else if ( pCreature->isVampire() )				{					sprintf( race, g_pStringPool->c_str( STRID_VAMPIRE ) );				}				else if ( pCreature->isOusters() )				{					sprintf( race, g_pStringPool->c_str( STRID_OUSTERS ) );				}				else				{					Assert(false);				}				const SweeperInfo* pSweeperInfo = dynamic_cast<SweeperInfo*>(g_pSweeperInfoManager->getItemInfo(pItem->getItemType()));				char msg[100];				sprintf( msg , g_pStringPool->c_str( STRID_PICK_UP_SWEEPER ) ,									pSweeperInfo->getName().c_str(),									pCreature->getName().c_str(),									race									);				GCSystemMessage gcSystemMessage;				gcSystemMessage.setMessage( msg );				pZone->broadcastPacket( &gcSystemMessage );			}			pZone->deleteItem(pItem,ZoneX, ZoneY);			pPC->addItemToExtraInventorySlot(pItem);			// 林篮 仇俊霸 肋 林菌促绊 搬苞甫 舅妨霖促.			GCDeleteandPickUpOK _GCDeleteandPickUpOK;			GCDeleteObject _GCDeleteObject;			_GCDeleteandPickUpOK.setObjectID(pItem->getObjectID());			pPlayer->sendPacket(&_GCDeleteandPickUpOK);			// 辟贸俊 乐绰 促弗 荤恩甸俊罢 酒捞袍俊 荤扼脸促绰 巴阑 焊郴霖促.			_GCDeleteObject.setObjectID(pItem->getObjectID());//			pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC);//			pZone->broadcastPacket(ZoneX, ZoneY, &_GCDeleteObject, pPC);			pZone->broadcastPacket(ZoneX, ZoneY, &_GCDeleteObject);			Success = true;			// 酒捞袍阑 历厘茄促.			//pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0);			// item历厘 弥利拳. by sigi. 2002.5.13			char pField[80];			sprintf(pField, "OwnerID='%s', Storage=%d", pPC->getName().c_str(), STORAGE_EXTRASLOT);			pItem->tinysave(pField);			// 骇飘老 版快 骇飘 救狼 酒捞袍甸档 葛滴 家蜡鼻捞 逞绢啊具 茄促. 2003.3.22 by Sequoia			if ( pItem->getItemClass() == Item::ITEM_CLASS_BELT )			{	            sprintf(pField, "OwnerID='%s'", pPC->getName().c_str());                Belt* pBelt = dynamic_cast<Belt*>( pItem );                Assert( pBelt != NULL );                Inventory* pBeltInventory = pBelt->getInventory();                PocketNum_t num = pBelt->getPocketCount();                for ( SlotID_t count = 0 ; count < num ; ++count )                {                    Item* pBeltItem = pBeltInventory->getItem( count, 0 );                    if ( pBeltItem != NULL )                    {                        pBeltItem->tinysave( pField );                    }                }			}			// 鞠胶龟靛老 版快 救狼 酒捞袍甸档 葛滴 家蜡鼻捞 逞绢啊具 茄促. 2003.3.22 by Sequoia			if ( pItem->getItemClass() == Item::ITEM_CLASS_OUSTERS_ARMSBAND )			{	            sprintf(pField, "OwnerID='%s'", pPC->getName().c_str());                OustersArmsband* pOustersArmsband = dynamic_cast<OustersArmsband*>( pItem );                Assert( pOustersArmsband != NULL );                Inventory* pOustersArmsbandInventory = pOustersArmsband->getInventory();                PocketNum_t num = pOustersArmsband->getPocketCount();                for ( SlotID_t count = 0 ; count < num ; ++count )                {                    Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem( count, 0 );                    if ( pOustersArmsbandItem != NULL )                    {                        pOustersArmsbandItem->tinysave( pField );                    }                }			}		}		else		{			goto ERROR;		}        if ( pItem != NULL && pItem->isTraceItem() )        {            char zoneName[15];            sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), ZoneX, ZoneY);            remainTraceLog( pItem, zoneName, pCreature->getName(), ITEM_LOG_MOVE, DETAIL_PICKUP);        }	} 	catch (Throwable & t) 	{		//cerr << t.toString();	}ERROR:	if (!Success)	{		GCCannotAdd _GCCannotAdd;		_GCCannotAdd.setObjectID(pPacket->getObjectID());		pPlayer->sendPacket(&_GCCannotAdd);	}#endif	// __GAME_SERVER__    __END_DEBUG_EX __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 捞亥飘 内靛啊 甸绢啊乐绰 滚傈捞促.// 度鞍篮 捞亥飘啊 肚 角青瞪 瘤 葛福聪, 瘤快瘤 富 巴! -- by 辫己刮///////////////////////////////////////////////////////////////////////////////*void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	try 	{		GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);		Creature*   pCreature   = pGamePlayer->getCreature();		bool        Success     = false;		if (pCreature == NULL) return;		PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature);		Zone*       pZone   = pPC->getZone();		ZoneCoord_t ZoneX   = pPacket->getZoneX();		ZoneCoord_t ZoneY   = pPacket->getZoneY();		// 官款靛甫 逞绢啊瘤绰 臼绰瘤 眉农茄促.		if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) goto ERROR;		Tile& _Tile = pZone->getTile(ZoneX, ZoneY);		// 鸥老俊 酒捞袍捞 绝促搁 寸楷洒 歹且 荐 绝促.		if (!_Tile.hasItem())		{			GCCannotAdd _GCCannotAdd;			_GCCannotAdd.setObjectID(pPacket->getObjectID());			pPlayer->sendPacket(&_GCCannotAdd);			return;		}		// 酒捞袍 器牢磐啊 澄捞扼搁 寸楷洒 歹且 荐 绝促.		Item* pItem = _Tile.getItem();		if (pItem == NULL)		{			GCCannotAdd _GCCannotAdd;			_GCCannotAdd.setObjectID(pPacket->getObjectID());			pPlayer->sendPacket(&_GCCannotAdd);			return;		}		ObjectID_t ItemObjectID = pItem->getObjectID();		// 酒捞袍狼 ObjectID啊 老摹窍绰瘤 眉农茄促.		if (ItemObjectID == pPacket->getObjectID()) 		{			Item* pExtraItem = pPC->getExtraInventorySlotItem();			// 捞固 公攫啊甫 甸绊 乐促搁, 酒捞袍阑 歹且 荐 绝促.			if (pExtraItem != NULL) 			{				GCCannotAdd _GCCannotAdd;				_GCCannotAdd.setObjectID(pPacket->getObjectID());				pPlayer->sendPacket(&_GCCannotAdd);				return;			}			// 官蹿俊 冻绢廉 乐绰 酒捞袍捞 捞亥飘侩 秦榜捞扼搁...			if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL &&				12 <= pItem->getItemType() && pItem->getItemType() <= 16)			{				uint scount = pGamePlayer->getSpecialEventCount();				int  prev   = (int)(scount/10);				int  cur    = 0;				switch (pItem->getItemType())				{					case 12: scount += 1; break; // 炔陛 秦榜					case 15: scount += 4; break; // 荐沥 秦榜					case 14: scount += 9; break; // 八篮 秦榜					default: break;				}				// 墨款飘甫 历厘茄促.				pGamePlayer->setSpecialEventCount(scount);				pGamePlayer->saveSpecialEventCount();				cur = scount/10;				// 粮俊辑 酒捞袍阑 昏力茄促.				pZone->deleteItem(pItem, ZoneX, ZoneY);				// 林篮 仇俊霸 肋 林菌促绊 朝妨霖促.				GCDeleteandPickUpOK _GCDeleteandPickUpOK;				GCDeleteObject _GCDeleteObject;				_GCDeleteandPickUpOK.setObjectID(pItem->getObjectID());				pPlayer->sendPacket(&_GCDeleteandPickUpOK); 				// 辟贸俊 乐绰 促弗 荤恩甸俊罢 酒捞袍俊 荤扼脸促绰 巴阑 焊郴霖促.				_GCDeleteObject.setObjectID(pItem->getObjectID());				pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC);				// 付瘤阜栏肺 角力 酒捞袍 按眉甫 昏力茄促.				SAFE_DELETE(pItem);				// 痢荐甫 沥扁利栏肺 啊福媚霖促.				StringStream msg;				msg << "寸脚狼 泅犁 捞亥飘 器牢飘绰 " << pGamePlayer->getSpecialEventCount() << " 器牢飘 涝聪促.";				GCSystemMessage gcMsg;				gcMsg.setMessage(msg.toString());				pPlayer->sendPacket(&gcMsg);				// 痢荐甫 沥扁利栏肺 宏肺靛某胶泼茄促.				if (prev != cur)				{					StringStream msg;					msg << pPC->getName() << "丛膊辑 " << pGamePlayer->getSpecialEventCount() << " 器牢飘狼 捞亥飘 痢荐甫 裙垫窍看嚼聪促.";					GCSystemMessage gcMsg;					gcMsg.setMessage(msg.toString());					pPlayer->sendPacket(&gcMsg);					pZone->broadcastPacket(pPC->getX(), pPC->getY(), &gcMsg , pPC);				}				return;			}			// 粮俊辑 酒捞袍阑 昏力窍绊, 付快胶俊促 崔酒霖促.			pZone->deleteItem(pItem, ZoneX, ZoneY);			pPC->addItemToExtraInventorySlot(pItem);			// 林篮 仇俊霸 肋 林菌促绊 搬苞甫 舅妨霖促.			GCDeleteandPickUpOK _GCDeleteandPickUpOK;			GCDeleteObject _GCDeleteObject;			_GCDeleteandPickUpOK.setObjectID(pItem->getObjectID());			pPlayer->sendPacket(&_GCDeleteandPickUpOK);			// 辟贸俊 乐绰 促弗 荤恩甸俊罢 酒捞袍俊 荤扼脸促绰 巴阑 焊郴霖促.			_GCDeleteObject.setObjectID(pItem->getObjectID());			pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC);			Success = true;			// 酒捞袍阑 历厘茄促.			pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0);		}		if (!Success) 		{			GCCannotAdd _GCCannotAdd;			_GCCannotAdd.setObjectID(pPacket->getObjectID());			pPlayer->sendPacket(&_GCCannotAdd);		}	} 	catch (Throwable & t) 	{		//cerr << t.toString();	}#endif	// __GAME_SERVER__    __END_DEBUG_EX __END_CATCH}*/

⌨️ 快捷键说明

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