コード例 #1
0
void CGAddMouseToGearHandler::execute (CGAddMouseToGear* 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);
		Assert(pGamePlayer != NULL);

		Creature*   pCreature   = pGamePlayer->getCreature();
		Assert(pCreature != NULL);

		bool        Success     = false;

		if (pCreature->isSlayer()) 
		{
			Slayer* pSlayer    = dynamic_cast<Slayer*>(pCreature);
			Assert(pSlayer != NULL);

			Item*   pItem = pSlayer->getExtraInventorySlotItem();

			if (pItem == NULL)
			{
				GCCannotAdd _GCCannotAdd;
				_GCCannotAdd.setObjectID(pPacket->getObjectID());
				pPlayer->sendPacket(&_GCCannotAdd);
				return;
			}

			ObjectID_t ItemObjectID = pItem->getObjectID();
			SlotID_t   SlotID       = pPacket->getSlotID();
		
			// 아이템의 ObjectID가 일치하는지 체크한다.
			if (ItemObjectID == pPacket->getObjectID()) 
			{
				Item::ItemClass IClass = pItem->getItemClass();
				
				switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다.
				{
					case Slayer::WEAR_HEAD:
						if (IClass == Item::ITEM_CLASS_HELM) Success = true;
						break;
					case Slayer::WEAR_NECK:
						if (IClass == Item::ITEM_CLASS_NECKLACE) Success = true;
						break;
					case Slayer::WEAR_FINGER1:
						if (IClass == Item::ITEM_CLASS_RING || IClass == Item::ITEM_CLASS_COUPLE_RING) Success = true;
						break;
					case Slayer::WEAR_FINGER2:
						if (IClass == Item::ITEM_CLASS_RING || IClass == Item::ITEM_CLASS_COUPLE_RING) Success = true;
						break;
					case Slayer::WEAR_FINGER3:
						if (IClass == Item::ITEM_CLASS_RING || IClass == Item::ITEM_CLASS_COUPLE_RING) Success = true;
						break;
					case Slayer::WEAR_FINGER4:
						if (IClass == Item::ITEM_CLASS_RING || IClass == Item::ITEM_CLASS_COUPLE_RING) Success = true;
						break;
					case Slayer::WEAR_WRIST1:
						if (IClass == Item::ITEM_CLASS_BRACELET) Success = true;
						break;
					case Slayer::WEAR_WRIST2:
						if (IClass == Item::ITEM_CLASS_BRACELET) Success = true;
						break;
					case Slayer::WEAR_LEFTHAND:
						if (IClass == Item::ITEM_CLASS_SHIELD) Success = true;
						break;
					case Slayer::WEAR_HAND3:
						if (IClass == Item::ITEM_CLASS_GLOVE) Success = true;
						break;
					case Slayer::WEAR_BODY:
						if (IClass == Item::ITEM_CLASS_COAT) Success = true;
						break;
					case Slayer::WEAR_BELT:
						if (IClass == Item::ITEM_CLASS_BELT) Success = true;
						break;
					case Slayer::WEAR_LEG:
						if (IClass == Item::ITEM_CLASS_TROUSER) Success = true;
						break;
					case Slayer::WEAR_FOOT:
						if (IClass == Item::ITEM_CLASS_SHOES) Success = true;
						break;
					case Slayer::WEAR_RIGHTHAND:
						if (isSlayerWeapon(IClass)) Success = true;
						break;
					case Slayer::WEAR_ZAP1:
					case Slayer::WEAR_ZAP2:
					case Slayer::WEAR_ZAP3:
					case Slayer::WEAR_ZAP4:
						if (IClass == Item::ITEM_CLASS_CORE_ZAP) Success = true;
						break;
					case Slayer::WEAR_PDA:
						if (IClass == Item::ITEM_CLASS_CARRYING_RECEIVER) Success = true;
						break;
					case Slayer::WEAR_SHOULDER:
						if (IClass == Item::ITEM_CLASS_SHOULDER_ARMOR) Success = true;
						break;
					default :
						break;
				}
				
				// 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다.
				if (Success) pSlayer->wearItem((Slayer::WearPart)SlotID);
			}
		} 
		else if (pCreature->isVampire())
		{
			Vampire* pVampire = dynamic_cast<Vampire*>(pCreature);
			Assert(pVampire != NULL);

			Item*    pItem    = pVampire->getExtraInventorySlotItem();

			if (pItem == NULL)
			{
				GCCannotAdd _GCCannotAdd;
				_GCCannotAdd.setObjectID(pPacket->getObjectID());
				pPlayer->sendPacket(&_GCCannotAdd);
				return;
			}

			ObjectID_t ItemObjectID = pItem->getObjectID();
			SlotID_t   SlotID       = pPacket->getSlotID();
		
			// 아이템의 ObjectID가 일치하는지 체크한다.
			if (ItemObjectID == pPacket->getObjectID()) 
			{
				Item::ItemClass IClass = pItem->getItemClass();
				
				switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다.
				{
					case Vampire::WEAR_NECK:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_NECKLACE) Success = true;
						break;
					case Vampire::WEAR_FINGER1:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_RING || IClass == Item::ITEM_CLASS_VAMPIRE_COUPLE_RING) Success = true;
						break;
					case Vampire::WEAR_FINGER2:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_RING || IClass == Item::ITEM_CLASS_VAMPIRE_COUPLE_RING) Success = true;
						break;
					case Vampire::WEAR_FINGER3:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_RING || IClass == Item::ITEM_CLASS_VAMPIRE_COUPLE_RING) Success = true;
						break;
					case Vampire::WEAR_FINGER4:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_RING || IClass == Item::ITEM_CLASS_VAMPIRE_COUPLE_RING) Success = true;
						break;
					case Vampire::WEAR_WRIST1:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_BRACELET) Success = true;
						break;
					case Vampire::WEAR_WRIST2:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_BRACELET) Success = true;
						break;
					case Vampire::WEAR_EARRING1:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_EARRING) Success = true;
						break;
					case Vampire::WEAR_EARRING2:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_EARRING) Success = true;
						break;
					case Vampire::WEAR_BODY:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_COAT) Success = true;
						break;
					case Vampire::WEAR_LEFTHAND:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_WEAPON) Success = true;
						break;
					case Vampire::WEAR_RIGHTHAND:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_WEAPON) Success = true;
						break;
					case Vampire::WEAR_AMULET1:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_AMULET) Success = true;
						break;
					case Vampire::WEAR_AMULET2:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_AMULET) Success = true;
						break;
					case Vampire::WEAR_AMULET3:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_AMULET) Success = true;
						break;
					case Vampire::WEAR_AMULET4:
						if (IClass == Item::ITEM_CLASS_VAMPIRE_AMULET) Success = true;
						break;
					case Vampire::WEAR_ZAP1:
					case Vampire::WEAR_ZAP2:
					case Vampire::WEAR_ZAP3:
					case Vampire::WEAR_ZAP4:
						if (IClass == Item::ITEM_CLASS_CORE_ZAP) Success = true;
						break;
					case Vampire::WEAR_DERMIS:
						if (IClass == Item::ITEM_CLASS_DERMIS) Success = true;
						break;
					case Vampire::WEAR_PERSONA:
						if (IClass == Item::ITEM_CLASS_PERSONA) Success = true;
						break;

					default :
						break;
				}
				
				// 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다.
				if (Success) pVampire->wearItem((Vampire::WearPart)SlotID);
			}
		}
		else if (pCreature->isOusters())
		{
			Ousters* pOusters = dynamic_cast<Ousters*>(pCreature);
			Assert(pOusters != NULL);

			Item*    pItem    = pOusters->getExtraInventorySlotItem();

			if (pItem == NULL)
			{
				GCCannotAdd _GCCannotAdd;
				_GCCannotAdd.setObjectID(pPacket->getObjectID());
				pPlayer->sendPacket(&_GCCannotAdd);
				return;
			}

			ObjectID_t ItemObjectID = pItem->getObjectID();
			SlotID_t   SlotID       = pPacket->getSlotID();
		
			// 아이템의 ObjectID가 일치하는지 체크한다.
			if (ItemObjectID == pPacket->getObjectID()) 
			{
				Item::ItemClass IClass = pItem->getItemClass();
				
				switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다.
				{
					case Ousters::WEAR_CIRCLET:
						if (IClass == Item::ITEM_CLASS_OUSTERS_CIRCLET) Success = true;
						break;
					case Ousters::WEAR_COAT:
						if (IClass == Item::ITEM_CLASS_OUSTERS_COAT) Success = true;
						break;
					case Ousters::WEAR_LEFTHAND:
					case Ousters::WEAR_RIGHTHAND:
						if (IClass == Item::ITEM_CLASS_OUSTERS_WRISTLET || IClass == Item::ITEM_CLASS_OUSTERS_CHAKRAM ) Success = true;
						break;
					case Ousters::WEAR_BOOTS:
						if (IClass == Item::ITEM_CLASS_OUSTERS_BOOTS) Success = true;
						break;
					case Ousters::WEAR_ARMSBAND1:
					case Ousters::WEAR_ARMSBAND2:
						if (IClass == Item::ITEM_CLASS_OUSTERS_ARMSBAND) Success = true;
						break;
					case Ousters::WEAR_RING1:
					case Ousters::WEAR_RING2:
						if (IClass == Item::ITEM_CLASS_OUSTERS_RING) Success = true;
						break;
					case Ousters::WEAR_NECKLACE1:
					case Ousters::WEAR_NECKLACE2:
					case Ousters::WEAR_NECKLACE3:
						if (IClass == Item::ITEM_CLASS_OUSTERS_PENDENT) Success = true;
						break;
					case Ousters::WEAR_STONE1:
					case Ousters::WEAR_STONE2:
					case Ousters::WEAR_STONE3:
					case Ousters::WEAR_STONE4:
						if (IClass == Item::ITEM_CLASS_OUSTERS_STONE) Success = true;
						break;

					case Ousters::WEAR_ZAP1:
					case Ousters::WEAR_ZAP2:
					case Ousters::WEAR_ZAP3:
					case Ousters::WEAR_ZAP4:
						if (IClass == Item::ITEM_CLASS_CORE_ZAP) Success = true;
						break;
					case Ousters::WEAR_FASCIA:
						if (IClass == Item::ITEM_CLASS_FASCIA) Success = true;
						break;
					case Ousters::WEAR_MITTEN:
						if (IClass == Item::ITEM_CLASS_MITTEN) Success = true;
						break;

					default :
						break;
				}
				
				// 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다.
				if (Success) pOusters->wearItem((Ousters::WearPart)SlotID);
			}
		}

		// Adding에 실패 하였을 경우
		if (!Success) 
		{
			GCCannotAdd _GCCannotAdd;
			_GCCannotAdd.setObjectID(pPacket->getObjectID());
			pPlayer->sendPacket(&_GCCannotAdd);
		}
	} 
	catch (Throwable & t) 
	{
		//cout << t.toString();
	}

#endif	// __GAME_SERVER__

    __END_DEBUG_EX __END_CATCH

}