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

Тонкости скриптов


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

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

Нужно боольше doOnce, больше таймеров! Давай 500 делений в кадре?

Так покажи рабочий, на твой взгляд, вариант, только не абстрактно, а на примере скрипта выше...Хотя бы на одном блоке. Я бы и потестил. Потому и написал в темке, чтоб помогли, а критиковать всем нетрудно...

Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 335
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме


short state
float timer
if ( state != -1 )
if ( state == 1 )
if ( timer > 0 )
set timer to ( timer - getsecondspassed )
elseif ( gethealthgetratio < 0.7 )
modcurrenthealth 30
removeitem p_restore_health_e 1
set timer to 3.
set state to 0
playsound3D drink
return
endif
elseif ( getitemcount p_restore_health_e > 0 )
set state to 1
messagebox "он выпьет... "
else
set state to -1
endif
endif
Изменено пользователем Larkin
Ссылка на комментарий
Поделиться на другие сайты

short state
float timer
if ( state != -1 )
	if ( state == 1 )
		if ( timer > 0 )
			set timer to ( timer - getsecondspassed )
		elseif ( gethealthgetratio < 0.7 )
			modcurrenthealth 30
			removeitem p_restore_health_e 1
			set timer to 3.
			set state to 0
			playsound3D drink
			return
		endif		
	elseif ( getitemcount p_restore_health_e > 0 )
		set state to 1
		messagebox "он выпьет...           "
	else
		set state to -1
	endif
endif

Погоди, но на остальные 4 типа зелий ведь тоже самое придется делать, и скрипт не уменьшится? На каждое зелье свой state, ПОЛУЧАЕТСЯ?

Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

Для чего придумали тарелки для супа, каши и кружку для чая ?

Все можно наливать в одну большую кружку, тогда придется меньше мыть посуды в фигваме.

Оптимизация однако...

Ссылка на комментарий
Поделиться на другие сайты

Погоди, но на остальные 4 типа зелий ведь тоже самое придется делать, и скрипт не уменьшится? На каждое зелье свой state, ПОЛУЧАЕТСЯ?

Предполагается, что на каждое зелье свое значение state, для другого state = 2 , 3 и т.д. таймер один для всех. На сим я откланиваюсь.

Изменено пользователем Larkin
Ссылка на комментарий
Поделиться на другие сайты

 

Ни какого перегруза быть не должно, если не работает при добавлении магии, то наверно она и одна работать не будет.

 

Set f to GetMagicka / MaxMagicka - здесь пишет, что не может быть значения "f". Я изменил на слово "mana", скрипт сохранился, но при тесте ошибка вылетала еще при входе в локацию, такого вообще 100 лет не было...

 

begin A_A_NPC_USING_POTION_HEALTH


short doOnce
short doInit
Float MaxMagicka
float timerHealth
float timerMag
float mana

if ( doOnce ); NPC мертв
return
elseIf ( OnDeath ); NPC умер
set doOnce to 1; фиксируем смерть
return
elseif ( doInit == 0 )
Set MaxMagicka to GetMagicka
set doInit to 1; запоминаем начальную величину магии
endif
if ( timerHealth > 0 ); если задан таймер задержки
set timerHealth to ( timerHealth - getsecondspassed ); уменьшаем таймер
elseif ( GetEffect, sEffectRestoreHealth ); еще не кончился эффект
elseif ( GetHealthGetRatio < 0.5); стало мало жизни
if ( GetItemCount "p_restore_health_e" > 0 ); есть в наличии бутылек
Modcurrenthealth 200
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_health_e" 1
set timerHealth to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_health_q" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrenthealth 100
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_health_q" 1
set timerHealth to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_health_s" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrenthealth 50
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_health_s" 1
set timerHealth to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_health_c" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrenthealth 25
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_health_c" 1
set timerHealth to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_health_b" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrenthealth 15
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_health_b" 1
set timerHealth to 3; задаем три секунды таймеру
endif
endif

