The Elder Scrolls & Fallout 3 Modding

на главную страницу сайта

Форум Oblivion, Skyrim & Fallout 3/4 Modding

Объявление

Господа, те кто пользуются фотохостингом http://uploads.ru/ для размещения изображений. Рекомендую воспользоваться для упрощения загрузки вот этой программой.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум Oblivion, Skyrim & Fallout 3/4 Modding » Скрипты » Балуемся скриптами


Балуемся скриптами

Сообщений 61 страница 90 из 125

61

Пожалуйста, помогите разобраться, в чем ошибка? Суть в том, что только один предмет из 6 может остаться в инвентаре. Но почему-то удаляется и тот предмет, который я беру взамен того, который удаляется. Например,  вот этот скрипт висит на первой вещи. По идее, должна выполняться проверка при добавлении вещи № 1 в инвентарь, на наличие в нем других пяти вещей. Если обнаруживается там что-то, то удаляется из инвентаря и укладывается обратно в контейнер. Скрипт работает, но.. после того, как он удалит вещь № 2, или 3, или 4 и т.д. до 6, из инвентаря и поместит ее в контейнер, он удаляет из инвентаря и вещь № 1, хотя про нее нет ни слова в скрипте. Не могу понять, почему. Пробовала делать через переменные, эффект такой же самый.

begin onAdd
MessageBox "Вы можете выбрать только одну вещь из шести"
If ( Player.GetItemCount aaaSmot2 == 1)
Player.RemoveItem aaaSmot2 1
aaaChost15Ref.AddItem aaaSmot2 1
else
If ( Player.GetItemCount aaaSmot3 == 1)
Player.RemoveItem aaaSmot3 1
aaaChost14Ref.AddItem aaaSmot3 1
else
If ( Player.GetItemCount aaaSmot4 == 1)
Player.RemoveItem aaaSmot4 1
aaaChost13Ref.AddItem aaaSmot4 1
else
If ( Player.GetItemCount aaaSmot5 == 1)
Player.RemoveItem aaaSmot5 1
aaaChost12Ref.AddItem aaaSmot5 1
else
If ( Player.GetItemCount aaaSmot6 == 1)
Player.RemoveItem aaaSmot6 1
aaaChost11Ref.AddItem aaaSmot6 1
endif
endif
endif
endif
endif
end

0

62

Скрипт нечитабельный, но все зачем эти "else". Одних "if" достаточно будет. Правда "endif" перемещать придется в конец каждого блока "if". Просто в текущем виде скрипт имеет вид некоего дерева: "Есть вещь 2? Если да, то удалить, а если нет, то проверять дальше наличие вещей, но уже с другим ID". А если этих вещей вдруг несколько окажется в инвентаре из-за какой-нибудь ошибки или еще чего?

Luna написал(а):

после того, как он удалит вещь № 2, или 3, или 4 и т.д. до 6, из инвентаря и поместит ее в контейнер, он удаляет из инвентаря и вещь № 1, хотя про нее нет ни слова в скрипте

Возможно, что что-то напутано с ID первой шмотки. Вдруг у нее ID "2, 3, 4, 5 или 6", о которых в скрипте как раз сказано. Я так понимаю, скриптов подобных 6 штук? И каждый весит на своей шмотке? Так что советую посмотреть на ID вещи, на которой лежит скрипт. И на сами ID в скриптах.

Отредактировано Evil (2011-07-27 10:09:26)

0

63

Evil   ID  я все уже перепроверила. Удаляет-то он все без проблем, сбоев тут нет. Думала, что может, какой-то глюк из-за того, что почти одинаковые ID, поменяла, сделала совершенно непохожие.. Один фиг.

0

64

Нет-нет, дело не в REF и не в ID. В скрипте все написано правильно, кроме блока. Этот блок будет работать, когда предмет добавляется в инвентарь Ref-копии объекта. Другой вопрос, что тут не указано, какой именно. Т.е. когда вещь №1 будет добавлена в инвентарь, вещь №3 будет удалена из инвентаря и добавлена в инвентарь контейнера. А при добавлении в инвентарь контейнера, сработает блок onAdd, указанный в скрипте вещи №3, который удалит из инвентаря игрока вещь №1. Нужно было просто написать не "begin onAdd", а "begin onAdd player", и всё будет работать как надо.

+1

65

runman, спасибо, попробую сделать так, потом расскажу о результатах  :)

0

66

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

0

67

Все отлично! Спасибо!

0

68

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

скрипт такой:

short Day
float Time
short doonce

