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);
         }
     }
 }
Example #3
0
        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);
            }
        }