Add event for when getting whether a player can see an entity

This commit is contained in:
UnknownShadow200 2020-08-01 21:41:24 +10:00
parent ea115da1f8
commit 3be4601ee5
3 changed files with 33 additions and 11 deletions

View File

@ -95,4 +95,19 @@ namespace MCGalaxy.Events.EntityEvents {
} }
} }
} }
public delegate void OnGettingCanSeeEntity(Player p, ref bool canSee, Entity target);
/// <summary> Called when code is checking if this player can see the given entity. </summary>
/// <remarks> e.g. You can use this event to make a player invisible during a game. </remarks>
public sealed class OnGettingCanSeeEntityEvent : IEvent<OnGettingCanSeeEntity> {
public static void Call(Player p, ref bool canSee, Entity target) {
IEvent<OnGettingCanSeeEntity>[] items = handlers.Items;
// Can't use CallCommon because we need to pass arguments by ref
for (int i = 0; i < items.Length; i++) {
try { items[i].method(p, ref canSee, target); }
catch (Exception ex) { LogHandlerException(ex, items[i]); }
}
}
}
} }

View File

@ -42,6 +42,7 @@ namespace MCGalaxy.Games {
OnPlayerSpawningEvent.Register(HandlePlayerSpawning, Priority.High); OnPlayerSpawningEvent.Register(HandlePlayerSpawning, Priority.High);
OnJoinedLevelEvent.Register(HandleJoinedLevel, Priority.High); OnJoinedLevelEvent.Register(HandleJoinedLevel, Priority.High);
OnPlayerChatEvent.Register(HandlePlayerChat, Priority.High); OnPlayerChatEvent.Register(HandlePlayerChat, Priority.High);
OnGettingCanSeeEntityEvent.Register(HandleCanSeeEntity, Priority.High);
base.HookEventHandlers(); base.HookEventHandlers();
} }
@ -58,17 +59,27 @@ namespace MCGalaxy.Games {
OnPlayerSpawningEvent.Unregister(HandlePlayerSpawning); OnPlayerSpawningEvent.Unregister(HandlePlayerSpawning);
OnJoinedLevelEvent.Unregister(HandleJoinedLevel); OnJoinedLevelEvent.Unregister(HandleJoinedLevel);
OnPlayerChatEvent.Unregister(HandlePlayerChat); OnPlayerChatEvent.Unregister(HandlePlayerChat);
OnGettingCanSeeEntityEvent.Unregister(HandleCanSeeEntity);
base.UnhookEventHandlers(); base.UnhookEventHandlers();
} }
void HandleCanSeeEntity(Player p, ref bool canSee, Entity other) {
Player target = other as Player;
if (!canSee || p.Game.Referee) return;
ZSData data = TryGet(target);
if (data == null) return;
canSee = !(target.Game.Referee || data.Invisible);
}
void HandleSendingModel(Entity e, ref string model, Player dst) { void HandleSendingModel(Entity e, ref string model, Player dst) {
Player p = e as Player; Player p = e as Player;
if (p == null || !Get(p).Infected) return; if (p == null || !Get(p).Infected) return;
model = p == dst ? p.Model : Config.ZombieModel; model = p == dst ? p.Model : Config.ZombieModel;
} }
void HandleTabListEntryAdded(Entity e, ref string tabName, ref string tabGroup, Player dst) { void HandleTabListEntryAdded(Entity e, ref string tabName, ref string tabGroup, Player dst) {
Player p = e as Player; Player p = e as Player;
if (p == null || p.level != Map) return; if (p == null || p.level != Map) return;

View File

@ -20,6 +20,7 @@ using System.Threading;
using MCGalaxy.DB; using MCGalaxy.DB;
using MCGalaxy.Drawing; using MCGalaxy.Drawing;
using MCGalaxy.Events.EconomyEvents; using MCGalaxy.Events.EconomyEvents;
using MCGalaxy.Events.EntityEvents;
using MCGalaxy.Events.PlayerEvents; using MCGalaxy.Events.PlayerEvents;
using MCGalaxy.Games; using MCGalaxy.Games;
using MCGalaxy.Maths; using MCGalaxy.Maths;
@ -80,16 +81,11 @@ namespace MCGalaxy {
public override bool CanSeeEntity(Entity other) { public override bool CanSeeEntity(Entity other) {
Player target = other as Player; Player target = other as Player;
if (target == null) return true; // not a player if (other == this) return true; // always see self
if (target == this) return true; // always see self
// hidden via /hide or /ohide bool canSee = CanSee(target, Rank);
// TODO: Just use Entities.CanSee OnGettingCanSeeEntityEvent.Call(this, ref canSee, other);
if (target.hidden) return Rank >= target.hideRank; return canSee;
if (!ZSGame.Instance.Running || Game.Referee) return true;
ZSData data = ZSGame.TryGet(target);
return data == null || !(target.Game.Referee || data.Invisible);
} }
public BlockID GetHeldBlock() { public BlockID GetHeldBlock() {