示例#1
0
    private void OnEnemyDestruction(EnemyType enemyType, DestructionType destructionType)
    {
        if (destructionType == DestructionType.Shot)
        {
            switch (enemyType)
            {
            case (EnemyType.Obstacle):
                scoreOthers += 10;
                destroyedObstacles++;
                break;

            case (EnemyType.Shooter):
                scoreOthers += 30;
                destroyedShooters++;
                break;

            case (EnemyType.Charger):
                scoreOthers += 50;
                destroyedChargers++;
                break;

            case (EnemyType.Coward):
                scoreOthers += 70;
                destroyedCowards++;
                break;

            default:
                break;
            }
        }
        else if (destructionType == DestructionType.Collided)
        {
            switch (enemyType)
            {
            case (EnemyType.Obstacle):
                collidedObstacles++;
                break;

            case (EnemyType.Shooter):
                collidedShooters++;
                break;

            case (EnemyType.Charger):
                collidedChargers++;
                break;

            case (EnemyType.Coward):
                collidedCowards++;
                break;

            default:
                break;
            }
        }
    }
示例#2
0
    /// <summary>
    /// Initialisation
    /// </summary>
    /// <param name="settings"></param>
    /// <param name="target"></param>
    public void Initialize(BoidSettings settings, Transform target, Vector3Int sensitivity, SC_KoaManager koaManager, int type)
    {
        this.koaManager      = koaManager;
        destructionType      = DestructionType.none;
        curFlick             = 0;
        transform.localScale = initScale;
        this.target          = target;                                  //Peut être null
        this.settings        = settings;                                //Scriptable object
        this.sensitivity     = sensitivity;
        position             = cachedTransform.position;                //Déplacement à la position tampon
        forward = cachedTransform.forward;                              //Direction selon axe X

        float startSpeed = (settings.minSpeed + settings.maxSpeed) / 2; //Vitesse d'initialisation

        velocity              = transform.forward * startSpeed;         //Stockage de la vélocité selon la vitesse de départ
        destructionTimer      = 1f;
        curTimer              = 0;
        meshRenderer.material = baseMat;
        isActive              = true;
    }
示例#3
0
    public void DestroyBoid(DestructionType destructionType)
    {
        this.destructionType = destructionType;
        switch (destructionType)
        {
        case DestructionType.Solo:

            StartCoroutine(ImpactFrame());
            deathPos        = transform.position;
            DestructionAnim = true;

            break;


        case DestructionType.Massive:

            StartCoroutine(ImpactFrame());
            deathPos        = transform.position;
            DestructionAnim = true;

            break;
        }
    }
示例#4
0
    public void DestroyPart(float carryStress = 0f, bool useFX = true, DestructionType destructionType = DestructionType.GENERIC)
    {
        if (useFX)
        {
            bool fallbackToGeneric = false;
            switch (destructionType)
            {
            case DestructionType.GENERIC:
                fallbackToGeneric = true;
                break;

            default:
                fallbackToGeneric = true;
                break;
            }
            if (fallbackToGeneric)
            {
                if (DestroyGenericSounds)
                {
                    DestroyGenericSounds.PlayRandomSoundAtPosition(transform.position);
                }
                if (DestroyGenericParticles)
                {
                    DestroyGenericParticles.PlayRandomEffectAtPosition(transform.position, transform.eulerAngles, pfxScale);
                }
            }
        }

        while (connections.Count > 0)
        {
            DisconnectPart(connections[0].toPart, carryStress);
        }
        MultipartPhysBody body = GetBody();

        body.StartCoroutine(body.FullRecalcPhysNextFixedUpdate());
        Destroy(gameObject);
    }
