void ActionRedeemMotorcycle::execute (Creature * pCreature1 , Creature* pCreature2) throw(Error) { __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); // 일단 클라이언트를 위해 ok패킷을 하나 날려주고... GCNPCResponse answerOKpkt; pPlayer->sendPacket(&answerOKpkt); // 플레이어가 슬레이어인지 검사한다. if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature2); Zone* pZone = pSlayer->getZone(); Inventory* pInventory = pSlayer->getInventory(); uint InvenWidth = pInventory->getWidth(); uint InvenHeight = pInventory->getHeight(); Item* pItem = NULL; Inventory* pBeltInventory = NULL; uint BeltInvenWidth = 0; uint BeltInvenHeight = 0; Item* pBelt = NULL; pBelt = pSlayer->getWearItem(Slayer::WEAR_BELT); if(pBelt != NULL) { pBeltInventory = ((Belt*)pBelt)->getInventory(); BeltInvenWidth = pBeltInventory->getWidth(); BeltInvenHeight = pBeltInventory->getHeight(); } // 인벤토리를 검색한다. for (uint y=0; y<InvenHeight; y++) { for (uint x=0; x<InvenWidth; x++) { // x, y에 아이템이 있다면... if (pInventory->hasItem(x, y)) { pItem = pInventory->getItem(x, y); if (load(pItem, pSlayer, pZone, pSlayer->getX(), pSlayer->getY())) { return; } } } } if(pBelt != NULL) { // 벨트를 검색한다 for (uint y = 0; y < BeltInvenHeight; y++) { for(uint x = 0; x < BeltInvenWidth; x++) { if(pBeltInventory->hasItem(x, y)) { pItem= pBeltInventory->getItem(x, y); if (load(pItem, pSlayer, pZone, pSlayer->getX(), pSlayer->getY())) { return; } } } } } } else // 뱀파이어라면...오토바이를 찾아줄 이유가 있을까? { } __END_CATCH }
void CGAddMouseToQuickSlotHandler::execute (CGAddMouseToQuickSlot* pPacket , Player* pPlayer) throw(ProtocolException, Error) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ Assert(pPacket != NULL); Assert(pPlayer != NULL); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); bool Success = false; if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); InventorySlot* pExtraSlot = pSlayer->getExtraInventorySlot(); Item* pItem = pExtraSlot->getItem(); if (pItem == NULL) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } ObjectID_t ItemObjectID = pItem->getObjectID(); SlotID_t SlotID = pPacket->getSlotID(); Item::ItemClass IClass = pItem->getItemClass(); // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID != pPacket->getObjectID()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } // 벨트를 입고 있지 않다면 벨트에다 아이템을 더할 수가 없다. if (!pSlayer->isWear(Slayer::WEAR_BELT)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } // 포션도 아니고, 탄창도 아니라면 더할 수가 없지. if (IClass != Item::ITEM_CLASS_POTION && IClass != Item::ITEM_CLASS_MAGAZINE && IClass != Item::ITEM_CLASS_EVENT_ETC && IClass != Item::ITEM_CLASS_KEY) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } if (IClass == Item::ITEM_CLASS_EVENT_ETC && pItem->getItemType() < 14 ) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } Item* pBelt = pSlayer->getWearItem(Slayer::WEAR_BELT); Inventory* pBeltInventory = ((Belt*)pBelt)->getInventory(); if (pBeltInventory->canAdding(SlotID, 0, pItem)) { // 현재 벨트에 있는 Item을 받아온다. Item* pPrevItem = pBeltInventory->getItem(SlotID, 0); // 지정한 자리에 아이템이 있다면... if (pPrevItem != NULL) { // 아이템이 완전히 같은 아이템이라면... if (isStackable(pItem) && isSameItem(pItem, pPrevItem)) { int MaxStack = ItemMaxStack[pItem->getItemClass()]; if (pItem->getNum() + pPrevItem->getNum() > MaxStack) { ItemNum_t CurrentNum = pPrevItem->getNum(); ItemNum_t AddNum = pItem->getNum(); ItemNum_t NewNum = AddNum + CurrentNum - MaxStack; pPrevItem->setNum(MaxStack); pItem->setNum(NewNum); pBeltInventory->increaseNum(MaxStack - CurrentNum); pBeltInventory->increaseWeight(pItem->getWeight()* (MaxStack - CurrentNum)); //pPrevItem->save(pSlayer->getName(), STORAGE_BELT, pBelt->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", MaxStack, STORAGE_BELT, pBelt->getItemID(), SlotID); pPrevItem->tinysave(pField); //pItem->save(pSlayer->getName(), STORAGE_EXTRASLOT, 0, 0, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", NewNum, STORAGE_EXTRASLOT); pItem->tinysave(pField); Success = true; } else // 숫자가 9개를 넘지 않을 때. { pSlayer->deleteItemFromExtraInventorySlot(); pPrevItem->setNum(pPrevItem->getNum() + pItem->getNum()); pBeltInventory->increaseNum(pItem->getNum()); pBeltInventory->increaseWeight(pItem->getWeight()* pItem->getNum()); //pPrevItem->save(pSlayer->getName(), STORAGE_BELT , pBelt->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", pPrevItem->getNum(), STORAGE_BELT, pBelt->getItemID(), SlotID); pPrevItem->tinysave(pField); pItem->destroy(); SAFE_DELETE(pItem); Success = true; } } else // 클래스랑 타입이 같지 않을때 { // 마우스에 달려있는 아이템과 벨트에 있는 아이템을 제거한다. pSlayer->deleteItemFromExtraInventorySlot(); pBeltInventory->deleteItem(pPrevItem->getObjectID()); // 둘의 위치를 바꿔 준다. pSlayer->addItemToExtraInventorySlot(pPrevItem); pBeltInventory->addItem(SlotID , 0 , pItem); // DB에다가 저장을 한다. //pPrevItem->save(pSlayer->getName(), STORAGE_EXTRASLOT, 0, 0, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); //pItem->save(pSlayer->getName(), STORAGE_BELT , pBelt->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pBelt->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } } else // 슬랏에 아무런 기존의 아이템이 없을때. { // Inventory에 특정 아이템을 넣는다. pBeltInventory->addItem(SlotID, 0 , pItem); // 넣기에 성공하면 마우스에 달려있는 아이템을 없앤다. pSlayer->deleteItemFromExtraInventorySlot(); //pItem->save(pSlayer->getName(), STORAGE_BELT, pBelt->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pBelt->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } } // end of if (pBeltInventory->canAdding(SlotID, 0, pItem)) } // if (pCreature->isSlayer()) else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); InventorySlot* pExtraSlot = pOusters->getExtraInventorySlot(); Item* pItem = pExtraSlot->getItem(); if (pItem == NULL) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } ObjectID_t ItemObjectID = pItem->getObjectID(); SlotID_t SlotID = pPacket->getSlotID(); Item::ItemClass IClass = pItem->getItemClass(); // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID != pPacket->getObjectID()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } Ousters::WearPart part = (SlotID > 2 ? Ousters::WEAR_ARMSBAND2 : Ousters::WEAR_ARMSBAND1); if (SlotID > 2 ) SlotID -= 3; // 해당 암스밴드가 없다 if (!pOusters->isWear(part)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } // 푸파도 아니고, 콤포스메이도 아니라면 더할 수가 없지. if (IClass != Item::ITEM_CLASS_PUPA && IClass != Item::ITEM_CLASS_COMPOS_MEI && IClass != Item::ITEM_CLASS_EVENT_ETC ) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } if (IClass == Item::ITEM_CLASS_EVENT_ETC && pItem->getItemType() < 14 ) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); return; } Item* pArmsband = pOusters->getWearItem(part); Inventory* pArmsbandInventory = ((OustersArmsband*)pArmsband)->getInventory(); if (pArmsbandInventory->canAdding(SlotID, 0, pItem)) { // 현재 벨트에 있는 Item을 받아온다. Item* pPrevItem = pArmsbandInventory->getItem(SlotID, 0); // 지정한 자리에 아이템이 있다면... if (pPrevItem != NULL) { // 아이템이 완전히 같은 아이템이라면... if (isSameItem(pItem, pPrevItem)) { int MaxStack = ItemMaxStack[pItem->getItemClass()]; if (pItem->getNum() + pPrevItem->getNum() > MaxStack) { ItemNum_t CurrentNum = pPrevItem->getNum(); ItemNum_t AddNum = pItem->getNum(); ItemNum_t NewNum = AddNum + CurrentNum - MaxStack; pPrevItem->setNum(MaxStack); pItem->setNum(NewNum); pArmsbandInventory->increaseNum(MaxStack - CurrentNum); pArmsbandInventory->increaseWeight(pItem->getWeight()* (MaxStack - CurrentNum)); //pPrevItem->save(pOusters->getName(), STORAGE_BELT, pArmsband->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", MaxStack, STORAGE_BELT, pArmsband->getItemID(), SlotID); pPrevItem->tinysave(pField); //pItem->save(pOusters->getName(), STORAGE_EXTRASLOT, 0, 0, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", NewNum, STORAGE_EXTRASLOT); pItem->tinysave(pField); Success = true; } else // 숫자가 9개를 넘지 않을 때. { pOusters->deleteItemFromExtraInventorySlot(); pPrevItem->setNum(pPrevItem->getNum() + pItem->getNum()); pArmsbandInventory->increaseNum(pItem->getNum()); pArmsbandInventory->increaseWeight(pItem->getWeight()* pItem->getNum()); //pPrevItem->save(pOusters->getName(), STORAGE_BELT , pArmsband->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", pPrevItem->getNum(), STORAGE_BELT, pArmsband->getItemID(), SlotID); pPrevItem->tinysave(pField); pItem->destroy(); SAFE_DELETE(pItem); Success = true; } } else // 클래스랑 타입이 같지 않을때 { // 마우스에 달려있는 아이템과 벨트에 있는 아이템을 제거한다. pOusters->deleteItemFromExtraInventorySlot(); pArmsbandInventory->deleteItem(pPrevItem->getObjectID()); // 둘의 위치를 바꿔 준다. pOusters->addItemToExtraInventorySlot(pPrevItem); pArmsbandInventory->addItem(SlotID , 0 , pItem); // DB에다가 저장을 한다. //pPrevItem->save(pOusters->getName(), STORAGE_EXTRASLOT, 0, 0, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); //pItem->save(pOusters->getName(), STORAGE_BELT , pArmsband->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pArmsband->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } } else // 슬랏에 아무런 기존의 아이템이 없을때. { // Inventory에 특정 아이템을 넣는다. pArmsbandInventory->addItem(SlotID, 0 , pItem); // 넣기에 성공하면 마우스에 달려있는 아이템을 없앤다. pOusters->deleteItemFromExtraInventorySlot(); //pItem->save(pOusters->getName(), STORAGE_BELT, pArmsband->getItemID(), SlotID, 0); // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pArmsband->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } } // end of if (pArmsbandInventory->canAdding(SlotID, 0, pItem)) } // if (pCreature->isOusters()) // QuickSlot에 넣는 것을 실패 하였을때 실패 패킷을 날린다. if (!Success) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); } #endif // __GAME_SERVER__ __END_DEBUG_EX __END_CATCH }
void ActionSearchMotorcycle::execute (Creature * pCreature1 , Creature* pCreature2) throw(Error) { __BEGIN_TRY Assert(pCreature1 != NULL); Assert(pCreature2 != NULL); Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); // 일단 클라이언트를 위해 ok패킷을 하나 날려주고... GCNPCResponse answerOKpkt; pPlayer->sendPacket(&answerOKpkt); // 플레이어가 슬레이어인지 검사한다. if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature2); Inventory* pInventory = pSlayer->getInventory(); uint InvenWidth = pInventory->getWidth(); uint InvenHeight = pInventory->getHeight(); Item* pItem = NULL; uint motorZoneID = 0; uint motorX = 0; uint motorY = 0; Inventory* pBeltInventory = NULL; uint BeltInvenWidth = 0; uint BeltInvenHeight = 0; Item* pBelt = NULL; pBelt = pSlayer->getWearItem(Slayer::WEAR_BELT); if(pBelt != NULL) { pBeltInventory = ((Belt*)pBelt)->getInventory(); BeltInvenWidth = pBeltInventory->getWidth(); BeltInvenHeight = pBeltInventory->getHeight(); } // 인벤토리를 검색한다. for (uint y=0; y<InvenHeight; y++) { for (uint x=0; x<InvenWidth; x++) { // x, y에 아이템이 있다면... if (pInventory->hasItem(x, y)) { pItem = pInventory->getItem(x, y); if (search(pItem, motorZoneID, motorX, motorY)) { GCSearchMotorcycleOK okpkt; okpkt.setZoneID(motorZoneID); okpkt.setX(motorX); okpkt.setY(motorY); pPlayer->sendPacket(&okpkt); return; } } } } if(pBelt != NULL) { // 인벤토리를 검색한다. for (uint y=0; y<BeltInvenHeight; y++) { for (uint x=0; x<BeltInvenWidth; x++) { // x, y에 아이템이 있다면... if (pBeltInventory->hasItem(x, y)) { pItem = pBeltInventory->getItem(x, y); if (search(pItem, motorZoneID, motorX, motorY)) { GCSearchMotorcycleOK okpkt; okpkt.setZoneID(motorZoneID); okpkt.setX(motorX); okpkt.setY(motorY); pPlayer->sendPacket(&okpkt); return; } } } } } } else // 뱀파이어라면...오토바이를 찾아줄 이유가 있을까? { } GCSearchMotorcycleFail failpkt; pPlayer->sendPacket(&failpkt); __END_CATCH }
////////////////////////////////////////////////////////////////////////////// // 모든 아이템 수리하기 ////////////////////////////////////////////////////////////////////////////// void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket , Player* pPlayer) throw(ProtocolException , Error) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ Creature* pPC = dynamic_cast<GamePlayer*>(pPlayer)->getCreature(); Price_t repairPrice = 0; GCNPCResponse response; bool bSendRealWearingInfo = false; if (pPC->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pPC); // 모든 아이템을 합한 수리비를 계산한다. for (int i=0; i<Slayer::WEAR_MAX; i++) { Item* pItem = pSlayer->getWearItem((Slayer::WearPart)i); if (pItem != NULL) { if (i == Slayer::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 오른손이고, 현재 들고 있는 무기가 양손 무기라면... // 수리 가격에 포함시킬 필요가 없다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } // 돈이 모자라다면 리턴한다. if (pSlayer->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i=0; i<Slayer::WEAR_MAX; i++) { Item* pItem = pSlayer->getWearItem((Slayer::WearPart)i); if (pItem != NULL) { if (i == Slayer::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 오른손이고, 현재 들고 있는 무기가 양손 무기라면... // 수리할 필요가 없다. } else if (isRepairableItem(pItem ) ) { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { // DB 쿼리를 줄이기 위해서 // 내구도의 변화가 생긴 경우에만 세이브한다. //pItem->save(pSlayer->getName(), STORAGE_GEAR, 0, i, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } if (oldDurability == 0 ) bSendRealWearingInfo = true; } } } // 돈을 줄이고... //pSlayer->setGoldEx(pSlayer->getGold() - repairPrice); // by sigi.2002.9.4 pSlayer->decreaseGoldEx(repairPrice); // 로그를 남긴다. //log(LOG_REPAIR_ITEM, pSlayer->getName(), "", "ALL"); // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pSlayer->getGold()); pPlayer->sendPacket(&response); } else if (pPC->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pPC); // 모든 아이템을 합한 수리비를 계산한다. for (int i=0; i<Vampire::VAMPIRE_WEAR_MAX; i++) { Item* pItem = pVampire->getWearItem((Vampire::WearPart)i); if (pItem != NULL) { if (i == Vampire::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 양손무기는 한쪽만 수리한다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } // 돈이 모자라다면 리턴한다. if (pVampire->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i=0; i<Vampire::VAMPIRE_WEAR_MAX; i++) { Item* pItem = pVampire->getWearItem((Vampire::WearPart)i); if (pItem != NULL) { if (i == Vampire::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 양손무기는 한쪽만 수리한다. } else { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { // DB 쿼리를 줄이기 위해서 // 내구도의 변화가 생긴 경우에만 세이브한다. //pItem->save(pVampire->getName(), STORAGE_GEAR, 0, i, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } if (oldDurability == 0 ) bSendRealWearingInfo = true; } } } // 돈을 줄이고... //pVampire->setGoldEx(pVampire->getGold() - repairPrice); // by sigi.2002.9.4 pVampire->decreaseGoldEx(repairPrice); // 로그를 남긴다. //log(LOG_REPAIR_ITEM, pVampire->getName(), "", "ALL"); // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pVampire->getGold()); pPlayer->sendPacket(&response); } else if (pPC->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pPC); // 모든 아이템을 합한 수리비를 계산한다. for (int i=0; i<Ousters::OUSTERS_WEAR_MAX; i++) { Item* pItem = pOusters->getWearItem((Ousters::WearPart)i); if (pItem != NULL) { if (i == Ousters::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 양손무기는 한쪽만 수리한다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } // 돈이 모자라다면 리턴한다. if (pOusters->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i=0; i<Ousters::OUSTERS_WEAR_MAX; i++) { Item* pItem = pOusters->getWearItem((Ousters::WearPart)i); if (pItem != NULL) { if (i == Ousters::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { // 양손무기는 한쪽만 수리한다. } else { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { // DB 쿼리를 줄이기 위해서 // 내구도의 변화가 생긴 경우에만 세이브한다. //pItem->save(pOusters->getName(), STORAGE_GEAR, 0, i, 0); // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } if (oldDurability == 0 ) bSendRealWearingInfo = true; } } } // 돈을 줄이고... //pOusters->setGoldEx(pOusters->getGold() - repairPrice); // by sigi.2002.9.4 pOusters->decreaseGoldEx(repairPrice); // 로그를 남긴다. //log(LOG_REPAIR_ITEM, pOusters->getName(), "", "ALL"); // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pOusters->getGold()); pPlayer->sendPacket(&response); } if (bSendRealWearingInfo ) { if (pPC->isSlayer() ) { Slayer* pSlayer = dynamic_cast<Slayer*>(pPC); Assert(pSlayer != NULL); pSlayer->initAllStatAndSend(); pSlayer->sendRealWearingInfo(); } else if (pPC->isVampire() ) { Vampire* pVampire = dynamic_cast<Vampire*>(pPC); Assert(pVampire != NULL); pVampire->initAllStatAndSend(); pVampire->sendRealWearingInfo(); } else if (pPC->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pPC); Assert(pOusters != NULL); pOusters->initAllStatAndSend(); pOusters->sendRealWearingInfo(); } } #endif __END_DEBUG_EX __END_CATCH }