Перейти к содержанию

Рекомендуемые сообщения

Опубликовано
09.11.2021 08:53:12, Pimple03 сказал(-а):

Маркер то есть, но манипуляции с ним ничего кроме перечисленного выше не дают, если ячейка уже была однажды загружена.

Чессказать, я вообще не очень понимаю назначение этих маркеров, т.к не шибко заморачивался тем, в какую сторону будет расположен интерьер (это мало кого волнует в процессе игры). А если ячейку сбросить с помощью функции ResetCell?

Ничто не истинно, все потрачено

Опубликовано
09.11.2021 11:03:37, Pimple03 сказал(-а):
Я пробовал ResetInterior, но результат нулевой.

PurgeCellBuffers

после SetAngle z

и разумеется, игрок не должен находиться в этой ячейке во время выполнения этой команды (скрипта).

  • Нравится 2
  • 3 недели спустя...
Опубликовано

Можно ли добавить в инвентарь игрока предмет, который будет значиться как украденный? Ну, или сделать предмет таковым уже непосредственно в самом инвентаре?

Опубликовано
Можно ли добавить в инвентарь игрока предмет, который будет значиться как украденный?

 

С помощью команды Activate можно заставить принудительно взять размещённый в мире предмет, причём, не зависимо от того, где он находится.

  • Нравится 1
Опубликовано

Я реализовал движение объекта привязав смещение по осям координат к таймеру внутри скрипта. Оказалось, что скорость движения напрямую зависит от мощности железа и разница весьма значительная. Отсюда вопрос: если вместо таймера в скрипте я использую привязку к игровому времени посредством функции GetCurrentTime (в теории мне это кажется возможным) нивелирует ли это разницу в скорости движения объекта на разных машинах?

Опубликовано
28.11.2021 18:41:57, Pimple03 сказал(-а):

Я реализовал движение объекта привязав смещение по осям координат к таймеру внутри скрипта. Оказалось, что скорость движения напрямую зависит от мощности железа и разница весьма значительная. Отсюда вопрос: если вместо таймера в скрипте я использую привязку к игровому времени посредством функции GetCurrentTime (в теории мне это кажется возможным) нивелирует ли это разницу в скорости движения объекта на разных машинах?

Хотелось бы увидеть сам скрипт. И я не очень понимаю - зачем Вам привязка к игровому времени, когда задавать скорость можно с помощью переменной-множителя?

Ничто не истинно, все потрачено

Опубликовано
28.11.2021 19:21:26, Takirell сказал(-а):
задавать скорость можно с помощью переменной-множителя

Переменную-множитель я использую для замедления объекта в конце движения, но и она обрабатывается с разной скоростью на разных по мощностям компьютерах. В самом скрипте используется стандартный таймер с функцией GetSecondsPassed.

Опубликовано

Скриптовые перемещения объектов (getpos\setpos, getangle\setangle) нужно делать через getSecondsPassed - тогда они будут независимыми от фпс, и скорость одинаковой на любых машинах. Пример:
set xp to ОбъектРеф.getpos x + 60*getSecondsPassed
ОбъектРеф.setPos x xp
Ну тут уже на практике смотри, какое число умножать на getSecondsPassed, чтобы получить нужную скорость.

  • Нравится 2
Опубликовано
02.12.2021 11:31:08, asrind сказал(-а):
как слить два плагина Oblivion в один?

Я бы воспользовался утилитой Tes4Edit. Там довольно быстро можно скопировать данные из одного плагина в другой. Главное чтоб в списке плагинов ваш плагин был расположен ниже донорского. Если одежда зачарована, то лучше сначала скопировать зачарования, а потом саму одежду, предварительно удалив с нее чары. А потом добавить чары обратно с новыми FormID. Иначе программа потребует добавить плагин-донор в список мастер-файлов вашего плагина.

  • Нравится 1
Опубликовано
02.12.2021 18:24:13, Pimple03 сказал(-а):

Я бы воспользовался утилитой Tes4Edit. Там довольно быстро можно скопировать данные из одного плагина в другой. Главное чтоб в списке плагинов ваш плагин был расположен ниже донорского. Если одежда зачарована, то лучше сначала скопировать зачарования, а потом саму одежду, предварительно удалив с нее чары. А потом добавить чары обратно с новыми FormID. Иначе программа потребует добавить плагин-донор в список мастер-файлов вашего плагина.

Либо TES4Gecko, который в 2 клика объединяет плагины.

  • Нравится 1

Ничто не истинно, все потрачено

Опубликовано

Задумал тут одну вещь: хотел сделать так, чтобы при условии завершения основного квеста и наступления нового года по игровому календарю, год сбрасывался на первый, а эра изменялась на 4ю. Собирался даже выпустить номер "вороного курьера" посвященный этому событию, и набросал его текст в уме, но в очередной раз меня ждало разочарование. Год сбросить не проблема, а "3я эра" это просто текст в меню и изменить его не представляется возможным. Жалко...

Опубликовано
05.12.2021 11:49:00, Pimple03 сказал(-а):
"3я эра" это просто текст в меню и изменить его не представляется возможным

Этот текст также должен быть где-то прописан, возможно, что в каком-то из XML-файлов интерфейса или же - это игровая настройка.

Ничто не истинно, все потрачено

  • 2 недели спустя...
Опубликовано (изменено)
20.01.2021 22:53:51, Pimple03 сказал(-а):

Попробовал изобразить спарринг двух NPC взяв за основу тренировку клинков в храме повелителя облаков. В точности скопировал их скрипты (кроме фрагмента с повышением навыка у игрока при наблюдении), а также AI пакеты с привязкой к маркерам на локации. В результате получилось не совсем то, что хотелось. А именно: мои NPC совсем не используют блок и лупят друг друга без остановки. Если оказаться в поле зрения одного из них, не важно, на каком расстоянии, то он прекращает спарринг и просто стоит с оружием наизготовку, в то время, как второй продолжает его дубасить. Может кто-нибудь сталкивался с подобным? Возможно есть нюанс, который я упустил... Изменение CombatStyle ничего не дает.

А упустил я следующее: Нужно было у маркера (на который ссылается AI пакет) во вкладке "X Target Data" указать RefID спарринг-партнера.

Изменено пользователем Pimple03
  • Нравится 1
Опубликовано (изменено)

Я заскриптовал объект-активатор на "Bigin OnHitWith" определенным оружием и выяснилось, что скрипт не работает. Как же так, подумал я, ведь я уже использовал подобный скрипт, только вместо оружия была стрела. Забавно, но на стрелу мой активатор сразу заработал, но он никак не реагирует ни на какое оружие. Больше того, он не работает даже просто с "Begin OnHit". Пораскинув мозгами, я пришел к выводу, что скрипт не срабатывает, потому, что активатор не получает урона. Почему же он реагирует на стрелу? Видимо потому, что реакция на попадание стрелой по неживому объекту была запрограммирована, чтобы сработала "стрела высвобождения" и обучающий квест с ведром. Или я опять что-то упустил?

Изменено пользователем Pimple03
Опубликовано
20.12.2021 22:04:06, Pimple03 сказал(-а):

Я заскриптовал объект-активатор на "Bigin OnHitWith" определенным оружием и выяснилось, что скрипт не работает. Как же так, подумал я, ведь я уже использовал подобный скрипт, только вместо оружия была стрела. Забавно, но на стрелу мой активатор сразу заработал, но он никак не реагирует ни на какое оружие. Больше того, он не работает даже просто с "Begin OnHit". Пораскинув мозгами, я пришел к выводу, что скрипт не срабатывает, потому, что активатор не получает урона. Почему же он реагирует на стрелу? Видимо потому, что реакция на попадание стрелой по неживому объекту была запрограммирована, чтобы сработала "стрела высвобождения" и обучающий квест с ведром. Или я опять что-то упустил?