Begin GameMode

If (doonce == 0)
Set Day to 0
Set Time to 0.00
Set doonce to 1
else
If (GetDayOfWeek==Day)&&(GetCurrentTime==Time)
aaaaContRef.AddItem gold001 100
Set doonce to 0
else
return
endif
endif
end

но у меня ничего не добавляется.. Что я не так сделала?

0

69

Luna написал(а):

но у меня ничего не добавляется.. Что я не так сделала?

Трудно сказать, что не так, но лишнее точно есть. Переменные и так в нулях, зачем их каждый раз принудительно обнулять? Но не работает не из за них, конечно. Мне кажется, квестовый скрипт не успевает поймать начало дня, он ведь раз в пять секунд работает. Я в Фаллауте для подобных вещей длал проще:
short doOnce

Begin GameMode
If GetDayOfWeek == 0 && doOnce == 0
    aaSVContRef.AddItem caps001 100
    Set doonce to 1
endif
if doOnce == 1 && GetDayOfWeek != 0
    set doOnce to 0
endif
end

+1

70

Нули, это для примера. Вообще там стоит время 8,0 и день недели - понедельник 1. И дополнительные переменные Day и Time я поставила уже после того, как  не сработал вариант
If (GetDayOfWeek==1)&&(GetCurrentTime==8.00) 

Я попробую вечером сделать так, как ты сказал, SpalnyVagon  :)  Скажу, что получится.

0

71

Luna
Привет! А попробуй через диалог добавить в инвентарь предмет (квитанцию) ну или что там можно придумать по Обливион (трехлистный клевер!)
И пока этот предмет у игрока пусть он добавляет золото, я видел такое решение SergeyRos там было так.
Пока предмет в инвентаре, каждый день добавляются крышки.
Что тебе и надо. А предмет сделай квестовым, что бы не выбросил или продал случайно.
Сейчас найду.
Вот
scn aaaModTecIamTheGreatestOverseerInTheWorldSCRIPT

float CurrentDay

Begin GameMode
if (Player.GetItemCount НазваниеЖетона > 0)
    if ((GameDayPassed - CurrentDay) >= 1)
    set CurrentDay to GameDayPassed
    ИмяКонтейнераRef.AddItem Caps001 КолВоКрышек
    endif
endif
End
Там сказали спасибо - значит должно работать
Правда тут нет конкретного времени, но ведь можно внести нужное условие, да и наверное этот клевер можно положить в этот же или скрытый контейнер и пока он там будет прирост богатства.
Пока.

Отредактировано K.A.I.N. (2011-10-13 17:13:48)

0

72

K.A.I.N., спасибо, попробую все) я кстати, уже использовала такой прием - добавление в инвентарь НПС какой-нибудь вещи, и чтоб после этого происходило какое-то действие. мне просто нужно, чтобы независимо ни от кого и без разговора с кем-то добавлялось в контейнер автоматически. Мало ли, вдруг я где-то буду лазить по Валгалле какой-нибудь, а там в это время денежки все равно будут капать))

0

73

SpalnyVagon, сделала скрипт по твоему варианту - работает! спасибо большое! видимо, правда, условие времени так мешало.

0

74

Я тоже сделал прикольный мод.        Идешь себе по бруме видишь монетка лежит. А кто её не возмет. Берешь и бах тебе 1000 рублей.    Если кому скрипт нужен обращайтесь

0

75

Вот скрипт.                   
Scn gold011

Begin OnAdd
Player.AddiTem <id> #  золота 

End
и наносим скрипт на любой предмет

0

76

vampir написал(а):

Вот скрипт.                   
Scn gold011

Begin OnAdd
Player.AddiTem <id> #  золота 

End
и наносим скрипт на любой предмет

Правильно :) Надо же с чего-то начинать.

0

77

Я и по сложней знаю:-)

0

78

А как можно написать скрипт например берешь факел и тебя телепортирует в определеную ячейку и рядом появляется 3 зомби

0

79

vampir написал(а):

А как можно написать скрипт например берешь факел и тебя телепортирует в определеную ячейку и рядом появляется 3 зомби

Ну тоже вроде простой

Код:
scn FakelZombi

begin OnAdd player
zombiID1.MoveTo RefIdMarker
zombiID2.MoveTo RefIdMarker
zombiID3.MoveTo RefIdMarker
player.MoveTo RefIdMarker
end

где
zombiID1, zombiID2, zombiID3 - RefID заготовленных где-то зараннее зомби
RefIdMarker - маркер нужной ячейки