示例#5
0
        public void Destroy(Attackable destroyer, DestructionType destructionType)
        {
            if (this is Spaceball || Destroyed)
            {
                return;
            }

            if (MainAttacker != null && MainAttacker is Player)
            {
                destroyer       = MainAttacker;
                destructionType = DestructionType.PLAYER;
            }

            Destroyed = true;

            var destroyCommand = ShipDestroyedCommand.write(Id, 0);

            if (this is Activatable)
            {
                GameManager.SendCommandToMap(Spacemap.Id, destroyCommand);
            }
            else if (this is Character)
            {
                SendCommandToInRangePlayers(destroyCommand);
            }

            if (this is Player player)
            {
                if (EventManager.JackpotBattle.InEvent(player))
                {
                    GameManager.SendPacketToMap(EventManager.JackpotBattle.Spacemap.Id, $"0|A|STM|msg_jackpot_players_left|%COUNT%|{(EventManager.JackpotBattle.Spacemap.Characters.Count - 1)}");
                }

                if (destroyer is Player && (destroyer as Player).Storage.KilledPlayerIds.Where(x => x == player.Id).Count() <= 13)
                {
                    (destroyer as Player).Storage.KilledPlayerIds.Add(player.Id);
                }

                player.Group?.UpdateTarget(player, new List <command_i3O> {
                    new GroupPlayerDisconnectedModule(true)
                });
                player.SkillManager.DisableAllSkills();
                player.SendCommand(destroyCommand);
                player.DisableAttack(player.Settings.InGameSettings.selectedLaser);
                player.CurrentInRangePortalId = -1;
                player.Storage.InRangeAssets.Clear();
                player.KillScreen(destroyer, destructionType);
            }
            else if (this is BattleStation battleStation)
            {
                if (destroyer.Clan.Id != 0)
                {
                    GameManager.SendPacketToAll($"0|A|STM|msg_station_destroyed_by_clan|%DESTROYER%|{destroyer.Clan.Name}|%MAP%|{Spacemap.Name}|%LOSER%|{battleStation.Clan.Name}|%STATION%|{battleStation.AsteroidName}");
                }
                else
                {
                    GameManager.SendPacketToAll($"0|A|STM|msg_station_destroyed|%MAP%|{Spacemap.Name}|%LOSER%|{battleStation.Clan.Name}|%STATION%|{battleStation.AsteroidName}");
                }

                battleStation.EquippedStationModule.Remove(battleStation.Clan.Id);
                battleStation.Clan                = GameManager.GetClan(0);
                battleStation.Name                = battleStation.AsteroidName;
                battleStation.InBuildingState     = false;
                battleStation.FactionId           = 0;
                battleStation.BuildTimeInMinutes  = 0;
                battleStation.AssetTypeId         = AssetTypeModule.ASTEROID;
                battleStation.CurrentHitPoints    = battleStation.MaxHitPoints;
                battleStation.CurrentShieldPoints = battleStation.MaxShieldPoints;

                Program.TickManager.RemoveTick(battleStation);

                //TODO check
                GameManager.SendCommandToMap(Spacemap.Id, AssetRemoveCommand.write(battleStation.GetAssetType(), battleStation.Id));
                GameManager.SendCommandToMap(Spacemap.Id, battleStation.GetAssetCreateCommand(0));

                QueryManager.BattleStations.BattleStation(battleStation);
                QueryManager.BattleStations.Modules(battleStation);
            }
            else if (this is Satellite satellite)
            {
                if (!satellite.BattleStation.Destroyed && satellite.Type != StationModuleModule.HULL && satellite.Type != StationModuleModule.DEFLECTOR)
                {
                    GameManager.SendPacketToClan($"0|A|STM|msg_station_module_destroyed|%STATION%|{satellite.BattleStation.AsteroidName}|%MAP%|{Spacemap.Name}|%MODULE%|{satellite.Name}|%LEVEL%|16", satellite.Clan.Id);
                }

                satellite.Remove(true);
                satellite.Type                = StationModuleModule.NONE;
                satellite.CurrentHitPoints    = 0;
                satellite.CurrentShieldPoints = 0;
                satellite.DesignId            = 0;

                if (satellite.BattleStation.Destroyed)
                {
                    Spacemap.Activatables.TryRemove(satellite.Id, out var activatable);
                    GameManager.SendCommandToMap(Spacemap.Id, AssetRemoveCommand.write(satellite.GetAssetType(), satellite.Id));
                }
                else if (satellite.BattleStation.AssetTypeId == AssetTypeModule.BATTLESTATION)
                {
                    GameManager.SendCommandToMap(Spacemap.Id, satellite.GetAssetCreateCommand(0));
                }

                QueryManager.BattleStations.Modules(satellite.BattleStation);
            }

            if (destroyer is Player destroyerPlayer)
            {
                int experience = 0;
                int honor      = 0;
                int uridium    = 0;
                int credits    = 0;

                bool reward     = true;
                var  changeType = ChangeType.INCREASE;

                if (this is Pet && (this as Pet).Owner == destroyerPlayer)
                {
                    changeType = ChangeType.DECREASE;
                }

                if (this is Character)
                {
                    experience = destroyerPlayer.Ship.GetExperienceBoost((this as Character).Ship.Rewards.Experience);
                    honor      = destroyerPlayer.GetHonorBoost(destroyerPlayer.Ship.GetHonorBoost((this as Character).Ship.Rewards.Honor));
                    uridium    = (this as Character).Ship.Rewards.Uridium;
                    credits    = (this as Character).Ship.Rewards.Credits;

                    var count = destroyerPlayer.Storage.KilledPlayerIds.Where(x => x == Id).Count();
                    if (this is Player && count >= 14 && !Duel.InDuel(destroyerPlayer))
                    {
                        reward = false;
                        destroyerPlayer.SendPacket($"0|A|STM|pusher_info_no_reward|%NAME%|{Name}");
                    }

                    if (this is Player && Duel.InDuel(this as Player))
                    {
                        reward = false;
                    }
                }
                else if (this is Activatable)
                {
                    credits    = 512000;
                    experience = 512000;
                    honor      = 512;
                    uridium    = 512;
                }

                experience += Maths.GetPercentage(experience, destroyerPlayer.BoosterManager.GetPercentage(BoostedAttributeType.EP));
                honor      += Maths.GetPercentage(honor, destroyerPlayer.BoosterManager.GetPercentage(BoostedAttributeType.HONOUR));
                honor      += Maths.GetPercentage(honor, destroyerPlayer.GetSkillPercentage("Cruelty"));

                if (reward)
                {
                    var groupMembers = destroyerPlayer.Group?.Members.Values.Where(x => x.AttackingOrUnderAttack());

                    if (destroyerPlayer.Group == null || (destroyerPlayer.Group != null && groupMembers.Count() == 0))
                    {
                        destroyerPlayer.ChangeData(DataType.CREDITS, credits);
                        destroyerPlayer.ChangeData(DataType.EXPERIENCE, experience);
                        destroyerPlayer.ChangeData(DataType.HONOR, honor, changeType);
                        destroyerPlayer.ChangeData(DataType.URIDIUM, uridium, changeType);
                    }
                    else if (this is Npc && destroyerPlayer.Group != null)
                    {
                        credits    = credits / groupMembers.Count();
                        experience = experience / groupMembers.Count();
                        honor      = honor / groupMembers.Count();
                        uridium    = uridium / groupMembers.Count();

                        foreach (var member in groupMembers)
                        {
                            member.ChangeData(DataType.CREDITS, credits);
                            member.ChangeData(DataType.EXPERIENCE, experience);
                            member.ChangeData(DataType.HONOR, honor, changeType);
                            member.ChangeData(DataType.URIDIUM, uridium, changeType);
                        }
                    }
                }

                if (this is Player)
                {
                    if (!Duel.InDuel(this as Player))
                    {
                        using (var mySqlClient = SqlDatabaseManager.GetClient())
                            mySqlClient.ExecuteNonQuery($"INSERT INTO log_player_kills (killer_id, target_id) VALUES ({destroyerPlayer.Id}, {Id})");
                    }

                    new CargoBox(Position, Spacemap, false, false, destroyerPlayer);
                }
            }
            else if (destructionType == DestructionType.RADIATION && this is Player && !Duel.InDuel(this as Player))
            {
                (this as Player).Destructions.dbrz++;
            }

            if (this is Character character)
            {
                if (this is Player && Duel.InDuel(this as Player))
                {
                    Duel.RemovePlayer(this as Player);
                }

                Spacemap.RemoveCharacter(character);

                CurrentHitPoints = 0;
            }

            if (this is Npc npc)
            {
                if (npc.Ship.Respawnable)
                {
                    npc.Respawn();
                }
            }

            if (destroyer is Character)
            {
                destroyer.Deselection();
            }

            Deselection();
            InRangeCharacters.Clear();
            VisualModifiers.Clear();

            if (this is Pet pet)
            {
                pet.Deactivate(true, true);
            }
        }
 public abstract void Destroy(Character destroyer, DestructionType destructionType);
        public override void Destroy(Character destroyer, DestructionType destructionType)
        {
            if (this is Spaceball)
            {
                return;
            }

            if (MainAttacker != null && MainAttacker is Player)
            {
                destroyer       = MainAttacker;
                destructionType = DestructionType.PLAYER;
            }

            if (destructionType == DestructionType.PLAYER)
            {
                var destroyerPlayer = destroyer as Player;

                destroyerPlayer.Selected = null;
                destroyerPlayer.DisableAttack(destroyerPlayer.SettingsManager.SelectedLaser);

                //if (!(this is Pet) || (this is Pet && (this as Pet).Owner != destroyerPlayer))
                int experience = destroyerPlayer.Ship.GetExperienceBoost(Ship.Rewards.Experience);
                int honor      = destroyerPlayer.GetHonorBoost(destroyerPlayer.Ship.GetHonorBoost(Ship.Rewards.Honor));
                int uridium    = Ship.Rewards.Uridium;
                var changeType = ChangeType.INCREASE;

                short relationType = destroyerPlayer.Clan != null && Clan != null?Clan.GetRelation(destroyerPlayer.Clan) : (short)0;

                if (destroyerPlayer.FactionId == FactionId && relationType != ClanRelationModule.AT_WAR && !(EventManager.JackpotBattle.Active && EventManager.JackpotBattle.Players.ContainsKey(Id)))
                {
                    changeType = ChangeType.DECREASE;
                }

                destroyerPlayer.ChangeData(DataType.EXPERIENCE, experience);
                destroyerPlayer.ChangeData(DataType.HONOR, honor, changeType);
                destroyerPlayer.ChangeData(DataType.URIDIUM, uridium, changeType);

                if (!(this is Pet))
                {
                    new CargoBox(AssetTypeModule.BOXTYPE_FROM_SHIP, Position, Spacemap, false, false, destroyerPlayer);
                }
            }

            Destroyed = true;
            var destroyCommand = ShipDestroyedCommand.write(Id, 0);

            SendCommandToInRangePlayers(destroyCommand);

            if (this is Player thisPlayer)
            {
                if (EventManager.JackpotBattle.Active && thisPlayer.Spacemap.Id == EventManager.JackpotBattle.Spacemap.Id && EventManager.JackpotBattle.Players.ContainsKey(thisPlayer.Id))
                {
                    EventManager.JackpotBattle.Players.TryRemove(thisPlayer.Id, out thisPlayer);
                    GameManager.SendPacketToMap(EventManager.JackpotBattle.Spacemap.Id, "0|LM|ST|SLE|" + EventManager.JackpotBattle.Players.Count);
                }

                thisPlayer.SkillManager.DisableAllSkills();
                thisPlayer.Pet.Deactivate(true);
                thisPlayer.CurrentHitPoints = 0;
                thisPlayer.SendCommand(destroyCommand);
                thisPlayer.DisableAttack(thisPlayer.SettingsManager.SelectedLaser);
                thisPlayer.CurrentInRangePortalId = -1;
                thisPlayer.Storage.InRangeAssets.Clear();
                thisPlayer.KillScreen(destroyer, destructionType);
            }

            Selected = null;
            InRangeCharacters.Clear();
            VisualModifiers.Clear();
            Spacemap.RemoveCharacter(this);

            if (this is Pet)
            {
                (this as Pet).Deactivate(true, true);
            }
        }
