All characters and animals have a certain field of view, divided into 2 zones: Full and Partial.
Full - near character/animal. Other characters/animals are definitely visible there.
Partial - after it. The visibility of the characters/animals located there depends on their stealth.
No one is visible outside the zones.
The size of the zones depends on the characteristics of the character, on the level of illumination (day / night / cave), on the type of biome on which the character is located (in the steppe it is seen better than in the forest). And, preferably, from blocking objects, such as buildings, cliffs, if this does not heavily load the server processor. Let's say a blocking object completely covers the Full Zone, leaving only a Partial one. If a character / animal is targeted (for attack), it is always visible, even in the Partial Zone.
To change the ratio of visibility zones can bring interesting effects. So, for example, being near a fire (fire, torch in hand) at night or in a cave, you can expand the Full Visibility Zone, but greatly reduce the Partial, so that the total zone becomes even smaller. A high Marksmanship value can also affect the ratio of zones, as archers should be better able to notice objects in the distance.
The modifier of stealth, in addition to the classic Intelligence*Stealth, can be the speed of movement of the character/animal, as well as on what land he is. The forest gives a small bonus to stealth, and speed other than 0 adds penalties.
All calculations should take place on the server side and return information to clients only about visible characters/animals.
At the first stage, you do not need to change the visibility of static objects such as trees, buildings, grass. Let this change only affect characters and animals.
An additional option 1: if the object is not visible in the Partial Zone, but the difference between Attention and Stealth is not significant, you can return to the client the area (center and radius) within which the object is randomly located and draw it as a "sound wave" in that place. There is someone there, but it is not clear exactly who and where.
An additional option 2: conversation bubbles that are used in local chat can be drawn in the same way as now, even outside of both zones. This will allow you to "call" and "go to the call."