Разумеется скрипт вешается на факел

0

80

Блин спасибо выручил ваще:)

Еще бы круто иметь скрипт на то заходишь например в бравил и к тебе подходит нпс и дает тебе золото

0

81

vampir написал(а):

Еще бы круто иметь скрипт на то заходишь например в бравил и к тебе подходит нпс и дает тебе золото


Код:
scn BravilGold

begin GameMode
if player.GetInWorldspace WorldspaceName
then StartConversation player, Greeting
end

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

Код:
 player.additem MyItem Count (ID золота и его количество)

+1

82

Спасибо огромное респект !

0

83

Подскажите как можно убрать обьект АКТИВАТОР с локации, если он был размещён на ней обычной командой PlaceAtMe. Целью является обьект который в нужные моменты кастует заклинание в радиусе, Но проблема в том, что даже установив внутри скрипта проверку или сделав его одноразовым, постоянный вызов активатора приведёт к большому скоплению обьектов на карте а нужен всего 1 активатор. Пытался удалять или отключать активатор различными Disable, SetDestroyed, но это не помогает в лучшем случае пропадает внешняя модель активатора а сам скрипт продолжает работать. В общем подскажите как полностью убрать установленный в локации активатор.

0

84

Shinahila85 привет!
Что бы решить проблему однократной активации, можно ввести в скрипт переменную, в которой будет "отслеживаться" количество активаций.
Например установка стадии квеста, при наличии в инвентаре определённого предмета:

scn aaaCounterSCRIPT

short DoOnce

Begin GameMode
  if (DoOnce == 0)
    if (Player.GetItemCount ИмяПредмета >= 10)
      SetStage ИмяКвеста СтадияКвеста 40
      set DoOnce to 1
    endif
  endif
End

short DoOnce - short переменная, DoOnce имя переменной (может быть любым)
Читаем скрипт:
if (DoOnce == 0) - если DoOnce равно 0
if (Player.GetItemCount ИмяПредмета >= 10) - если в инвентаре есть больше или 10 предметов
SetStage ИмяКвеста СтадияКвеста уставновить стадию квеста в 40
  Set DoOnce to 1  установить переменную DoOnce в 1

Получается что скрипт больше не сработает, так как переменная равно 1, а для выполнения условий она должна быть 0
Пока

Отредактировано K.A.I.N. (2012-09-02 18:38:33)

+1

85

Shinahila85 привет!
Что бы решить проблему однократной активации, можно ввести в скрипт переменную, в которой будет "отслеживаться" количество активаций.
Например установка стадии квеста, при наличии в инвентаре определённого предмета:

scn aaaCounterSCRIPT

short DoOnce

Begin GameMode
  if (DoOnce == 0)
    if (Player.GetItemCount ИмяПредмета >= 10)
      SetStage ИмяКвеста СтадияКвеста 40
      set DoOnce to 1
    endif
  endif
End

short DoOnce - short переменная, DoOnce имя переменной (может быть любым)
Читаем скрипт:
if (DoOnce == 0) - если DoOnce равно 0
if (Player.GetItemCount ИмяПредмета >= 10) - если в инвентаре есть больше или 10 предметов
SetStage ИмяКвеста СтадияКвеста уставновить стадию квеста в 40
  Set DoOnce to 1  установить переменную DoOnce в 1

Получается что скрипт больше не сработает, так как переменная равно 1, а для выполнения условий она должна быть 0
Пока


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

0

86

Shinahila85 написал(а):

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


Вообще-то проблема решается просто.

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

Помещаете туда этот активатор и говорите, что он персистент, а также даете ему Айди референса.

Помещаете туда иксмаркер, который тоже должен быть персистент и у него должно быть айди референса.

Потом в скрипте на появление этого активатора (допустим, в блоке на экипировку кольца, или же в стартовом блоке магического эффекта) пишете

Айдиданногоактиватора.moveto player (флаги - если надо указать ,где он должен относительно игрока появиться)

В блоке на снятие вещи или в блоке на конец магического эффекта пишете

Айдиданногоактиватора.moveto айдизаданноговсозданнойлокациииксмаркера

Вроде должно работать. С активаторами так не пробовал, а с неписями - работало.

+1

87

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

0

88

Shinahila85 написал(а):

Остаётся пока пара вопросов как быть с другими локациями, можно ли туда перемещать этот активатор вслед за игроком или он будет строго привязан к локе в которой он создан.


Дык функция moveto работает в любой локации.

+1

89

