Вступление
Приветствую, читатель. В этом руководстве я бы хотел рассказать тебе обо всем, что касается создания голограмм в Гаррис моде. Я покажу все функции, которые участвуют в создании голограмм, а также продемонстрирую небольшой пример создания минигана, который будет заменять нам физган (ну не совсем заменять, но об этом позже :D).-------------------------Если кто-то не знает, как открыть Expression 2---------------------------------------Для начала нам понадобится скачать из воркшопа аддон Wiremod: http://steamcommunity.com/sharedfiles/filedetails/?id=160250458. В этот аддон включен Expression 2, язык программирования, с помощью которого мы и будем создавать голограммы.После того, как аддон скачан, необходимо запустить игру, открыть Q-меню, справа сверху выбрать вкладку "Wire", далее найти папку "Chips, Gates" и уже выбрать пункт "Expression 2". Далее справа нажимаем кнопку New Expression.Перед нами появляется окно Expression 2, в котором мы и будем программировать наш чип на создание голограмм.-----------------------------------------------------------------------------------------------------------------------------Хочу добавить, что урок рассчитан все-таки на людей, хоть что-то умеющих делать на Е2, так что базовые действия я комментировать не буду. Если что-то не понятно, спрашивайте в комментариях.Приятного изучения голограмм :)
Что такое, с чем едят?
Собственно, голограммы - это объекты, которые можно увидеть, но нельзя потрогать. У них нет физики, поэтому если просто создать голограмму, она останется висеть в воздухе. Если хочется, например, создать физику падения, придется прописывать это в коде отдельно. Голограммы можно прикреплять к другим голограммам, пропам, даже игрокам (миниган в конце как раз и будет примером).
Список функций
Итак, вот список функций с их подробным описанием:
Функция | Возвращает значение | Описание |
---|---|---|
holoEntity(N) | Энтити | Возвращает энтити голограммы с указанным индексом |
holoIndex(E) | Число | Возвращает индекс голограммы по указанной энтити голограммы |
holoCanCreate() | Число | Возвращает 1, когда holoCreate() успешно создала новую голограмму, до тех пор, пока не достигнут лимит голограмм на сервере. Заменяет holoRemainingSpawns() |
holoRemainingSpawns() | Число | Возвращает количество голограмм, которые игрок еще может создать |
holoCreate(N,V,V,A,V,S) | Энтити | Создает новую голограмму с параметрами: Индекс, Позиция, Размер, Угол, Цвет, Модель. Если модель указана неправильно или не указана вовсе, то устанавливается дефолтная модель - куб |
holoCreate(N,V,V,A,V) | Энтити | Создает новую голограмму с параметрами: Индекс, Позиция, Размер, Угол, Цвет |
holoCreate(N,V,V,A) | Энтити | Создает новую голограмму с параметрами: Индекс, Позиция, Размер, Угол |
holoCreate(N,V,V) | Энтити | Создает новую голограмму с параметрами: Индекс, Позиция, Размер |
holoCreate(N,V) | Энтити | Создает новую голограмму с параметрами: Индекс, Позиция |
holoCreate(N) | Энтити | Создает новую голограмму с параметром: Индекс |
holoDelete(N) | - | Удаляет голограмму с указанным индексом |
holoDeleteAll() | - | Удаляет все голограммы владельца чипа |
holoScale(N,V) | - | Устанавливает размеры голограммы с заданным индексом по заданному вектору |
holoScale(N) | Вектор | Возвращает размеры голограммы с указанным индексом |
holoScaleUnits(N,V) | - | Устанавливает размеры голограммы с заданным индеском по заданному вектору в единицах Гаррис Мода |
holoScaleUnits(N) | Вектор | Возвращает размеры голограммы с указанным индексом |
holoPos(N,V) | - | Устанавливает позицию голограммы с указанным индексом |
holoColor(N,V,N) | - | Устанавливает цвет и прозрачность голограммы с указанным индексом |
holoColor(N,V) | - | Устанавливает голограммы с указанным индексом |
holoAlpha(N,N) | - | Устанавливает прозрачность голограммы с указанным индексом |
holoShadow(N,N) | - | Регулирует отображение тени голограммы: 0 - отключить отбрасывание тени, 1 - включить |
holoAng(N,A) | - | Устанавливает угол голограммы с указанным индексом |
holoModel(N,S,N) | - | Устанавливает модель, а также номер скина голограммы с указанным индексом |
holoModel(N,S) | - | Устанавливает модель голограммы с указанным индексом |
holoSkin(N,N) | - | Меняет скин голограммы с указанным индексом |
holoMaterial(N,S) | - | Устанавливает материал голограммы с указанным индексом |
holoBodygroup(N,N,N) | - | Устанавливает основную и побочную группы голограммы с указанным индексом |
holoBodygroups(N,N) | Число | Возвращает количество побочных групп указанной основной группы голограммы с указанным индексом |
holoDisableShading(N,N) | - | Отключает/Включает шейдинг голограммы с указанным индексом |
holoRenderFX(N,N) | - | Устанавливает режим отображения голограммы с указанным индексом |
holoParent(N,N) | - | Привязывает голограмму с первым индексом к голограмме со вторым индексом |
holoParent(N,E) | - | Привызывает голограмму с указанным индексом к энтити |
holoParentAttachment(N,E,S) | Энтити | Привызывает голограмму с указанным индексом к указанной части энтити |
holoUnparent(N) | - | Снимает любые привязки с голограммы с указанным индексом |
holoClipEnabled(N,N) | - | Включает/выключает возможность разреза голограммы голограммы с указанным индексом |
holoClipEnabled(N,N,N) | - | Аналогично предыдущей функции, но в данном случае есть возможность манипулирования разным количеством разрезов |
holoClip(N,V,V,N) | - | Определяет, как будет разрезаться голограмма. Первый вектор - позиция разреза, второй - направление. Четвертый параметр определяет, будет ли разрез относительно глобальных или локальных векторов |
holoClip(N,N,V,V,N) | - | Аналогично предыдущей функции, но эта функция позволяет выбирать определенный разрез для голограммы (второй параметр) |
holoClipsAvailable() | Число | Возвращает количество возможных разрезов голограммы с указанным индексом |
holoVisible(N,E,N) | - | Включает/Выключает отображение голограммы с указанным индексом для указанного энтити |
holoVisible(N,R,N) | - | Включает/Выключает отображение голограммы с указанным индексом для указанного всех игроков в массиве R |
Список моделей для голограмм
Здесь указаны базовые модели голограмм с их названиями, которые нужно будет вставить в функции holoCreate() или holoModel().
Низкополигональные голограммы:
cone | cube | cylinder | hexagon |
icosphere | icosphere2 | icosphere3 | octagon |
plane | prism | pyramid | right_prism |
sphere | sphere2 | sphere3 | tetra |
torus | torus2 | torus3 |
Высокополигональные голограммы:
Некоторые разъяснения
Базовые параметры голограммы:
- Базовый вид голограммы - белый куб, модель "cube".
- Базовое положение - позиция чипа, породившего голограмму.
- Угол голограммы соответствует углу чипа, под которым он находился в момент создания или обновления.
Создаем миниган
В данном уроке я создам миниган, который наш персонаж будет держать в руках, когда он держит физган, и который будет висеть за спиной, если выбрано другое оружие. Я использую почти все функции, указанные в руководстве, так что вам будет легче понять на практике работу каждой из этих функций. Начнем:
@name minigun@persist [E O Base Pivot]:entity I NumHolo Hold T Roll
Для начала объявим необходимые нам переменные:E - наш Е2 чипO - владелец чипа, то есть мыBase - базовая голограмма, к которой будут крепиться остальныеPivot - голограмма, которая будет крепиться к рукам нашего персонажаI - счетчикNumHolo - количество наших голограммHold - проверка на то, какое оружие у нас в рукахT - переменная, необходимая нам для вычета угла вращенияRoll - проверка на нажатие ПКМrunOnTick(1)if(first()){ E=entity() O=owner() Pivot=holoCreate(0) holoParent(0,E) holoAlpha(0,0) Base=holoCreate(1,E:pos(),vec(0.75,0.75,4),ang(90,0,0),vec(200),"hq_tube") holoParent(1,0) I = 2 NumHolo = 15 Hold=1
Мы создали первые две голограммы. Переменной Pivot присвоили энтити нулевой голограммы, чтобы потом закрепить ее там, где нам будет удобно. Выставили значение прозрачности в 0, потому что ее видимость нам не нужна. Вторая голограмма,наоборот, видна нам и имеет модель трубы. По этой голограмме мы будем выравнивать остальные. Привязали ее к нулевой голограмме. Далее выставили значения переменных, которые будут участвовать в создании последующих голограмм. function entity holoStyle(Index,Position:vector,Scale:vector,Angle:angle,Colour:vector,Model:string) { holoPos(Index,Position) holoScale(Index,Scale) holoAng(Index,Angle) holoColor(Index,Colour) holoModel(Index,Model) return holoEntity(Index) }}
Здесь я объявил пользовательскую функцию, которая, как можно заметить, по конструкции идентична holoCreate(). Я сделал так, потому что ниже будет проверяться количество голограмм, которые я могу создать, а для этого я просто создам голограммы без их стилизации.elseif(I <= NumHolo & holoCanCreate() & I > 0){ holoCreate(I) holoScale(I,vec()) I++ }
Собственно, проверка на количество возможных создаваемых голограмм.elseif(I > NumHolo & I > 0){ holoStyle(2,Base:toWorld(vec(0,6,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(3,Base:toWorld(vec(0,-6,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(4,Base:toWorld(vec(6,0,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(5,Base:toWorld(vec(-6,0,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(6,Base:toWorld(vec(4,4,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(7,Base:toWorld(vec(4,-4,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(8,Base:toWorld(vec(-4,4,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(9,Base:toWorld(vec(-4,-4,0)),vec(0.1,0.1,4),Base:toWorld(ang()),vec(150),"hq_tube") holoStyle(10,Base:toWorld(vec(0,0,-18)),vec(1.2,1.2,0.75),Base:toWorld(ang()),vec(150),"hq_cylinder") holoStyle(11,Base:toWorld(vec(0,0,20)),vec(1.3,1.3,1),Base:toWorld(ang()),vec(150),"hq_cylinder") holoStyle(12,Base:toWorld(vec(-3,-10,23)),vec(0.1,0.1,0.5),Base:toWorld(ang(0,0,90)),vec(150),"hq_cylinder") holoStyle(13,Base:toWorld(vec(-2,0,25)),vec(0.25,0.25,1.75),Base:toWorld(ang(30,0,0)),vec(150),"cube") holoStyle(14,Base:toWorld(vec(2,0,28)),vec(0.2,0.2,0.2),Base:toWorld(ang(0,0,90)),vec(150),"hq_torus") holoStyle(15,Base:toWorld(vec(2,0,28)),vec(0.05,0.05,0.1),Base:toWorld(ang(-60,0,0)),vec(150),"cube")
Здесь я просто начал создавать и выравнивать голограммы. По сути миниган уже сделан, но мы не можем его еще держать в руках. for(I=2,9){ holoParent(I,10) } for(I=10,NumHolo){ holoParent(I,Base) } I=0
Прикрепляем голограммы друг к другу. Я сделал два отдельных цикла, потому что мы позже сделаем так, чтобы миниган был не просто моделькой, но и вполне работающим и очень опасным оружием :D}elseif(I==0){ if(O:weapon():type()=="weapon_physgun"){ O:weapon():setAlpha(0) Hold=0 } else{ Hold=1 O:weapon():setAlpha(255) }
Тут мы просто делаем прозрачным наш физган, чтобы он не портил вид, а заодно делаем проверку на ношение необходимого нам оружия. if($Hold){ if(Hold==0){ holoPos(0,O:attachmentPos("anim_attachment_RH")) holoAng(0,O:attachmentAng("anim_attachment_RH")) holoParentAttachment(0,O,"anim_attachment_RH") holoAng(1,Pivot:toWorld(ang(80,-12,180))) holoPos(1,Pivot:toWorld(vec(28,-6,7))) } elseif(Hold==1){ holoPos(0,O:attachmentPos("chest")) holoAng(0,O:attachmentAng("chest")) holoParentAttachment(0,O,"chest") holoAng(1,Pivot:toWorld(ang(0,0,0))) holoPos(1,Pivot:toWorld(vec(-16,0,0))) } }}
В этом блоке мы привязываем наш миниган к нашим рукам, если сейчас у нас используется физган, или к груди, если используется любое другое оружие.T=(T+10)%360Roll=O:keyAttack2()if(Roll&!Hold){ holoAng(10,holoEntity(10):toWorld(ang(0,T,0)))#ifdef entity:shootTo(vector,vector,number,number,number,string)holoEntity(10):shootTo(holoEntity(10):pos()-holoEntity(10):forward()*5,O:aimPos()-holoEntity(2):pos()-vec(0,0,30),0,0,0,"toolTracer")#endif holoEntity(10):soundPlay(1,0.3,"weapons/minigun/gunfire/minigun_fire.wav")}
Здесь мы прописываем код стрельбы и вращения стволов нашего минигана. KeyAttack2 - это клавиша ПКМ.*ВНИМАНИЕ* Для использования функции ShootTo вам необходим Health Core или же аддон E2Power. Если таковых нет, то просто закомментируйте эту функцию. В этом случае миниган просто не будет стрелять. Подведем итоги
В данном руководстве мы рассмотрели все функции, позволяющие нам создать голограммы в Garry's Mod'е, увидели их практическое применение. Если вам что-то оказалось сложным, либо вы не знаете каких-то функций, использованных в создании минигана, пишите в комментарии или в личку, все расскажу и покажу. Прошу вас также указать на какие-то ошибки, допущенные в руководстве, или на ошибочный перевод.Таблица функций и картинки базовых моделей взяты с официальной вики Wiremod: http://wiki.wiremod.com/wiki/Expression_2Добавляйте руководство в избранное, чтобы иметь в игре быстрый доступ к функциям создания голограмм.