Core/Objects: Implemented vignettes

Port From (https://github.com/TrinityCore/TrinityCore/commit/fccf6fb72b60b08dfbe6d5fb17fba55239944fca)
This commit is contained in:
hondacrx
2024-03-13 21:09:46 -04:00
parent 2c008b2b70
commit 4b9b81c7e2
21 changed files with 573 additions and 10 deletions
+16
View File
@@ -230,6 +230,22 @@ namespace Game.Entities
UpdateCriteria(CriteriaType.EnterTopLevelArea, newZone);
UpdateCriteria(CriteriaType.LeaveTopLevelArea, oldZone);
VignetteUpdate vignetteUpdate = new();
foreach (var vignette in GetMap().GetInfiniteAOIVignettes())
{
if (!vignette.Data.GetFlags().HasFlag(VignetteFlags.ZoneInfiniteAOI))
continue;
if (vignette.ZoneID == newZone && Vignettes.CanSee(this, vignette))
vignette.FillPacket(vignetteUpdate.Added);
else if (vignette.ZoneID == oldZone)
vignetteUpdate.Removed.Add(vignette.Guid);
}
if (!vignetteUpdate.Added.IDs.Empty() || !vignetteUpdate.Removed.Empty())
SendPacket(vignetteUpdate);
}
}
+51 -7
View File
@@ -5644,6 +5644,17 @@ namespace Game.Entities
{
UpdateVisibilityForPlayer();
// Send map wide vignettes before UpdateZone, that will send zone wide vignettes
// But first send on new map will wipe all vignettes on client
VignetteUpdate vignetteUpdate = new();
vignetteUpdate.ForceUpdate = true;
foreach (VignetteData vignette in GetMap().GetInfiniteAOIVignettes())
if (!vignette.Data.GetFlags().HasFlag(VignetteFlags.ZoneInfiniteAOI) && Vignettes.CanSee(this, vignette))
vignette.FillPacket(vignetteUpdate.Added);
SendPacket(vignetteUpdate);
// update zone
uint newzone, newarea;
GetZoneAndAreaId(out newzone, out newarea);
@@ -6034,13 +6045,23 @@ namespace Game.Entities
}
#region Sends / Updates
void BeforeVisibilityDestroy(WorldObject obj, Player p)
void BeforeVisibilityDestroy(WorldObject t, Player p)
{
if (!obj.IsTypeId(TypeId.Unit))
return;
var creature = t.ToCreature();
if (creature != null)
if (p.GetPetGUID() == creature.GetGUID() && creature.IsPet())
creature.ToPet().Remove(PetSaveMode.NotInSlot, true);
if (p.GetPetGUID() == obj.GetGUID() && obj.ToCreature().IsPet())
((Pet)obj).Remove(PetSaveMode.NotInSlot, true);
VignetteData vignette = t.GetVignette();
if (vignette != null)
{
if (!vignette.Data.IsInfiniteAOI())
{
VignetteUpdate vignetteUpdate = new();
vignetteUpdate.Removed.Add(vignette.Guid);
p.SendPacket(vignetteUpdate);
}
}
}
public void UpdateVisibilityOf(ICollection<WorldObject> targets)
@@ -6103,8 +6124,7 @@ namespace Game.Entities
{
if (!CanSeeOrDetect(target, false, true))
{
if (target.IsTypeId(TypeId.Unit))
BeforeVisibilityDestroy(target.ToCreature(), this);
BeforeVisibilityDestroy(target, this);
if (!target.IsDestroyedObject())
target.SendOutOfRangeForPlayer(this);
@@ -6158,6 +6178,16 @@ namespace Game.Entities
public void SendInitialVisiblePackets(WorldObject target)
{
var sendVignette = (VignetteData vignette, Player where) =>
{
if (!vignette.Data.IsInfiniteAOI() && Vignettes.CanSee(where, vignette))
{
VignetteUpdate vignetteUpdate = new();
vignette.FillPacket(vignetteUpdate.Added);
where.SendPacket(vignetteUpdate);
}
};
Unit targetUnit = target.ToUnit();
if (targetUnit != null)
{
@@ -6167,6 +6197,20 @@ namespace Game.Entities
if (targetUnit.HasUnitState(UnitState.MeleeAttacking) && targetUnit.GetVictim() != null)
targetUnit.SendMeleeAttackStart(targetUnit.GetVictim());
}
VignetteData vignette = targetUnit.GetVignette();
if (vignette != null)
sendVignette(vignette, this);
}
else
{
GameObject targetGo = target.ToGameObject();
if (targetGo != null)
{
VignetteData vignette = targetGo.GetVignette();
if (vignette != null)
sendVignette(vignette, this);
}
}
}