Diamond: Блог

 

Diamond

втянувшийся

Вот этот алгоритм выборки 1 предмета из группы мне очень не нравится (возможно я неправ):

code text
  1.                 // iterate each item in group and check chance
  2.                 chance = Rnd.get(L2Drop.MAX_CHANCE);
  3.                 for(L2DropData i : _items)
  4.                 {
  5.                         if(chance > i.getChance())
  6.                         {
  7.                                 chance -= i.getChance();
  8.                                 continue;
  9.                         }
  10.  
  11.                         ItemToDrop t = new ItemToDrop(i.getItemId());
  12.                         // well, we have our drop-item now, let's get count
  13.                         int count = 0;
  14.  
  15.                         if(i.getMinDrop() >= i.getMaxDrop())
  16.                                 count = i.getMinDrop();
  17.                         else
  18.                                 count = Rnd.get(i.getMinDrop(), i.getMaxDrop());
  19.                         if(_isAdena)
  20.                                 count *= adenarate;
  21.                         t.count = count;
  22.                         t.isAdena = _isAdena;
  23.                         return t;
  24.                 }
  25.                 // can it be?
  26.                 return null;

Это подтверждается многочисленными жалобами игроков. Например у предмета шанс 0.5 и не выпадает за пару суток, вместе с этим выпадает штук 5 предметов с шансами 0.05 и ниже.
 

Diamond

втянувшийся

1. Форт
- убрать лишние эвенты, починить остальные
- разобраться с территориями, упорядочить, доделать
- почистить все остальное, упорядочить
- сделать новые, постоянные эвенты, наподобие моей пвп системы
2. Скиллы
- скилловый движок
- энчант скиллов
- определиться с форматом скиллов
- описать неописанные скиллы
3. AI
- улучшить AI, сделать легкий
- разобраться с Z координатой, если моб ниже по Z то идет задержка атаки, и не агрится если рядом встать
- переделать AI обычных гвардов
- переделать AI осадных гвардов (с нуля)
4. Корабли
- плавают по суше, исправить
5. Кланхоллы
- декорации
- зоны клан холлов (уже описаны но вроде неиспользованы)
- остальные функции (кроме аукциона ничего не работает)
6. Манор
- доделать
7. Кланы
- доделать все С5 функции


Список расширить и дополнить.
 

Diamond

втянувшийся

Нужна инфа о поведении мобов на офф сервере + свои идеи. Выкладывайте - что смогу реализую :)

Пока сделал только это:

- если тебя атакует несколько мобов, то лучники и маги отбегают на расстояние выстрела и атакуют оттуда, а воины бьют вблизи. Моб которого ты бьешь не отбегает.
- маги не подбегают к тебе, а атакуют с дальнего расстояния, если имеется такой скилл. Лучники не подбегают вообще.
- если у мага есть скилл ближнего боя (аура) то он не бьет вручную, а использует его.
- мобы выбирают скиллы ближнего/дальнего боя в зависимости от расстояния до цели.
- баферы бафают и лечат себя + всех своих союзников.
- если моб не бафер, но у него есть баф - бафает только себя.
- мобы разделены на типы (воин, лучник, скаут, маг, бафер)
- игроки разделены на типы (воин, лучник, маг, бафер)
- для каждой ситуации (воин вс воин, лучник вс маг и т.д.) оределены настройки, влияющие на частоту использования различных скиллов. (пример: воины чаще пытаются станить магов, чем воинов, потому что на магов стан проходит лучше)
- если у тебя мало хп то моб будет скорее бить тебя чееще м дебафать
- мобы иногда говорят фразы, в зависимости от ситуации. Пока в разработке.

Еще планирую сделать убегание скаутов за подмогой. Но тут желательна геодата и инфа с оффа.

Рассмотрю любые предложения, советуйте :)



