WarCraft 3: Как сделать новый ресурс?

База примеров на GUI
И так "как сделать новый ресурс?" для этого нужно определиться что за ресурс мы хотим добывать, как мы его будем добывать и откуда. Для начало взглянем на стандартные ресы варкрафта, золото и дерево, еда тоже ресурс но о нем попозже.
-- И так добычи золота 2 вида:
  1. Альянс - юнит отправляется к шахте -) у шахты исчезает через некоторое время появляется и с шахты снимается золото -) юнит перенаправляется к зданию где cдает золото -) подходит к зданию в копилку игрока падает снятое золото, отображается количество полученного и юнит отправляется обратно к шахте.
  1. Нежить - юнит строит на руднике свой рудник -) юнит походит к построенному руднику и перенаправляется в определенном месте около рудника -) каждую секунду с шахты вычитается золото и добавляется в копилку игрока, снятое золото отображается над проклятым рудником.
Почему я не указываю эльфов, так это потому что они делают тоже самое что и нежить , за исключением того что рудник для них это транспортное средство.
-- Добычи дерева тоже 2 вида:
  1. Альянс - юнит подбегает к объекту -) проигрывается анимация у юнита и объекта, у объекта снимается количество дерева -) через определенное время юнит бежит к зданию где cдает дерево -) подходит к зданию в копилку игрока падает снятое дерево, отображается количество полученного и юнит отправляется обратно к объекту.
  1. Эльфы - юнит подбегает к объекту -) проигрывается анимация у юнита -) каждую секунду с объекта вычитается дерево и добавляется в копилку игрока, снятое дерево отображается над объектом.
Правда добыча дерева на что-то похожа)))
И так к главному:::

Пример №1: Нефть.

Основные используемые объекты в примере:
"Танкер" - юнит которым будем собирать ресурс.
"Здание1" - Нефть в виде нейтрального здания "рудник" но с моделью нефтяного пятна.
"Здание2" - Нефтеплатформа при постройке которой мы сможем добывать нефть(проклятый рудник нежити).
"Здание3" - собственно верфь, где строятся юниты и куда относят ресурс.
"Oil1" - Область в которой будет нефть и нужна для работы триггеров.
Переменные:
"OilCount" - переменная "Целочисленная" массив. Будет содержать количество нефти в пятне. Номер массива это номер пятна.
"OilsText" - переменная "Плавающий текст" массив. Я взял плавающий текст который будет висеть над областью в котором будет нефтепятно и будет отображать "OilCount". Номер массива это номер пятна.
"PlayersBoard" - переменная "Таблица Рекордов" массив. В нее вносится последний созданный лидерборд в котором будет отображаться ресурс то бишь нефть. Номер массива это номер игрока.
"PlayersOil" - переменная "Целочисленная" массив. Является копилкой ресурса для игрока. Номер массива это номер игрока.
"SlotOfUnits" - переменная "Отряд" массив. используется как маркер что юнит имеет на борту ресурс. Номер массива это номер игрока.
Этот пример помесь добычи золота у Альянса и Нежити. Соответственно как это у нас будет выглядеть:
Нефтяное пятно на нем указано количество. К нему подплывает юнит, строит на нем нефтяную платформу. -) Юнит подплывает к Платформе и исчезает через некоторое время появляется и с платформы снимается нефть -) юнит перенаправляется к зданию где сдает нефть -) подходит к зданию в копилку игрока падает снятая нефть, отображается количество полученного и юнит отправляется обратно к платформе.
вроде все просто, но не тут то было делаем область чуть больше нефти пятна, в центр либо триггерно либо ручками помещаем здание нефтепятно. Переходим к Триггерам:

Для начала где у вас:

> Событие:
> - Map initialization
Ставим в конец, действия:

> Действие:
> -Set "OilCount"[1] равно 20 000
> -Плавающий текст - Create floating text that reads (String("OilCount"[1])) at (Center of "Oil1") with offset 0.00, using font size 10.00 color (50.00%, 50.00%, 50.00%) and 0.00% transparency
> -Set "OilsText"[1] равно (Last created floating text)
> -Wait 0.10 seconds
> -For each (Integer A) from 1 to 12, fo (Actions)
> --Цикл - действия:
> ---Таблица рекордов - Create a leaderboard for (Player group(Player(Integer A))) title (Нефть: +(String(PlayersOil[(Integer A)])))
> ---Set "PlayersBoard"[(Integer A)] равно (Last created leaderboard)

Это создаст в областях нефти текст с количеством нефти, и закрепит их за переменной. Так же будет и с копилкой игроков, создадутся лидерборды для каждого игрока и закрепятся в переменную.
Теперь создаем действие
(Юнит подплывает к Платформе и исчезает через некоторое время появляется и с платформы снимается нефть -) юнит перенаправляется к зданию где сдает нефть)
И назовем его "ZoneOilOne"

