Система Маноров

 
+
-
edit
 

Ene_ECL

новичок
Сабж меня сильно интересует, поэтому я решил "вплотную" заняться им. Почитав информацию про систему решил проверить хоть малюсенькую работоспособность оной на сервере. Зашёл в игру, пришёл к Диону, взял зерно(seed), брал с ИД 5016 и 5026, но это не важно. При использовании(даблклик) семян из инвентаря и при включенном Debug Info в окне сервера вылезает:

[C] 14 UseItem <<< ene
no itemhandler registered for itemId:5026

или:

[C] 14 UseItem <<< ene
no itemhandler registered for itemId:5016

АйДэ предметов написаны...

Решил присвоить что-нибудь к действию, писанул:
code text
  1. : use-item-5026 ( L2NpcInstance -- location )
  2.         player@
  3.         target@
  4.         dup L2Attackable.class instance-of? if
  5.                 "AggroRange" p@ .
  6.         else
  7.                 0 .
  8.         then
  9. ;
  10. : use-item-5016 "Test2" show ;

Выбрал монстра, юзнул семена - всё ОК. Решил пошерстить исходники на предмет useSeed, нашёл такую вещицу в L2Attackable.java :
code text
  1. public void setSeeded(int id, int seederLvl)
  2.         {
  3.                 _seeded = true;
  4.                 _seedType = id;
  5.                 int count = 1;
  6.  
  7.                 int diff = (getLevel() - seederLvl - 1);
  8.  
  9.                 // hi-lvl mobs bonus
  10.                 if (diff > 0 && diff < 5)//Config.MANOR_HARVEST_DIFF_BONUS)
  11.                         count += Rnd.get(diff);
  12.  
  13.                 List<L2ItemInstance> harvested = new FastList<L2ItemInstance>();
  14.  
  15.                 for (int i = 0; i < count; i++)
  16.                         harvested.add(ItemTable.getInstance().createItem(L2Manor.getInstance().getCropType(_seedType)));
  17.                
  18.  
  19.                 _harvestItems = harvested.toArray(new L2ItemInstance[harvested.size()]);
  20.         }

Обрадовался, решил юзнуть так прямо из игры:
code text
  1. //5016 24 player@ target@ "setSeeded" { int.class int.class } jexec

В окне сервера написало:
code text
  1. Error while jexec <noname>
  2. Unknown word <noname> error
  3. Input:
  4. === cut ===
  5. ... 24 player@ target@ "setSeeded" { int.class int.class } >|  jexec |<
  6. === cut ===
  7. Return stack trace:
  8. java.lang.reflect.InvocationTargetException
  9.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  10.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  11.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  12.         at java.lang.reflect.Method.invoke(Unknown Source)
  13.         at ru.balancer.jbforth.words.Java$jexec.exec(Java.java:263)
  14.         at ru.balancer.JBForth.do_word(JBForth.java:338)
  15.         at ru.balancer.JBForth.do_code(JBForth.java:203)
  16.         at ru.balancer.JBForth.do_code(JBForth.java:180)
  17.         at ru.balancer.JBForth.exec(JBForth.java:113)
  18.         at ru.balancer.JBForth.execp(JBForth.java:120)
  19.         at net.sf.l2j.gameserver.clientpackets.SendBypassBuildCmd.runImpl(SendBy
  20. passBuildCmd.java:98)
  21.         at net.sf.l2j.gameserver.clientpackets.ClientBasePacket.run(ClientBasePa
  22. cket.java:55)
  23.         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
  24.         at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
  25.         at java.util.concurrent.FutureTask.run(Unknown Source)
  26.         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
  27. access$301(Unknown Source)
  28.         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
  29. run(Unknown Source)
  30.         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source
  31. )
  32.         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  33.         at java.lang.Thread.run(Unknown Source)
  34. Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
  35.         at net.sf.l2j.gameserver.ItemTable.getTemplate(ItemTable.java:607)
  36.         at net.sf.l2j.gameserver.model.L2ItemInstance.<init>(L2ItemInstance.java
  37. :148)
  38.         at net.sf.l2j.gameserver.ItemTable.createItem(ItemTable.java:622)
  39.         at net.sf.l2j.gameserver.model.L2Attackable.setSeeded(L2Attackable.java:
  40. 1735)
  41.         ... 20 more

Вооот...
Кто с таким сталкивался??? Как лечить? Не ругайте меня - я ещё только учусь. :)

З.Ы.: очень хочется реализовать систему маноров. Мыслей уже кучу передумал. Могу даже полностью переписать всё на Форте, но не знаю, как "отметить" моба на предмет seed'a. Хоть новое поле в БД вставляй. Предлагайте варианты - надо реализовывать систему то...
З.З.Ы.: Ещё интересное:
code text
  1. public boolean isSeeded()
  2.         {
  3.                 return _seeded;
  4.         }
  5.  
  6.         @SuppressWarnings("unused") // ---  вот эта строка интереснее всего.
  7.         private boolean isSeededHigh()
  8.         {
  9.                 return (_seedType < 5650); // low-grade seeds has id's below 5650
  10.         }
 

stiff

разработчик l2j-сервера
Как мне кажелся сиды чемто сродни спойлу... Может его покопать?
 
+
-
edit
 

Ene_ECL

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

stiff

разработчик l2j-сервера
имхо на яве быстрее...
 
+
-
edit
 

Ene_ECL

новичок
stiff> имхо на яве быстрее...
Ага... Если быстрее, то почему не работает до сих пор? Все противники Форта говорят, а не делают. Уважаемый stiff, давай так: я приступлю к работе сегодня же, а ты (если конечно хочешь и можешь помочь серверу) приступай когда хочешь... Посмотрим, у кого быстрее получится заставить работать систему маноров... Или хотябы с места сдвинуться.

По существу: долгое обдумывание сабжа привело к примерному решению. Так как хочу переписать систему Маноров "с нуля" на Форте, то сначала хочу реализовать малое: заставить зёрна "садиться" в монстров и пытаться "харвестить". Для обозначения статуса "isSeeded" у моба было решено добавить 1 столбец в таблицу npc. Столбец "isSeededBy", в который писать obj_Id или хотя бы char_name посадившего в моба зерно игрока. При использовании Harvester'a необходимо сравнить obj_Id или char_name чара, который юзает Harvester, и значение в "isSeededBy" и при совпадении выдавать необходимый дроп. В принципе, систему можно развивать неограниченно, а самое главное - не надо компилить и рестартить сервер для отладки и проверки кода. Если у кого-нибудь есть наработки иили мысли, то прошу поделиться ими.
 

Beast

разработчик l2j-сервера
Вся проблема в отсутствии правильных диалогов NPC и некторых пакетов.
 

stiff

разработчик l2j-сервера
имелась ввиду скорость работы а не разработки.
> Все противники Форта говорят, а не делают.
сторонники тоже не делают. =)

Еще одно поле... Ты собрался 1 сидом сидить всех мобов данного типа на сервере?
При каждом сиде запись в базу? Нерационально.

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

а тестовый сервер не проблема рестартоавть.
 
+
-
edit
 

Ene_ECL

новичок
stiff> имелась ввиду скорость работы а не разработки.
Прально, тебе быстрее писать на Жабе, мне на Форте.
Пиши, помогай, Маноров делать надо всем миром.

>> Все противники Форта говорят, а не делают.
stiff> сторонники тоже не делают. =)
За себя отвечу: я сторонник - я делаю... :)

stiff> Еще одно поле... Ты собрался 1 сидом сидить всех мобов данного типа на сервере?
stiff> При каждом сиде запись в базу? Нерационально.
stiff> isSeeded должен быть у каждого экземпляра моба, а не общий на всех. Смотри спойл.
Не совсем понимаю, зачем? Посмотри, как я реализовал, может понравится.

stiff> а тестовый сервер не проблема рестартоавть.
Хмм.... У меня на Атлоне 3200+ компилится сервер примерно 1-2 минуты + старт 30-32 сек. Форт рестартится за одно нажатие клавиши + 1-3 сек на сам рестарт.

Вот плоды 4х часовой работы:
code text
  1. 0 suvalue isSeeded
  2.  
  3. : Seed@ "isSeeded" uv@ ;
  4. : Seed! "isSeeded" uv! ;
  5. : Seed-clear 0 "isSeeded" uv! ;
  6.  
  7. : ch 100 10 choose - ;
  8.  
  9. : ch_2 player@ "Level" p@ player@ target@ "Level" p@ - abs int dup 5 > if 15 * else 0 then ;
  10.  
  11. : ch_fin ch_2 ch - negate dup 1 < if drop 1 then ;
  12.  
  13. : calculate-chance-seed? 100 choose ch_fin < if 1 else 0 then ;
  14.  
  15. : in-right-region? -1 ;
  16.  
  17. : near-Dion? ( player@ -- flag )
  18.         loc@
  19.         drop
  20.         loc>map
  21.         52 55 within
  22.         0 <> if
  23.                 46 49 within
  24.                 0 <> if
  25.                         -1
  26.                 then
  27.         then
  28. ;
  29.  
  30. : mob-is-near? player@ target-or-me@ "getDistance" { L2Object.class } jget ;
  31.  
  32. : mob-curr-hp player@ target@ "CurrentHp" p@ int ;
  33.  
  34. : isSeededBy! ( char_name target -- )
  35.         player@ target@
  36.         oid@
  37.         Seed!  
  38.         "Seed-clear" 60000 timer-start
  39. ;
  40. : mob-is-seeded? player@ target@ oid@ Seed@ = if 1 else 0 then  ;
  41. : use-item-5016
  42.         mob-is-near?
  43.          150 < if
  44.                 near-Dion?
  45.                 0 <> if                
  46.                         calculate-chance-seed?
  47.                         0 <> if
  48.                                 mob-is-seeded? 0 = if                          
  49.                                         isSeededBy!
  50.                                         "Seeding success" type
  51.                                         5016 item_remove
  52.                                 else
  53.                                 "Mob already seeds" type
  54.                                 then
  55.                         else
  56.                                 "Seeding failed" type
  57.                         then
  58.                 then
  59.        
  60.         else
  61.         "Mob is so far" type
  62.         then
  63. ;
  64.  
  65. : mag_eff player@ dup target@ 2023 1 2 2 new-MagicSkillUser ;  Хер знает почему не работает, может анимация не прописана.
  66.  
  67. : calculate-chance-harvester? -1 ;
  68. : mob-is-seeded? player@ target@ oid@ Seed@ = if 1 else 0 then  ;
  69.  
  70. : use-item-5125
  71.         calculate-chance-harvester?
  72.         0 <> if
  73.                 mob-is-seeded?
  74.                 0 <> if
  75.                         "Mob is Seeded" type
  76.                         mob-curr-hp 0 = if
  77.                                 "Trying to harvest" type
  78.                         else
  79.                                 "Mob is not died" type
  80.                         then
  81.                 else
  82.                 "Mob is not Seeded" type
  83.                 then
  84.         then
  85. ;

Фортом занимаюсь 4й день, поэтому прошу не смеяться, а лучше показать ошибки. Собсна обработан один сид с ИД 5016 + харвест, но это тока начало. Вместо добавления столбца к таблицам была использована character_quests. Не нравятся две проблемы: не знаю, как распознать местонахождение чара по локациям. Могу координаты вывести, а преобразовать coords@ -> MapRegion не могу. Надо бы чтобы кто-нить помог с вызовом метода Жабы. И второе: не знаю как временно убрать дроп с "засиденного" моба.
 

Murkt

Pythoneer

Я тебе могу сделать setSeeded, getSeeded, и убрать дроп при осеменении. Только учти, что getSeeded будет возвращать не boolean (есть два вида семян, нужно для дропа различать).
[team Їжачки - сумні падлюки]  
+
-
edit
 

Ene_ECL

новичок
Murkt>Я тебе могу сделать setSeeded, getSeeded, и убрать дроп при осеменении. Только учти, что Murkt>getSeeded будет возвращать не boolean (есть два вида семян, нужно для дропа различать).
Собсна setSeeded, getSeeded реализованы, при успешном сиде пишется переменная в указанную таблицу, уникальная для каждого чара. Один минус: при попытке "засИдеть" второго моба, с первого "засИженного" сид снимается. Через указанный интервал времени переменная становися нулём(0). Помочь убрать дроп при осеменении необходимо. Ещё нужно как воздух вызвать метод, который выводит на стек локацию чара, будь то город или Beehive... Ориентировка на L2JSourceServerBalancertrunkjavanetsfl2jgameserverhandlerusercommandhandlersLoc.java

Murkt> "есть два вида семян, нужно для дропа различать"
угу, хотел писать ещё одну переменную в БД с ИД сида, думаю как лучше реализовать.

Murkt>getSeeded будет возвращать не boolean
А что будет возваращать? Наверное ИД сида?

Крч, Murkt, делай, что сможешь - я всё сжую.

З.Ы.: дайте пожалуйста ссылки на топики с примерами работы jexec и jget, а то я до сих пор не могу понять. Если кто может, напишите примерчики наглядные.
 

Murkt

Pythoneer

Ene_ECL>А что будет возваращать? Наверное ИД сида?

Что скажешь, то и будет.

В БД писать ничего нельзя.

Собсно я могу всё сделать :)) можешь написать на форте, я потом на яву для скорости перепишу (если пойму)
[team Їжачки - сумні падлюки]  
+
-
edit
 

Ene_ECL

новичок
Ene_ECL>>А что будет возваращать? Наверное ИД сида?
Murkt> Что скажешь, то и будет.
Murkt> В БД писать ничего нельзя.
Murkt> Собсно я могу всё сделать :)) можешь написать на форте, я потом на яву для скорости перепишу (если пойму)
А почему в БД нельзя? Счётчик убийств реализован же через БД... Я подумаю, что ты сможешь написать, конечно лучше написать метод определения местоположения чара. А на яве всё уже написано, но не работает. Если ты сможешь написать на яве то, что я на Форте буду переписывать с Явы, то не проще ли поправить Яву сразу? В любом случае, я не знаю, как обойтись на Форте без БД, подскажешь как - скажу спасибо.. :)))
 

Murkt

Pythoneer

БД - очень долго.

А написать пару коротких функций для тебя, и разбираться в существующем коде - "две больших разницы" ©
[team Їжачки - сумні падлюки]  
+
-
edit
 
Счетчик убийств это скорее концепция, ибо 3 запроса на убийство это много. Если сервер маленький и загрузка небольшая то можно, но при серьезном онлайне сильно грузить будет. Я уж не говорю про счетчик дропа - там еще хуже, поскольку на одно убийство обычно приходтся несколько вещей.
Пытаясь понять рекурсию, следи за тем, чтобы она не поняла тебя первой...  
+
-
edit
 

Ene_ECL

новичок
Да, согласен, онлайн сервера растёт.. Сейчаз уже к сотне подваливает...
Как вызвать правильно, чтобы эксепшены не сыпались:
MapRegionTable.getInstance().getClosestTownNumber(_char) ?? Если кто знает - помогите, я пол дня сижу разбираюсь.
 

Murkt

Pythoneer

ща, у меня получилось вызвать одну функцию из Formulas :)
[team Їжачки - сумні падлюки]  

Murkt

Pythoneer

попробуй так. На стеке уже должно лежать L2Character

code text
  1. "java.net.sf.l2j.gameserver.MapRegionTable" class "getInstance" 0 jget "getClosestTownNumber" 1 jget


если не сработает (будет материться на последний jget), попробуй так

code text
  1. "java.net.sf.l2j.gameserver.MapRegionTable" class "getInstance" 0 jget "getClosestTownNumber" { L2Character.class } jget
[team Їжачки - сумні падлюки]  
+
-
edit
 

Ene_ECL

новичок
Murkt, есть два варианта твоей помощи: либо переписать
code text
  1. public void setSeeded(int id, int seederLvl)
  2.         {
  3.                 _seeded = true;
  4.                 _seedType = id;
  5.                 int count = 1;
  6.  
  7.                 int diff = (getLevel() - seederLvl - 1);
  8.  
  9.                 // hi-lvl mobs bonus
  10.                 if (diff > 0 && diff < 5)//Config.MANOR_HARVEST_DIFF_BONUS)
  11.                         count += Rnd.get(diff);
  12.  
  13.                 List<L2ItemInstance> harvested = new FastList<L2ItemInstance>();
  14.  
  15.                 for (int i = 0; i < count; i++)
  16.                         harvested.add(ItemTable.getInstance().createItem(L2Manor.getInstance().getCropType(_seedType)));
  17.                
  18.  
  19.                 _harvestItems = harvested.toArray(new L2ItemInstance[harvested.size()]);
  20.         }
  21.  
  22.         public boolean isSeeded()
  23.         {
  24.                 return _seeded;
  25.         }

Либо научить меня грамотно вызывать java методы.. А то я делаю всё, как написано в примерах, а вылезают эксепшны...
З.Ы.:
code text
  1. "java.net.sf.l2j.gameserver.MapRegionTable" class "getInstance" 0 jget "getClosestTownNumber" { L2Character.class } jget
не алё... Алё:
code text
  1. : get-closest-town-number
  2. self
  3. "MapRegionTable"
  4. server-stat-instance
  5. "getClosestTownNumber"
  6. { L2Character.class }
  7. jget
  8. ;
 
+
-
edit
 

Balancer

администратор
★★★★★
Не "java.net.sf.l2j.gameserver.MapRegionTable", а "net.sf.l2j.gameserver.MapRegionTable"
 
+
-
edit
 

Ene_ECL

новичок
А как мне вызывать "public void setSeeded(int id, int seederLvl)" из L2Attackable.java ? Пробовал: : qqq 5016 30 player@ "getTarget" 0 jget "Seeded" p! ; - пишет эксепшн... Бал, помогай...
 
+
-
edit
 

Balancer

администратор
★★★★★
P! работает только когда тип данных на стеке совпадает с типом функции. На стеке у тебя всегда Integer (int - не ссылочный тип). Поэтому по p! в функцию от (int) записать нельзя, только в (Integer)

Кроме того, p! пишет только один аргумент. А тебе надо - два.
code forth
  1. : qqq    5016 30 player@ "getTarget" 0 jget "setSeeded" { int.class int.class } jexec ;


или так:
code forth
  1. : c.seeded!  ( id seedlevel char - - )  "setSeeded" { int.class int.class } jexec ;
  2.  
  3. : qqq   5016 30 my-target@ c.seeded! ;
 

в начало страницы | новое
 
Поиск
Поддержка
Поддержи форум!
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru