В данной системе разобрана система триггеров, которая позволит делать строения как "общие магазины".
Для чего система?
Она позволит сделать одно строение с улучшениями, наймом войск, покупкой артефактов и прочего, для того игрока, который его выбрал.
Реализация
Для данной системы нам понадобится 3 триггера и 1 переменная. # Эта система очень вариативная, но для данной статьи будет разобран самый простой её вариант
Переменная
Это глобальная переменная типа Unit в которой будет хранится ссылка на нужное вам здание, которому надо менять контроль от выбора игроков
Триггер - Select Unit
Простой триггер, суть которого заключается в том, что когда единица из переменной выделяется, но с условием что этой единицей владеет нейтральный игрок (в данном примере это Игрок 0 # Для вашего случая это может быть любой другой игрок)
То в таком случае, контроль этой единицы из переменной меняется на того кто её выбрал (То есть на (Triggering Player) # А Triggering Player это специальная функция, которая возвращает того игрока, который активировал событие)
Код Триггера
Select Unit
Events
Unit Selection -barrack is Selected by player Any Player
Local Variables
Conditions
(Owner of barrack) == 0
Actions
Unit -Change ownership of (Triggering unit) to player (Triggering player) and Change ColorТриггер - Deselect Unit
Суть же этого триггера обратная.
Когда игрок снимает выделение с единицы из переменной, то тогда что-то делаем..
А что мы должны делать? Для начала мы должны проверить, а подконтролем ли эта единица этому игроку? Ведь может произойти ситуация когда единица принадлежит третьему игроку, а второй игрок снял выделение и единица стала принадлежать нейтральному игроку.
Проверим это в условии, функцией Owner Of Unit, на значение равным (Triggering Player).
Этим мы убедимся, что наше здание в переменной действительно под контролем нужного игрока, и нужно менять её контроль.
Этим мы убедимся, что наше здание в переменной действительно под контролем нужного игрока, и нужно менять её контроль.
Далее, нужно обработать случай, когда в этот момент эта единица выделена у кого-то ещё.
Сделаем это циклом Pick Each Player In Player Groups, который переберёт каждого игрока в группе All Players.
Сделаем это циклом Pick Each Player In Player Groups, который переберёт каждого игрока в группе All Players.
Для каждого игрока, нам нужно проверить, находится ли юнит из переменной в его выделении? Это можно сделать с помощью конструкции If Then Else, которую нужно добавить в блок действий нашего цикла как Действие, и в котором в блоке If Добавить новое условие, с функцией Unit In Unit Group.
В качестве группы единиц надо указать функцию Selected Units, Которая вернёт группу единиц с выделенными юнитами игрока. а в качестве игрока выбрать функцию Picked Player, которая считается текущим перебираемым игроком.
Если же юнит находится в группе выделенных юнитов, то это значит что мы нашли того игрока, которому передать контроль над нашим зданием, это Picked Player, и надо с помощью действия Change Owner передать контроль над юнитом для игрока Picked Player, а затем нужно пропустить все последующие действия триггера, с помощью действия Skip Remaining Actions, для того чтобы цикл дальше не работал, и самое главное, чтобы юнит в конце триггера не передался нейтральному игроку
Но если вдруг не найдется такой игрок у которого ещё будет выделен наш юнит, то после цикла просто передадим контроль над юнитом для нейтрального игрока. Опять таки с помощью действия Change Owner
Код Триггера
Deselect Unit
Events
Unit Selection -barrack is Deselected by player Any Player
Local Variables
Conditions
(Owner of barrack) == (Triggering player)
Actions
Player Group -Pick each player in (All players) and do (Actions)
Actions
General -If (Conditions) then do (Actions) else do (Actions)
If
((Triggering unit) is in (Selected units for player (Picked player))) == True
Then
Unit -Change ownership of (Triggering unit) to player (Picked player) and Change Color
General -Skip remaining actions
Else
Unit -Change ownership of (Triggering unit) to player 0 and Change Color
SC2









