В различных картах а-ля Петросянщина (забыл, как называется жанр) есть здания, при постройке которых они дают N-ное количество золота допустим, раз в три секунды за КАЖДОЕ здание, и они все работают по отдельности, не завися друг от друга. К тому же, если прокачать постройку – то она будет давать больше золота, чем постройки более низкого уровня + количество этих золотодобывалок ограничено.
Скажите пожалуйста, как сделать такие здания? Триггерно, конечно.

Принятый ответ

там ничего сложного нет. вопрос часто встречаемый в последнее время. Там периодически перебирают всех юнитов. В основном работа в группе. Многие неправильно работать в группе, забывают ее удалять.
Вариант 1 (общий вариант)
Событие - периодический таймер
действие - цикл перебираем всех игроков
действие - установить "группа DDD = выбрать всех юнитов в группу игрока" //я использовал такой необычный способ, чтобы группу запомнить в глобалку, также используй фильтр/условие, отсеивай не нужных юнитов (например, не здания)
действие - ForGroup (делать действие над каждым юнитом в группе DDD), и в зависимости от типа юнита складывай / прибавляй денежки игроку // if-ами придеться перебирать, если ...
группу не забываем удалять после работы с нею. Можно использовать также счетчики, и использовать заранее заготовленную группу, в нее будем добавлять и убавлять юнитов. при завершении постройки добавляй юнита в группу, при уничтожении удаляй из группы. И не нужно будет каждый раз пересоздавать группу и удалять.
Вариант 2
Событие - юнит вошел в зону
условие - юнит является зданием
события можно по-другому найти, так как вошел в зону не совсем точное, потому, что юнит вошел, то есть его только , что создали. Он в данный момент только строится
Событие - юнит завершает строительство
действие - if/then/else //короче длинные будут проверки типов, так как будут разные здания, и разные здания будут давать разные денежки
условие - тип юнита
действие - переменная + 1 // общий голд
когда здание уничтожают, убавляем голда
Событие - юнит умирает или покидает зону
условие - тип юнита
действие - переменная - 1
когда улучшают здание
Событие - юнит завершает улучшение
условие - тип юнита
действие - переменная + еще 1
начисляем периодически
Событие - Периодический таймер
действие - добавить голда
Вариант 3
далее предлагаю запоминать сколько дает данное здание. Можно использовать Custom Value / обычное значение юнита, в котором можно сохранить число. Число можно хранить у юнита, у каждого оно свое. В этом числе можно сохранить сколько оно денежек дает. Есть две функции SetCustomValue - установить число, и GetCustomValue - условие, определяющее сколько золота.
условие - тип юнита
действие - SetCustomValue
и потом периодически перебираем всех юнитов
Событие - Периодический таймер
действие - Выбрать всех юнитов в группу, и сделать действия. //перебирает каждого юнита, и добавляем столько, сколько GetCustomValue у юнита
Использовать хранения можно также хэш-таблицу. Ваше CustomValue может использоваться в других системах, и поэтому нужны еще где-то запоминать, а хэш-таблица самое то.Не забудь глобалку хэша создать, и создать хэш-таблицу в начале игры
Событие - Инициализация
Действие - Создать/инициализровать хэш-таблицу
Действие - установить глобалка = последняя созданная хэш-таблица
при сохранении используется так
CS: set udg_D=GetHandleId( ваш юнит) //целочисленное число, HandleId - номер объекта, необходим для дальнейшего
сохранить целочисленное число Integer 
Хэш-таблица - Сохранить целочисленное число, Id-хэндл, и ключ //там есть типа адрес и номер, адрес - как хэндл. номер - ключ, ключ вводишь любой 
при загрузке хэндла
CS: set udg_D=GetHandleId( ваш юнит) 
Хэш-таблица - Загрузить число по хэндлу, и ключу //ключ вводишь тот, который ввел при сохранении
Хэш-таблица используется точно также как и число у юнита, мы всех юнитов перебираем узнаем кол-во число, складываем и даем бабло. Также можно использовать классификацию юнита (можно триггерно дабавлять/удалять) xgm.guru/p/wc3/wc3targets
xgm.guru/p/100/179866 примерчик с логовом
xgm.guru/p/100/179159 примерчик с автокастом - ловишь приказ автокаста, время задаешь в перезарядке абилки и не нужно периодить таймером
+ количество этих золотодобывалок ограничено.
смотри в разделе игрок
Действие - Игрок - лимит на обучение данного типа (Limit training of type-unit to кол-во у Игрока)
2 комментария удалено
0
27
7 лет назад
Отредактирован MpW
0
там ничего сложного нет. вопрос часто встречаемый в последнее время. Там периодически перебирают всех юнитов. В основном работа в группе. Многие неправильно работать в группе, забывают ее удалять.
Вариант 1 (общий вариант)
Событие - периодический таймер
действие - цикл перебираем всех игроков
действие - установить "группа DDD = выбрать всех юнитов в группу игрока" //я использовал такой необычный способ, чтобы группу запомнить в глобалку, также используй фильтр/условие, отсеивай не нужных юнитов (например, не здания)
действие - ForGroup (делать действие над каждым юнитом в группе DDD), и в зависимости от типа юнита складывай / прибавляй денежки игроку // if-ами придеться перебирать, если ...
группу не забываем удалять после работы с нею. Можно использовать также счетчики, и использовать заранее заготовленную группу, в нее будем добавлять и убавлять юнитов. при завершении постройки добавляй юнита в группу, при уничтожении удаляй из группы. И не нужно будет каждый раз пересоздавать группу и удалять.
Вариант 2
Событие - юнит вошел в зону
условие - юнит является зданием
события можно по-другому найти, так как вошел в зону не совсем точное, потому, что юнит вошел, то есть его только , что создали. Он в данный момент только строится
Событие - юнит завершает строительство
действие - if/then/else //короче длинные будут проверки типов, так как будут разные здания, и разные здания будут давать разные денежки
условие - тип юнита
действие - переменная + 1 // общий голд
когда здание уничтожают, убавляем голда
Событие - юнит умирает или покидает зону
условие - тип юнита
действие - переменная - 1
когда улучшают здание
Событие - юнит завершает улучшение
условие - тип юнита
действие - переменная + еще 1
начисляем периодически
Событие - Периодический таймер
действие - добавить голда
Вариант 3
далее предлагаю запоминать сколько дает данное здание. Можно использовать Custom Value / обычное значение юнита, в котором можно сохранить число. Число можно хранить у юнита, у каждого оно свое. В этом числе можно сохранить сколько оно денежек дает. Есть две функции SetCustomValue - установить число, и GetCustomValue - условие, определяющее сколько золота.
условие - тип юнита
действие - SetCustomValue
и потом периодически перебираем всех юнитов
Событие - Периодический таймер
действие - Выбрать всех юнитов в группу, и сделать действия. //перебирает каждого юнита, и добавляем столько, сколько GetCustomValue у юнита
Использовать хранения можно также хэш-таблицу. Ваше CustomValue может использоваться в других системах, и поэтому нужны еще где-то запоминать, а хэш-таблица самое то.Не забудь глобалку хэша создать, и создать хэш-таблицу в начале игры
Событие - Инициализация
Действие - Создать/инициализровать хэш-таблицу
Действие - установить глобалка = последняя созданная хэш-таблица
при сохранении используется так
CS: set udg_D=GetHandleId( ваш юнит) //целочисленное число, HandleId - номер объекта, необходим для дальнейшего
сохранить целочисленное число Integer 
Хэш-таблица - Сохранить целочисленное число, Id-хэндл, и ключ //там есть типа адрес и номер, адрес - как хэндл. номер - ключ, ключ вводишь любой 
при загрузке хэндла
CS: set udg_D=GetHandleId( ваш юнит) 
Хэш-таблица - Загрузить число по хэндлу, и ключу //ключ вводишь тот, который ввел при сохранении
Хэш-таблица используется точно также как и число у юнита, мы всех юнитов перебираем узнаем кол-во число, складываем и даем бабло. Также можно использовать классификацию юнита (можно триггерно дабавлять/удалять) xgm.guru/p/wc3/wc3targets
xgm.guru/p/100/179866 примерчик с логовом
xgm.guru/p/100/179159 примерчик с автокастом - ловишь приказ автокаста, время задаешь в перезарядке абилки и не нужно периодить таймером
+ количество этих золотодобывалок ограничено.
смотри в разделе игрок
Действие - Игрок - лимит на обучение данного типа (Limit training of type-unit to кол-во у Игрока)
Принятый ответ
0
17
7 лет назад
0
Я раз в пару минут выбираю всех юнитов на карте, потом проверка на тип выбранного юнита и если все верно, то начисляю золото хозяину выбранного юнита.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.