Перейти к содержимому


Фотография
- - - - -

Готовые скрипты

мануал скрипты скрипты

  • Авторизуйтесь для ответа в теме

#21 Ссылка на это сообщение Deska

Deska
  • Авантюрист

  • 155 сообщений
  •    

Отправлено

После старта глобальный скрипт отсчитывает 3 дня. Затем стоит только игроку уснуть, как его разбудит появление какого-либо существа, например, даэдры Мефалы в облике прекрасной девушки (aa_mephala).


1. Создайте новую журнальную запись ("aaa_note" ) и сделайте запись для нее с индексом 1. Это запись, после которой начинается отсчет времени.
Например "Она сказала, чтобы я не беспокоился и продолжал путешествие: она сама найдет меня через несколько дней"


2. Создайте в редакторе новый скрипт. Примерно такой.

begin AA_global_time2

short daysPassed
short myDay
short state
; составитель - LofZ
if ( daysPassed == 0 )
set myDay to Day
set daysPassed to 1
endif

if ( myDay != Day )
set daysPassed to daysPassed + 1
set myDay to Day
endif

if ( GetPCSleep == 1 )
if ( state == 0 )
if ( GetJournalIndex "aaa_note" == 1 )
if ( daysPassed >= 3 ) ; количество дней можно регулировать
WakeUpPC
placeatpc "aa_mephala" 1 128 1
set state to 1
endif
endif
endif
endif

if ( state == 1 )
stopscript "AA_global_time2"
endif

end



Примечания:
1. Скрипт не сразу скомпилируется. Дело в том, что он пока отсутствует в реестре. Редактор считает, что ему нечего останавливать.

Выделите кусочек

if ( state == 1 )
stopscript "AA_global_time2"
endif


и вырежьте его (клавиши alt-x).
Сохраните скрипт.
Затем вставьте все как было через клавиши ctrl-V и пересохраните.

2. После строчки WakeUpPC можно добавить
MessageBox "Вам снилось то-то и то-то"


3. Запустите новый скрипт.  Это можно сделать, напрмиер, написав journal "aaa_note" 1
"startscript "AA_global_time"
  в результате диалога (рекомендуется использовать для этого не стандартную морровиндскую тему, а новую, оригинальную).


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

Нет мира кроме тех, к кому я привык,
И с кем не надо нагружать язык,
А просто жить рядом и чувствовать, что жив.
 



  • Авторизуйтесь для ответа в теме
Сообщений в теме: 34

#22 Ссылка на это сообщение Uzbek

Uzbek
  • Новенький
  • 17 сообщений

Отправлено

Делается это довольно просто. Неважно на кого мы повесим этот скрипт, любой обьект кроме статика исчезнет ночью(или днем если поменять местами Disable и Enable).

Begin Settings_scp

if ( GameHour >= 20 ); Ночь
Disable
elseif ( GameHour >= 8 ); День
Enable
endif

End Settings_scp
 

#23 Ссылка на это сообщение Uzbek

Uzbek
  • Новенький
  • 17 сообщений

Отправлено

Скрипт для автоматического запирания дверей на ночь.

Begin exDoor

short lock
short unlock

if ( GameHour >= 19 ); ночь
if ( lock == 0 )
Lock 60; уровень замка
set lock to 1
set unlock to 0
endif
elseif ( GameHour >= 6 ); день
if ( unlock == 0 )
Unlock; открывашка
set unlock to 1
set lock to 0
endif
endif

End exDoor


#24 Ссылка на это сообщение Invire

Invire
  • Новенький
  • 19 сообщений

Отправлено

Функции deactivate в скриптовом языке ТЕС не существует, так что название темы - шутка (я решил назвать по аналогии с темой Скрипт с disable, созданной Deska). Есть пара функций enable-disable, отвечающая за включение-выключение присутствия объекта в игровом мире. Функция же activate тоже отвечает за включение, но другого рода - активацию, действие, выполняемое с объектом. Почему бы и ей не иметь своего антипода deactivate, деактивировать (я иногда путаю и пишу deactivate вместо disable). Если это дверь, контейнер или книга, то при клике на них они откроются, все остальные предметы помещается в инвентарь - все это работа функции activate.

