//---------------------------------------------------------------------- // 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 }
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 }
//---------------------------------------------------------------------- // 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 }
//---------------------------------------------------------------------- // 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 }