проблема с реализацией квеста.

 
DK DeathDemona #17.12.2006 17:32
+
-
edit
 

DeathDemona

новичок
в общем , решил написать квест по аналогии с
http://la2.balancer.ru/wiki/...
это для меня что-то вроде "Hello world" , я собираюсь постепенно усложнять его тем чего я ещё не умею делать , потом внимательно вникнуть в код , удалить его с концами и написать с нуля , что бы убедится что понял всё. В написанни у меня возникла трабла
code forth
  1. vocabulary testevent
  2. also forth definitions
  3. 0 suvalue 17122006tq-step
  4. : step@   17122006tq-step ;
  5. : step!   to 1qbo-step ;
  6.  
  7. : npc-7071-dialog-append
  8.    '<br><a action="bypass -h jbf_testquest_7071">Testquest</a><br>' .
  9. ;
  10. : bypass_testquest_7071
  11.    step@ 0 = if
  12.        "Poidi ubei orka" show "test1" announce
  13.        1 step!
  14.          exit
  15.    then
  16.    step@ 1 = if
  17.        "ewe ne ubil orka" show "test2" announce
  18.        exit
  19.    then
  20.    step@ 2 = if
  21.        "Gra , ti ubil orka" show "test3" announce
  22.        -1 step!
  23.       exit
  24.    then
  25.    step@ -1 = if
  26.        "Kto ti takoi ? " show "test4" announce
  27.        exit
  28.    then
  29.    
  30.    "Ti haker" show "test5" announce
  31.    "jail-me" player@ do-player
  32. ;
  33. : on-npc-5122-die
  34.       "test6" announce
  35.        1 3427 items_add
  36.        2 step!
  37.       "test7" announce
  38. ;
  39.  
  40. ['] on-npc-5122-die 5122 npc-die+!
  41. previous definitions


суть таже что и в примере в вики , announce в роли дебагера
проблема в том что слове

: on-npc-5122-die

"test6" announce

1 3427 items_add

2 step!

"test7" announce

;

выполняется только первое слово в потоке , тобеш "test6" announce , если его убрать то не выполняется ничего из этого слова , в логе ошибок нет , форт ребутил , что делать ? :)
 

Murkt

Pythoneer

Я только что подумал, а может там текущий игрок не тот, кто убил? А тот, кого убили? То есть проверить
player@ name@ .
Если это не ты, то надо тогда делать так
3427 1 killer inventory+!
Если name@ не работает, то надо написать "Name" p@.

PS надеюсь, не ошибся насчёт вызова killer.
[team Їжачки - сумні падлюки]  
Это сообщение редактировалось 18.12.2006 в 10:18
DK DeathDemona #18.12.2006 12:58
+
-
edit
 

DeathDemona

новичок
таки да , ты прав , код теперь имеет такой вид
code text
  1. vocabulary testevent
  2. also forth definitions
  3.  
  4.  
  5. 0 suvalue 18122006tq-step
  6. : step@   18122006tq-step ;
  7. : step!   to 18122006tq-step ;
  8.  
  9. : npc-7071-dialog-append
  10.    '<br><a action="bypass -h jbf_testquest_7071">Testquest</a><br>' .
  11. ;
  12.  
  13. : bypass_testquest_7071
  14.    step@ 0 = if
  15.        "Сходи убей Ящерицу" show
  16.        1 step!
  17.          exit
  18.    then
  19.    step@ 1 = if
  20.        "ты ещё не убил Ящерицу " show
  21.        exit
  22.    then
  23.    step@ 2 = if
  24.        "Поздравляю , ты убил ящерицу" show
  25.        -1 step!
  26.       exit
  27.    then
  28.    step@ -1 = if
  29.        "Кто ты такой ? " show
  30.        exit
  31.    then
  32.    "Ты ХАКЕР !!! " show
  33.    "jail-me" player@ do-player
  34. ;
  35. : on-npc-5122-die
  36.    287 1 killer inventory+!
  37.    2 step!
  38. ;
  39. ['] on-npc-5122-die 5122 npc-die+!
  40. previous definitions


Но как теперь выполнять и "2 step!" для текущего игрока ? ведь он её меняет для моба которого я убил :(
 
DK DeathDemona #18.12.2006 13:13
+
-
edit
 

DeathDemona

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

: on-npc-5122-die
step@ 1 = if
287 1 killer inventory+!
2 step!
then
;
['] on-npc-5122-die 5122 npc-die+!
 
+
-
edit
 

Diamond

втянувшийся

А почему бы не попробовать вот так:

: noname ['] on-npc-5122-die killer do-player ; 5122 npc-die+!

Тогда слово on-npc-5122-die выполнится для killer, т.е. для того кто убил а не для того кого убили.


: noname "код" ; это нечто вроде временного слова, только оно не сохраняется а сразу возвращает ссылку на код. Можно было бы вместо него написать так:

: slovo ['] on-npc-5122-die killer do-player ;

['] slovo 5122 npc-die+!

Но так неудобно и создается лишнее, ненужное слово.

do-player описание смотри в вики, выполняет код для заданного игрока.
 
Это сообщение редактировалось 18.12.2006 в 13:38
DK DeathDemona #18.12.2006 13:46
+
-
edit
 
+
-
edit
 

Balancer

администратор
★★★★★
По идее, все примеры нужно переписывать. Безнадёжно устарелый и тяжёлый для эксплуатации стиль.

Более-менее близко к тому, что я хочу, и как оно будет - стиль кодирования эвента "Пираты" - data/jbforth/events/balancer/pirates

Кажется, нужно будет сосредоточиться в Форте не на введении новых возможностей, а на написании демонстративных кодов. Как нужно писать :)

"Пираты" тоже ещё требуют массу улучшений. Зато потом, по готовому коду, штамповать несложные квесты и эвенты можно будет просто конвейером.
 
+
-
edit
 

Balancer

администратор
★★★★★
Megawolf> : noname "код" ;

:noname слитно пишется :)

можно для уменьшения лишних буковок ввести более короткое написание. Скажем, в духе ': ("адрес слова").
 
DK DeathDemona #18.12.2006 14:08
+
-
edit
 

DeathDemona

новичок
да пока пытаюсь вьехать в форт как таковой :) к синтаксису долго привыкаю :)
я ж писал , что это что-то вроде "Hello world"
 
DK DeathDemona #18.12.2006 14:13
+
-
edit
 

DeathDemona

новичок
Пока абсолютно не вьезжаю в область действия и время жизни переменных и слов в форте :)
 
+
-
edit
 

Balancer

администратор
★★★★★
DeathDemona> я ж писал , что это что-то вроде "Hello world"

Твоя ошибка вот где.

code forth
  1. : on-npc-5122-die
  2.    287 1 killer inventory+!
  3.    2 step!
  4. ;


Этот код выполняется в контексте убитой жертвы, а не убийцы. Соответственно, все переменные - от жертвы. И "step!" выполняется для переменной у жертвы.

Выполнить код в чужом контексте в простейшем случае можно по
"2 step!" character do-player.

Или вместо do-player можно использовать синоним exec-for (ещё не решил, какое имя лучше :) Скорее второе, так как исполняться может в контексте не только игрока, но и NPC, моба, объекта со своим Фортом).

code forth
  1. : on-npc-5122-die
  2.    287 1 killer inventory+!
  3.    "2 step!" killer exec-for
  4. ;


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

code forth
  1. : 2>step 2 step! ;
  2.  
  3. : on-npc-5122-die
  4.    287 1 killer inventory+!
  5.    ['] 2>step killer exec-for
  6. ;


Хотя в данном случае усложнение не оправдано. Такие смерти бывают редко, так что на скорость тут наплевать.

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

code forth
  1. : on-npc-5122-die
  2.    287 1 killer inventory+!
  3.    2 ['] step! killer p-exec-for
  4. ;



Слова p-exec-for и p-do-player передаёт со стека один параметр в вызываемое слово. В нашем примере - двойку. ['] - возвращает адрес слова.
 
+
-
edit
 

Balancer

администратор
★★★★★
DeathDemona> Пока абсолютно не вьезжаю в область действия и время жизни переменных и слов в форте :)

Есть переменные двух типов.

1. Старые, классические, VARIABLE. Чтение и запись в них выполняются словами @ и !. VARIABLE - это глобальные переменные на весь сервер. Если в такую переменную запишет один пользователь, то другой прочитает изменённое значение. Есть пользовательские переменные - USER. Эти - индивидуальные, локальные для каждого пользователя.

2. VALUE - переменные. Читаются простым вызовом по имени, пишутся отедльным словом. Чаще удобнее простых, иногда - нет. VALUE - глобальные на всех пользователей. Пользовательский вариант -USER-VALUE. У нас есть ещё более короткое нестандартное имя - UVALUE. Кроме того, есть расширение - переменная, автоматически сохраняемая в БД - SUVALUE (saveable user value). Значение, занесённое в неё, сохраняется в базе при сохранении параметров пользователя. При входе же пользователя в игру - в переменную загрузится сохранённое ранее значение.

Разница в формате инициации. VARIABLE-переменные требуют только имени. VALUE - ещё и начального значения:
code forth
  1. VARIABLE test1
  2. 55 test1 !
  3.  
  4. 77 VALUE test2
 
DK DeathDemona #18.12.2006 16:08
+
-
edit
 

DeathDemona

новичок
code forth
  1. vocabulary testevent
  2. also forth definitions
  3.  
  4. 0 suvalue 18122006tq-step
  5. : step@   18122006tq-step ;
  6. : step!   to 18122006tq-step ;
  7.  
  8. : npc-7071-dialog-append
  9.    '<br><a action="bypass -h jbf_testquest_7071">Testquest</a><br>' .
  10. ;
  11.  
  12. : bypass_testquest_7071
  13.    step@ 0 = if
  14.        "Сходи убей Ящерицу" show
  15.        1 step!
  16.          exit
  17.    then
  18.    step@ 1 = if
  19.        "ты ещё не убил Ящерицу " show
  20.        exit
  21.    then
  22.    step@ 2 = if
  23.        "Поздравляю , ты убил ящерицу" show
  24.        -1 step!
  25.       exit
  26.    then
  27.    step@ -1 = if
  28.        "Кто ты такой ? " show
  29.        exit
  30.    then
  31.    "Ты ХАКЕР !!! " show
  32.    "jail-me" player@ do-player
  33. ;
  34.  
  35. : 2>step 2 step!
  36. ;
  37.  
  38. : test  
  39.   step@ 1 = if
  40.   287 1 killer inventory+!
  41.   ['] 2>step killer exec-for
  42.   then
  43. ;
  44.  
  45. : on-npc-5122-die
  46.   ['] test killer exec-for
  47. ;
  48.  
  49.  
  50. ['] on-npc-5122-die 5122 npc-die+!
  51.  
  52. previous definitions


на что геймсервер ругается

code text
  1. Exception in word 'on-npc-5122-die' defined in file '.\data\jbforth\testevent\ma
  2. in.f' while execute word 'exec-for'Return stack trace:
  3.     : on-npc-5122-die   test killer  >| exec-for |<  exit ;
 
Это сообщение редактировалось 18.12.2006 в 16:15
+
-
edit
 

Balancer

администратор
★★★★★
code forth
  1. : test
  2. step@ 1 = if
  3. 287 1 killer inventory+!
  4. ['] 2>step killer exec-for
  5. then
  6. ;


Этот код будет исполняться в контексте игрока. И никакого killer там определено не будет. Используй self :) Ибо тебе (точнее - игроку) нужно дать предмет самому себе. А self inventory+! лучше заменить на items_add (оно добавляет N итемов себе самому).

Кроме того, 2>step в нашем случае писать не нужно. Этот код также УЖЕ выполняется в контексте киллера.

code forth
  1. : test
  2.     step@ 1 = if
  3.         1 287 items_add
  4.         2 step!
  5.     then
  6. ;


Вот, и всё.

Кстати, тэг term хорошо подходит для выделения короткой строчки в пару слов. А блок кода лучше оформлять именно как код :) Сейчас поправлю твоё сообщение.
 
DK DeathDemona #18.12.2006 18:52
+
-
edit
 

DeathDemona

новичок
спасибо огромное , понял. "Hello World" готово , начинаю усложнять...
P.S. Код:
[code forth]
vocabulary testevent
also forth definitions
0 suvalue 18122006tq-step
: step@ 18122006tq-step ;
: step! to 18122006tq-step ;
: npc-7071-dialog-append
'
Testquest
' .
;
: bypass_testquest_7071
step@ 0 = if
"Дружище , а не прибить ли тебе Карика , а ? Это падло стащило мой кристал и сьело , заодно и кристальчик принесёш , ок ? " show
1 step!
exit
then
step@ 1 = if
"Ты ещё тут ?!" show
exit
then
step@ 2 = if
"ну спасибо , ты принёс мне мою прелеть , вот тебе от меня подарочек" show
1 287 items_add
-1 step!
exit
then
step@ -1 = if
"Привет Герой" show
exit
then
"Слушай , ты не хакер случаем ?!" show
"jail-me" player@ do-player
;
: test
step@ 1 = if
1 1046 items_add
2 step!
then
;
: on-npc-5122-die
['] test killer exec-for
;
['] on-npc-5122-die 5122 npc-die+!
previous definitions
[/code forth]
 
DK DeathDemona #18.12.2006 19:18
+
-
edit
 

DeathDemona

новичок
о-о-о :) а
['] test killer exec-for
и
['] on-npc-5122-die 5122 npc-die+!
нельзя обьединить в одно ? :)
 
+
-
edit
 

Balancer

администратор
★★★★★
DeathDemona> нельзя обьединить в одно ? :)

Можно так:
code forth
  1. : test
  2.     step@ 1 = if
  3.         1 1046 items_add
  4.         2 step!
  5.     then
  6. ;
  7.  
  8. :noname ['] test killer exec-for ; 5122 npc-die+!


Совсем без дополнительных слов:

code forth
  1. :noname
  2.     step@ 1 = if
  3.         1 1046 items_add
  4.         2 step!
  5.     then
  6. ;
  7.  
  8. ":noname [  ] killer exec-for ;" eval
  9. 5122 npc-die+!
 
DK DeathDemona #19.12.2006 06:10
+
-
edit
 

DeathDemona

новичок
Добавил анимацию при завершении квеста и получении вознаграждения в виде Перила. Анимация - как при получения лвл. Тем самым я освоил отправку пакетов, вот код:
[code forth]
vocabulary testevent
also forth definitions

0 suvalue 18122006tq-step

: step@ 18122006tq-step ;

: step! to 18122006tq-step ;

: npc-7071-dialog-append
'
Testquest
' .
;

: Get_Obj_Id
player@ "getObjectId" 0 jget
;

: bypass_testquest_7071
step@ 0 = if
"Дружище , а не прибить ли тебе Карика , а ? Это падло стащило мой кристал и сьело , принеси мне мой кристал , ок ? " show
1 step!
exit
then
step@ 1 = if
"Ты ещё тут ?! Вали в ЛоА !!!" show
exit
then
step@ 2 = if
"Ну спасибо , ты принёс мне мою прелесть , вот тебе от меня подарочек - Перилчег" show
1 287 items_add
Get_Obj_Id 15 "SocialAction" { int.class int.class } new-server-packet
send-packet
-1 step!
exit
then
step@ -1 = if
"Привет Герой, как дела ?" show
exit
then

"Слушай , ты не хакер случаем ?!" show
"jail-me" player@ do-player
;

: test
step@ 1 = if
1 1046 items_add
2 step!
then
;

: on-npc-629-die
['] test killer exec-for
;

['] on-npc-629-die 629 npc-die+!
previous definitions
[/code forth]
 
Это сообщение редактировалось 19.12.2006 в 09:02
DK DeathDemona #19.12.2006 06:39
+
-
edit
 

DeathDemona

новичок
Ув. Беленсер , извини за мою не скромность и некую наглость , но всё же без доступа к исходникам было довольно трудно додуматся до
Get_Obj_Id 15 "SocialAction" { int.class int.class }
добрые люди подсказали
broadcastPacket(new SocialAction(getObjectId(), 15));
правда это я у сф-фовцов посмотрел , уверен что в этом у вас то отличий нет
code java
  1. public SocialAction(int playerId, int actionId)
  2. {
  3.         _playerId = playerId;
  4.         _actionId = actionId;
  5. }

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

1. Когда персонаж завершает квест и получает вознаграждение , на него должна падать аура подобная той что падает при получении уровня [ВЫПОЛНЕНО]
2. перед аурой вокруг персонажа должны спавнится 4 феи и чтобы смотрели на персонажа
3. ну и патетический текст от квестера - "HERO - you complete my quest!!!" и тд
4. когда персонаж убивает квестового моба - должен спавнится демон который проникновенным голосом говорить - мол дарагой ты маладец - пора идти к квестеру
 
+
-
edit
 

Balancer

администратор
★★★★★
DeathDemona> В общем , если есть такая возможность , можно получить доступ к svn как бы для ознакомления , виде испытательного срока ?

Стукни сегодня в Jabber. В крайнем случае - по email.

DeathDemona> 2. перед аурой вокруг персонажа должны спавнится 4 феи и чтобы смотрели на персонажа

Спавн мобов можешь посмотреть в data/jbforth, много где используется :)

DeathDemona> 3. ну и патетический текст от квестера - "HERO - you complete my quest!!!" и тд

Тексты, если они больше одной-двух строчек, лучше и удобнее хранить в файлах.

DeathDemona> 4. когда персонаж убивает квестового моба - должен спавнится демон который проникновенным голосом говорить - мол дарагой ты маладец - пора идти к квестеру

Тут тебе трудно, наверное, будет. Нужно написать слово .say, которое будет "говорить" от лица некоего чара. Аналогично словам .tell/.trade/.shout (описаны в data/jbforth/effects/say.f). Но пока его нет, и при его использовании есть тонкость - говорить нужно не всем чарам сервера, а только окружающим на заданном расстоянии :)

Думаю, это лучше мне такое слово написать. Сейчас пропишу себе в TODO.
 
DK DeathDemona #19.12.2006 10:08
+
-
edit
 

DeathDemona

новичок
что-то с спавном запорлся, в чём напутал ?
[code forth]
{ } value fairys-spawned-list
{ testevent/spawnlist } value fairys-spawnlist
0 value xM
0 value yM
0 value zM
0 value HeadingM


: test1
player@ "X" p@ 100 + to xM
player@ "Y" p@ 100 + to yM
player@ "Z" p@ to zM
player@ "Heading" p@ to HeadingM
"{5122 [ xM ] [ yM ] [ zM ] [ HeadingM ] 60 false}" parse fairys-spawned-list list+
fairys-spawnlist npc-list-spawn to fairys-spawned-list
;
[/code forth]
 
+
-
edit
 

Balancer

администратор
★★★★★
DeathDemona> что-то с спавном запорлся, в чём напутал ?

Где ошибка - попробую понять позже. Пока советы по мелочам.

DeathDemona> 0 value xM

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

Вообще, чую, пора вводить локальные временные переменные слова :)

DeathDemona> player@ "X" p@ 100 + to xM
DeathDemona> player@ "Y" p@ 100 + to yM
DeathDemona> player@ "Z" p@ to zM

1. Есть слово coords@ ( character -- x y z ), которое возвращает x, y и z указанного персонажа.

2. Есть слово coords-randomize ( x y z delta -- x+/-delta y+/-delta z ). Т.е. можно написать:
code forth
  1. self coords@ 100 coords-randomize to zM to yM to xM


DeathDemona> "{5122 [ xM ] [ yM ] [ zM ] [ HeadingM ] 60 false}" parse

Получилась строка.

> fairys-spawned-list list+

Ты строку добавил к списку.

DeathDemona> fairys-spawnlist npc-list-spawn to fairys-spawned-list

Пытаешься отспавнить, и среди других данных - простая строка... :)

Варианты:

1. добавить eval, чтобы просто вычислить строку: "{ 5122 [ xM ] [ yM ] [ zM ] [ HeadingM ] 60 false }" parse  eval.

2. Зачем вообще вычислять строку? Список можно итак сделать, фигурные скобки - это обычные слова. Открывающаяся запоминает уровень стека, закрывающая - снимает всё, что появилось с введения открывающейся и из добавленных элементов формирует список. Кстати, поэтому и не забывай фигурные скобки отделять пробелом или переводом строки от других слов.
code forth
  1. { 5122 xM yM zM HeadingM 60 false } fairys-spawned-list list+


Кстати, содержимое списка можно посмореть, распечатав. Или в клиенте, или в телнете:
code forth
  1. fairys-spawned-list .


("точка" - печатает со стека одно значение).

Для отладки полезно также использовать ещё .s (печатает весь стек, не трогая значений).
 
UA MorbidAngel #19.12.2006 12:04
+
-
edit
 

MorbidAngel

разработчик L2J Fortress

DeathDemona> что-то с спавном запорлся, в чём напутал ?
DeathDemona> [code forth]
DeathDemona> { } value fairys-spawned-list
DeathDemona> { testevent/spawnlist } value fairys-spawnlist
DeathDemona> 0 value xM
DeathDemona> 0 value yM
DeathDemona> 0 value zM
DeathDemona> 0 value HeadingM
DeathDemona> : test1
DeathDemona> player@ "X" p@ 100 + to xM
DeathDemona> player@ "Y" p@ 100 + to yM
DeathDemona> player@ "Z" p@ to zM
DeathDemona> player@ "Heading" p@ to HeadingM
DeathDemona> "{5122 [ xM ] [ yM ] [ zM ] [ HeadingM ] 60 false}" parse fairys-spawned-list list+
DeathDemona> fairys-spawnlist npc-list-spawn to fairys-spawned-list
DeathDemona> ;
DeathDemona> [/code forth]


Я сам только начинаю въезжать в форт, но, помоему, в таком случае:
[code forth]
DeathDemona> player@ "Heading" p@ to HeadingM
[/code forth]
непись будит смотреть не в твою сторону, а в ту-же что и ты.

2Balancer А где можно посмотреть полный список уже описаных слов, операторов, а то на вики ДАЛЕКо не все?
 
Это сообщение редактировалось 19.12.2006 в 12:10
DK DeathDemona #19.12.2006 12:05
+
-
edit
 
AD Реклама Google — средство выживания форумов :)
DK DeathDemona #19.12.2006 12:07
+
-
edit
 

DeathDemona

новичок
берёш доступную сборку и смотриш в /gameserver/data/jbforth/
да , ты прав , смотреть будет в туже сторону , у меня пока руки не дошли считать угол :)
P.S.
[code forth]
new-list value fairys-spawned-list
new-list value fairys-spawnlist
0 value xM
0 value yM
0 value zM
0 value HeadingM

: step@ 18122006tq-step ;

: step! to 18122006tq-step ;


: test1
player@ "X" p@ to xM
player@ "Y" p@ to yM
player@ "Z" p@ to zM

"
{
{ 5122 [ xM ] [ yM 100 + ] [ zM ] [ HeadingM ] 60 false }
{ 5122 [ xM 100 + ] [ yM ] [ zM ] [ HeadingM ] 60 false }
{ 5122 [ xM ] [ yM 100 - ] [ zM ] [ HeadingM ] 60 false }
{ 5122 [ xM 100 - ] [ yM ] [ zM ] [ HeadingM ] 60 false }
} to fairys-spawnlist" parse eval
fairys-spawnlist npc-list-spawn to fairys-spawned-list
;

[/code forth]
 
Это сообщение редактировалось 19.12.2006 в 12:16

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru