Полная Версия: Мод: Новые вещи в старом мире.
Scull
Есть два спела: Пометка и Возврат. Возможно ли в принципе создание вещи, которая совмещала их действие (т.е. переместиться в помеченное место и одновременно пометить место откуда переместился)?
Hvost
В самой игре это невозможно. Два эффекта одновременно могут сработать только если постоянные, но в морре нет вещей в которые влезут зачарование и пометка на постоянный эффект. Через конструктор, вполне реально создать такую вещь срабатывающую например при одевании но скорее всего придется повозится со скриптом, чтоб не возникло проблем и четко определить их последовательность.
Scull
Спасибо, прямо сейчас попробовал, но получается два варианта:
1. Перемещаюсь в помеченное место и заново его помечаю.
2. Помечаю место, где нахожусь и остаюсь на месте.

А можно заставить игру думать, что ближайший храм находиться в помеченном месте (через скрипт)?
Infernal knight
1 и 2 - Чего и следовало ожидать...
Метку поставить можно, но будет ли она ближайшей... хороший вопрос... если ты конечно готов потереть все другие метки - это даст гарантию я так думаю :)
Scull
Я понял, я неправильно задал вопрос. Как игре запомнить то место, которое было помечено игроком?

2 Infernal knight
На счёт меток: попробую, когда будет много свободного времени:)
Infernal knight
Ты правильно выразился :)
В Морке есть специальная функция которая может телепортировать перса в ЛЮБУЮ клетку в любую точку с координатами X,Y,Z...
Получить координаты месторасположения перса труда не составляет - если память не изменяет что-то вроде GetX, GetY, GetZ... (посмотри скриптинг для dummies) другое дело, что определить в какой клетке находится перс - это фсе... помнится есть в Морке функция Находится ЛИ перс в Такой-то локации, но в Морке этих локаций - Море! Так что если ты не хочешь писать скрипт длинной в несколько тысяч строк - самое простое ограничиться ключевыми локациями, если тебе такие нужны... ну сделаешь проверочку на десяток-два локаций и все будет пахать.

P.S. Правда есть там вроде один паршивый глюк 0:-) Из-за которого локация не прорисовыввается, если телепортируемый перс ранее в ней не находился... В смысле если ты был в локации удаленной от этой на 10 клеток то ты можешь увидеть черный экран... пока не произойдет переход между локациями... правда его может исправили в Бладмуне... или патче каком, но в оригинальной Морке и кажись в Трибе баг был на месте ;)
Scull
Функции определения положения игрока я знаю, но я не знаю как присвоить переменной возвращаемое значение этой функции:(

А в какой локации находится перс мне знать не надо:) Просто использовать предмет можно будет только во внешнем мире, а для внешнего мира надо знать только X,Y,Z.

Т.е. я хочу, чтобы было так:
1. первое использование - запоминаем координаты игрока в память (1pos)
2. второе использование - запоминаем координаты игрока в память (2pos) и
переносим его в предыдущие (1pos)

1. и 2. управляются неким счётчиком (use).


Dimonix
Scull, Правельно ли я тебя понял?
Ты хочешь создать некий артефакт, который телепортирует PC из точки А в точку Б (ранее сохраненную) и при следующем использовании артефакта возвращает его в точку А


...
; определяем текущее местоположение PC
Set Xcurr to GetPos, X
Set Ycurr to GetPos, Y
Set Zcurr to GetPos, Z

; телепортируем PC в "точку возврата"
SetPos X Xprev
SetPos Y Yprev
SetPos Z Zprev

; координаты PC до телепортации
; становятся координатами "точки возврата"
Set Xprev to Xcurr
Set Yprev to Ycurr
Set Zprev to Zcurr
...

Для безупречной работы не хватает:
1) проверки существования "точки возврата"
2) определения нахождения PC (локация/"Внешний мир")


Надеюсь справишься, удачи...



PS А идея мне понравилась ;)
Scull
Вот черновой вариант скрипта:

Begin travel_script

short status
short button
short OnPCEquip
short 1px
short 1py
short 1pz

if ( MenuMode == 1 )
return
endif

if ( OnPCEquip == 1 )
Set Status to 10
Set 1px to GetPos, X
Set 1py to GetPos, Y
Set 1pz to GetPos, Z
Set OnPCEquip to 0
Endif

If ( status == 10 ) ; меню
MessageBox "Телепортируй меня в ", "1", "0", "cancel"
Set Status to 20
Elseif ( status == 20 )
Set button to GetButtonPressed
If ( button == -1 )
Return
Elseif ( button == 0 ) ; 1
Player -> Position 1px, 1py, 1pz, 0
Elseif ( button == 1 ) ; 2
Player -> Position 0, 0, 0, 0
Elseif ( button >= 2 ) ; cancel
Set status to 0
Endif
Endif

End

А теперь вопрос, почему меня телепортируют в одно и тоже место (0,0,0) не зависимо от выбора кнопки?
Artem13
Несколько замечаний:
1. Лучше использовать разные переменные для запоминания текущей позиции и телепортации. Иначе ты телепортируешься в ту же точку, где артефакт заюзал, т.е. останешься на месте.

2. Кусок
QUOTE
Set Status to 20
Elseif ( status == 20 )
Set button to GetButtonPressed
If ( button == -1 )

Лучше сделать так

QUOTE
Set Status to 20
Elseif ( status == 20 )
Set button to GetButtonPressed
endif
If ( button == -1 )


А телепортирует тебя в 0 всегда можт только по одной причине - не срабатывает ГетПоз. Посмотри внимательно эту ф-цию в указанном ранее мануале. Возможнор, что она работает некорректно или в чистой Морре вовсе не реализована...
Infernal knight
1) ты не правильно рассуждаешь о внешнем мире, т.е. не interior, а exterior - там не действует единая координатная сетка, завязанная на X,Y и Z. Вся поверхность поделена на клетки, и в каждой клетки действует своя система координат
2) GetPos работает как буся - я ее юзал, но если мне память не изменяет она не short, а float...
3) мне не нравится конструкция, где ты переменной button присваиваешь GetButtonPressed - не уверен, что так можно делать... Но это возможно и правильно...
4) посмотри работает ли процедура Position...
5) Посмотри в Helpe к TES CS пример по работе с диалоговым окном, а именно с тем какой код когда возвращается и как они его обрабатывают
Scull
2 Infernal knight

1. при вводе строки "Player -> Position 0,0,0,0" -оказываюсь в районе Эшлендера
при вводе строки "Player -> Position 99999,99999,0,0" -оказываюсь в районе Грейзленда
в обоих случаях находился в Балморе...
2. "GetPos работает как буся..." - не понял :(
3. Эту конструкцию полностью скопировал из "указанного ранее мануала"
4. Работает
5.Посмотрел, всё тоже самое.

2 All

Как проверить работает ли GetPos?

Почему когда нажимаю кнопки, ничего не происходит:

if ( MenuMode == 1 )
Return
endif

if (OnPcEquip == 1 )
Set use to 1
Set OnPCEquip to 0
endif

if ( use == 1 )
MessageBox "What you want to do?","Save Pos 1","Save Pos 2","Teleport to 1","Teleport to 2"
Set use to 2
elseif ( use == 2 )
Set button to GetButtonPressed
if ( button == -1 )
Return
elseif ( button == 0 )
Set 1px to GetPos, X
Set 1py to GetPos, Y
Set 1pz to GetPos, Z
MessageBox "Pos 1 saved"
elseif ( button == 1 )
Set 2px to GetPos, X
Set 2py to GetPos, Y
Set 2pz to GetPos, Z
MessageBox "Pos 2 saved"
elseif ( button == 2 )
Player -> Position 1px, 1py, 1pz, 0
MessageBox "Teleported to 1"
elseif ( button == 3 )
Player -> Position 2px, 2py, 2pz, 0
MessageBox "Teleported to 2"
endif
endif

Set use to 0





Infernal knight
1) Странно... ладно, надо будет посмотреть... но мне кажется, что 99999 - это слишком маленькое число единиц длины для такого большого расстояния...
2) Я проверял - все работает... я использовал эти команды в своих скриптовых функциях.

Вот этот кусочек...

if ( use == 1 )
MessageBox "What you want to do?","Save Pos 1","Save Pos 2","Teleport to 1","Teleport to 2"
Set use to 2
elseif ( use == 2 )
Set button to GetButtonPressed

Ты сам-то понял, что написал? Он работать не будет... Потому что ты сначала присваиваешь значение 1 и проверяешь его - все ОК, но значение 2 оно уже не проверяет... почему? потому что оно у тебя стоит в ТОМ же IF, дальше ты проверяешь кнопки, но откуда ж там взяться значению если ты не присвоил переменной button GetButtonPressed? А в конце ты вообще берешь и понаглому обнуляешь переменную use... :)

Как я понял тебе вообще не надо присваивать значение равное 2 - нахрена?
Пиши так:

if ( use == 1 )
MessageBox "What you want to do?","Save Pos 1","Save Pos 2","Teleport to 1","Teleport to 2"
Set button to GetButtonPressed

А дальше пиши свою проверку на кнопочки
Artem13
2 Infernal knight Да нет, должно работать, поскольку скрипт исполняется в каждом кадре...
ЗЫ Виноват, пропустил вот это
QUOTE
в конце ты вообще берешь и понаглому обнуляешь переменную use... :)

Тады да, работать не будет...
2 Scull

Зря пренебрегаешь моим советом - делай ИФ как можно меньшей длины - существует ограничение на кол-во строк, а именно 127, включая ИФ и ЭНДИФ...
Scull
Да уж, в этом месте я перемудрил...:)

2 Infernsl knight

2. Приведи пример...

2 Zmei Artem

Я не пренебрегаю им. Тем более, что конструкций if и elseif у меня не так много.

2 All

Теперь с меню всё работает, но остаётся вопрос: как проверить работу GetPos, (axis).
Строки:
float 1px
Set 1px to GetPos, X - не работает (как был 1px=0, так и остаётся... )

Есть что-нибудь аналогичное GetPos ?

PS Подскажите, как проверять свой скрипт не выходя из Морра,а то эти постоянные загрузки просто убивают
Dimonix
"Set use to 0" в конце это ты конечно зря поставил...

Поставь его после каждого MessageBox'a
...
MessageBox "Pos 1 saved"
Set use to 0
...
MessageBox "Pos 2 saved"
Set use to 0
...
MessageBox "Teleported to 1"
Set use to 0
...
MessageBox "Teleported to 2"
Set use to 0
...
Artem13
Не выходя из игры не получится, поскольк все плаги загружаются в момент запуска игры

Проверить ГетПоз можно примерно так:

set 1px to 0

Set 1px to GetPos, X

if(1px == 0)
MessageBox "GetPos returned 0", "Ok"
endif

PS Попробуй player->GetPos, X
Dimonix
Буквально вчера сотворил себе такой амулетик...

С GetPos все в порядке, проблемы с "Player -> Position x,y,z,angle".

Если снимать координаты GetPos, то телепортироваться нужно, используя функцию SetPos.

...
; определяем текущее местоположение PC
Set X0 to Player -> GetPos, X
Set Y0 to Player -> GetPos, Y
Set Z0 to Player -> GetPos, Z
...
; телепортируем PC в "точку возврата"
Player -> SetPos X X0
Player -> SetPos Y Y0
Player -> SetPos Z Z0
...

Ваш ответ: