public override async void Die()
        {
            Lock(null);
            EntitiesLockedSafe(x => {
                if (x.ID == AttackTraceAssembly.CurrentMainAttacker &&
                    x is PlayerController killer)
                {
                    killer.PlayerItemsAssembly.ChangeUridium(5000);
                    killer.PlayerItemsAssembly.ChangeExperience(500 * 1024, false, true);
                    killer.PlayerItemsAssembly.ChangeHonor(5000);
                }

                if (x.Locked != null && x.Locked.ID == ID)
                {
                    x.Lock(null);
                }
            });

            ICommand killCommand = PacketBuilder.KillCommand(this);

            EntitesInRange(x => x.Send(killCommand));
            Spacemap?.Remove(this); // remove from spacemap

            TimerStop();

            await Task.Delay(3000);

            new NpcController(ID + 1, "Ehrenhaftes NPC " + (ID + 1), Faction.NONE);
        }
        public override void Dispose()
        {
            if (_disposed || !(_disposed = true))
            {
                return;
            }

            Lock(null);
            Spacemap?.Remove(this);

            GameManager.Remove(ID);
            UpdateState();

            base.Dispose();
            Connection?.Dispose(false);
            _logger.LogInformation($"['{Account.Username}'] unloaded!");
        }
        public override void Die()
        {
            PlayerEffectsAssembly.CureInfection(true);
            MovementAssembly.Move(MovementAssembly.ActualPosition(), MovementAssembly.ActualPosition());

            Lock(null);
            EntitiesLockedSafe(x => {
                if (x.Locked != null && x.Locked.ID == ID)
                {
                    x.Lock(null);
                }
            });

            ICommand killCommand = PacketBuilder.KillCommand(this);

            GameManager.Get(AttackTraceAssembly.CurrentMainAttacker, out PlayerController killer);
            Send(killCommand, PacketBuilder.KillScreen.KillScreenCommand(DestructionTypeModule.PLAYER, killer));
            // send kill screen

            EntitesInRange(x => {
                if (x.ID == AttackTraceAssembly.CurrentMainAttacker)   // killer
                                                                       // render rewards etc.
                {
                    x.Send(
                        killCommand,
                        PacketBuilder.Legacy("0|A|STD|You killed " + Account.Username + "!")
                        );
                }
                else
                {
                    x.Send(killCommand);
                }
            });

            AttackTraceAssembly.Reset();
            Spacemap?.Remove(this); // remove from spacemap
            TimerStop();
        }
예제 #4
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);
            }
        }