PS: ходили недавно в бараки к лизардменам, напали на кучку мобов в центре, наблюдал следующую картину: 2 воина и копейщик кинулись на нас врукопашную, а 2 шамана отбежали на безопасное расстояние и стали кидаться массовым гидробластом :D
 

Diamond

втянувшийся

Из тюрьмы сбегают, причем сразу как туда попадут. Им пофигу на карму и на то что при тп обратно кидает. Причем сбегают в основном через ворота, сломав их либо релогином.
Предлагаю в качестве временной меры поставить у выхода "невидимую стенку". Выложенную папку положить в /jbforth/geodata/territories/ и прописать в main.f
 
 

Diamond

втянувшийся

Автоматическая система боев на арене.
Уже выкладывал где-то описание, но все же повторюсь:

Игрок подходит к Arena Manager, создает бой. Указывает:
- ставку (10к - 1кк)
- размер команд (например 2 vs 3)
- диапазон уровней команд (например 45-47 vs 40-42)
- время до начала (от 1 до 10 минут)
Далее идет отсчет времени, каждую минуту выводится сообщение с текстом "игрок такой-то создал бой с параметрами такими-то, до начала столько-то минут"
В это время любые желающие (и подходящие по уровню) могут зарегистрироваться либо за, либо против него, заплатив указанную сумму.
Как только время истекает, все зарегистрировавшиеся телепортируются на арену, в четко определенные позиции.
Парализуются на 60 сек (время, выделенное для того чтобы все успели телепортироваться), потом паралич снимается и дается команда на старт.
В конце автоматически определяются победители, и все вложенные деньги делятся между ними.

Для установки просто распакуйте в папку jbforth и впишите строчку pvp/main.f после events/main.f в файле jbforth/main.f
Работает только в fortress
pvp.rar (скачать) [2,8 кБ]
 
 
 

Diamond

втянувшийся

2 вопроса:

1. Допустим, имеется такой код:
code text
  1. also ai
  2. also evt
  3. : attack_check "attack" . ;
  4. : attack EVT_ATTACKED ['] attack_check player@ evt.handler! ;
  5. previous previous \ сколько их тут надо? 1 или 2?

В чате пишем //do pvp_attack
По идее этот код должен отслеживать любую атаку по тебе. Но на деле отслеживается только атака вручную, не скиллами/магией.
Вобщем просьба пофиксить. И еще, никак не найду каким образом отслеживать кто именно атаковал.

2. Раньше я делал имитацию стенки (запрет на вход в территорию) вот таким образом:
code text
  1. also geodata:
  2. also territories:
  3. also ai
  4. also intention
  5. 0 VALUE pl_h
  6. : pl?  ( - )  self L2Player.class instance-of? ;
  7. : pvp_enter  ( - )
  8.         pl? unless false exit then
  9.         player@ "Heading" p@ to pl_h
  10.         pl_h 16384 <= if
  11.                 player@ "X" p@ 10 - player@ "Y" p@ 10 - player@ "Z" p@ pl_h xyzh>position
  12.                 null AI_INTENTION_MOVE_TO intention!
  13.         then
  14.         pl_h 16384 > pl_h 32768 <= and if
  15.                 player@ "X" p@ 10 + player@ "Y" p@ 10 - player@ "Z" p@ pl_h xyzh>position
  16.                 null AI_INTENTION_MOVE_TO intention!
  17.         then
  18.         pl_h 32768 > pl_h 49152 <= and if
  19.                 player@ "X" p@ 10 + player@ "Y" p@ 10 + player@ "Z" p@ pl_h xyzh>position
  20.                 null AI_INTENTION_MOVE_TO intention!
  21.         then
  22.         pl_h 49152 > if
  23.                 player@ "X" p@ 10 - player@ "Y" p@ 10 + player@ "Z" p@ pl_h xyzh>position
  24.                 null AI_INTENTION_MOVE_TO intention!
  25.         then
  26. ;
  27. ['] pvp_enter terr "setEnterWord" 1 jexec
  28. previous previous previous previous \ а тут вообще хз сколько надо :)

При входе в обасть игрок отодвигался немного назад, в результате войти в нее не мог.
Теперь же, применяя тот же код, так сделать не получается - при "отодвигании" назад игрок может щелкнуть бежать вперед, в результате если часто щелкать можно пройти "стенку".
Предлагаю сделать запрет на самостоятельное передвижение во время принудительного. Иначе пропадет куча интересных возможностей при написании эвентов :)
 

