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

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

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

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

Здесь все просто, ГГ отдает за 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), которые уже можно обменять на что-то другое.
  • Нравится 1
  • 6 месяцев спустя...
Опубликовано
блин... ну вот скажите чего оно не срабатывает. Задолбал етот диалог. мне всего то надо получить индекс журнала через 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.webp

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

Begin CrateSound ;название скрипта

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

If ( OnActivate == 1 ) ;здесь мы рассматриваем момент активации обьекта (контейнера)
If ( GetLocked == 1 ) ;если он заперт...
PlaySound3D "CrateLk" ;то мы услышим вот этот вот звук
Else ( GetLocked == 0 ) ;если он не заперт...
PlaySound3D "CrateOp" ;то услышим вот этот звук
Activate ;и откроем контейнер
Set Cl to 1 ;а наша переменная примет новое значение 1
Return ;после чего скрипт прерывается
EndIf
EndIf

If ( MenuMode == 0 ) ;если мы не находимся в меню контейнера...
If ( Cl == 1 ) ;после его открытия (ибо переменная стала равной 1 в момент активации), что равноценно его закрытию
PlaySound3D "CrateCl" ;услышим вот этот вот звук
Set ASNRvCl to 0 ;после чего переменная вновь обнулится и скрипт будет готов к повтороному использованию при следующем обращении к обьекту
EndIf
EndIf


End


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

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...
  • 1 год спустя...
Опубликовано
Кто играл в Heroes of Might and Magic 3, наверняка помнит юнитов эфритов и их огненные барьеры, которые бьют врага огнем в ответ.
Вроде как все работает.

Спойлер
begin ХХХ ; название вашего скрипта

short once
short onPCHitme
float timer

if ( menumode == 1 )
return
endif

if ( once == 0 )
if ( onPCHitme == 1 )
addspell, 111, 222 ; эффект огненного барьера, вешается на существо (огненный атронах, например) где 111 это ID заклинания - огненный щит - характеристика, и далее 222 нужное вам существо.
removespell, 111, 222

set once to 1
endif
endif

if ( once == 1 )
if ( onPCHitme == 1 )
addspell, "333", player ; урон от барьера, создайте заклинание - характеристика, урон огнем

set timer to timer + GetSecondsPassed

if timer > 1 ; время можете указать другое, я поставил 1 секунду, просто чем больше времени, тем дольше идет урон от огня.
Player -> RemoveSpell, "333"
endif
endif
endif

end


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

AddSpell, "SpellID"
MSDF гласит только про один параметр.
Получается, что
"222"->addspell "111"
.
Спойлер
if ( once == 1 )

if ( onPCHitme == 1 )

addspell, "333", player ; урон от барьера, создайте заклинание - характеристика, урон огнем



set timer to timer + GetSecondsPassed



if timer > 1 ; время можете указать другое, я поставил 1 секунду, просто чем больше времени, тем дольше идет урон от огня.

Player -> RemoveSpell, "333"

;Последний штрих, чтобы не постоянно добавлять/удалять спел

set onPCHitMe to 0

endif

endif

endif



end

Бесцеремонное вмешательство
Верхний блок, впрочем, для красоты
  • Нравится 1
  • 4 недели спустя...
Опубликовано
Скрипт на постепенное исчезновение. Так, например, можно превратить непися в призрака, который потом исчезнет.
Создаем 10 заклинаний(или сколько стадий вы оставите в скрипте).
Если брать айди из скрипта, то:
&#39;Списко айди&#39;
[list="1"]
[*]sch10
[*]sch20
[*]sch30
[*]sch40
[*]sch50
[*]sch60
[*]sch70
[*]sch80
[*]sch90
[*]sch100
[/list]

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

