private void CheckPlayersInRange() { if (Spacemap == null) { return; } HashSet <int> updated = new HashSet <int>(); lock (_checkPlayersInRange) { foreach (var entity in Spacemap.InRange(this)) { if (!_renderedPlayers.Contains(entity.ID)) { EntityAddedToMap(entity); } updated.Add(entity.ID); } foreach (int id in _renderedPlayers) { if (!updated.Contains(id)) { EntityRemovedFromMap(id); } } } _renderedPlayers = updated; }
public void EntitesInRange(Action <EntityControllerBase> handler) { if (Spacemap != null) { foreach (var entity in Spacemap.InRange(this)) { handler(entity); } } }
public void Handle() { if (Activated && !_detonated) { _detonated = true; foreach (var entity in Spacemap.InRange(Position, 1000).ToList()) { if (!(entity is PlayerController playerController)) { continue; } if (playerController.TryRemoveMine(this)) { playerController.Send(Explode()); } else { playerController.Send(Render(), Explode()); } if (playerController.MovementAssembly.ActualPosition().DistanceTo(Position) <= 300 * RadiusBoost) { if (!playerController.EffectsAssembly.HasProtection && !playerController.SpecialItemsAssembly.IsInvicible) { if (Item.ID == Mine.ACM_01.ID) { double damage = playerController.HangarAssembly.Hitpoints * 0.2 * DamageBoost; int shieldDamage = Math.Abs(playerController.HangarAssembly.ChangeShield(-(int)(damage * playerController.BoosterAssembly.Get(BoosterType.SHIELD_ABSORBATION)), false)); int hitpointsDamage = Math.Abs(playerController.HangarAssembly.ChangeHitpoints(-(int)(damage - shieldDamage), false)); playerController.AttackTraceAssembly.LogAttack(Owner, shieldDamage, hitpointsDamage, false); playerController.HangarAssembly.CheckDeath(); ICommand damageCommand = PacketBuilder.AttackCommand(Owner, playerController, AttackTypeModule.MINE, shieldDamage + hitpointsDamage); playerController.Send(damageCommand); playerController.EntitiesLocked(x => x.Send(damageCommand)); } else if (Item.ID == Mine.DDM_01.ID) { int damage = Math.Abs(playerController.HangarAssembly.ChangeHitpoints(-(int)(playerController.HangarAssembly.MaxHitpoints * 0.2 * DamageBoost), false)); playerController.AttackTraceAssembly.LogAttack(Owner, 0, damage, false); playerController.HangarAssembly.CheckDeath(); ICommand damageCommand = PacketBuilder.AttackCommand(Owner, playerController, AttackTypeModule.MINE, damage); playerController.Send(damageCommand); playerController.EntitiesLocked(x => x.Send(damageCommand)); } else if (Item.ID == Mine.IM_01.ID) { playerController.PlayerEffectsAssembly.Infect(15 * 60000); double damage = playerController.HangarAssembly.Hitpoints * 0.2 * DamageBoost; int shieldDamage = Math.Abs(playerController.HangarAssembly.ChangeShield(-(int)(damage * playerController.BoosterAssembly.Get(BoosterType.SHIELD_ABSORBATION)), false)); int hitpointsDamage = Math.Abs(playerController.HangarAssembly.ChangeHitpoints(-(int)(damage - shieldDamage), false)); playerController.AttackTraceAssembly.LogAttack(Owner, shieldDamage, hitpointsDamage, false); playerController.HangarAssembly.CheckDeath(); ICommand damageCommand = PacketBuilder.AttackCommand(Owner, playerController, AttackTypeModule.MINE, shieldDamage + hitpointsDamage); playerController.Send(damageCommand); playerController.EntitiesLocked(x => x.Send(damageCommand)); } else if (Item.ID == Mine.SABM_01.ID) { int damage = Math.Abs(playerController.HangarAssembly.ChangeShield(-(int)(playerController.HangarAssembly.Shield * 0.5 * DamageBoost), false)); playerController.AttackTraceAssembly.LogAttack(Owner, damage, 0, false); ICommand damageCommand = PacketBuilder.AttackCommand(Owner, playerController, AttackTypeModule.MINE, damage); playerController.Send(damageCommand); playerController.EntitiesLocked(x => x.Send(damageCommand)); } else if (Item.ID == Mine.SLM_01.ID) { playerController.EffectsAssembly.SlowMine(3000); } } if (Item.ID == Mine.EMPM_01.ID) { playerController.EffectsAssembly.UnCloak(); } } } Spacemap.Remove(this); } }