示例#8
0
    /// <summary>
    /// Update fait maison |
    /// Appelé à chaque frame dans l'update du BoidManager
    /// </summary>
    public void UpdateBoid()
    {
        if (isActive && (!DestructionAnim || destructionType == DestructionType.Massive))
        {
            Vector3 acceleration = Vector3.zero; //RaZ de l'accélération

            if (target != null)                  //Absence de target
            {
                float curTargetWeight = settings.targetWeight;
                if (isKoa && koaTargetWeight)
                {
                    curTargetWeight *= 3;
                }
                Vector3 offsetToTarget = (target.position - position);         //Calcul de la différence entre boid et Target
                acceleration = SteerTowards(offsetToTarget) * curTargetWeight; //Acceleration = Résultat de SteerToward * Attraction de la Target
            }

            if (numPerceivedFlockmates != 0)                                                            //Si des mates sont dans la zone de détection
            {
                centreOfFlockmates /= numPerceivedFlockmates;                                           //Position des autres flock / nombre de flock autour
                Vector3 offsetToFlockmatesCentre = (centreOfFlockmates - position);                     //Offset selon position mate - position actuel

                var alignmentForce  = SteerTowards(avgFlockHeading) * settings.alignWeight;             //Vector3 Alignement
                var cohesionForce   = SteerTowards(offsetToFlockmatesCentre) * settings.cohesionWeight; //Vector3 Cohesion
                var seperationForce = SteerTowards(avgAvoidanceHeading) * settings.seperateWeight;      //Vector3 separation

                //Application des forces (Vector3)
                acceleration += alignmentForce;
                acceleration += cohesionForce;
                acceleration += seperationForce;
            }

            //Detection de collision (return bool)
            if (IsHeadingForCollision())
            {
                //Nouvelle direction pour éviter obstacle
                Vector3 collisionAvoidDir = ObstacleRays();
                //Nouveau déplacement selon la nouvelle direction
                Vector3 collisionAvoidForce = SteerTowards(collisionAvoidDir) * settings.avoidCollisionWeight;
                //Ajout de l'évitement dans le déplacement
                acceleration += collisionAvoidForce;
            }

            velocity += acceleration * Time.deltaTime;                           //MaJ de la vélocité du boid
            float   speed = velocity.magnitude;                                  //Récupère magnitude de la vélocité (longueur du vecteur)
            Vector3 dir   = velocity / speed;                                    //Nouvelle direction car Velocité / magnitude : direction
            speed    = Mathf.Clamp(speed, settings.minSpeed, settings.maxSpeed); //Vélocité clampée entre les bornes (sécurité)
            velocity = dir * speed;                                              //MaJ de la vélocité

            if (this != null)
            {
                cachedTransform.position += velocity * Time.deltaTime; //Position tampon MaJ
                cachedTransform.forward   = dir;                       //Orientation du Tampon selon direction
                position = cachedTransform.position;                   //Position du boid MaJ selon tampon
                forward  = dir;                                        //Orientation du boid MaJ selon direction Tampon
            }
        }
        if (DestructionAnim)
        {
            curTimer += Time.deltaTime;

            if (destructionType == DestructionType.Solo)
            {
                transform.position = new Vector3(deathPos.x, transform.position.y - 75 * Time.deltaTime, deathPos.z);
            }

            float scale = (cachedTransform.localScale.x / destructionTimer);
            scale *= Time.deltaTime;
            transform.localScale -= new Vector3(scale, scale, scale);


            if (curTimer > destructionTimer)
            {
                transform.position = new Vector3(0, -2000, 0);
                destructionType    = DestructionType.none;
                isActive           = false;
                DestructionAnim    = false;
            }
        }
    }