Скрипт с использованием ОБСЕ. Предназначен, чтобы менять модели данного объекта при обнажении оружия. В данном случае - световой меч без клинка меняется на световой меч с клинком. НА ИГРОКЕ РАБОТЕТ! А на неписе - не работает! Хотя там ясно сказано - сет актреф ту гетконтейнер, то есть привязка к актеру, у которого меч. Вот скрипт:

scn aaaLightsaberpurple1script
string_var modelpath
string_var modelpathon
ref ActRef
ref sRef
short change
short change2

begin Onequip
set Actref to Getcontainer
set sRef to GetBaseObject
set modelpath to sv_Construct "001jediescape\weapon\Lightsaberhilt1.nif"
set modelpathon to sv_Construct "001jediescape\weapon\plasmapurple.nif"
end

begin Gamemode
if (actref.getequipped aaaLightsaberpurple1 == 1)
if (change == 0) && (ActRef.IsWeaponOut == 0)
return
endif
if (change == 1) && (ActRef.IsWeaponOut == 1)
return
endif
if (change == 1) && (ActRef.IsWeaponOut == 0)
SetModelPathEX "%z" modelpath
set change to 0
set change2 to 1
ActRef.removespell aaasworddeflection
playsound aaaLsaberoff
endif
if (change == 0) && (ActRef.IsWeaponOut == 1) 
SetModelPathEX "%z" modelpathon
set change to 1
set change2 to 1
ActRef.addspell aaasworddeflection
playsound aaaLsaberon
endif
if change2 == 1
Actref.UnequipItemNS sRef
ActRef.EquipItemNS sRef
set change2 to 0
endif
endif

end


Может кто понять, почему на неписе не сработал? Можно поэкспериментировать с другими видами оружия - только поменять там айди объектов и пути к моделям (путь отсчитывается от папки meshes, а не от Data).

______________

Спустя несколько минут:

ООО! ЭВРИКА! КАЖЕТСЯ ПОНЯЛ, ПОЧЕМУ! ПОТОМУ ЧТО МЕЧ БЫЛ ДАН НЕПИСЮ, И ЭКИПИРОВАН ИЗНАЧАЛЬНО! Соответственно блок Онэкип и не сработал!

Тогда надо написать, чтобы актер экипировал меч только в случае боя, а в спокойном состоянии откладывал!

И к чему это лучше привязать - к самому мечу или к актеру?

______________

Еще через несколько ... довольно много... минут:

Повесил вот такой скрипт на актера:

scn aaaMagisterCronScript

Begin Gamemode
if ( Magistercronref.Isincombat == 0 )
Magistercronref.unequipitem aaaLightsaberpurple1
endif
end
Begin Onstartcombat
Magistercronref.equipitem aaaLightsaberpurple1
end


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

Мда... на этот раз точно ничего не понимаю. Кто-нибудь может выяснить?

Отредактировано Вовочка (2012-10-13 02:13:45)

0

90

Вовочка написал(а):

Мда... на этот раз точно ничего не понимаю. Кто-нибудь может выяснить?

Делай проверку не Onequip а:

if (player.getequipped aaaLightsaberpurple1 == 1) && (Magistercronref.Isincombat == 0)
Magistercronref.unequipitem aaaLightsaberpurple1
endif

if (player.getequipped aaaLightsaberpurple1 == 0) && (Magistercronref.Isincombat == 1)
Magistercronref.EquipItem aaaLightsaberpurple1 ;1
endif


Забыл написать, если принудительно одевать вещь, то блок Onequip не сработает. Нужно искать другой выход, например сделать все через GameMode меняя переменную так:
short armoronoff

if (player.getequipped aaaLightsaberpurple1 == 1) && (Magistercronref.Isincombat == 0)
Magistercronref.unequipitem aaaLightsaberpurple1
set armoronoff to 1
endif

if (player.getequipped aaaLightsaberpurple1 == 0) && (Magistercronref.Isincombat == 1)
Magistercronref.EquipItem aaaLightsaberpurple1 ;1
set armoronoff to 2
endif


Ну и:

if quest.armoronoff == 2
set Actref to Getcontainer
set sRef to GetBaseObject
set modelpath to sv_Construct "001jediescape\weapon\Lightsaberhilt1.nif"
set modelpathon to sv_Construct "001jediescape\weapon\plasmapurple.nif"
endif


И в конце переменную ставить на 0.

Отредактировано Graf (2012-10-13 02:35:36)

+1


Вы здесь » Форум Oblivion, Skyrim & Fallout 3/4 Modding » Скрипты » Балуемся скриптами