Set mana to GetMagicka / MaxMagicka
if ( timerMag > 0 ); если задан таймер задержки
set timerMag to ( timerMag - getsecondspassed ); уменьшаем таймер
elseif ( GetEffect, sEffectRestoreSpellPoints ); еще не кончился эффект
elseif ( mana < 0.5); стало мало маны
if ( GetItemCount "p_restore_magicka_e" > 0 ); есть в наличии бутылек
Modcurrentmagicka 300
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_magicka_e" 1
set timerMag to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_magicka_q" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrentmagicka 150
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_magicka_q" 1
set timerMag to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_magicka_s" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrentmagicka 75
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_magicka_s" 1
set timerMag to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_magicka_c" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrentmagicka 40
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_magicka_c" 1
set timerMag to 3; задаем три секунды таймеру
elseif ( GetItemCount "p_restore_magicka_b" > 0 ); проверка на следующий бутылек если нет предыдущего
Modcurrentmagicka 20
if ( GetSoundPlaying "Drink" == 0 )
PlaySound "Drink"
endif
RemoveItem "p_restore_magicka_b" 1
set timerMag to 3; задаем три секунды таймеру
endif
endif
end

 


Кстати, я потестил ModCurrent отдельно магию и усталость - они работают, хотя и иногда с зависаниями. Но скрипт из 2- 3х модулей игра не вывозит ну никак.

Изменено пользователем Scarab-Phoenix
Ссылка на комментарий
Поделиться на другие сайты

замени: Set mana to GetMagicka / MaxMagicka

на:

Set mana to GetMagicka

Set mana to mana / MaxMagicka

 

Ошибка, только теперь уже прям в бою

 

Кстати, зачем теперь вот эта вот проверка, если зелья, по сути, не "пьются" как таковые? 

 

elseif ( GetEffect, sEffectRestoreSpellPoints ); еще не кончился эффект

Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

проверка на эффект не нужна

 

я не вижу причин для сбоя, перегруженность это фигня.

Видимо что-то нельзя вызывать вместе.

можно их проверять по очереди:

1) добавь переменную:

short State

 

2) добавь проверку для этих блоков:

 

​if ( State == 0 )

  Set State to 1

​elseif ( State == 1 )

  Set State to 2

​else

  Set State to 0

endif

 

if ( State == 0 )

if ( timerHealth > 0 ); если задан таймер задержки

...

endif

 

 

if ( State == 1 )

Set mana to GetMagicka

...

endif

 

State будет меняться: 0 1 2 0 1 2...

проверки будут разнесены по времени.

Изменено пользователем olol
Ссылка на комментарий
Поделиться на другие сайты

В общем, я решил провести еще один опыт - я перенес блок со здоровьем вниз, убрал проверки на эффект и убрал звуки. Скрипт стал рабочим вот в таком формате:

 

 

begin A_A_NPC_USING_POTION_PLEASE
float timerHealth
float timerMag
short doOnce
 
if ( doOnce ); NPC мертв
  return
elseIf ( OnDeath ); NPC умер
 set doOnce to 1; фиксируем смерть
 return
endif
;---------------------------------Магия
if ( timerMag > 0 ); если задан таймер задержки
  set timerMag to ( timerMag - getsecondspassed ); уменьшаем таймер
elseif ( GetMagicka < 100); стало мало маны
  if ( GetItemCount "p_restore_magicka_e" > 0 ); есть в наличии бутылек
    Modcurrentmagicka 300
RemoveItem "p_restore_magicka_e" 1
        set timerMag to 3; задаем три секунды таймеру
  elseif ( GetItemCount "p_restore_magicka_q" > 0 ); проверка на следующий бутылек если нет предыдущего
        Modcurrentmagicka 150
RemoveItem "p_restore_magicka_q" 1
    set timerMag to 3
  elseif ( GetItemCount "p_restore_magicka_s" > 0 )
           Modcurrentmagicka 75