То есть момент помещения в инвентарь можно определить точно (для этого в скрипте вызываем условие onActivate == 1, внутри ставим нужной переменной нужное значение и функцию Activate). А момент выкладывания? Вот тут-то нам и поможет функция deactivate. Ну на самом деле такой функции нет)), так что мы сымитируем те действия, которые она должна выполнять, а именно определять момент выкладывания предмета из инвентаря (поскольку само выкладывание производим мы сами). Для этого необходимо прежде всего определить, что конкретный объект находится в инвентаре. Если копия объекта одна, то нет проблем ( Player -> GetItemCount, название == 1 ), а если копий несколько? Можно локальной переменной в скрипте каждой копии объекта присвоить свое уникальное значение, а можно поступить еще проще. Определить любую координату объекта (например, для координаты х это GetPos, x). Если объект находится в инвентаре, то любая его координата равна нулю. Однако тут следует иметь ввиду, что координата объекта, находящегося не в инвентаре (скажем так, в мире) на самом деле может быть равна нулю. В этом случае можно поставить проверку условия сразу на две координаты, что еще более уменьшит и без того малую вероятность совпадения координат, а еще лучше на все три - тогда в мире будет существовать всего лишь одна-единственная точка, начало координат, где координаты предмета в мире будут равны координатам объекта в инвентаре. В эту точку можно поставить камень, колонну, бочку - в общем любой неподвижный объект и перекрыть игроку доступ туда, или сделать локацию "в обход".

Теперь, когда мы знаем, что предмет в инвентаре, можно обнаружить и момент выкладывания из инвентаря. Значение локальной переменной в скрипте объекта постоянно проверяется и когда при старом значении обнаруживается изменение координат с нуля на число, то значит предмет был выложен. Вот примерный скрипт:
begin scr_deactivate

short varBag

if ( varBag == 0 );предмет в мире
  if ( GetPos, x == 0 )
	if ( GetPos, y == 0 )
	  if ( GetPos, z == 0 )
		set varBag to 1
	  endif
	endif
  endif
else;предмет в инвентаре
  if ( GetPos, x != 0 )
	if ( GetPos, y != 0 )
	  if ( GetPos, z != 0 )
		MessageBox "Предмет выложен"
		set varBag to 0
	  endif
	endif
  endif
endif

end
Этот скрипт запаздывает на 1 кадр, поскольку мы обнаруживаем "неладное" тогда, когда предмет уже имеет новые координаты, а значит был выложен. Однако момент взятия можно не упустить - переменной varBag можно присваивать значение 1, когда вызывается функция Activate

if ( onActivate == 1 )
set varBag to 1
Activate
endif

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

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

short varMenu

if ( MenuMode == 1 )
  if ( varMenu == 1 )
	return
  else
	set varMenu to 1
  endif
else
  if ( varMenu == 0 )
	return
  else
	MessageBox "Вы вышли из меню"
	set varMenu to 0
  endif
endif

end


#25 Ссылка на это сообщение Siegrun

Siegrun
  • Бяка Зюка

  • 17 800 сообщений
  •    

Отправлено

а при употреблении зелья и исчезновении ингредиентов и камней душ ничего не будет происходить? если скажем скрипт висит на зелье - что будет? просто предмет исчезнет вместе со скриптом?
Кстати! а ведь так можно зарпетить выкладывать квестовые вещи, как в Обле))))

Да я тоже тебя люблю (пока его тут нет). © Монгол
Я трудный человек, но если вы рядом со мной, то и вы не простые люди.
LoveFlower002.png


#26 Ссылка на это сообщение Invire

Invire
  • Новенький
  • 19 сообщений

Отправлено

Да, если игрок съест предмет или тот исчезнет функцией RemoveItem, то исчезнет навсегда, а вместе с ним и скрипт, который прикреплен к нему (прекратив следовательно свое выполнение). В отличие, кстати, от функции disable - при ее вызове предмет не исчезает, а выключается из игрового мира, а скрипты на нем все еще продолжают выполняться! Я был удивлен, узнав это. В оригинальной игре есть скрипт SealedTreasuryReport на свитке с печатью, которую можно распечатать, а потом попытаться снова запечатать. Так вот, там в скрипте свиток просто дизейблится, а игроку в инвентарь добавляется новая копия. А я их выкладывал, брал обратно... Представляете, сколько теперь невидимых копий свитков болтается неизвестно где? И на каждой скрипт, который по прежнему продолжает выполняться! Пример того, как как неаккуратно написан скрипт.

