fix(Core): Correct fishing catch calculations (#23171)

This commit is contained in:
grace-of-hainaut
2025-10-10 21:14:58 +01:00
committed by GitHub
parent dd1f6f776c
commit 4867510cac

View File

@@ -1731,34 +1731,40 @@ void GameObject::Use(Unit* user)
uint32 zone, subzone; uint32 zone, subzone;
GetZoneAndAreaId(zone, subzone); GetZoneAndAreaId(zone, subzone);
int32 zone_skill = sObjectMgr->GetFishingBaseSkillLevel(subzone); int32 zoneSkill = sObjectMgr->GetFishingBaseSkillLevel(subzone);
if (!zone_skill) if (!zoneSkill)
zone_skill = sObjectMgr->GetFishingBaseSkillLevel(zone); zoneSkill = sObjectMgr->GetFishingBaseSkillLevel(zone);
//provide error, no fishable zone or area should be 0 //provide error, no fishable zone or area should be 0
if (!zone_skill) if (!zoneSkill)
LOG_ERROR("sql.sql", "Fishable areaId {} are not properly defined in `skill_fishing_base_level`.", subzone); LOG_ERROR("sql.sql", "Fishable areaId {} are not properly defined in `skill_fishing_base_level`.", subzone);
int32 skill = player->GetSkillValue(SKILL_FISHING); // no miss skill is zone skill + 95 since at least patch 2.1
int32 const noMissSkill = zoneSkill + 95;
int32 const skill = player->GetSkillValue(SKILL_FISHING);
int32 chance; int32 chance;
if (skill < zone_skill) // fishing pool catches are 100%
//TODO: find reasonable value for fishing hole search
GameObject* fishingHole = LookupFishingHoleAround(20.0f + CONTACT_DISTANCE);
if (fishingHole)
chance = 100;
else if (skill < noMissSkill)
{ {
chance = int32(pow((double)skill / zone_skill, 2) * 100); chance = int32(pow((double)skill / noMissSkill, 2) * 100);
if (chance < 1) if (chance < 1)
chance = 1; chance = 1;
} }
else else
chance = 100; chance = 100;
int32 roll = irand(1, 100); int32 const roll = irand(1, 100);
LOG_DEBUG("entities.gameobject", "Fishing check (skill: {} zone min skill: {} chance {} roll: {}", skill, zone_skill, chance, roll); LOG_DEBUG("entities.gameobject", "Fishing check (skill: {} zone min skill: {} no-miss skill: {} chance {} roll: {})", skill, zoneSkill, noMissSkill, chance, roll);
if (sScriptMgr->OnPlayerUpdateFishingSkill(player, skill, zone_skill, chance, roll)) if (sScriptMgr->OnPlayerUpdateFishingSkill(player, skill, zoneSkill, chance, roll))
{
player->UpdateFishingSkill(); player->UpdateFishingSkill();
}
// but you will likely cause junk in areas that require a high fishing skill (not yet implemented) // but you will likely cause junk in areas that require a high fishing skill (not yet implemented)
if (chance >= roll) if (chance >= roll)
{ {
@@ -1768,11 +1774,10 @@ void GameObject::Use(Unit* user)
SetOwnerGUID(player->GetGUID()); SetOwnerGUID(player->GetGUID());
SetSpellId(0); // prevent removing unintended auras at Unit::RemoveGameObject SetSpellId(0); // prevent removing unintended auras at Unit::RemoveGameObject
//TODO: find reasonable value for fishing hole search // fishing pool catch
GameObject* ok = LookupFishingHoleAround(20.0f + CONTACT_DISTANCE); if (fishingHole)
if (ok)
{ {
ok->Use(player); fishingHole->Use(player);
SetLootState(GO_JUST_DEACTIVATED); SetLootState(GO_JUST_DEACTIVATED);
} }
else else