Garry's Mod

Garry's Mod

194 ratings
Wiremod Expression 2. Всё о голограммах
By j0ez
В данном руководстве мною рассмотрены практически все аспекты создания голограмм в Garry's Mod'е с помощью Wiremod Expression 2.
   
Award
Favorite
Favorited
Unfavorite
Вступление
Приветствую, читатель. В этом руководстве я бы хотел рассказать тебе обо всем, что касается создания голограмм в Гаррис моде. Я покажу все функции, которые участвуют в создании голограмм, а также продемонстрирую небольшой пример создания минигана, который будет заменять нам физган (ну не совсем заменять, но об этом позже :D).

-------------------------Если кто-то не знает, как открыть Expression 2---------------------------------------
Для начала нам понадобится скачать из воркшопа аддон Wiremod: http://gtm.steamproxy.vip/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

Высокополигональные голограммы:


hq_cone

hq_cubinder

hq_cylinder

hq_dome

hq_hdome

hq_hdome_thick

hq_hdome_thin

hq_icosphere

hq_rcube

hq_rcube_thick

hq_rcube_thin

hq_rcylinder

hq_rcylinder_thick

hq_rcylinder_thin

hq_sphere

hq_stube

hq_stube_thick

hq_stube_thin

hq_torus

hq_torus_thick

hq_torus_thin

hq_tube

hq_tube_thick

hq_tube_thin

Модели можно использовать любые, которые доступны в вашем Q-меню, а не только те базовые, которые указаны выше. Для этого нужно в Q-меню правой кнопкой мыши нажать на модель, выбрать Copy to Clipboard, а затем вставить в ваш код.
Некоторые разъяснения
Базовые параметры голограммы:
  • Базовый вид голограммы - белый куб, модель "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)%360 Roll=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

Добавляйте руководство в избранное, чтобы иметь в игре быстрый доступ к функциям создания голограмм.
114 Comments
artemiter Coder 20 Jul, 2023 @ 6:39am 
да вооще везде можеш поставить галочку
artemiter Coder 20 Jul, 2023 @ 6:38am 
e2 Extensions и там holo чтобы на ней стояла галочка
artemiter Coder 20 Jul, 2023 @ 6:38am 
ана работает воощет
ты возможно в утилитах не включил кое чо свяханое с модельками
Nut Master 15 Jul, 2023 @ 12:30pm 
комманда wire_hologram_modelany 1 не работает, как избавиться от этого куба?
Arseny_1987[RU] 15 Jun, 2022 @ 12:59am 
Спасибо огромное, я никак не мог создать голограмму танка, постоянно появлялся куб ебучий, что только не делал.
Потом снес гаррис, прочистил подписки и все скачал, и после твоё руководство прочитал, и ВСЕ ЗАРАБОТАЛО!
Спасибо снова тебе ОГРОМНОЕ просто. Я уверен твое руководство в этом причастно!
Markus Fandom 24 Mar, 2022 @ 6:59am 
Можно ли как-то вырубить чужие холки? Есть ИНДИВИДУМЫ которые вешают холки на игроков. Хотелось бы узнать, как выключать видимость холок.
j0ez  [author] 23 Mar, 2021 @ 3:04am 
да
Yyate 22 Mar, 2021 @ 8:12am 
миниган всем игрокам виден?
ZergLingFX 19 Sep, 2020 @ 12:45pm 
pyshistik, скорее всего на сервере есть доп библиотеки которые ты использовал в своей программе, вот и ошибки появляются.
ZergLingFX 19 Sep, 2020 @ 12:44pm 
TheWitcher, wire_hologram_modelany 1 починит.