bool CheckFisherLuck(CCharEntity* PChar) { if (PChar->UContainer->GetType() != UCONTAINER_EMPTY) { ShowDebug(CL_CYAN"Player cannot fish! UContainer is not empty\n" CL_RESET); return false; } CItemFish* PFish = nullptr; CItemWeapon* WeaponItem = nullptr; WeaponItem = (CItemWeapon*)PChar->getEquip(SLOT_RANGED); DSP_DEBUG_BREAK_IF(WeaponItem == nullptr); DSP_DEBUG_BREAK_IF(WeaponItem->isType(ITEM_WEAPON) == false); DSP_DEBUG_BREAK_IF(WeaponItem->getSkillType() != SKILL_FSH); uint16 RodID = WeaponItem->getID(); WeaponItem = (CItemWeapon*)PChar->getEquip(SLOT_AMMO); DSP_DEBUG_BREAK_IF(WeaponItem == nullptr); DSP_DEBUG_BREAK_IF(WeaponItem->isType(ITEM_WEAPON) == false); DSP_DEBUG_BREAK_IF(WeaponItem->getSkillType() != SKILL_FSH); uint16 LureID = WeaponItem->getID(); int32 FishingChance = WELL512::irand()%100; if (FishingChance <= 20) { const int8* Query = "SELECT " "fish.fishid," // 0 "fish.max," // 1 "fish.watertype," // 2 "fish.size," // 3 "fish.stamina," // 4 "fish.log," // 5 "fish.quest," // 6 "rod.flag " // 7 "FROM fishing_zone AS zone " "INNER JOIN fishing_rod AS rod USING (fishid) " "INNER JOIN fishing_lure AS lure USING (fishid) " "INNER JOIN fishing_fish AS fish USING (fishid) " "WHERE zone.zoneid = %u AND rod.rodid = %u AND lure.lureid = %u AND lure.luck = 0"; int32 ret = Sql_Query(SqlHandle, Query, PChar->getZone(), RodID, LureID); if( ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0) { while(Sql_NextRow(SqlHandle) == SQL_SUCCESS) { // ловля предметов, необходимых для поисков uint8 logid = (uint8)Sql_GetIntData(SqlHandle,5); uint8 quest = (uint8)Sql_GetIntData(SqlHandle,6); if(logid < MAX_QUESTAREA && quest < MAX_QUESTID) { uint8 current = PChar->m_questLog[logid].current [quest/8] & (1 << (quest % 8)); uint8 complete = PChar->m_questLog[logid].complete[quest/8] & (1 << (quest % 8)); if (complete == 0 && current != 0) { PFish = new CItemFish(*itemutils::GetItemPointer(Sql_GetIntData(SqlHandle,0))); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); break; } } // TODO: ловля простых предметов } } } else { const int8* Query = "SELECT " "fish.fishid," // 0 "fish.min," // 1 "fish.max," // 2 "fish.size," // 3 "fish.stamina," // 4 "fish.watertype," // 5 "rod.flag, " // 6 "lure.luck " // 7 "FROM fishing_zone AS zone " "INNER JOIN fishing_rod AS rod USING (fishid) " "INNER JOIN fishing_lure AS lure USING (fishid) " "INNER JOIN fishing_fish AS fish USING (fishid) " "WHERE zone.zoneid = %u AND rod.rodid = %u AND lure.lureid = %u AND lure.luck != 0 " "ORDER BY luck"; int32 ret = Sql_Query(SqlHandle, Query, PChar->getZone(), RodID, LureID); if( ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0) { int32 FisherLuck = 0; int32 FishingChance = WELL512::irand()%1000; while(Sql_NextRow(SqlHandle) == SQL_SUCCESS) { FisherLuck += Sql_GetIntData(SqlHandle,7); if (FishingChance <= FisherLuck) { PFish = new CItemFish(*itemutils::GetItemPointer(Sql_GetIntData(SqlHandle,0))); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); break; } } } } return (PFish != nullptr); }
bool CheckFisherLuck(CCharEntity* PChar) { if (PChar->UContainer->GetType() != UCONTAINER_EMPTY) { ShowDebug(CL_CYAN"Player cannot fish! UContainer is not empty\n" CL_RESET); return false; } CItemFish* PFish = NULL; CItemWeapon* WeaponItem = NULL; WeaponItem = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_RANGED]); DSP_DEBUG_BREAK_IF(WeaponItem == NULL); DSP_DEBUG_BREAK_IF(WeaponItem->isType(ITEM_WEAPON) == false); DSP_DEBUG_BREAK_IF(WeaponItem->getSkillType() != SKILL_FSH); uint16 RodID = WeaponItem->getID(); WeaponItem = (CItemWeapon*)PChar->getStorage(LOC_INVENTORY)->GetItem(PChar->equip[SLOT_AMMO]); DSP_DEBUG_BREAK_IF(WeaponItem == NULL); DSP_DEBUG_BREAK_IF(WeaponItem->isType(ITEM_WEAPON) == false); DSP_DEBUG_BREAK_IF(WeaponItem->getSkillType() != SKILL_FSH); uint16 LureID = WeaponItem->getID(); int FishingChance = rand() % 100; int ListID = GridList(PChar); if (ListID == 0) { ShowDebug(CL_CYAN"Fish list not found for Zone: %u \n" CL_RESET, PChar->getZone()); } if (ListID > 0 && FishingChance <= 50) { const int8* Query = "SELECT ListID, EntityID \ FROM fishing_list \ WHERE ListID = %u \ ORDER BY ListID ASC"; int32 ret = Sql_Query(SqlHandle, Query, ListID); int RC = 0; // this will pick a random number from range 1 to max record count int RID = rand() % Sql_NumRows(SqlHandle) + 1; if (ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0) { while (Sql_NextRow(SqlHandle) == SQL_SUCCESS) { RC = RC + 1; uint32 EntityID = Sql_GetIntData(SqlHandle, 1); if (RC == RID) { // Gil if (EntityID == 0x0000FFFF) { // do not change this item number this is a place holder ID for gil PFish = new CItemFish(*itemutils::GetItemPointer(14117)); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); catchtype[0] = 2; break; } // Monster if (EntityID == 0x0001046A) { GetMobInfo(PChar); if (IsSpawned(mobid[0]) == false && mobid[0] > 0) { // do not change this item number this is a place holder ID for mobs PFish = new CItemFish(*itemutils::GetItemPointer(14117)); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); break; } } if (EntityID != 0x0000FFFF || EntityID != 0x0001046A) { // get fish or item for returned record if its not a monster or gil GetOtherInfo(EntityID); // Fish if (catchtype[0] == 0) { // will create a fish entity if the bait can be used to catch the fish if (BaitCheck(LureID, EntityID) == true) { PFish = new CItemFish(*itemutils::GetItemPointer(EntityID)); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); break; } } // Item if (catchtype[0] == 1) { PFish = new CItemFish(*itemutils::GetItemPointer(EntityID)); PChar->UContainer->SetType(UCONTAINER_FISHING); PChar->UContainer->SetItem(0, PFish); break; } } } if(RC == Sql_NumRows(SqlHandle)) { break; } } } } return (PFish != NULL); }