//----------------------------------------------------------------------
// remove effect from target
//----------------------------------------------------------------------
void EffectDecayMotorcycle::unaffect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget, Slayer* pSlayer)
	throw(Error)
{
	__BEGIN_TRY

	// 올바른 좌표이어야 한다.
	Assert(isValidZoneCoord(pZone, x, y));

	// TempItem 변수를 잡는다.
	Item* pTempItem = NULL;

	// 여기서는 지정 아이템이 없을 수 있으며, 또 다른 아이템이 놓여 있을 수도 있다.
	// 이 경우는 오리지널 아이템과 지금 현재 바닥에 있는 아이템을 비교하여 삭제해야 한다.
	// 없을 경우는 무시하면 된다.
	Tile & tile = pZone->getTile(x, y);

	if (tile.hasItem()) {

		pTempItem = tile.getItem();

		if (pTempItem != NULL) {
			// ObjectID가 같다는 말은 같은 아이템이란 말이다.
			//if (pTempItem->getObjectID() == m_ObjectID) {
			if (pTempItem->getObjectID() == m_ObjectID) {

				pZone->deleteItem(pTempItem , x, y);

				// 아이템이 사라졌다는 패킷을 날린다.
				GCDeleteObject gcDeleteObject;
				gcDeleteObject.setObjectID(m_ObjectID);

				pZone->broadcastPacket(x, y , &gcDeleteObject);

				if (m_bDeleteFromDB)
				{
					pTempItem->destroy();
				}

				SAFE_DELETE(pTempItem);
			}
		}
	}

	// heartbeat시 EffectDecayMotorcycle이 처리된다. 그 이후 다음 heartbeat시에
	// 사용자에게 오토바이를 호출해 주어야 한다.
	// 사용자는 오토바이의 오브젝트와

	//EffectCallMotorcycle* pEffectCallMotorcycle = new EffectCallMotorcycle(pMotorcycleObject, pSlayer);
	//pTarget = NULL;

	__END_CATCH
}
Example #2
0
void EffectDecayCorpse::unaffect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget)
	throw(Error)
{
	__BEGIN_TRY

	// 올바른 좌표이어야 한다.
	Assert(isValidZoneCoord(pZone, x, y));

	// 시체에 접근한다.
	if (pZone->getTile(x,y).hasItem()) 
	{
		Item* pItem = pZone->getTile(x,y).getItem();

		if (pItem != NULL) 
		{
			// 타일위에 아이템이 있고 그 아이템의 오브젝트 아이디가 똑같아야만 똑 같은 시체이다.
			if (pItem->getObjectID() == m_ObjectID) 
			{
				Corpse* pCorpse = dynamic_cast<Corpse*>(pTarget);
				try 
				{
					// 시체를 존에서 삭제한다.
					Assert(pZone->getTile(x,y).getItem() == pCorpse);
					pZone->deleteItem(pCorpse , x, y);
				} 
				catch (NoSuchElementException & nsee) 
				{
					cerr << "EffectDecayCorpse::unaffect() : NoSuchElementException" << endl;
					throw Error(nsee.toString());
				}

				GCDeleteObject gcDeleteObject;
				gcDeleteObject.setObjectID(pCorpse->getObjectID());
				pZone->broadcastPacket(x, y , &gcDeleteObject);

				// 시체 자체를 삭제한다.
				SAFE_DELETE(pCorpse);
			}
		}
	}

	pTarget = NULL;

	__END_CATCH
}
Example #3
0
//----------------------------------------------------------------------
// remove effect from target
//----------------------------------------------------------------------
void EffectDeleteItem::unaffect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget)
	throw(Error)
{
	__BEGIN_TRY

	// 올바른 좌표이어야 한다.
	//Assert(pTarget!=NULL);
	Assert(isValidZoneCoord(pZone, x, y));

	//pZone->deleteFromItemList(pTarget->getObjectID());
	//(pZone->getTile(x, y)).deleteItem();
	//pZone->deleteItem(pTarget, x, y);

	Item* pItem = NULL;

	Tile& tile = pZone->getTile(x,y);

	if (tile.hasItem() )
	{
		pItem = tile.getItem();

		if (pItem != NULL )
		{
			if (pItem->getObjectID() == m_ObjectID )
			{
				pZone->deleteItem(pItem, x, y);

				GCDeleteObject gcDO;
				gcDO.setObjectID(pTarget->getObjectID());
				pZone->broadcastPacket(x, y, &gcDO);

				SAFE_DELETE(pTarget);
			}
		}
	}

	__END_CATCH
}
Example #4
0
//----------------------------------------------------------------------
// remove effect from target
//----------------------------------------------------------------------
void EffectDecayItem::unaffect (Zone* pZone , ZoneCoord_t x , ZoneCoord_t y , Object* pTarget)
	throw(Error)
{
	__BEGIN_TRY

	// 올바른 좌표이어야 한다.
	Assert(isValidZoneCoord(pZone, x, y));

	// TempItem 변수를 잡는다.
	Item* pTempItem = NULL;

	// 여기서는 지정 아이템이 없을 수 있으며, 또 다른 아이템이 놓여 있을 수도 있다.
	// 이 경우는 오리지널 아이템과 지금 현재 바닥에 있는 아이템을 비교하여 삭제해야 한다.
	// 없을 경우는 무시하면 된다.
	Tile & tile = pZone->getTile(x, y);

	if (tile.hasItem()) {

		pTempItem = tile.getItem();

		if (pTempItem != NULL) {
			// ObjectID가 같다는 말은 같은 아이템이란 말이다.
			//if (pTempItem->getObjectID() == m_ObjectID) {
			if (pTempItem->getObjectID() == m_ObjectID) {

				pZone->deleteItem(pTempItem , x, y);

				// 아이템이 사라졌다는 패킷을 날린다.
				GCDeleteObject gcDeleteObject;
				gcDeleteObject.setObjectID(m_ObjectID);

				pZone->broadcastPacket(x, y , &gcDeleteObject);

				if (m_bDeleteFromDB)
				{
					//ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pTempItem->getItemClass(), pTempItem->getItemType());
					//Assert(pItemInfo!=NULL);

					// 유니크 아이템인 경우 개수를 줄인다.
					if (pTempItem->isUnique())
					{
						// create한 아이템이 아닌 경우만 지워준다.
						if (pTempItem->getCreateType()!=Item::CREATE_TYPE_CREATE)
							UniqueItemManager::deleteItem(pTempItem->getItemClass(), pTempItem->getItemType());

						filelog("uniqueItem.txt", "[EffectDecayItem] %s", pTempItem->toString().c_str());
					}

					// ItemTraceLog 를 남긴다
					/*
					 * 존에 떨어진 아이템중 expire time인것들 모두 로그를 빼버린다.
					if (pTempItem != NULL && pTempItem->isTraceItem() )
					{
						char zoneName[15];
						sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), x, y);
						remainTraceLog(pTempItem, zoneName, "GOD", ITEM_LOG_DELETE, DETAIL_TIMEOUT);
					}
					*/

					// 돈 로그 남기자
					if (pTempItem->getItemClass() == Item::ITEM_CLASS_MONEY )
					{
						Money* pMoney = dynamic_cast<Money*>(pTempItem);
						if (pMoney->getAmount() >= g_pVariableManager->getMoneyTraceLogLimit() )
						{
							char zoneName[15];
							sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), x, y);
							remainMoneyTraceLog(zoneName, "GOD", ITEM_LOG_DELETE, DETAIL_TIMEOUT, pMoney->getAmount());
						}
					}

					pTempItem->destroy();
				}

				SAFE_DELETE(pTempItem);
			}
		}
	}

	pTarget = NULL;

	__END_CATCH
}