protected override void AbilityAction(GameEntity executor, GameContext gameContext) { base.AbilityAction(executor, gameContext); executor.ToGlobal(gameContext, out var newPosition, out var newAngle, out _, out _, out _); newPosition += position.GetRotated(newAngle); newAngle += angle; var entity = ability.CreateEntity(gameContext, newPosition, newAngle, executor.team.id); if (executor.hasSkin) { executor.skin.value.AddSkin(entity, gameContext); } if (executor.hasAttackIncreasing) { var attackIncreasing = executor.attackIncreasing.value; foreach (var child in entity.GetAllChildrenGameEntities(gameContext)) { child.AddAttackIncreasing(attackIncreasing); if (child.hasDamage) { child.ReplaceDamage(child.damage.value * attackIncreasing); } } } entity.AddOwner(executor.GetGrandParent(gameContext).id.value); entity.AddGrandOwner(executor.GetGrandOwnerId(gameContext)); if (spawnAsChild) { entity.AddParent(executor.id.value); } }
public void Initialize() { // Log.Info($"Создание игровой комнаты с номером {matchModel.MatchId}"); Dictionary <int, ushort> playerInfos = new Dictionary <int, ushort>(matchModel.GameUnits.Count()); var zoneEntity = FlameCircle.CreateEntity(gameContext, Vector2.zero, 0f); gameContext.SetZone(zoneEntity.id.value); var step = 360f / matchModel.GameUnits.Count(); var halfStep = step * 0.5f; GameUnitsFactory factory = new GameUnitsFactory(); List <GameUnitModel> gameUnits = factory.Create(matchModel); for (int gameUnitIndex = 0; gameUnitIndex < gameUnits.Count; gameUnitIndex++) { GameUnitModel gameUnit = gameUnits[gameUnitIndex]; float angle = gameUnitIndex * step + halfStep; Vector2 position = CoordinatesExtensions.GetRotatedUnitVector2(angle) * 40f; GameEntity playerEntity = PlayerPrototypes[gameUnit.WarshipName.ToLower()] .CreateEntity(gameContext, position, 180f + angle, (byte)(gameUnitIndex + 1)); if (playerEntity.hasDrop) { playerEntity.drop.objects.Add(UpgradeBonus); } else { playerEntity.AddDrop(new List <EntityCreatorObject> { UpgradeBonus }); } playerEntity.AddPlayer(gameUnit.TemporaryId); playerEntity.AddAccount(gameUnit.AccountId); playerInfos.Add(playerEntity.account.id, playerEntity.id.value); if (gameUnit.IsBot()) { Match.MakeBot(playerEntity); } if (Skins.TryGetValue(gameUnit.SkinName, out var skin)) { skin.AddSkin(playerEntity, gameContext); } var powerLevel = gameUnit.WarshipPowerLevel - 1; if (powerLevel > 0) { var newHp = playerEntity.maxHealthPoints.value * (1f + powerLevel * WarshipImprovementConstants.HealthPointsCoefficient); var newSpeed = playerEntity.maxVelocity.value * (1f + powerLevel * WarshipImprovementConstants.LinearVelocityCoefficient); var newRotation = playerEntity.maxAngularVelocity.value * (1f + powerLevel * WarshipImprovementConstants.AngularVelocityCoefficient); var attackCoefficient = 1f + powerLevel * WarshipImprovementConstants.AttackCoefficient; playerEntity.ReplaceMaxHealthPoints(newHp); playerEntity.ReplaceHealthPoints(newHp); playerEntity.ReplaceMaxVelocity(newSpeed); playerEntity.ReplaceMaxAngularVelocity(newRotation); foreach (var child in playerEntity.GetAllChildrenGameEntities(gameContext)) { child.AddAttackIncreasing(attackCoefficient); } } var wallAngle = angle + halfStep; var wallDirection = CoordinatesExtensions.GetRotatedUnitVector2(wallAngle); for (var r = 11; r < 50; r += 25) { for (var j = r; j < r + 10; j++) { RandomAsteroid.CreateEntity(gameContext, wallDirection * j, (float)random.NextDouble() * 360f); } } SpaceStation.CreateEntity(gameContext, wallDirection * 10f, wallAngle, 0); SpaceStation.CreateEntity(gameContext, wallDirection * 25f, wallAngle, 0); SpaceStation.CreateEntity(gameContext, wallDirection * 35f, 180f + wallAngle, 0); RandomBonus.CreateEntity(gameContext, wallDirection * 30f, 0); } Boss.CreateEntity(gameContext, Vector2.zero, (float)random.NextDouble() * 360f, 0); foreach (var playerInfo in matchModel.GameUnits.Players) { udpSendUtils.SendPlayerInfo(matchModel.MatchId, playerInfo.TemporaryId, playerInfos); } }