RemoveItem "p_restore_magicka_s" 1
    set timerMag to 3
  elseif  ( GetItemCount "p_restore_magicka_c" > 0 )
            Modcurrentmagicka 40
RemoveItem "p_restore_magicka_c" 1
    set timerMag to 3
  elseif  ( GetItemCount "p_restore_magicka_b" > 0 )
            Modcurrentmagicka 20
RemoveItem "p_restore_magicka_b" 1
    set timerMag to 3
  endif
endif
if ( timerHealth > 0 ); если задан таймер задержки
  set timerHealth to ( timerHealth - getsecondspassed ); уменьшаем таймер
elseif ( GetHealthGetRatio < 0.5); стало мало жизни
  if ( GetItemCount "p_restore_health_e" > 0 ); есть в наличии бутылек
     Modcurrenthealth 200
RemoveItem "p_restore_health_e" 1
    set timerHealth to 3; задаем три секунды таймеру
      elseif ( GetItemCount "p_restore_health_q" > 0 ); проверка на следующий бутылек если нет предыдущего
   Modcurrenthealth 100
RemoveItem "p_restore_health_q" 1
    set timerHealth to 3
  elseif ( GetItemCount "p_restore_health_s" > 0 )
    Modcurrenthealth 50
RemoveItem "p_restore_health_s" 1
    set timerHealth to 3
  elseif  ( GetItemCount "p_restore_health_c" > 0 )
    Modcurrenthealth 25
RemoveItem "p_restore_health_c" 1
    set timerHealth to 3
  elseif  ( GetItemCount "p_restore_health_b" > 0 )
     Modcurrenthealth 15
RemoveItem "p_restore_health_b" 1
    set timerHealth to 3
  endif
endif
end
 
 
После этого я аккуратно врезал такой же урезанный блок усталости в самое начало (вроде как скрипты читаются снизу вверх, как мне сказали). Скрипт вновь показал работоспособность, причем без вылетов и тормозов.
Получается, звук и проверка на эффект настолько сильно грузили скрипт, что он не мог нормально работать?
Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

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

Получается, звук и проверка на эффект настолько сильно грузили скрипт, что он не мог нормально работать?

"Грузили скрипт" - это нонсенс. Я бы лучше проверил сам код в той части скрипта, где был звук.

Ссылка на комментарий
Поделиться на другие сайты

"Грузили скрипт" - это нонсенс. Я бы лучше проверил сам код в той части скрипта, где был звук.

Там код из одной команды, максимум двух. Уже перепроверяли неоднократно. Я хз, может команду проигрывания звука надо останавливать, чтоб не подвисала?

 

Кстати, нашел в MSFD вот это: "В меню “Gameplay”->“Sound menu” Вы можете видеть список всевозможных звуков и их идентификаторов. Учтите, что по каким-то причинам ID “drink” создаёт ошибку, поэтому нет возможности проверить, выпил ли игрок что-нибудь."

 

Может,  заменить на др звук, например, от заклинания восстановления?

Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

чёй-то  тебе крупно не повезло, собрал все баги движка сразу.

вот и попробуй тут вычислить причину...

 

рискну посоветовать попробовать сделать то же самое с Equipt :)

 

а со звуком можно просто создать другой drink2 с тем же звуком и использовать его.

Изменено пользователем olol
Ссылка на комментарий
Поделиться на другие сайты

чёй-то  тебе крупно не повезло, собрал все баги движка сразу.

вот и попробуй тут вычислить причину...

 

рискну посоветовать попробовать сделать то же самое с Equipt :)

 

а со звуком можно просто создать другой drink2 с тем же звуком и использовать его.

А звук восстановления спеллов\зелий - где мне название найти - в эффектах заклинаний же? Возьму его для верности:)

 

Если не заработает - беру версию без звука - пилю глобалки через активаторы, и в топку все. Играть уже охота, а эти тесты все впечатление от игры портят. Эти дурацкие забеги по окрестным пещерам в 100500й раз....

Изменено пользователем Varang
Ссылка на комментарий
Поделиться на другие сайты

В общем, походу звук Drink был багованный - при его замене на звук заклинания восстановления прекратились тормоза и вылеты. Остается скрестить пальцы, что это пока последние сюрпризы.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Как-нибудь можно проверить класс игрока через ID класса?

Типо: класс игрока такой-то = 1

То дать игроку такую-то способность

Если не равно 1

То не давать игроку такую способность

Ссылка на комментарий
Поделиться на другие сайты

Как-нибудь можно проверить класс игрока через ID класса?

Типо: класс игрока такой-то = 1

То дать игроку такую-то способность

Если не равно 1

То не давать игроку такую способность

Никак, увы.

В СХ для этого наворотили целую уйму скриптов, которые, кажется, сравнивают диапазоны стартовых умений у разных классов с навыками игрока.

Ссылка на комментарий
Поделиться на другие сайты

Никак, увы.

В СХ для этого наворотили целую уйму скриптов, которые, кажется, сравнивают диапазоны стартовых умений у разных классов с навыками игрока.

В скриптах они проверяют значения навыков данного класса, а потом если совпадает - то дают способность. Я попытался так же сделать, но только подогнал под данмеров, но не работает. А делать через созвездия - ну такое

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

Друзья, подскажите пожалуйста.

 

Есть у нас в базе вот такой любопытный плагин:

Профессиональный алхимик

 

Помимо основных изменений с алхимией в комплект входят переносные контейнеры:

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

 

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

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

 

В общем-то, благодаря этому плагину это в целом возможно.

На контейнере "Походный мешок" висит вот такой скрипт:

 

 

Begin A1V4_RoadBagMiscItem_1_sc

short OnPCDrop

if ( GetDisabled == 1 )
	SetDelete 1
	return
endif

if ( OnPCDrop == 1 )
	set OnPCDrop to 0
	set A1V4_RoadBagX to GetPos X
	set A1V4_RoadBagY to GetPos Y
	set A1V4_RoadBagZ to GetPos Z
	PlaceAtPC A1V4_RoadBagMiscCont_1 1, 50, 0
	Disable
endif

End

 

 

 

Который в свою очередь ссылается на вот такой скрипт:

 

 

Begin A1V4_RoadBagMiscCont_1_sc

short doOnce
short doRemove
short doDisable
short temp
float cx
float cy
float cz
long invItem
long invCount
long invRef
long pcRef
long invRefType
long tempLong
float invWeight
long invNextRef
short doActivate
short waitActivate

if ( doDisable > 20 )
	if ( GetDisabled == 1 )
		SetDelete 1
		return
	endif
endif

if ( doDisable > 20 )
	Disable
	return
endif

if ( doDisable > 0 )
	AddItem "A1V4_RoadBagFakeIngred", 2
	set doDisable to ( doDisable + 1 )
	return
endif

if ( GetDisabled == 1 )
	Enable
	set doDisable to 1
endif

if ( waitActivate == 2 )
	if ( MenuMode == 0 )
		set waitActivate to 0
		if ( GetItemCount A1V4_RoadBagMiscItem_1 == 0 )
			set doDisable to 1
		endif
	endif
	return
elseif ( waitActivate == 1 )
	if ( MenuMode == 1 )
		set waitActivate to 2
	endif
	return
endif

if ( MenuMode == 1 )
	return
endif

ifx ( doOnce )
else
	DisablePlayerControls
	set doOnce to 1
	set cx to A1V4_RoadBagX
	set cy to A1V4_RoadBagY
	set cz to A1V4_RoadBagZ
	SetPos X cx
	SetPos Y cy
	SetPos Z cz
	setx invItem,invCount,invRef to xInventory
	whilex ( invCount )
		xRemoveItem invItem invCount
		setx invItem,invCount,invRef to xInventory
	endwhile
	AddItem "A1V4_RoadBagMiscItem_1", 1
	set invRef to 0
	set doRemove to 1
	return
endif

if ( doActivate == 1 )
	set waitActivate to 1
	set doActivate to 0
	Activate
	return
endif

if ( doRemove == 10 )
	set doRemove to 0
	MessageBox "Предметы выложены"
	EnablePlayerControls
	return
endif

if ( doRemove > 5 )
	set temp to 1
else
	set temp to 0
endif

ifx ( temp )
	setx pcRef to xGetRef "player"
	whilex ( pcRef )
		setx invItem,invCount,invRefType,tempLong,invWeight,tempLong,invNextRef to pcRef->xContentList invRef
		ifx ( invItem )
			set temp to 1
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_Stalhrim_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_glass_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_glass_tinos"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_ebony_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_adamantium_ore_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_ruby_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_emerald_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_emerald_pinetear"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_pearl_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_diamond_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "deepnight_travelFood"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_bread_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "food_kwama_egg_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "food_kwama_egg_02"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_ash_yam_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_scrib_jerky_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_crab_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_hound_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_human_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_rat_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_scuttle_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_saltrice_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "deepnight_campement01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "Balors_portable_Bedroll"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "misc_de_muck_shovel_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "full_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "halffull_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "nearlyfull_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "nearlyempty_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "empty_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "index_"
				if ( tempLong > 0 )
					set tempLong to 1
				else
					set tempLong to 0
				endif
				ifx ( tempLong )
					setx tempLong to xStringCompare invItem, "index_z"
					if ( tempLong < 0 )
						set temp to 0
					endif
				endif
			endif
			ifx ( temp )
			else
				pcRef->xRemoveItem invItem invCount
				xAddItem invItem invCount
				set invRef to 0
				set pcRef to 0
				set doRemove to 1
			endif
		endif
		if ( doRemove > 1 )
			set invRef to invNextRef
		endif
		if ( invNextRef == 0 )
			set pcRef to 0
			set doRemove to 10
		endif
	endwhile
	return
endif

if ( doRemove > 0 )
	set doRemove to ( doRemove + 1 )
	return
endif

if ( OnActivate == 1 )
	set doActivate to 1
	return
endif

End

 

 

 

Т.е. идея в целом проста - во второй скрипт можно прописать ID всех предметов, которые тебя интересуют.

 

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

 

p.s. Или можно даже ещё проще - вообще тупо перенести весь инвентарь в контейнер. Потому что потом взять из контейнера нужное и экипировать на персонажа, в принципе, не проблема.

Изменено пользователем -=ChieF=-
Ссылка на комментарий
Поделиться на другие сайты

Друзья, подскажите пожалуйста.

 

Есть у нас в базе вот такой любопытный плагин:

Профессиональный алхимик

 

Помимо основных изменений с алхимией в комплект входят переносные контейнеры:

 

 

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

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

 

В общем-то, благодаря этому плагину это в целом возможно.

На контейнере "Походный мешок" висит вот такой скрипт:

 

 

 

Begin A1V4_RoadBagMiscItem_1_sc

short OnPCDrop

if ( GetDisabled == 1 )
	SetDelete 1
	return
endif

if ( OnPCDrop == 1 )
	set OnPCDrop to 0
	set A1V4_RoadBagX to GetPos X
	set A1V4_RoadBagY to GetPos Y
	set A1V4_RoadBagZ to GetPos Z
	PlaceAtPC A1V4_RoadBagMiscCont_1 1, 50, 0
	Disable
endif

End

 

 

Который в свою очередь ссылается на вот такой скрипт:

 

 

Begin A1V4_RoadBagMiscCont_1_sc

short doOnce
short doRemove
short doDisable
short temp
float cx
float cy
float cz
long invItem
long invCount
long invRef
long pcRef
long invRefType
long tempLong
float invWeight
long invNextRef
short doActivate
short waitActivate

if ( doDisable > 20 )
	if ( GetDisabled == 1 )
		SetDelete 1
		return
	endif
endif

if ( doDisable > 20 )
	Disable
	return
endif

if ( doDisable > 0 )
	AddItem "A1V4_RoadBagFakeIngred", 2
	set doDisable to ( doDisable + 1 )
	return
endif

if ( GetDisabled == 1 )
	Enable
	set doDisable to 1
endif

if ( waitActivate == 2 )
	if ( MenuMode == 0 )
		set waitActivate to 0
		if ( GetItemCount A1V4_RoadBagMiscItem_1 == 0 )
			set doDisable to 1
		endif
	endif
	return
elseif ( waitActivate == 1 )
	if ( MenuMode == 1 )
		set waitActivate to 2
	endif
	return
endif

if ( MenuMode == 1 )
	return
endif

ifx ( doOnce )
else
	DisablePlayerControls
	set doOnce to 1
	set cx to A1V4_RoadBagX
	set cy to A1V4_RoadBagY
	set cz to A1V4_RoadBagZ
	SetPos X cx
	SetPos Y cy
	SetPos Z cz
	setx invItem,invCount,invRef to xInventory
	whilex ( invCount )
		xRemoveItem invItem invCount
		setx invItem,invCount,invRef to xInventory
	endwhile
	AddItem "A1V4_RoadBagMiscItem_1", 1
	set invRef to 0
	set doRemove to 1
	return
endif

if ( doActivate == 1 )
	set waitActivate to 1
	set doActivate to 0
	Activate
	return
endif

if ( doRemove == 10 )
	set doRemove to 0
	MessageBox "Предметы выложены"
	EnablePlayerControls
	return
endif

if ( doRemove > 5 )
	set temp to 1
else
	set temp to 0
endif

ifx ( temp )
	setx pcRef to xGetRef "player"
	whilex ( pcRef )
		setx invItem,invCount,invRefType,tempLong,invWeight,tempLong,invNextRef to pcRef->xContentList invRef
		ifx ( invItem )
			set temp to 1
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_Stalhrim_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_glass_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_glass_tinos"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_raw_ebony_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_adamantium_ore_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_ruby_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_emerald_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_emerald_pinetear"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_pearl_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_diamond_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "deepnight_travelFood"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_bread_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "food_kwama_egg_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "food_kwama_egg_02"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_ash_yam_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_scrib_jerky_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_crab_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_hound_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_human_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_rat_meat_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_scuttle_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "ingred_saltrice_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "deepnight_campement01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "Balors_portable_Bedroll"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "misc_de_muck_shovel_01"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "full_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "halffull_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "nearlyfull_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "nearlyempty_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "empty_waterskin"
				if ( tempLong == 0 )
					set temp to 0
				endif
			endif
			ifx ( temp )
				setx tempLong to xStringCompare invItem, "index_"
				if ( tempLong > 0 )
					set tempLong to 1
				else
					set tempLong to 0
				endif
				ifx ( tempLong )
					setx tempLong to xStringCompare invItem, "index_z"
					if ( tempLong < 0 )
						set temp to 0
					endif
				endif
			endif
			ifx ( temp )
			else
				pcRef->xRemoveItem invItem invCount
				xAddItem invItem invCount
				set invRef to 0
				set pcRef to 0
				set doRemove to 1
			endif
		endif
		if ( doRemove > 1 )
			set invRef to invNextRef
		endif
		if ( invNextRef == 0 )
			set pcRef to 0
			set doRemove to 10
		endif
	endwhile
	return
endif

if ( doRemove > 0 )
	set doRemove to ( doRemove + 1 )
	return
endif

if ( OnActivate == 1 )
	set doActivate to 1
	return
endif

End

 

 