&#39;Скрипт&#39;
Begin stageschameleon
;скрипт только на npc/creature
;написан Myyrnом
float timer
short doonce
if ( MenuMode == 1 )
return
endif
if ( onactivate == 1 );старт исчезновения, можно добавить любое условие
set doonce to 1
endif
if ( doonce == 0 )
return
endif
set timer to ( timer + getsecondspassed )
if ( timer >= 2 )
if ( timer <= 3 )
addspell sch10
elseif ( timer <= 4 )
addspell sch20
elseif ( timer <= 5 )
addspell sch30
elseif ( timer <= 6 )
addspell sch40
elseif ( timer <= 7.5 )
addspell sch50
elseif ( timer <= 8 )
addspell sch60
elseif ( timer <= 12 )
addspell sch70
elseif ( timer <= 13 )
addspell sch80
elseif ( timer <= 14 )
addspell sch90
elseif ( timer <= 15 )
addspell sch100;эффекты не удаляются, потому что заметно, непись перестал просвечивать и снова начал, некрасиво выглядит
endif
endif
if ( getchameleon >= 100 )
if ( getdisabled == 0 )
disable
set timer to 0
return
endif
if ( timer > 5 )
setdelete 1;удаляем, чтобы не занимал память
endif
endif

end stageschameleon

При вылетах, попробуйте удалить блок с timer > 5.
P.S. Смысл похож на изложенный здесь. Но у меня непись исчезает постепенно, а в другой теме после диалога исчезает, а через 5 секунд сразу удаляется actor.
2f57bf3ac535.png.png
  • 4 месяца спустя...
Опубликовано
Я очень намаился с этим скриптом и решил выложить его для того, чтобы другие люди сэкономили время и нервы. Оптимизация скриптов приветствуется.
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/forum/user/13795-muurn-shepard/
спасибо за идеи Invire
  • Нравится 2
...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше
  • 1 год спустя...
Опубликовано (изменено)
Выложу скрипт. Фактически в 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
  • Нравится 2
...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше
  • 9 месяцев спустя...
Опубликовано (изменено)

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

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

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

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

Пример:

Спойлер
begin Mort_constellation
StopScript Mort_constellation
If ( Player->GetEffect sEffectDispel)
player->AddSpell "beggar's nose spell"
player->AddSpell "tower key"
player->RemoveEffects, 57

set mort global_variable to 1
elseIf ( Player -> GetEffect sEffectFeather  )
player->AddSpell "charioteer ability"
player->RemoveEffects, 8

set mort global_variable to 2
elseIf ( Player -> GetEffect sEffectLight)
player->AddSpell "blessed touch"
player->AddSpell "blessed word"
player->AddSpell "mara's gift"
player->RemoveEffects, 41

set mort global_variable to 3
elseIf ( Player -> GetEffect sEffectWeaknessToMagicka   )
player->AddSpell "elfborn ability"
player->RemoveEffects, 31

set mort global_variable to 4
elseIf ( Player -> GetEffect sEffectRestoreSpellPoints  )
player->AddSpell "fay ability"
player->RemoveEffects, 76

set mort global_variable to 5
elseIf ( Player -> GetEffect sEffectOpen )
player->AddSpell "akaviri danger-sense"
player->RemoveEffects, 13

set mort global_variable to 6
elseIf ( Player->GetEffect sEffectCharm)
player->AddSpell "lady's favor"
player->AddSpell "lady's grace"
player->RemoveEffects, 44

set mort global_variable to 7
elseIf ( Player -> GetEffect sEffectResistParalysis )
player->AddSpell "mooncalf ability"
player->AddSpell "lover's kiss"
player->RemoveEffects, 99

set mort global_variable to 8
elseIf ( Player -> GetEffect sEffectChameleon )
player->AddSpell "moonshadow"
player->RemoveEffects, 40

set mort global_variable to 9
elseIf ( Player -> GetEffect sEffectSoultrap )
player->AddSpell "star-curse"
player->RemoveEffects, 58

set mort global_variable to 10
elseIf ( Player -> GetEffect sEffectFortifyHealth )
player->AddSpell "blood of the north"
player->AddSpell "trollkin ability"
player->RemoveEffects, 80

set mort global_variable to 11
elseIf ( Player ->GetEffect sEffectFortifyAttackBonus)
player->AddSpell "warywrd ability"
player->RemoveEffects, 117

set mort global_variable to 12
elseIf ( Player -> GetEffect sEffectStuntedMagicka )
player->AddSpell "wombburn"
player->RemoveEffects, 136

set mort global_variable to 13
endif
end

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

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

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

Спойлер

begin CharGen_ring_keley

;picking up this ring shows you magic menu

short state
short OnPCAdd

if ( CharGenState == -1 )
    return
endif

if ( menumode == 1 )
    return
endif

if ( state == 30 )
    return
endif

