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; } } }
/// <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; }
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; } }
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); }
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); } }
/// <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; } } }