Т.е. идея в целом проста - во второй скрипт можно прописать ID всех предметов, которые тебя интересуют.

 

Но можно ли как-то второй скрипт отредактировать как-то так:

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

?

 

p.s. Или можно даже ещё проще - вообще выложить тупо весь инвентарь. Потому что потом взять из контейнера нужное и экипировать на персонажа не проблема.

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

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

Спасибо, но мой вопрос был связан не со скриптом, который делал бы так, чтобы ГГ тонул (я планирую пользоваться вот этим), а со скриптом, который выкладывает из инвентаря некоторые предметы в контейнер. Т.е. сейчас в скрипте "для выкладывания" жёстко прописаны ID предметов, которые нужно искать в инвентаре ГГ.

Я спрашивал, можно ли изменить этот скрипт так, чтобы не пришлось вписывать туда все ID предметов из игры, а заменить этот перечень какой-нибудь универсальной строчкой типа "выложить всё, кроме экипированного" или вообще "перенести всё из инвентаря" в этот контейнер.

 

Переписывать все ID долго и нудно, и при этом, кстати, нужно будет ещё отдельно как-то учесть самодельные зелья и зачарованное лично игроком оружие и броню, потому что у них отдельные уникальные ID.

Изменено пользователем -=ChieF=-
Ссылка на комментарий
Поделиться на другие сайты

Спасибо, но мой вопрос был связан не со скриптом, который делал бы так, чтобы ГГ тонул (я планирую пользоваться вот этим), а со скриптом, который выкладывает из инвентаря некоторые предметы в контейнер. Т.е. сейчас в скрипте "для выкладывания" жёстко прописаны ID предметов, которые нужно искать в инвентаре ГГ.

Я спрашивал, можно ли изменить этот скрипт так, чтобы не пришлось вписывать туда все ID предметов из игры, а заменить этот перечень какой-нибудь универсальной строчкой типа "выложить всё, кроме экипированного" или вообще "перенести всё из инвентаря" в этот контейнер.

 

Переписывать все ID долго и нудно, и при этом стати, нужно будет ещё отдельно как-то учесть самодельные зелья и зачарованное лично игроком оружие и броню, потому что у них отдельные уникальные ID.

С оригинальным скриптовым набором не получится никак, только костыли с перечислением всех ID.

Может быть есть в MWSE, надо призвать в чят Mintmike.

 

Заклинание призыва мятного миши

 

 

Изменено пользователем morrow
Ссылка на комментарий
Поделиться на другие сайты

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

 

p.s. Или можно даже ещё проще - вообще тупо перенести весь инвентарь в контейнер. Потому что потом взять из контейнера нужное и экипировать на персонажа, в принципе, не проблема.

 

С MWSE это реализуемо в несколько строчек кода.

 

 

Ссылка на комментарий
Поделиться на другие сайты

Т.е. идея в целом проста - во второй скрипт можно прописать ID всех предметов, которые тебя интересуют.

По-моему, в этом скрипте прописаны айди тех предметов, которые автоматом не перекидываются в мешок. С MWSE это реализуемо, как отметили выше, без MWSE, в принципе, невозможно. Вернее, потенциально, можно написать десятки скриптов, которые учтут все ванильные вещи, но это то еще извращение. И, например, самопальные зелья, самопальное зачарование скрипты видеть не смогут.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

С MWSE это реализуемо в несколько строчек кода.

 

Есть возможность подсказать, на какую функцию MWSE смотреть? :/

Вот сюды?

Насколько я понимаю, скрипты MWSE можно сохранять прямо в стандартный раздел TES CS "Редактировать скрипты"?

Т.е. оставить скрипт на контейнере неизменным, а отредактировать только тот скрипт, который отвечает за предметы, которые должны оказаться в этом контейнере?

Изменено пользователем -=ChieF=-
Ссылка на комментарий
Поделиться на другие сайты

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

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

Создать учетную запись

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

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

Войти

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

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

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