bool CPolymorphUtils::UpdateBookPracticeGrade(LPCHARACTER pChar, LPITEM pItem) { if (pChar == NULL || pItem == NULL) return false; if (pItem->GetSocket(1) > 0) pItem->SetSocket(1, pItem->GetSocket(1) - 1); else pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑서 수련을 마첬습니다. 신선에게 찾아가세요.")); return true; }
bool CPolymorphUtils::UpdateBookPracticeGrade(LPCHARACTER pChar, LPITEM pItem) { if (pChar == NULL || pItem == NULL) return false; if (pItem->GetSocket(1) > 0) pItem->SetSocket(1, pItem->GetSocket(1) - 1); else pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µР°©ј јц·ГА» ё¶ГєЅАґПґЩ. ЅЕј±їЎ°Ф ГЈѕЖ°Ўјјїд.")); return true; }
bool CPolymorphUtils::BookUpgrade(LPCHARACTER pChar, LPITEM pItem) { if (pChar == NULL || pItem == NULL) return false; pItem->SetSocket(1, pItem->GetSocket(2) * 50); pItem->SetSocket(2, pItem->GetSocket(2)+1); return true; }
bool DSManager::IsTimeLeftDragonSoul(LPITEM pItem) const { if (pItem == NULL) return false; // АПґЬАє timer based on wearАО їлИҐј®ёё ЅГ°Ј ґЩ µЗѕоµµ ѕИ ѕшѕоБшґЩ. if (pItem->GetProto()->cLimitTimerBasedOnWearIndex >= 0) { return pItem->GetSocket(ITEM_SOCKET_REMAIN_SEC) > 0; } // ґЩёҐ limit typeАО їлИҐј®µйАє ЅГ°Ј µЗёй ёрµО »з¶уБц±в ¶§№®їЎ ї©±в µйѕоїВ ѕЖАМЕЫАє АПґЬ ЅГ°ЈАМ іІѕТґЩ°н ЖЗґЬ. else { return true; } }
bool DSManager::IsTimeLeftDragonSoul(LPITEM pItem) const { if (pItem == NULL) return false; // 일단은 timer based on wear인 용혼석만 시간 다 되어도 안 없어진다. if (pItem->GetProto()->cLimitTimerBasedOnWearIndex >= 0) { return pItem->GetSocket(ITEM_SOCKET_REMAIN_SEC) > 0; } // 다른 limit type인 용혼석들은 시간 되면 모두 사라지기 때문에 여기 들어온 아이템은 일단 시간이 남았다고 판단. else { return true; } }
bool CPolymorphUtils::PolymorphCharacter(LPCHARACTER pChar, LPITEM pItem, const CMob* pMob) { BYTE bySkillLevel = pChar->GetSkillLevel(POLYMORPH_SKILL_ID); DWORD dwDuration = 0; DWORD dwBonusPercent = 0; int iPolyPercent = 0; switch (pChar->GetSkillMasterType(POLYMORPH_SKILL_ID)) { case SKILL_NORMAL: dwDuration = 10; break; case SKILL_MASTER: dwDuration = 15; break; case SKILL_GRAND_MASTER: dwDuration = 20; break; case SKILL_PERFECT_MASTER: dwDuration = 25; break; default: return false; } // dwDuration *= 60; // 변신 확률 = 캐릭터 레벨 - 몹 레벨 + 둔갑서 레벨 + 29 + 둔갑 스킬 레벨 iPolyPercent = pChar->GetLevel() - pMob->m_table.bLevel + pItem->GetSocket(2) + (29 + bySkillLevel); if (iPolyPercent <= 0) { pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑에 실패 하였습니다")); return false; } else { if (number(1, 100) > iPolyPercent) { pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑에 실패 하였습니다")); return false; } } pChar->AddAffect(AFFECT_POLYMORPH, POINT_POLYMORPH, pMob->m_table.dwVnum, AFF_POLYMORPH, dwDuration, 0, true); // 변신 보너스 = 둔갑 스킬 레벨 + 둔갑서 레벨 dwBonusPercent = bySkillLevel + pItem->GetSocket(2); switch (GetBonusType(pMob->m_table.dwVnum)) { case POLYMORPH_ATK_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_ATT_BONUS, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; case POLYMORPH_DEF_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_DEF_BONUS, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; case POLYMORPH_SPD_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_MOV_SPEED, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; default: case POLYMORPH_NO_BONUS: break; } return true; }
bool DSManager::IsActiveDragonSoul(LPITEM pItem) const { return pItem->GetSocket(ITEM_SOCKET_DRAGON_SOUL_ACTIVE_IDX); }
bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count) { LPITEM item; int max_position = 5 * m_iSize; if (bCell >= max_position || bDestCell >= max_position) return false; if (!(item = GetItem(bCell))) return false; if (item->IsExchanging()) return false; if (item->GetCount() < count) return false; { LPITEM item2; if ((item2 = GetItem(bDestCell)) && item != item2 && item2->IsStackable() && !IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_STACK) && item2->GetVnum() == item->GetVnum()) // 합칠 수 있는 아이템의 경우 { for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i) if (item2->GetSocket(i) != item->GetSocket(i)) return false; if (count == 0) count = item->GetCount(); count = MIN(200 - item2->GetCount(), count); if (item->GetCount() >= count) Remove(bCell); item->SetCount(item->GetCount() - count); item2->SetCount(item2->GetCount() + count); sys_log(1, "SAFEBOX: STACK %s %d -> %d %s count %d", m_pkChrOwner->GetName(), bCell, bDestCell, item2->GetName(), item2->GetCount()); return true; } if (!IsEmpty(bDestCell, item->GetSize())) return false; m_pkGrid->Get(bCell, 1, item->GetSize()); if (!m_pkGrid->Put(bDestCell, 1, item->GetSize())) { m_pkGrid->Put(bCell, 1, item->GetSize()); return false; } else { m_pkGrid->Get(bDestCell, 1, item->GetSize()); m_pkGrid->Put(bCell, 1, item->GetSize()); } sys_log(1, "SAFEBOX: MOVE %s %d -> %d %s count %d", m_pkChrOwner->GetName(), bCell, bDestCell, item->GetName(), item->GetCount()); Remove(bCell); Add(bDestCell, item); } return true; }