Все верно, эти блоки не работают на активаторах. Игра реагирует только на прожектали (магические снаряды и стрелы, т.к они, походу, чуть иначе обрабатываются).

Ничто не истинно, все потрачено

Опубликовано
21.12.2021 08:00:16, Takirell сказал(-а):
Все верно, эти блоки не работают на активаторах.

Может есть способ как-то по другому зафиксировать удар оружием по активатору?

Опубликовано
21.12.2021 09:01:39, Pimple03 сказал(-а):

Может есть способ как-то по другому зафиксировать удар оружием по активатору?

По классике - ставят кричера на место активатора и по его скрипту считывают удары. Можно попробовать использовать триггер, хотя я так никогда не делал.
Есть еще мысль через GetCrosshairRef считывать объект в перекрестии игрока, затем проверять анимацию атаки через AnimPathIncludes и уже по полученным результатам считать хиты. Сам я такой скрипт не писал, концепция давно вынашивается в голове, но реализовывать не пробовал, т.к не было надобности.
На нексусе где-то был мод, типа NPC Box, который, якобы, ловил удары. По этой схеме был построен локальный урон по актерам. Мод не разбирал, хз, как он досконально устроен.

  • Нравится 1

Ничто не истинно, все потрачено

Опубликовано
21.12.2021 09:51:15, Takirell сказал(-а):
Есть еще мысль через GetCrosshairRef считывать объект в перекрестии игрока

По моему именно так и реализовано разбивание замков в моде Lock Bash Omega (включен в состав ООО)
если интересно, вот код

КОД
scn tejonLockBashScript

float fQuestDelayTime
short bash
short bashWas
ref target
short lockRoll
short playerRoll
short modifier
float damage
ref thing
long value

begin GameMode
	set fQuestDelayTime to 0.01

	;	The crime is reported through SendTrespassAlarm, which fails if the player is not detected.
	;	Disallow during stealth because the other option is to force the player out of stealth.
	;	This would be inconsistent: hitting doors breaks stealth, but hitting walls doesn't?
	if (player.IsSneaking)
		RETURN
	endif

	;	Detect attacks on statics by checking for the sound.
	;	Since quick attack sounds can overlap, test by quantity relative to previous frame.
	set bash to (player.GetSoundPlaying WPNHitBlunt) + (player.GetSoundPlaying WPNHitBlade) + (player.GetSoundPlaying WPNHitHand)
	if bash > bashWas
		set target to GetCrosshairRef
		;	Naturally, anything not lockable is never locked.
		if (target.GetLocked)
			;	Can't bash a door which needs a key.
			if (target.GetLockLevel < 100)
				set thing to player.GetBaseObject
				if target.IsOffLimits thing
					player.SendTrespassAlarm player
				endif