if ( OnPCAdd == 1 )
    if ( State == 0 )
        EnableMagicMenu
        MessageBox "У вас есть меню магии, где вы можете видеть все ваши способность, заклинания и магические предметы." "Ok"
        set state to 5
        return
    endif
endif

if ( state == 5 )
    if ( GetButtonPressed != -1 )
        set state to 10
    endif
endif

if ( state == 10 )
    if ( Xbox == 0 )
        MessageBox "Как и для других меню, щелкните правой кнопкой мыши, чтобы использовать это новое меню. Щелкните на заклинание, или на магический предмет, которые вы хотите сделать активными." "Ok"
    else
        MessageBox "Как и для других меню B, чтобы использовать это новое меню. Нажмите B еще раз, чтобы выйти из меню." "Ok"
    endif

    set state to 20
    return

endif

if ( state == 20 )
    if ( Xbox == 0 )
        MessageBox "Нажмите ^ActionReadyMagic, чтобы приготовить вашу активную магию, а затем щелкните, чтобы использовать ее." "Ok"
    else
        MessageBox "Нажмите Y, чтобы приготовить вашу активную магию, а затем щелкните, чтобы использовать ее." "Ok"
    endif
    
    set state to 30

endif
If ( state == 30 )
StartScript Mort_constellation
    set state to 40
    endif
end

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

Изменено пользователем Mortuus
...Если бы боги существовали, как бы вынес я, что я не бог?

- Фридрих Ницше
  • 3 года спустя...
Опубликовано

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

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

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

  • 7 лет спустя...
Опубликовано (изменено)

Приветы. Тут очень тихо, но может: помогут мастеру-кулибину в простом деле? В скриптах Морровинда - не шарю. Мне надо всего-лишь: отнять у игрока спелл регена маны - ес ли: "он атронах" - когда он берёт "справку об освобождении" (CharGen Statssheet). Не против насмешек - ес ли помогаете. Я решил сделать это на основе скрипта CharGenStatssheet:

begin CharGenStatsSheet
;Global. excess?

;for picking up the stats sheet, shows inventory

short state
short OnPCAdd ;auto set by code when object is picked up, see help file
float timer

if ( menumode == 1 )
return
endif

if ( state == 20 )
return
endif

if ( state == 0 )

if ( OnActivate == 1)
  Activate
  EnableInventoryMenu
endif

;if ( Player->GetItemCount "CharGen Statssheet" > 0 )
if ( OnPCAdd == 1 )
  MessageBox "У вас есть меню Снаряжения: здесь вы можете видеть все, что несете с собой. Вы можете перемещать объекты из окружающего мира в меню снаряжения щелчком мыши."
  enableplayerfighting
  enableplayermagic
  set state to 10
  return
endif

endif

end

========================

Сделал это (не срабатывает):

begin Atronah_noregenmana
;Global. excess?

;for picking up the stats sheet, shows inventory

short state
short OnPCAdd ;auto set by code when object is picked up, see help file
float timer

if ( menumode == 1 )
return
endif

if ( state == 20 )
return
endif

if ( state == 0 )

if ( OnActivate == 1)
  Activate
  EnableInventoryMenu
endif

;if ( Player->GetItemCount "CharGen Statssheet" > 0 )
if ( OnPCAdd == 1 )
;if ( PC_noAtronah == 0 )
  Player->removespell regenmana01
  Player->removespell regenmana1
  set state to 10
  return
endif

endif

end

===================================

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

*Зависимость скорости восстановления маны от интеллекта - я ставить не хочу: это качественный, классический принцип - но он не для Морровинда. Почему: в простом Морровинде - мана восстанавливается при отдыхе - не за одно и то же время, а в зависимости от запаса маны (мало или много надо спать). А классический принцип зависимости от интеллекта - делает скорость её восстановления - не зависимым от запаса маны - то есть: не важно: 30 или 450 у тебя маны - восстановишь за примерно одинаковое время. (чтобы маг был "альтернативным воином" - чего в Морровинде не сделано специально)

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

Чтобы не требовалась эта принципеальная формальность надобности отдыха - чтобы маг снова двинулся в путь. С простым восстановлением маны - потребность отдыха перестаёт быть обязательной, но остаётся востребованной - ес ли запаса маны - много, но вся потрачена, а в пути она восстановится не скоро.

Изменено пользователем DoctorChort

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

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

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

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

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

Войти

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

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

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