Чтобы полностью удалить копию объекта из игры следует использовать функцию setdelete. Как я понял, ее работа распространяется только на копии объектов, созданные во время самой игры, а не в редакторе, например, функцией PlaceItem. Функция setdelete всегда должна выполняться после того, как предмет был отключен функцией disable, и в том же скрипте одновременно с ней ничего больше не должно выполняться, а то игра вылетит. Поэтому ставим этот блок в начало, а в конце его слово return. Скрипт на объекте object:
begin scr_delete_copy

if ( GetDisabled == 1 )
  setdelete 1;полное удаление старой копии
  return
endif

if ( onActivate == 1 )
  PlaceAtMe, object, 1 0 0;создаем новую копию
  Disable;выключаем старую
endif

end

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

#27 Ссылка на это сообщение Fable

Fable
  • nothing more..
  • 774 сообщений
  •    

Отправлено

Недавно для себя вот, сделал несложный скрипт. Решил поделиться.

Скрипт повесил на обычный ящик. Но можно на что угодно.

Здесь все просто, ГГ отдает за 10 любых болтов по 500 золотых. Причем, болты бесконечны, ибо даются скриптом.
Не удивляйтесь что болты дорогие, они просто довольно мощные и зачарованные. Впрочем, для себя вы можете назначить другую сумму.

RANDOM - Здесь вы указываете ID болтов. Соответственно, отдельно для каждого вида. Свои ID я вписывать не стал, ибо тут уже у каждого может быть по своему.

begin 11aafbsilverbolt

short state
short button

if ( onactivate == 1 )
if ( state == 0 )
messagebox "500 септимов за 10 болтов. Какие болты вам нужны? " "Огонь" "Лед" "Молния" "Яд" "Ничего" ; весь messagebox в одной строке
set state to 1
endif
endif

if ( state == 1 )
set button to getbuttonpressed

if ( button == -1 )
return
elseif ( button == 0 )

if ( player-> getitemcount "Gold_001" <= 499 )
messagebox "Вам не хватает денег"
set state to 0
return
else
player-> removeitem "Gold_001", 500
player-> additem "RANDOM", 10
set state to 0
endif

elseif ( button == 1 )
if ( player-> getitemcount "Gold_001" <= 499 )
messagebox "Вам не хватает денег"
set state to 0
return
else
player-> removeitem "Gold_001", 500
player-> additem "RANDOM", 10
set state to 0
endif

elseif ( button == 2 )
if ( player-> getitemcount "Gold_001" <= 499 )
messagebox "Вам не хватает денег"
set state to 0
return
else
player-> removeitem "Gold_001", 500
player-> additem "RANDOM", 10
set state to 0
endif

elseif ( button == 3 )
if ( player-> getitemcount "Gold_001" <= 499 )
messagebox "Вам не хватает денег"
set state to 0
return
else
player-> removeitem "Gold_001", 500
player-> additem "RANDOM", 10
set state to 0
endif

elseif ( button == 4 )
set state to 0
return
endif
endif

end


PS
Да... и вовсе необязательно продавать болты за золото. И вовсе не обязательно продавать только болты. Тут может быть что угодно. Например, вместо золота можно указать ID бриллиантов (ingred_diamond_01), которые уже можно обменять на что-то другое.

#28 Ссылка на это сообщение Siegrun

Siegrun
  • Бяка Зюка

  • 17 800 сообщений
  •    

Отправлено

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

Элегантная полностью рабочая версия от TJ

begin My_Script



short once

Short FirstDay

Short currentDay

short delay; эту локальную переменную мы используем в диалоге с НПС



if ( once == 0 )

	if ( getjournalindex "Моя_запись" >= 10 ); запись когда НПС первый раз назначил встречу

			set FirstDay to DaysPassed

			set once to 1

		endif

elseif ( once == 1 )

		set currentDay to ( DaysPassed - FirstDay )

			if ( currentDay >= 2 )

				set once to 2

				set delay to 1; установим на 1, в диалоге чтобы можно было проверить, что первый срок прошел

			endif

elseif ( once == 2 )

	if ( getjournalindex "Моя_запись" >= 20 ); запись когда НПС второй раз назначил встречу

			set FirstDay to DaysPassed; снова начинаем отсчет дней

			set once to 3

	endif