> Событие:
> -Боевая единица - A unit enters "Oil1"
> Условие:
> -(Unit type of (Triggering unit)) равно "Танкер"
> Действие:
> -Отряд add (Triggering unit) to "SlotOfUnits"[(Player number of(Owner of (Triggering unit)))]
> -Боевая единица - Hide (Triggering unit)
> -Wait 1.00 seconds
> -Боевая единица - Unhide (Triggering unit)
> -Set "OilCount"[1] равно ("OilCount"[1] - 10)
> -Плавающий текст - Change text of "OilText"[1]) to (String("OilCount"[1])) using font size 10.00
> -Боевая единица - Order (Triggering unit) to Двигаться (Position of (Random unit from(Units owned by (Owner of (Triggering unit)) of type "Здание3")))
> -If\Then\Else, multiple function
> --Если - условия:
> ---"OilCount"[1] меньше или равно 0
> --То - Действие:
> ---Игра - Display to (Player group (Owner of (Triggering unit))) the text: Нефтяное месторождение истощено.
> ---Плавающий текст - Destroy "OilText"[1]
> ---Триггер - Turn off (this trigger)
> --Иначе - Действие:

А помимо выше написанного действия мы еще поставили в триггер отключение при истощении ресурса в Нефтяном пятне и отображение соответствующего текста. И убираем галочку с "изначально включен".
Идем дальше, нам нужно чтобы триггер работал только при построенной Нефтеплатформы

> Событие:
> -Боевая единица - A unit Завершает строительство
> Условие:
> -(Unit type of (Constructed structure)) равно "Здание2"
> Действие:
> -Отряд - Pick every unit in (Units in "Oil1" Owned by (Owner of (Triggering unit))) and do (Actions)
> --Цикл - действия:
> -If\Then\Else, multiple function
> --Если - условия:
> ---(Unit type of (Picked unit)) равно "Здание2"
> --То - Действие:
> ---Триггер - Turn on ("ZoneOilOne")
> --Иначе - Действие:

Теперь соответственно нужен триггер отключающий триггер "ZoneOilOne" при уничтожении платформы и устанавливающий нефтяное пятно.

> Событие:
> -Боевая единица - A unit Умирает
> Условие:
> ---(Unit type of (Triggering unit)) равно "Здание2"
> Действие:
> -Отряд - Pick every unit in (Units in "Oil1" Owned by (Owner of (Triggering unit))) and do (Actions)
> --Цикл - действия:
> -If\Then\Else, multiple function
> --Если - условия:
> ---(Unit type of (Picked unit)) равно (Unit type of (Triggering unit))
> --То - Действие:
> ---Триггер - Turn off ("ZoneOilOne")
> ---Боевая единица - Create 1 "Здание1" for Нетрально-пассивный at (Center of "Oil1") facing Стандартная ориентация зданий degrees
> --Иначе - Действие:

И заключительный триггер:
подходит к зданию в копилку игрока падает снятая нефть, отображается количество полученного и юнит отправляется обратно к платформе.

> Событие:
> -Время - Every 0.50 seconds of game time
> Условие:
> Действие:
> -For each (Integer B) from 1 to 12, fo (Actions)
> --Цикл - действия:
> ---Отряд - Pick every unit in (Units owned by (Player (Integer B)) of type "Здание3") and do (Actions)
> ----Цикл - действия:
> -----Отряд - Pick every unit in (Units within 200.00 of (Position of (Picked unit))) and do (Actions)
> ------Цикл - действия:
> -------If\Then\Else, multiple function
> --------Если - условия:
> ---------(Picked unit) is in "SlotOfUnits"[(Integer B)] равно Да
> --------То - Действие:
> ---------Отряд - Remove (Picked unit) from "SlotOfUnits"[(Integer B)]
> ---------Set "PlayersOil"[(Integer B)] равно ("PlayersOil"[(Integer B)] + 10)
> ----------Плавающий текст - Create floating text that reads +10 at (Position of (Picked unit)) with offset 0.00, using font size 10.00 color (50.00%, 50.00%, 50.00%) and 0.00% transparency
> ----------Плавающий текст - Set the velocity of (Last created floating text) to 42.00 towards 90.00 degrees
> ----------Плавающий текст - Скрыть (Last created floating text) for (All enemies of (Owner of (Killing unit)))
> ----------Плавающий текст - Change (Last created floating text): Заблокировать permanence
> ----------Плавающий текст - Change the lifespan of (Last created floating text) to 2.00 seconds
> ----------Таблица рекордов - Change the title of "PlayersBoard"[(Integer B)] to (Нефть: +(String(PlayersOil[(Integer B)])))
> ----------Боевая единица - Order (Picked unit) to Двигаться (Position of (Random unit from(Units owned by (Player (Integer B)) of type "Здание2")))
> --------Иначе - Действие:


Ссылка на скачивание примера

Фух, закончил))

Просмотров: 5 765

» Лучшие комментарии


map_maiker #1 - 4 года назад 0
good
SID69 #2 - 4 года назад 4
Простолюдам не понять!
Daro #3 - 4 года назад -1
не понять
Sergant1000 #4 - 4 года назад 0
MMIceStar, Daro, Ну третий ресурс это сложное и геморройное занятие, расчитанное на человека который освоил триггеры. Так что дерзайте, но если что помогу.
LordOfTheRings #5 - 3 года назад -1
Конечно это здорово, но я бы хотел, чтобы на этот новый ресурс можно было что-то покупать.
Timoxxx #6 - 3 года назад 1
LordOfTheRings:
Конечно это здорово, но я бы хотел, чтобы на этот новый ресурс можно было что-то покупать.
В чем проблема?
Сохраняй цены в переменные.
2 комментария удалено