Мы завершили работу над созданием ассоциативных массивов. Следующим шагом будет выдача игрокам оружия за устранение.
При устранении должны соблюдаться следующие два правила:
-
Если у игрока оружие не самого высокого уровня в команде или все игроки находятся на одном уровне оружия, игроку нужно выдать оружие следующего уровня.
-
Если в команде остался игрок с более низким уровнем оружия, ему нужно выдать оружие более высокого уровня.
Это позволит равномерно продвигать всех игроков в команде по уровням оружия, исключив ситуации, когда игрок опережает или отстаёт от своих товарищей по команде более чем на один уровень оружия.
Для этого необходимо знать, когда игрок набирает очки за устранение, после чего нужно сравнить уровень его оружия с оружием остальных игроков в команде и повысить его уровень с учётом двух обозначенных выше правил.
Для выдачи оружия необходимо выполнить следующие действия.
-
Добавьте новый метод
GiveNextWeapon
в классteam_elimination_game
. Этот метод будет выдавать игроку оружие всякий раз, когда он или кто-то из его команды получает очки за устранение (при этом по-прежнему должны соблюдаться два обозначенных выше правила).GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Ищу игрока для повышения уровня")
-
Внесите изменения в блок
OnPlayerEliminated
для отслеживания того, какой игрок выполнил устранение. ПосколькуOnPlayerEliminated
принимаетelimination_result
в качестве аргумента, мы получаем ссылку как на устранённого, так и на устранившего персонажа. Поскольку игроки могут быть устранены различными способами (например, получить урон от падения, от сторожевого поста, нанесения урона самим себе и т. п.), необходимо проверять, является лиEliminatingCharacter
реальнымFortCharacter
(то есть реальным игроком).- Получите ссылку на
Result.EliminatingCharacter
и сохраните её в локальной опциональной переменнойEliminator
. Проверьте, является лиEliminator
реальнымFortCharacter
, и, если да, сохраните агента для этого персонажа в другой переменнойEliminatorAgent
. После этого передайтеEliminatorAgent
в качестве аргумента функцииGiveNextWeapon
OnPlayerEliminated(Result : elimination_result) : void = Print("Игрок устранён!") Eliminator := Result.EliminatingCharacter if (FortCharacter := Eliminator?, EliminatorAgent := FortCharacter.GetAgent[]): GiveNextWeapon(EliminatorAgent)
- Получите ссылку на
-
Функция
GiveNextWeapon
должна отслеживать несколько переменных для того, чтобы выдавать нужному игроку новое оружие. В функциюGiveNextWeapon
добавьте следующее.-
Целочисленную переменную
WeaponTier
. Она нужна для отслеживания уровня оружия игрока, чтобы определять, какое оружие выдавать при устранении. -
Опциональную переменную агента с именем
MaybePlayerToGrant
, которая будет представлять игрока, которому нужно выдать оружие. По умолчанию это игрок, передаваемый в функциюGiveNextWeapon
. -
Опциональную переменную команды с именем
MaybePlayerTeam
, которая будет представлять команду игрока, которому нужно выдать оружие. По умолчанию это команда игрока, переданная в функциюGiveNextWeapon
.
GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Ищу игрока для повышения уровня") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # Игрок, которому нужно выдать оружие var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # Команда, в которой состоит игрок
-
-
Сохраните значение
MaybePlayerTeam
в локальной переменнойPlayerTeam
, а затем присвойтеWeaponTier
значение счёта игрока изTeamMap
.var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # Команда, в которой состоит игрок if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]):
-
При помощи цикла выполните итерацию по каждому игроку в команде и сравните уровни их оружия. Если будет найден игрок с более низким уровнем, задаём для него
MaybePlayerToGrant
, а для его счёта —WeaponTier
. Обратите внимание, что, посколькуTeamMap
является ассоциативным массивом, вы можете получить ключ (которым является игрок) и значение (уровень оружия) в качестве локальных переменных при помощи следующего синтаксиса:Teammate -> TeammateTier
.if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("В команде найден игрок с более низким уровнем: {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate}
-
Как только мы нашли игрока с самым низким уровнем оружия, необходимо увеличить значение
WeaponTier
на единицу, а затем передать значениеWeaponTier
этого игрока вTeamMap
.if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("В команде найден игрок с более низким уровнем: {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Уровень устранившего игрока теперь {WeaponTier}")
-
Здесь же мы можем проверить, выиграл ли игрок, так как повышение уровня оружия может привести к превышению количества устранений, необходимых для завершения игры.
- В классе
team_elimination_game
создайте новый методEndGame
. Этот метод будет активироватьEndGameDevice
для соответствующего игрока, когда тот достигнет последнего уровня оружия. Сам метод должен выглядеть следующим образом:
EndGame(InPlayer : agent) : void = Print("Игрок достиг последнего уровня оружия, активирую EndGameDevice") EndGameDevice.Activate(InPlayer)
- В
GiveNextWeapon
после повышения уровня оружия игрока добавьте проверкуif WeaponTier >= EliminationsToEndGame
. При соответствии данному условию мы вызываемEndGame
и передаём соответствующего игрока.
if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Уровень устранившего игрока теперь {WeaponTier}") if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer)
- В классе
-
В противном случае мы вызываем
GrantWeapon
дляGrantedPlayer
.if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) GrantWeapon(MaybePlayerToGrant, WeaponTier)
-
Метод
GiveNextWeapon
должен выглядеть следующим образом.GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Ищу игрока для повышения уровня") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # Игрок, которому нужно выдать оружие var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # Команда, в которой состоит игрок if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("В команде найден игрок с более низким уровнем: {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("Уровень устранившего игрока теперь {WeaponTier}") if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) GrantWeapon(MaybePlayerToGrant, WeaponTier)
Сохраните сценарий в Visual Studio Code, скомпилируйте его и нажмите Запустить сеанс на панели инструментов UEFN, чтобы выполнить игровой тест уровня. При тестировании уровня игрок снова должен появиться с первым оружием из массива WeaponGranters
. Убедитесь, что этот так, проверив журнал. Устранив вражеского игрока, вы переходите к следующему оружию. Переход на новый уровень должен выполняться с соблюдением двух правил, описанных ранее. Получение оружия последнего уровня должно приводить к завершению игры, а устранивший игрок, достигший этого уровня, будет считаться победителем.

Что дальше
Дальше мы разберём, как добавлять игроков в ассоциативный массив map и выдавать им оружие, когда они присоединяются к уже запущенной игре.