elseif ( once == 3 )

		set currentDay to ( DaysPassed - FirstDay )

			if ( currentDay >= 2 )

				set once to 4

				set delay to 2; установим на 2, чтобы в диалоге проверить, что прошел второй срок

			endif

endif



end
НЕ ЗАБЫВАЕМ УКАЗЫВАТЬ АВТОРА при использовании (ну чтобы другие знали кого спрашивать...хихи)!!!

Да я тоже тебя люблю (пока его тут нет). © Монгол
Я трудный человек, но если вы рядом со мной, то и вы не простые люди.
LoveFlower002.png


#29 Ссылка на это сообщение Asirion

Asirion
  • Beyond Divinity
  • 643 сообщений
  •  

Отправлено

Достаточно простой, но полезный скрипт. Во многих играх открывание/закрывание контейнеров (ящиков, бочек, сундуков и пр.) сопровождается тематическими звуками. Однако в Морровинде подобное предусмотрено только для дверей, оставляя контейнеры беззвучными. Но это можно исправить (как это было сделано в моем плагине для новых обьектов), если добавить в игру нужные звуки и присвоить обьектам типа контейнер скрипт подобного вида:

[b]Begin CrateSound[/b] [i];название скрипта[/i]

[b]Short Cl[/b] [i];произвольная переменная, которой мы позже будем оперировать[/i]

[b]If ( OnActivate == 1 )[/b] [i];здесь мы рассматриваем момент активации обьекта (контейнера)[/i]
	   [b]If ( GetLocked == 1 )[/b] [i];если он заперт...[/i]
		      [b]PlaySound3D "CrateLk"[/b] [i];то мы услышим вот этот вот звук[/i]
[b]	   Else ( GetLocked == 0 )[/b]  [i];если он не заперт...[/i]
		      [b]PlaySound3D "CrateOp"[/b] [i];то услышим вот этот звук[/i]
    		      [b]Activate[/b]  [i];и откроем контейнер[/i]
		      [b]Set Cl to 1[/b]  [i];а наша переменная примет новое значение 1[/i]
		      [b]Return[/b]  [i];после чего скрипт прерывается[/i]
[b]	   EndIf
EndIf
[/b]
[b]If ( MenuMode == 0 )[/b] [i];если мы не находимся в меню контейнера...[/i]
	   [b]If ( Cl == 1 )[/b]  [i];после его открытия (ибо переменная стала равной 1 в момент активации), что равноценно его закрытию[/i]
		      [b]PlaySound3D "CrateCl"[/b]  [i];услышим вот этот вот звук[/i]
		      [b]Set ASNRvCl to 0[/b] [i];после чего переменная вновь обнулится и скрипт будет готов к повтороному использованию при следующем обращении к обьекту[/i]
[b]	   EndIf
EndIf[/b]

[b]End[/b]

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

Don't let me fall. Just hold me tight. And tell me it will be alright. Tomorrow when I wake up... You'll be there...

#30 Ссылка на это сообщение Fable

Fable
  • nothing more..
  • 774 сообщений
  •    

Отправлено

Кто играл в Heroes of Might and Magic 3, наверняка помнит юнитов эфритов и их огненные барьеры, которые бьют врага огнем в ответ.
Вроде как все работает.

Спойлер


Единственный минус:
shortonpchitme -- работает только на игрока.

AddSpell, "SpellID"

MSDF гласит только про один параметр.
Получается, что
"222"->addspell "111"
.
Спойлер

Бесцеремонное вмешательство

  • Myyrn это нравится

#31 Ссылка на это сообщение Myyrn

Myyrn
  • Кентаврион
  • 509 сообщений

Отправлено

Скрипт на постепенное исчезновение. Так, например, можно превратить непися в призрака, который потом исчезнет.
Создаем 10 заклинаний(или сколько стадий вы оставите в скрипте).
Если брать айди из скрипта, то:
Списко айди

Эффект хамелеон 10 в 10

Скрипт

При вылетах, попробуйте удалить блок с timer > 5.
P.S. Смысл похож на изложенный здесь. Но у меня непись исчезает постепенно, а в другой теме после диалога исчезает, а через 5 секунд сразу удаляется actor.
Изображение

#32 Ссылка на это сообщение Mortuus

Mortuus
  • Аватар пользователя Mortuus
  • Авантюрист
  • 189 сообщений

Отправлено