Diamond

втянувшийся

Может почините сабж? :)
Его вызов сейчас отключен, при включении сыпет ошибками...
 

Diamond

втянувшийся

Как реализовать проверку вводимых в форме символов? Например чтобы писали только по английски. Либо сделать так чтобы русские буквы сохранялись в правильном формате.
А то сделал регистрацию команд для проведения турнира, а игроки пишут их по русски, в итоге ?????? выходит...
 

Diamond

втянувшийся

Воспользовался идеей балансера, сделал нпц который рассказывает в каких мобах лежат выбитые из игроков предметы, за 1/10 стоимости. Т.е. платишь 100к и получаешь инфу о всех предметах стоимостью до 1кк.

code text
  1. new-list VALUE owners
  2. new-list VALUE items
  3. new-list VALUE types
  4. NULL VALUE item_price
  5. NULL VALUE items_out
  6.  
  7. : npc-8604-dialog-append
  8.         '<br>' .
  9.         '<a action="bypass -h jbf_informer1">Найти предметы</a>' .
  10. ;
  11.  
  12. forth:: bypass_informer1
  13.         '<br>
  14.         Я могу найти для тебя любую вещь! Но информация стоит денег.
  15.         Нет денег - нет информации! Сколько ты готов заплатить?
  16.         <edit var="item_price" width=80>
  17.         <button value=Ok action="bypass -h jbf_informer2 $item_price" width=80 height=15>' show
  18. ;
  19.  
  20. forth:: bypass_informer2 ( item_price - )
  21.         to item_price
  22.         item_price adena_pay
  23.         item_price 10 * to item_price
  24.         new-list to owners
  25.         new-list to items
  26.         new-list to types
  27.         "SELECT C.name AS mob_name, B.name AS item_name, B.crystal_type FROM items AS A LEFT OUTER JOIN prices AS B ON ( A.item_id = B.item_id ) LEFT OUTER JOIN npc AS C ON ( A.owner_id = C.id ) WHERE A.loc='MONSTER' AND B.price<='[ item_price >slashes ]' order by price" parse query    
  28.                 ?dup IF . drop exit THEN
  29.                 'dup "crystal_type" m@ types list+ dup "mob_name" m@ owners list+ "item_name" m@ items list+' do-list
  30.  
  31.         "" to items_out
  32.  
  33.         types list> 0 ?DO
  34.                 dup "none" = if drop "n" then
  35.                 " - " s+ items i list@ s+ " - " s+ owners i list@ s+ "<br>" s+ items_out swap s+ to items_out
  36.         LOOP
  37.         items_out show
  38. ;
 

Diamond

втянувшийся

Этой проблеме уже год, и все никто не соизволит поправить. Половина лучников до сих пор в упор стреляет. Пофиксил большинство:

id;name;attackrange1;attackrange2
784;"Tasaba Lizardman";40;500
826;"Platinum Tribe Archer";40;500
855;"Kel Mahum Archer";40;500
920;"Maille Lizardman Scout";40;500
1013;"Ol Mahum Van Archer";40;500
1019;"Fallen Orc Archer";40;500
1133;"Dead Pit Skeleton Archer";40;500
1354;"Varka Silenos Hunter";40;500
1605;"Zaken's Archer";40;500
1606;"Zaken's Archer";40;500
1607;"Zaken's Elite Archer";40;500
1639;"Tasaba Lizardman";40;500
1642;"Tasaba Lizardman Sniper";40;500
1643;"Tasaba Lizardman Sniper";40;500
1661;"Otherworldly Invader Archer";40;500
1684;"Dimension Invader Archer";40;500
1707;"Purgatory Invader Archer";40;500
1730;"Forbidden Path Invader Archer";40;500
1753;"Dark Omen Invader Archer";40;500
1776;"Messenger Invader Archer";40;500
10005;"Turek Mercenary Archer";40;500
10042;"Remmel's Archer";40;500
10107;"Lidia's Archer";40;500
10150;"Evil Spirit Archer";40;500
10171;"Hellion's Archers";40;500
10257;"Arak's Archer";40;500
10261;"Totem Guard Archer";0;500
10364;"Sharuk's Marksman";40;500
10389;"Red Eye Archer";40;500
10413;"Necrosentinel Archer";40;500
10446;"Shooter of Enmity";40;500
10477;"Kabed's Archer";40;500
12567;"Doom Archer";40;500


attackrange1 - то что было (и сейчас есть) в npc таблице фортреса.
attackrange2 - так как надо :)

Всех до одного проверял вручную, данные верные.
 

Diamond

втянувшийся

Описал кусок стены гирана. Написал несложный код на форте для отслеживанию вхождения в эту область (по аналогии с worldtree). В случае попадания в стену перемещает игрока (воспользовался примерами из bodyguard) немного назад. В итоге через стену нельзя ходить. Вышло почти как с геодатой, только обходной путь не ищет, но это и не нужно.

На то чтобы разобраться - потратил часа 2, на описывание стенки - 5 минут. Весь замок описать - часа 2.

Вопрос - почему раньше не сделали? ;D

С помощью того же bodyguard научился отслеживать факт атаки, могу получить координаты атакующего и атакуемого. Если эти координаты а так же область стены передать функции на java, которая отследит пересечение, то нельзя будет стрелять через стены. Просьба написать такую функцию :)

Если все это доработать, осады станут гораздо интереснее, на производительности не скажется (проверял).
 

Diamond

втянувшийся

После эвентов или турниров часто надо телепортировать игроков по домам, а .back не всегда работает. Писать имя каждого игрока в админке и телепортировать - не очень то удобно. Чуток поменял страничку при щелчке с шифтом на игрока - добавил кнопку телепорта по локациям. Совсем небольшой и несложный фикс, но телепортировать стало гораздо удобнее :)

В datajbforthadminplayers добавить файл character_teleport.htm с текстом:


<html><body>

Starter Towns:Mainland:
Dark Elven VillageDion Castle Town
Dwarven VillageFloran Village
Elven VillageGiran Castle Town
Orc VillageGludin Village
Talking Island VillageGludio Castle Town
Hunters Village
Town of Aden
Town of Oren


</body></html>


В файле datajbforthadminplayersmain.f добавить:

: admin_teleport_char ( name — )
"jbforth/admin/players/character_teleport.htm" show
;

В файле datajbforthadminplayerscharacter_list.htm (то же самое в файле character_list-ru.htm только по русски) после строчки:<button value="Go" action="bypass -h admin_to_char [ object p.name@ ]" width=60 height=15 back="sek.cbui94" fore="sek.cbui92">вставить строчку:<button value="Teleport" action="bypass -h admin_teleport_char [ object p.name@ ]" width=60 height=15 back="sek.cbui94" fore="sek.cbui92">В файл datajbforthadminteleports.f добавить:

: admin_teleport_character ( x y z — )
"teleport" check-access
s>coords drop
player@ target@ teleport-player-to
;

И почему это не сделали раньше? :)
 

Diamond

втянувшийся

Нашел ряд мобов в вашей нпц таблице, у которых пдеф=мдеф=100 независимо от уровня (select * from npc where mdef=100 and pdef=100 and type='l2monster' and level>20), видимо выставлено по умолчанию. Ну и остальные параметры у таких мобов часто неверные.
Написал небольшой фикс, работает примерно так:

$hp2=round((0.0058*pow($level,3)+0.0621*pow($level,2)+18.348*$level+47.452)*$hp_slow_bonus*$hp_type_rate);
if ($hp2>$hp) {$hp=$hp2;}
$mp2=round((0.005*pow($level,3)-0.1254*pow($level,2)+12.336*$level+52.762)*$mp_type_rate);
if ($mp2>$mp) {$mp=$mp2;}
$patk2=round((0.0047*pow($level,3)-0.153*pow($level,2)+4.4176*$level)*$patk_type_rate);
if ($patk2>$patk) {$patk=$patk2;}
$matk2=round((0.002242*pow($level,3)-0.026787*pow($level,2)+0.673145*$level+3.188317)*$matk_type_rate);
if ($matk2>$patk) {$matk=$matk2;}
$pdef2=round((-0.0004*pow($level,3)+0.082*pow($level,2)+0.9462*$level+44.524)*$pdef_type_rate);
if ($pdef2>$pdef) {$pdef=$pdef2;}
$mdef=round(0.000073*pow($level,3)+0.030487*pow($level,2)+1.297110*$level+32.335722);
if ($mdef2>$mdef) {$mdef=$mdef2;}
$exp=round((0.025392*pow($level,3)-1.194857*pow($level,2)+42.974866*$level-16.686425)*$exp_bonus*$leader_bonus*$hp_rate);
$sp=round((0.002591*pow($level,3)-0.115185*pow($level,2)+2.788418*$level-0.787184)*$exp_bonus*$leader_bonus*$hp_rate);

Считает параметр, сравнивает с исходным, если исходный меньше значит заменяет на новый. Exp и Sp посчитал полностью по своему, но там сами переделаете скриптом.

Еще у некоторых рейдов нет оружия, прописал:

UPDATE npc SET rhand=295 WHERE id=10019;
UPDATE npc SET rhand=97 WHERE id=10038;
UPDATE npc SET rhand=156 WHERE id=10169;
UPDATE npc SET rhand=9 WHERE id=10064;
UPDATE npc SET rhand=161 WHERE id=10280;
UPDATE npc SET rhand=80 WHERE id=10035;
UPDATE npc SET rhand=169 WHERE id=10199;
UPDATE npc SET rhand=160 WHERE id=10202;
UPDATE npc SET rhand=6611 WHERE id=10205;

 

Diamond

втянувшийся

Что если сделать програмку, которая с нуля создаст весь дроплист?
Плюсы такого дропа:
1) Он намного более полный, там присутствуют абсолютно все вещи, в отличие от того дропа что есть сейчас.
2) В нем отсутствуют ошибки, т.к. создан он программой а не человеком.
3) Он в разы больше стандартного дропа, задействованы все мобы. (а сейчас многие просто пустые)
4) Сейчас С4 дроп вобще отсутствует, по нему нет инфы. А в этом дропе все С4 предметы будут присутствовать.
5) Если на сервере малый онлайн, то такой дроп можно подстроить конкретно под это - например сделать шанс выпадения не менее 0.001 (а не 0.0001 как сейчас). И много других возможностей.
6) Админы и ГМы наконец-то смогут спать спокойно, зная что халявного дропа больше нет :)

Минусы:
1) Такой дроп непривычен, не соответствует оффу, многие игроки уже привыкли что-то выбивать из определенных мобов. Исчезнут некоторые особенности игры, например что большинство книг валится в зачарованной долине, и.т.д. (хотя и тут можно все учесть)

Всех рейд-боссов и таких боссов как queen ant, core, orfen, baium, antharas не править а оставить прежними.

Согласитесь, что плюсов больше чем минусов? :)

Прошу высказать Ваше мнение.
 

Diamond

втянувшийся

Если проставить рейдам скиллы, станет на порядок сложнее и интересней их убивать. Тестировал, давал им рут/слип/сайленс и пару атакующих спелов - рейд просто озверел )))
 

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