;	FORMULA STARTS HERE
				;	This is a roll-off on 100-sided dice.
				;	The lock gets the better of two rolls, modified by its lock level.
				set lockRoll to GetRandomPercent
				set value to GetRandomPercent
				if value > lockRoll
					set lockRoll to value
				endif
				set lockRoll to lockRoll + target.GetLockLevel
				;	Striker will be damaged based on lock quality and roll.
				;	Damage is stored as a negative number for use with ModXXX commands.

				;	The player gets the worse of two rolls, or the better of two if power-attacking.
				set playerRoll to GetRandomPercent
				set value to GetRandomPercent
				if player.IsPowerAttacking
					if value > playerRoll
						set playerRoll to value
					endif
					;	Power attack causes significant extra damage to the striker.
					;	Remember damage is negative!
					set damage to -18
				else
					;	Not power attacking.
					if value < playerRoll
						set playerRoll to value
					endif
					set damage to -6
				endif

				;	Player's roll is modified by average of Strength and weapon skill.
				;	Luck affects Skill by the standard formula.
				;	Later when we divide the modifier by 5.1, that's based on the following:
				;	Maximum lock level is 100. Maximum attribute or skill is 255. 255/100 = 2.55.
				;	Averaging strength and skill for the modifier: 2.55 * 2 = 5.1.
				;	Player also gets a penalty for most weapons.
				set thing to player.GetEquippedObject 16
				;	If this returned zero player is unarmed, otherwise test weapon type.
				if (thing)
					;	Apply damage to the striking weapon.
					player.ModEquippedCurrentHealth damage 16
					;	Only continue bashing if weapon didn't break.
					if (player.GetEquippedCurrentHealth 16) > 0
						set value to GetWeaponType thing
						if (value == 0)
							;	1H Blade
							set modifier to player.GetAV Blade
							set playerRoll to playerRoll -15
							IncrementPlayerSkillUse Blade 0 0.5
						elseif (value == 1)
							;	2H Blade
							set modifier to player.GetAV Blade
							set playerRoll to playerRoll - 10
							IncrementPlayerSkillUse Blade 0 0.5
						elseif (value == 2)
							;	1H Blunt
							set modifier to player.GetAV Blunt
							set playerRoll to playerRoll - 5
							IncrementPlayerSkillUse Blunt 0 0.5
						elseif (value == 3)
							;	2H Blunt. No penalty to the roll!
							set modifier to player.GetAV Blunt
							IncrementPlayerSkillUse Blunt 0 0.5
						else
							;	Staff/bow melee mod?
							set modifier to 0
							set playerRoll to playerRoll - 20
						endif
					else
						;	Weapon broken, bash fails.
						message "Ваше оружие сломано и не может использоваться для того, чтобы ломать замки."
						RETURN
					endif
				else
					;	Unarmed. Master gets no penalty, other ranks do.
					set modifier to player.GetAV HandToHand
					if modifier < (GetGameSetting iSkillApprenticeMin)
						set playerRoll to playerRoll - 20
					elseif modifier < (GetGameSetting iSkillJourneymanMin)
						set playerRoll to playerRoll - 15
					elseif modifier < (GetGameSetting iSkillExpertMin)
						set playerRoll to playerRoll - 10
					elseif modifier < (GetGameSetting iSkillMasterMin)
						set playerRoll to playerRoll - 5
					endif
					;	If unarmed, damage gloves and/or player.
					set thing to player.GetEquippedObject 4
					if (thing)
						;	Hand armor absorbs some or all damage.
						;	Verify amor isn't already broken to avoid duplicate messages later.
						if (player.GetEquippedCurrentHealth 4) > 0
							if IsArmor thing
								if (GetArmorType thing)
									;	Type 1: Heavy Armor.
									set value to player.GetAV HeavyArmor
									if value >= (GetGameSetting iSkillJourneymanMin)
										set value to damage * (GetGameSetting fPerkHeavyArmorJourneymanDamageMult)
									elseif value < (GetGameSetting iSkillApprenticeMin)
										set value to damage * (GetGameSetting fPerkHeavyArmorNoviceDamageMult)
									else
										set value to damage
									endif
									player.ModEquippedCurrentHealth value 4
									if (player.GetEquippedCurrentHealth 4) == 0
										;	Broken, pass full damage amount.
										message "Ваши поврежденные рукавицы больше не поглощают отдачу."
									else
										;	Not broken, absorb all damage and exercise skill slightly.
										set damage to 0
										IncrementPlayerSkillUse HeavyArmor 0 0.25
									endif
								else
									;	Type 0: Light Armor.
									set value to player.GetAV LightArmor
									if value >= (GetGameSetting iSkillJourneymanMin)
										set value to damage * (GetGameSetting fPerkLightArmorJourneymanDamageMult)
									elseif value < (GetGameSetting iSkillApprenticeMin)
										set value to damage * (GetGameSetting fPerkLightArmorNoviceDamageMult)
									else
										set value to damage
									endif
									;	Only half damage is applied to light armor!
									set value to value / 2
									player.ModEquippedCurrentHealth value 4
									if (player.GetEquippedCurrentHealth 4) == 0
										;	Broken, pass full damage amount.
										message "Ваши поврежденные перчатки больше не уменьшают отдачу."
									else
										;	Not broken, absorb half damage and exercise skill slightly.
										set damage to damage / 2
										IncrementPlayerSkillUse LightArmor 0 0.25
									endif
								endif
							endif
						endif
					endif
					;	Now damage the player, if armor didn't absorb it all.
					;	We're going to be very nice and abort if this would be fatal.
					set value to 0 - (player.GetAV Health)
					if value < damage
						player.ModAV2 Health damage
						;	Gain skill only if it wouldn't kill you.
						IncrementPlayerSkillUse HandToHand 0 0.5
					else
						message "Вы вздрагиваете от боли и не можете нанести удар с полной силой."
						RETURN
					endif
				endif

				;	Oblivion luck formula cannot raise a skill above 100, so we'll prevent that.
				;	Skills naturally over 100 are kept.
				set value to (player.GetAV Luck)
				set value to value * (GetGameSetting fActorLuckSkillMult)
				set value to value + (GetGameSetting iActorLuckSkillBase)
				set value to modifier + value
				if value > 100
					set value to 100
					if value > modifier
						set modifier to value
					endif
				elseif value < 1
					set modifier to 0
				endif
				;	High Security is treated as extra Luck. This can push over 100, but not 255.
				set value to (player.GetAV Security)
				set value to value * (GetGameSetting fActorLuckSkillMult)
				set value to value + (GetGameSetting iActorLuckSkillBase)
				if value > 0
					set modifier to modifier + value
				endif
				if modifier > 255
					set modifier to 255
				endif

				;	Average skill with strength and adjust 255 to 100 as explained at the top.
				set modifier to (modifier + player.GetAV Strength) / 5.1
				;	And to just in case something went screwy...
				if modifier > 100
					set modifier to 100
				endif
				;	Finally, reduce the modifier according to the fatigue formula for weapon strikes.
				if modifier > 0
					set value to 1 - player.GetFatiguePercentage
					set value to value * (GetGameSetting fFatigueMult)
					set value to (GetGameSetting fFatigueBase) - value
					set modifier to modifier * value
				endif

				;	Apply the modifier to the roll, and compare. Winner takes all.
				set playerRoll to playerRoll + modifier
				if playerRoll >= lockRoll
					target.Unlock
					PlaySound PHYArmorHitHeavy
					message "Вы сломали замок!"
				else
					PlaySound CMetalSmall
				endif
;	FORMULA ENDS HERE

			endif
		endif
	endif

	;	Last but not least, set up next frame's sound quantity check.
	set bashWas to bash

end 

  • Нравится 2
Опубликовано
21.12.2021 19:06:09, allexa сказал(-а):
вот код

Спасибо, мне это помогло. Сделал пока в упрощенном виде (реакцию на удар), а в дальнейшем постараюсь добавить износ оружия как в Вашем примере.

Опубликовано
21.12.2021 19:06:09, allexa сказал(-а):

По моему именно так и реализовано разбивание замков в моде Lock Bash Omega (включен в состав ООО)

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

Ничто не истинно, все потрачено

  • 3 недели спустя...
Опубликовано

Подскажите как ограничить полное сопротивление магии? Как редактировать параметры брони понятно, а вот с магией не доходит...

Опубликовано
10.01.2022 17:43:49, JOSAM сказал(-а):
Подскажите как ограничить полное сопротивление магии?

Если сопротивление магии это способность, то нужно редактировать соответствующую Ability, изменяя параметр Magnitude.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...