Я очень намаился с этим скриптом и решил выложить его для того, чтобы другие люди сэкономили время и нервы. Оптимизация скриптов приветствуется.
1 скрипт, засекает время включения меню.
begin mort_sc1
if ( MenuMode == 1 )
Set mort_timer to GameHour
StopScript mort_sc1
StartScript mort_sc3
endif
end

2 скрипт, исключает ошибочное повышение переменной когда ГГ спит, либо путешествует
begin mort_sc2

if (GetPCTraveling == 1)
set mort_traning to mort_traning - 1
StopScript mort_sc2
endif
if (GetPCSleep == 1)
set mort_traning to mort_traning - 1
StopScript mort_sc2
endif
end

3 скрипт, делает проверку времени после выключения меню, при повышении переменной выдаётся сообщение, сделано для проверки работоспособности скрипта

begin mort_sc3
short varMenu
if ( MenuMode == 1 )
if ( varMenu == 1 )
return
else
set varMenu to 1
endif
else
if ( varMenu == 0 )
return
else
if ( mort_timer < GameHour )
set mort_traning to mort_traning+1
MessageBox "Вы обучались %.0g раз ", mort_traning
set varMenu to 0
StartScript mort_sc1
StartScript mort_sc2
StopScript mort_sc3
else
MessageBox "Вы вышли из меню"
set varMenu to 0
StartScript mort_sc1
StartScript mort_sc2
StopScript mort_sc3
endif
endif
endif

mort_traning - глобальная short переменная отслеживающая количество обучений
mort_timer глобальная переменная фиксирующая время включения меню

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

спасибо за советы Муурн Шепарду, хоть он и не верил в успех =) http://fullrest.ru/f...-muurn-shepard/
спасибо за идеи Invire
...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше

#33 Ссылка на это сообщение Mortuus

Mortuus
  • Аватар пользователя Mortuus
  • Авантюрист
  • 189 сообщений

Отправлено

Выложу скрипт. Фактически в MFSD тематика водных процедур слабовато отражена, да и в КС вы найдете в основном только тестовые скрипты с этой функцией. Скрипт выдает сообщение когда в воде у главного герой начинает терять кислород.Немного не правильно выразился, показывается глубина погружения героя. Применения и развитие у скрипта много, фантазируйте.
begin Mort_Wd_sc
float myZ
float waterZ
if (menumode==1)
return
endif
set myZ to ( player->GetPos Z )
set waterZ to (GetWaterLevel - myZ)
if (waterZ >= 133 ) ; данная цифра - глубина погружения когда начинается уменьшение кислорода взята для ;единичного роста, рост каждой расы и каждого пола можно найти в кс
MessageBox "Глубина погружения %.2f", current ; показывает глубину в условных игровых единицах
endif
end

Сообщение отредактировал Mortuus: 04 января 2013 - 08:56

...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше

#34 Ссылка на это сообщение Mortuus

Mortuus
  • Аватар пользователя Mortuus
  • Авантюрист
  • 189 сообщений

Отправлено

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

1 Что делаем создаём 13 заклинаний ( точнее характеристик) с редкими эффектам, которые нам не встречаются в бонусах рас.

2 заменяем этими характеристиками существующие бонусы знаков. Создаём глобальную переменную ( у меня mort global_variable ) тип short, начальное значение 0.

3 Делаем скрипт на проверку эффектов (тех самых 13 эффектов которые мы выбрали)

Пример:

Этим скриптом мы определяем какой эффект наложен на гг, из этого делаем выводы о выбранном знаке, затем удаляем ненужный нам нулевой эффект и раздаём стандартные бонусы знаков. Задаём значение глобальной переменной отвечающей за знак. И останавливаем скрипт (нам не нужно чтобы он проигрывался многократно)

4 Изменяем скрипт CharGen_ring_keley

Добавляем в него StartScript Mort_constellation в самом конце

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


Сообщение отредактировал Mortuus: 12 октября 2013 - 10:21

...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше

#35 Ссылка на это сообщение tymmi

tymmi
  • Новенький
  • 2 сообщений

Отправлено

Люди, скиньте пожалуйста готовый, стартовый скрипт, на мору! Просто нужно проверить, то что создалось. Огромное спасибо!



#36 Ссылка на это сообщение Haxop

Haxop
  • Скиталец
  • 37 сообщений
  •  

Отправлено

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







Темы с аналогичным тегами мануал скрипты, скрипты

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых