/// <summary> /// Indique au système de récompenses que des dégâts ont été infligés à une entité. /// </summary> /// <param name="source">Entité infligeant les dégâts.</param> /// <param name="destination">Entité subissant les dégâts.</param> /// <param name="damageAmount">Nombre de dégâts bruts subis par l'entité destination.</param> public void NotifyDamageDealt(EntityBase source, EntityBase destination, float damageAmount) { EntityHero dst = destination as EntityHero; EntityHero src = source as EntityHero; if (src != null && dst != null) { AddAttacker(dst, src); RewardConstants constants = GameServer.GetScene().Constants.Rewards; // Distribue des PAs au Tank if (dst.Role == EntityHeroRole.Tank) { // Vérifie qu'il y a des héros alliés en combat EntityCollection inrange = GameServer.GetMap().Entities.GetAliveEntitiesInRange(dst.Position, constants.TankPAPerHPLostRange); inrange = inrange.GetEntitiesByType((dst.Type & EntityType.Teams) | EntityType.Player); if (inrange.Count != 0) { dst.PA += damageAmount * constants.TankPAPerHPLost; } } // Distribues des PAs à l'attaquant si c'est un combattant. if (src.Role == EntityHeroRole.Fighter) { src.PA += damageAmount * constants.FighterPAPerDamageDealt; } } }
/// <summary> /// Indique au système de récompenses qu'une unité a été tuée. /// </summary> /// <param name="unit">Unité tuée.</param> /// <param name="killer">Unité ayant porté le dernier coup.</param> public void NotifyUnitDeath(EntityBase unit, EntityHero killer) { RewardConstants constants = GameServer.GetScene().Constants.Rewards; // Si l'unité est un Virus, on offre une récompense aux héros proches. if (unit.Type.HasFlag(EntityType.Virus) || unit.Type.HasFlag(EntityType.Monster)) { if (killer != null) { if (unit.Type.HasFlag(EntityType.Virus)) { killer.Stats.TotalVirusSlain++; } if (unit.Type.HasFlag(EntityType.Monster)) { killer.Stats.TotalNeutralMonstersSlain++; } } foreach (EntityHero hero in m_allHeroes) { // Si le héros est dans l'équipe adverse du Virus/monstre tué. if (!hero.Type.HasFlag(unit.Type & EntityType.Teams)) { if (Vector2.DistanceSquared(hero.Position, unit.Position) <= constants.VirusDeathRewardRange * constants.VirusDeathRewardRange) { hero.PA += constants.VirusDeathReward; } } } } else if (unit.Type.HasFlag(EntityType.Tower)) { foreach (EntityHero hero in m_allHeroes) { // Si le héros est dans l'équipe adverse de la tour tuée // Applique le bonus du combattant lors de la destruction d'une tour. if (!hero.Type.HasFlag(unit.Type & EntityType.Teams) && hero.Role == EntityHeroRole.Tank) { if (Vector2.DistanceSquared(hero.Position, unit.Position) <= constants.TankTowerDestructionBonusRange * constants.TankTowerDestructionBonusRange) { hero.PA += constants.TankTowerDestructionBonus; } } } } // Récompense du HUNTER if (killer != null) { if (unit.Type.HasFlag(EntityType.Monster) && killer.UniquePassive == EntityUniquePassives.Hunter) { killer.PA += GameServer.GetScene().Constants.UniquePassives.HunterBonusGold; } } }
/// <summary> /// Crée une nouvelle instance de GameConstants avec des constantes par défaut. /// </summary> public GameConstants() { Vision = new VisionConstants(); Structures = new StructureConstants(); Virus = new VirusConstants(); Roles = new RoleConstants(); Rewards = new RewardConstants(); Events = new EventConstants(); CampMonsters = new CampMonsterConstants(); Routers = new RouterConstants(); BuffedVirus = new VirusConstants(); UniquePassives = new UniquePassiveConstants(); ActiveSpells = new ActiveSpellsConstants(); Equip = new EquipConstants(); Heroes = new HeroConstants(); Towers = new TowerConstants(); DatacenterConstants = new DatacenterConstants(); MiningFarms = new MiningfarmConstants(); }
/// <summary> /// Indique au système de récompenses qu'un héros a été tué. /// </summary> /// <param name="unit">Unité tuée.</param> /// <param name="killer">Unité ayant porté le dernier coup.</param> public void NotityHeroDeath(EntityHero unit, EntityHero killer) { if (killer == null) { return; } EntityType killerTeam = killer.Type & EntityType.Teams; // On donne une récompense au tueur. RewardConstants constants = GameServer.GetScene().Constants.Rewards; killer.PA += constants.KillReward; killer.Stats.TotalKills++; // Bonus de PA/Kill pour le passif rugged. if (killer.UniquePassive == EntityUniquePassives.Rugged && killer.UniquePassiveLevel == 2) { killer.PA += GameServer.GetScene().Constants.UniquePassives.RuggedKillReward; } // On mémorise les héros déjà récompensés pour les assist List <EntityHero> rewarded = new List <EntityHero>(); if (m_assistants.ContainsKey(killer)) { foreach (var kvp in m_assistants[killer]) { EntityHero assistant = kvp.Key as EntityHero; if (assistant != null) { assistant.PA += constants.AssistReward; assistant.Stats.TotalAssists++; // Bonus d'assist du combattant. if (assistant.Role == EntityHeroRole.Fighter) { assistant.PA += constants.TankAssistBonus; } // Bonus d'assist du mage. if (assistant.Role == EntityHeroRole.Mage) { assistant.PA += constants.MageAssistBonus; } rewarded.Add(assistant); } } } if (m_attackers.ContainsKey(unit)) { foreach (var kvp in m_attackers[unit]) { EntityHero attacker = kvp.Key as EntityHero; // On ne récompense l'attaqueur que s'il n'a pas déjà été récompensé // par la prime d'assist. if (attacker != null && !rewarded.Contains(attacker)) { attacker.PA += constants.AssistReward; attacker.Stats.TotalAssists++; // Bonus du combattant. if (attacker.Role == EntityHeroRole.Fighter) { attacker.PA += constants.TankAssistBonus; } // Bonus d'assist du mage. if (attacker.Role == EntityHeroRole.Mage) { attacker.PA += constants.MageAssistBonus; } } } } }