//////////////////////////////////////////////////////////////////////////////// // 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveQuestItem::execute (Creature * pCreature1 , Creature * pCreature2) throw(Error) { __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature2); Assert(pPC != NULL); TPOINT pt; Item* pItem = pPC->getQuestItem(); if (pItem == NULL || !pPC->getInventory()->getEmptySlot(pItem, pt ) ) { GCNPCAsk gcNPCAsk; gcNPCAsk.setObjectID(pCreature1->getObjectID()); gcNPCAsk.setScriptID(m_CounterScriptID); gcNPCAsk.setNPCID(dynamic_cast<NPC*>(pCreature1)->getNPCID()); pPC->getPlayer()->sendPacket(&gcNPCAsk); return; } if (pPC->getInventory()->addItem(pItem, pt ) ) { pPC->setQuestItem(NULL); pPC->getZone()->registerObject(pItem); pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); if (pItem->isUnique() || pItem->isTimeLimitItem() ) { pPC->addTimeLimitItem(pItem, 43200); } GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pItem, pt.x, pt.y); pPC->getPlayer()->sendPacket(&gcCreateItem); } __END_CATCH }
//////////////////////////////////////////////////////////////////////////////// // 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveFinalLottoScript::execute (Creature * pCreature1 , Creature * pCreature2) throw(Error) { __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature2); Assert(pPC != NULL); GCNPCAsk gcNPCAsk; gcNPCAsk.setObjectID(pCreature1->getObjectID()); gcNPCAsk.setNPCID(dynamic_cast<NPC*>(pCreature1)->getNPCID()); QuestID_t qID; if (pPC->getQuestManager()->successEventQuest(4, qID ) ) { ItemType_t fitItem = rand()%10; if (pPC->getInventory()->findItem(Item::ITEM_CLASS_EVENT_ITEM, fitItem ) != NULL ) { pPC->getQuestManager()->getEventQuestAdvanceManager()->advanced(EventQuestAdvanceManager::EVENT_QUEST_LEVEL_MAX-1); gcNPCAsk.setScriptID(m_SuccessScriptID); } else { gcNPCAsk.setScriptID(m_FailScriptID); } list<Item*> iList; pPC->getInventory()->clearQuestItem(iList); list<Item*>::iterator itr = iList.begin(); list<Item*>::iterator endItr = iList.end(); for (; itr != endItr ; ++itr ) { GCDeleteInventoryItem gcDII; gcDII.setObjectID((*itr)->getObjectID()); pPC->getPlayer()->sendPacket(&gcDII); (*itr)->destroy(); SAFE_DELETE(*itr); } iList.clear(); } else { gcNPCAsk.setScriptID(m_CounterScriptID); } pPC->getPlayer()->sendPacket(&gcNPCAsk); __END_CATCH }
//////////////////////////////////////////////////////////////////////////////// // 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRewardEventQuest::execute (Creature * pCreature1 , Creature * pCreature2) throw(Error) { __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature2); Assert(pPC != NULL); if (pPC->getQuestItem() != NULL ) { TPOINT pt; Item* pItem = pPC->getQuestItem(); if (pItem == NULL || !pPC->getInventory()->getEmptySlot(pItem, pt ) ) { GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUEST); gcNPCResponse.setParameter(COMPLETE_FAIL_NO_INVENTORY_SPACE); pPC->getPlayer()->sendPacket(&gcNPCResponse); return; } if (pPC->getInventory()->addItem(pItem, pt ) ) { pPC->setQuestItem(NULL); pPC->getZone()->registerObject(pItem); pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); if (pItem->isUnique() || pItem->isTimeLimitItem() ) { pPC->addTimeLimitItem(pItem, 604800); pPC->sendTimeLimitItemInfo(); } GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pItem, pt.x, pt.y); pPC->getPlayer()->sendPacket(&gcCreateItem); GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUEST); gcNPCResponse.setParameter(COMPLETE_SUCCESS); pPC->getPlayer()->sendPacket(&gcNPCResponse); remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); return; } else { GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUEST); gcNPCResponse.setParameter(COMPLETE_FAIL_NO_INVENTORY_SPACE); pPC->getPlayer()->sendPacket(&gcNPCResponse); return; } } int questLevel = pPC->getQuestManager()->getEventQuestAdvanceManager()->getQuestLevel(); ScriptID_t sID = m_ScriptID[ questLevel ]; QuestID_t qID; if (!pPC->getQuestManager()->successEventQuest(questLevel, qID ) ) sID = m_CounterScriptID; if (pPC->getQuestManager()->getEventQuestAdvanceManager()->getStatus(questLevel) == EventQuestAdvance::EVENT_QUEST_INIT && questLevel > 1 ) sID = m_CancelScriptID; GCNPCAsk gcNPCAsk; gcNPCAsk.setObjectID(pCreature1->getObjectID()); gcNPCAsk.setScriptID(sID); gcNPCAsk.setNPCID(dynamic_cast<NPC*>(pCreature1)->getNPCID()); Player* pPlayer = pCreature2->getPlayer(); pPlayer->sendPacket(&gcNPCAsk); __END_CATCH }