int32_t Weapon::playerWeaponCheck(Player* player, Creature* target) const { const Position& playerPos = player->getPosition(); const Position& targetPos = target->getPosition(); if (playerPos.z != targetPos.z) { return 0; } int32_t trueRange; const ItemType& it = Item::items[getID()]; if (it.weaponType == WEAPON_AMMO) { trueRange = player->getShootRange(); } else { trueRange = range; } if (std::max<int32_t>(Position::getDistanceX(playerPos, targetPos), Position::getDistanceY(playerPos, targetPos)) > trueRange) { return 0; } if (!player->hasFlag(PlayerFlag_IgnoreWeaponCheck)) { if (!enabled) { return 0; } if (player->getMana() < getManaCost(player)) { return 0; } if (player->getPlayerInfo(PLAYERINFO_SOUL) < soul) { return 0; } if (isPremium() && !player->isPremium()) { return 0; } if (!vocWeaponMap.empty()) { if (vocWeaponMap.find(player->getVocationId()) == vocWeaponMap.end()) { return 0; } } int32_t damageModifier = 100; if (player->getLevel() < getReqLevel()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } if (player->getMagicLevel() < getReqMagLv()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } return damageModifier; } return 100; }
int32_t Weapon::playerWeaponCheck(Player* player, Creature* target, uint8_t shootRange) const { const Position& playerPos = player->getPosition(); const Position& targetPos = target->getPosition(); if (playerPos.z != targetPos.z) { return 0; } if (std::max<uint32_t>(Position::getDistanceX(playerPos, targetPos), Position::getDistanceY(playerPos, targetPos)) > shootRange) { return 0; } if (!player->hasFlag(PlayerFlag_IgnoreWeaponCheck)) { if (!enabled) { return 0; } if (player->getMana() < getManaCost(player)) { return 0; } if (player->getSoul() < soul) { return 0; } if (isPremium() && !player->isPremium()) { return 0; } if (!vocWeaponMap.empty()) { if (vocWeaponMap.find(player->getVocationId()) == vocWeaponMap.end()) { return 0; } } int32_t damageModifier = 100; if (auto chance = g_config.getNumber(ConfigManager::CRITICAL_HIT_CHANCE)) { if (boolean_random(static_cast<double>(chance) / 100.0)) { damageModifier += g_config.getNumber(ConfigManager::CRITICAL_HIT_EXTRA); std::cout << "Critical hit!" << std::endl; } } if (player->getLevel() < getReqLevel()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } if (player->getMagicLevel() < getReqMagLv()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } return damageModifier; } return 100; }
int32_t Weapon::playerWeaponCheck(Player* player, Creature* target, uint8_t shootRange) const { const Position& playerPos = player->getPosition(); const Position& targetPos = target->getPosition(); if (playerPos.z != targetPos.z) { return 0; } if (std::max<uint32_t>(Position::getDistanceX(playerPos, targetPos), Position::getDistanceY(playerPos, targetPos)) > shootRange) { return 0; } if (!player->hasFlag(PlayerFlag_IgnoreWeaponCheck)) { if (!enabled) { return 0; } if (player->getMana() < getManaCost(player)) { return 0; } if (player->getSoul() < soul) { return 0; } if (isPremium() && !player->isPremium()) { return 0; } if (!vocWeaponMap.empty()) { if (vocWeaponMap.find(player->getVocationId()) == vocWeaponMap.end()) { return 0; } } int32_t damageModifier = 100; if (player->getLevel() < getReqLevel()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } if (player->getMagicLevel() < getReqMagLv()) { damageModifier = (isWieldedUnproperly() ? damageModifier / 2 : 0); } return damageModifier; } return 100; }