void EffectChargingPower::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectChargingPower" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); pCreature->removeFlag(Effect::EFFECT_CLASS_CHARGING_POWER); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CHARGING_POWER); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); //cout << "EffectChargingPower" << "unaffect END" << endl; __END_DEBUG __END_CATCH }
void EffectPotentialExplosion::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG //cout << "EffectPotentialExplosion " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); Assert(pCreature->isSlayer()); pCreature->removeFlag(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); GCOtherModifyInfo gcOtherModifyInfo; makeGCOtherModifyInfo(&gcOtherModifyInfo, pSlayer, &prev); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcOtherModifyInfo, pSlayer); //cout << "EffectPotentialExplosion " << "unaffect END" << endl; __END_DEBUG __END_CATCH }
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 EffectAlignmentRecovery::unaffect(Creature* pCreature) throw(Error) { __BEGIN_TRY Assert(pCreature != NULL); if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Assert(pSlayer != NULL); Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); if (m_Period != 0) { // 한 턴에 얼마나 회복 시킬 것인가. Alignment_t CurrentAlignment = pSlayer->getAlignment(); Alignment_t NewAlignment = min(10000, (int)(CurrentAlignment + m_AlignmentQuantity* m_Period)); pSlayer->setAlignment(NewAlignment); WORD AlignmentSaveCount = pSlayer->getAlignmentSaveCount(); if (AlignmentSaveCount == 10) { StringStream msg; msg << "Alignment = " << NewAlignment; pSlayer->tinysave(msg.toString()); AlignmentSaveCount = 0; } else AlignmentSaveCount++; pSlayer->setAlignmentSaveCount(AlignmentSaveCount); } // 현재 Alignment를 브로드캐스팅한다. // 이제 회복이 끝났나는 것을 알리도록 한다. // 자신에게 먼저 GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_ALIGNMENT, pSlayer->getAlignment()); pSlayer->getPlayer()->sendPacket(&gcModifyInformation); // 주변사람에게도 무언가를 날려줘야 한다. // 패킷을 새로 만들어야겠지.. pSlayer->removeFlag(Effect::EFFECT_CLASS_ALIGNMENT_RECOVERY); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); //Zone* pZone = pVampire->getZone(); if (m_Period != 0) { // 한 턴에 얼마나 회복 시킬 것인가. Alignment_t CurrentAlignment = pVampire->getAlignment(); Alignment_t NewAlignment = min(10000, (int)(CurrentAlignment + m_AlignmentQuantity* m_Period)); WORD AlignmentSaveCount = pVampire->getAlignmentSaveCount(); if (AlignmentSaveCount == 10) { StringStream msg; msg << "Alignment = " << NewAlignment; pVampire->tinysave(msg.toString()); AlignmentSaveCount = 0; } else AlignmentSaveCount++; pVampire->setAlignmentSaveCount(AlignmentSaveCount); } // 현재 Alignment를 브로드캐스팅한다. // 이제 회복이 끝났나는 것을 알리도록 한다. // 자신에게 먼저 GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_ALIGNMENT, pVampire->getAlignment()); pVampire->getPlayer()->sendPacket(&gcModifyInformation); // 주변사람에게도.. pVampire->removeFlag(Effect::EFFECT_CLASS_ALIGNMENT_RECOVERY); } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); //Zone* pZone = pOusters->getZone(); if (m_Period != 0) { // 한 턴에 얼마나 회복 시킬 것인가. Alignment_t CurrentAlignment = pOusters->getAlignment(); Alignment_t NewAlignment = min(10000, (int)(CurrentAlignment + m_AlignmentQuantity* m_Period)); WORD AlignmentSaveCount = pOusters->getAlignmentSaveCount(); if (AlignmentSaveCount == 10) { StringStream msg; msg << "Alignment = " << NewAlignment; pOusters->tinysave(msg.toString()); AlignmentSaveCount = 0; } else AlignmentSaveCount++; pOusters->setAlignmentSaveCount(AlignmentSaveCount); } // 현재 Alignment를 브로드캐스팅한다. // 이제 회복이 끝났나는 것을 알리도록 한다. // 자신에게 먼저 GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_ALIGNMENT, pOusters->getAlignment()); pOusters->getPlayer()->sendPacket(&gcModifyInformation); // 주변사람에게도.. pOusters->removeFlag(Effect::EFFECT_CLASS_ALIGNMENT_RECOVERY); } __END_CATCH }