Skip to content

Что такое Структура Пилла

Структурой Пилла мы называем таблицу, второй аргумент в регистрации через pills.register(name, {...}), которая имеет все сведения о нашем Пилле: модель, способности, анимации, скорость, звуки и т.д.

Все основные параметры структуры

Чаще всего в Пилле необходимы именно следующие параметры:

ПараметрТипОписание
printNamestringПолное имя ОБЯЗАТЕЛЕН
modelstringПуть до модели (должен начинаться с "models/")
typestringОБЯЗАТЕЛЕН И ВСЕГДА ДОЛЖЕН УКАЗЫВАТЬ ply
hullVectorХитбокс (третий аргумент - высота)
duckByfloatНа сколько юнитов Пилл присаживается
healthfloatМаксимальное здоровье (Если не указать - включается бессмертие)
jumpPowerfloatСила прыжка
animstable[...]Анимации модели
soundstable[...]Звуки
moveSpeedtable[...]Скорость передвижения
attacktable[...]ЛКМ Пилла
attack2table[...]ПКМ Пилла
reloadfunction(ply, ent)Бинд +reload Пилла
jumpfunction(ply, ent)Прыжок
landfunction(ply, ent)Приземление

Также есть дополнительные параметры:

ПараметрТипОписание
cameratable[...]Настройки камера от первого и третьего лица
viewmodeltable[...]Класс и настройки SWEP'а который будет служить Пиллу руками от первого лица
talktable[...]Укажите здесь параметры для движения рта аниматроника, когда тот разговаривает
modelScalestringРазмер модели
bloodTypeintТип крови (См. Enum BLOOD_COLOR)
muteStepsboolПриглушить ходьбу игрока?
noFallDamageboolОтключить урон от падения?
chaseThemestringТема погони (Например, default)
movePoseModestringЕсли модель поддерживает параметры поз move_x и move_y, то впишите xy. Параметр move_yaw пока не проверен на работоспособность
aimtable[...]Указывает какие параметры поз использовать для поворота тела Пилла вместе с камерой игрока
collisionGroupintГруппа коллизии (См. Enum COLLISION_GROUP)
killConditionfunction(ply, ent)Если есть, и возвращает true, то рисует значок убийства у курсора игрока
startFunctionfunction(ply, ent)Срабатывает после того как игрок стал Пиллом
onRemovefunction(ent, formTable, ply)Срабатывает после удаления Пилла (т.е. игрок сменил Пилл, или стал выжившим)
onRemovePostfunction(ent, formTable, ply)Тоже самое что и сверху
restorefunction(ent, formTable, ply)Тоже самое что и сверху, но не вызывается если игрока СМЕНИЛ ПИЛЛ
tauntfunction(ply, ent, act)Срабатывает, при использовании игроком команды act
moveModfunction(ply, ent, mv, cmd)Позволяет обработать передвижение Пилла внутри SetupMove
animStoppedfunction(ply, ent, anim)Вызывается после того как закончилась анимация (Не вызывается если закончился слоёная анимация)
animEventfunction(ply, ent, eventName, time, cycle, type, options)Вызывается в ENT:HandleAnimEvent(...)
boneMorphstable[...]Используется для изменения позиции, поворота и размера костей

WARNING

onRemove и onRemovePost вызываются как на сервере, так и на клиенте. Также учтите что аргументы в функции не начинаются как можно привыкнуть с игрока, тут у нас (ent, formTable, ply)

killCondition вызывается только на клиенте.

Параметры, которые не используются нигде в режиме, но они есть:

ПараметрТипОписание
flashlightfunction(ply, ent)Вызывается когда фонарик включается (Если игрок выключает фонарик - не вызывается)
glideThinkfunction(ply, ent)Вызывается пока игрок не на земле
diefunction(ply, ent)После смерти игрока, владеющим Пиллом
visColorColorКрасит модель Пилла в данный цвет
visColorRandomboolКрасит модель Пилла в случайный цвет
fliesboolПилл должен летать, а не ходить?
cloaktable[...]Встроенная в базу система невидимости, скорее всего НЕ РАБОТАЕТ
loadouttable[Weapon]Выдаёт оружие из таблицы (МОЖЕТ БЫТЬ УДАЛЕНО В СЛЕДУЮЩИХ ОБНОВЛЕНИЯХ)
ammotable[...]Выдаёт патроны из таблицы (МОЖЕТ БЫТЬ УДАЛЕНО В СЛЕДУЮЩИХ ОБНОВЛЕНИЯХ)

Альтернативные SHARED варианты attack, attack2 и reload:

ПараметрТипОписание
attack_shfunction(ply, ent)Тоже самое, что и attack
attack2_shfunction(ply, ent)Тоже самое, что и attack2
reload_shfunction(ply, ent)Тоже самое, что и reload
attack_sh_nolcfunction(ply, ent)Тоже самое, что и attack, но без Лаг-Компенсации
attack2_sh_nolcfunction(ply, ent)Тоже самое, что и attack2, но без Лаг-Компенсации
reload_sh_nolcfunction(ply, ent)Тоже самое, что и reload, но без Лаг-Компенсации

На заметку

Вместо версий без Лаг-Компенсации можно просто использовать версии SHARED и самостоятельно выключать её с помощью Player:LagCompensation(false)

Подробнее о параметрах

Скорее всего вы заметили, многие параметры требуют таблицу table[...], но что это такое? - Это таблицы с динамичными ключами и значениями. Далее мы разберём поподробнее как устроены эти таблицы.

anims

lua
anims={
	-- Внутри default хранятся все анимации Пилла
	-- кроме слоёных, они будут ниже
	default={
		-- Следующие анимации переключаются автоматически
		-- Справа должны быть названия анимаций самой модели,
		-- А слева строго указанные названия
		idle = "Idle_01",
		walk = "Walking",
		run = "Running",
		jump = "Jump_1",
		glide = "Air_01", -- В воздухе
		swim = "Swim_01", -- В воде
		crouch = "Crawl",
		crouch_walk = "CrawlMovement",
		noclip = "Air_02", -- В ноуклипе
		
		-- Также можно добавить свои анимации,
		-- Которые можно будет включить с помощью
		-- ent:PillAnim(name, freeze)
		stun = "TaserStun",
		land = "LandHard",
	},
	-- Слоёные анимации, которые можно будет
	-- включить с помощью
	-- ent:PillGesture(name, priority, rate, blendin, blendout, startFrame)
	gestures={
		melee = "Melee_01",
		land = "LandSoft",
		taken_damage = "body_Flinch01",
	},
	-- Следующие значения заставляют анимации
	-- Ускоряться, если скорость Пилла их превышает.
	speedCap={
		walk = 160,
		run = 500,
		ducked = 90,
	},
}

sounds

lua
sounds={
	-- Слева название звука, а справа - путь к звуку
	scream = "fnaf2/bonniescream.wav",
	melee = "fnaf2/xscream2.wav",
}
-- Можно воспроизвести с помощью
-- ent:PillSound("melee", false)

moveSpeed

lua
moveSpeed={
	walk = 160, -- Ходьба
	run = 500, -- Бег
	ducked = 90, -- Вприсяди
}

attack, attack2

lua
attack={
	-- режим "trigger" Обозначает что функция ниже сработает при единичном нажатии
	-- однако других режимов у параметра нет.
	mode="trigger",
	-- Функция при срабатывании параметра
	-- Первый аргумент это игрок носящий Пилл, второй это сам Пилл
	func=function(ply,ent)
		local target = FindNearestPlayer(ent:GetPos(), 130, ply, 32)
		if not IsValid(target) then return end
		target:TakeDamage(target:Health() + 500, ply)
		
		ent:PillSound("melee",false)
	end
}

camera

lua
camera = {
	-- Оффсет камеры от первого лица
	offset = Vector(0, 0, 90), -- (третий аргумент - высота)
	-- Дистанция камеры от Пилла от третьего лица
	dist = 150
}

viewmodel

lua
viewmodel={
	weapon = "v_bear", -- класс SWEP'а
	skin = 5, -- Скин
	bodyGroup = "Microphone", -- Бодигруп (меняет его значение на 1)
	func = function(wep) -- Функция при выдаче
		print("[TEST] Мы выдали игроку " .. wep:GetClass())
	end
},

talk

lua
talk = {
	jawbone="bip_lowerEndoJaw", -- Кость которая должна двигаться
	reversed=false, -- Если true, кость начинает двигаться в обратную сторону
	scale=1.5, -- Увеличить силу вращения
},

aim

lua
aim={
	xPose = "aim_yaw", -- Параметр позы если Пилл крутит камерой влево-вправо
	yPose = "aim_pitch", -- Параметр позы если Пилл крутит камерой вверх-вниз
	
	xInvert = true, -- Инвертировать лево-право
	yInvert = true -- Инвертировать вверх-вниз
},

boneMorphs`

lua
boneMorphs={
	-- Слева название кости, справа параметры в таблице
	-- Параметрами могут быть scale, pos и ang
	["bip_eye_R"] = {scale = Vector(0.5,0.5,0.5)},
	["bip_eye_L"] = {scale = Vector(0.5,0.5,0.5)},
	["bip_EyeLid_0_R"] = {scale = Vector(0,0,0)},
	["bip_EyeLid_1_R"] = {scale = Vector(0,0,0)},
	["bip_EyeLid_0_L"] = {scale = Vector(0,0,0)},
	["bip_EyeLid_1_L"] = {scale = Vector(0,0,0)},
},

Шаблон Пилла + Регистрация

Так как прописывание всех этих параметров вручную может показаться муторным (оно так и есть), FH предлагает вам шаблон, в котором есть все основные параметры!

Функция:

lua
local MY_PILL = GetPillTemplate()

PrintTable(MY_PILL)

Вывод:

["aim"]:
		["xPose"]	=	aim_yaw
		["yPose"]	=	aim_pitch
["bloodType"]	=	3
["camera"]:
		["dist"]	=	150
		["offset"]	=	0.000000 0.000000 90.000000
["duckBy"]	=	60
["health"]	=	10000
["hull"]	=	32.000000 32.000000 86.000000
["jump"]	=	function: 0x8088097784fcdbb2
["jumpPower"]	=	250
["movePoseMode"]	=	xy
["muteSteps"]	=	true
["noFallDamage"]	=	true
["sounds"]:
		["jump"]	=	jump.mp3
		["land"]	=	land.mp3
		["melee"]	=	fnaf2/xscream2.wav
["type"]	=	ply

После того как использовали шаблон, можно добавлять, или изменять параметры:

lua
local MY_PILL = GetPillTemplate()

MY_PILL.printName = "Super Jump Freddy"
MY_PILL.model="models/speps/pill/oldfreddy.mdl"
MY_PILL.jumpPower = 500
MY_PILL.anims={
	default={
		idle = "idle",
		crouch = "crouch",
		crouch_walk = "crouchmove",
		walk = "walk",
		run = "run",
		jump = "jump",
		glide = "air",
		land = "land",
	}
}
MY_PILL.moveSpeed={
	walk = 150,
	run = 490,
	ducked = 70,
}
MY_PILL.viewmodel={	weapon="v_freddy" }

И как финальный этап, теперь мы можем зарегистрировать наш Пилл, в конце нашего кода:

lua
pills.register("super_jump_freddy", MY_PILL)

Внимание

Убедитесь, что наш код загружается после того как загружается режим. Проще всего это сделать так:

lua
hook.Add("OnGamemodeLoaded", "fh_mycustom_anim", function()
	-- надо убедиться что режим сервера - Fazbear's Hunt
	if engine.ActiveGamemode() ~= "fazbearshunt" then return end
    
	-- Сюда пишем код
end)

Если никаких ошибок нет, то теперь спокойно заходите на любую карту, затем открывайте Админ-Панель (на Q) и заходите в раздел Аниматроники. В категории "Неизвестные" должен лежать ваш Пилл.

Следующий шаг

Перейдите к разделу Регистрация в базу FH →, чтобы узнать, как зарегистрировать аниматроника в базу FH.