Coder Social home page Coder Social logo

dreamland-mud / dreamland_code Goto Github PK

View Code? Open in Web Editor NEW
42.0 5.0 16.0 13.06 MB

DreamLand MUD: server code

License: GNU General Public License v3.0

Makefile 1.17% Perl 0.13% M4 0.10% C++ 96.34% C 2.22% Shell 0.02% Python 0.03%
mud mud-server plugin-system xml websockets dreamland-mud mud-engine

dreamland_code's Introduction

DreamLand MUD, руководство разработчика

Pусский | English


Stand With Ukraine DreamLand MUD version License Build Status Discord chat

Как собирать и запускать:

  • Из-под Ubuntu 18.04, 20.04 (реальная или виртуальная машина): пользуйтесь инструкцией ниже.
  • Из-под Windows 10: следуя этой инструкции для Windows Subsystem for Linux и редактора VS Code
  • Из-под окружения Docker: собрать готовый к использованию Docker контейнер, как описано в Readme к проекту dreamland_docker.
  • Из-под онлайн сред разработки в браузере: Goorm Online IDE или же https://gitpod.io.

Содержание

Эта инструкция по сборке была проверена на Ubuntu 18.04. Дримленд гарантированно собирается под gcc 9.3 (или другой версией с поддержкой C++17).

Если вам удалось собрать под чем-то еще, пожалуйста, обновите это руководство.

Установите компилятор и сопутствующие программы, а также библиотеки, от которых зависит код дримленд:

sudo apt-get update
sudo apt-get install -y git g++ gcc make automake libtool bison flex gdb telnet db-util libfl-dev bzip2
sudo apt-get install -y libcrypto++-dev libjsoncpp-dev libdb5.3 libdb5.3-dev libdb5.3++ libdb5.3++-dev zlib1g zlib1g-dev libssl-dev
sudo apt-get install -y locales && locale-gen ru_RU.KOI8-R && update-locale

На Ubuntu 18.04, возможно, понадобится установить более свежую версию компилятора и сделать ее версией по умолчанию:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-9 g++-9

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9
sudo update-alternatives --config gcc

Склонируйте к себе либо главный репозиторий, либо свою собственную копию (fork) - о создании fork читайте ниже. Предположим, что исходники будут лежать в /home/dreamland/dreamland_code, тогда:

mkdir /home/dreamland && cd /home/dreamland
git clone https://github.com/dreamland-mud/dreamland_code.git

В каталоге с исходниками проинициализируйте конфигурационный скрипт и сборочные файлы, запустив

cd dreamland_code
make -f Makefile.git

В дальнейшем эту команду запускать не нужно, разве что если изменится configure.ac. Приступаем к конфигурации и сборке. Для удобства все объектники будут в отдельном каталоге, чтобы не засорять исходники лишними файлами. Инсталяция дримленд также будет в отдельном каталоге runtime, где на этапе конфигурации будет создано дерево каталогов и скопированы нужные файлы. В этом руководстве предполагается, что объектники лежат в /home/dreamland/objs, а инсталляция - в /home/dreamland/runtime. Измените пути в примерах согласно своей конфигурации.

mkdir /home/dreamland/objs && cd /home/dreamland/objs
/home/dreamland/dreamland_code/configure --prefix=/home/dreamland/runtime

Для сборки и установки запустите команду:

make && make install

Если у вас несколько процессоров, будет выгодно распараллелить сборку, указав количество параллельных потоков, например:

make -j 4 && make install

Склонируйте репозиторий dreamland_world, который содержит все конфигурационные файлы и некоторые зоны, а также репу dreamland_fenia_public с полезными скриптами на фене.

cd /home/dreamland/runtime
git clone https://github.com/dreamland-mud/dreamland_world.git share/DL
git clone https://github.com/dreamland-mud/dreamland_fenia_public.git share/DL/fenia/public

Вот и всё, мир готов к запуску.

cd  /home/dreamland/runtime
./bin/dreamland etc/dreamland.xml &

Логи попадают в подкаталог var/log в каталоге runtime. Формат файла логов задается в etc/dreamland.xml, по умолчанию имя файла - это дата и время запуска.

<logPattern>var/log/%Y%m%d-%H%M%S.log</logPattern>

Удалив эту строку из dreamland.xml, можно добиться вывода логов в stdout.

Изначально в мире есть только один персонаж, наделенный всеми полномочиями: Kadm, пароль KadmKadm. Остальных персонажей можно создать по мере необходимости. Мир доступен локально на нескольких портах:

  • 9001 - "задняя дверь" для быстрого доступа, минуя архивариуса. При входе через этот порт укажите в одной строке кодировку, логин и пароль, например: 0 Kadm KadmKadm.
  • 9000 - обычный вход, тут же можно создать нового персонажа.
  • 1234 - порт web-socket. Можете скачать клиент mudjs, установить его согласно инструкции и играть из браузера.

Например: telnet localhost 9000 или #connect localhost 9000 в муд-клиенте. Вместо localhost может понадобиться указать IP-адрес виртуальной машины, на которой установлен и запущен муд-сервер.


Создайте свою собственную копию (fork) репозитория, нажав на кнопку Fork вверху страницы: fork example

Ваша копия будет иметь путь https://github.com/yourname/dreamland_code: fork example

Cклонируйте исходники к себе на машину, используя URL из Clone or download: clone example например

git clone https://github.com/yourname/dreamland_code

Теперь вы можете вносить какие угодно изменения в свой fork, никак не влияя на основной репозиторий. Когда какая-то функциональность будет готова к вливанию обратно в основной репозиторий, нужно будет создать запрос (pull request), об этом ниже.

Кратко опишем команды, которые понадобятся для внесения изменений в свой fork. Все это стандартные команды git, о которых можно прочитать во многих руководствах.

  1. Проверить, какие файлы изменились или добавились в локальной версии:
git status

Просмотреть изменения подробно:

git diff
  1. Добавить все измененные файлы в будущий commit:
git add .

Добавить файлы выборочно:

git add path/to/file
  1. Создать commit и описать изменение. Описания рекомендуется делать понятные для тех, кто будет читать их через полгода.
git commit -m "Guys, I did a thing!"

Если нужно запустить встроенный редактор для создания описания (commit log):

git commit
  1. Выпихнуть изменения на github:
git push

Настало время поделиться со всеми тем, над чем вы корпели так долго. На странице вашего репозитория будет описано, на сколько коммитов вы опережаете родительский репозиторий, и появится кнопка для создания запроса New pull request: pull example

Нажав на нее, можно будет просмотреть отличия между двумя ветками. Если между вашей и родительской версией нету конфликтов, вы увидите "Able to merge". Можно создавать pull request, нажав на кнопку Create: pull example

Периодически приходится затаскивать изменения из главного репозитория в свой, чтобы всегда работать с последней версией. Один из способов это сделать такой:

В самом начале, как только склонировали репозиторий, добавьте себе еще один remote под названием upstream, который указывает на главный репозиторий:

git remote add upstream https://github.com/dreamland-mud/dreamland_code.git 

Теперь каждый раз, когда хочется обновиться из главного репозитория, можно легко стянуть изменения из главного и наложить их на свою ветку master:

git fetch upstream
git checkout master
git merge upstream/master
git push

Несколько замечаний, которые могут облегчить жизнь при разработке.

Если вы внесли изменения в каталог src:

  • если поменялась только реализация (файлы с расширением .cpp), достаточно пересобрать только каталог src:
cd /home/dreamland/objs/src
make -j 4 && make install
  • если ваше изменение также повлияет и на плагины (например, поменялся заголовочный файл) - то нужно пересобрать вообще всё.
cd /home/dreamland/objs
make -j 4 && make install

Затем надо перезапустить dreamland (см. выше про запуск).

Пересоберите все измененные плагины:

cd /home/dreamland/objs/plug-ins/yourplugin
make -j 4 && make install

Перегрузите все измененные плагины изнутри мира, набрав:

plug reload changed

dreamland_code's People

Contributors

bald-bald avatar dreamland-machine avatar filths avatar fiorine avatar fungoter avatar georgy-garnov avatar kerrad avatar niml0th avatar pavelmoskalev avatar ruffinakoza avatar tahidrow avatar targorn avatar vnd avatar zaleshanin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

dreamland_code's Issues

Crash: double affect_remove called for charm person affect

(gdb) bt
#0  0x00000000000000f1 in ?? ()
#1  0x00007f0b77e5ee20 in affect_remove (ch=ch@entry=0x559c63bc93d0, paf=<optimized out>, paf@entry=0x559c59103330) at ../../../dreamland_code/plug-ins/loadsave/affects.cpp:448
#2  0x00007f0b74904cb4 in char_update_affects (ch=ch@entry=0x559c63bc93d0) at ../../../dreamland_code/plug-ins/updates/update.cpp:1438
#3  0x00007f0b74909575 in char_update () at ../../../dreamland_code/plug-ins/updates/update.cpp:420
#4  0x00007f0b7490a5c3 in update_handler () at ../../../dreamland_code/plug-ins/updates/update.cpp:1023
#5  0x00007f0b7491e726 in virtual thunk to AnatoliaUpdate::run() () from ./libexec/plugins/libupdates.so
#6  0x00007f0b7aeda778 in SchedulerList::tick (this=this@entry=0x559c592f8f38) at ../../../dreamland_code/src/scheduler/../lang/pointer.h:186
#7  0x00007f0b7aedacbd in SchedulerPriorityMap::tick (this=0x559c58a262c0) at ../../../dreamland_code/src/scheduler/schedulerprioritymap.cpp:18
#8  0x00007f0b7aeda39a in Scheduler::tick (this=0x559c527f39c0) at ../../../dreamland_code/src/scheduler/scheduler.cpp:53
#9  0x00007f0b7b1cb4fe in DreamLand::run (this=0x7fffd6a99730) at ../../dreamland_code/src/lang/pointer.h:186
#10 0x0000559c50c201f6 in main (argc=2, argv=0x7fffd6a99bf8) at ../../dreamland_code/src/main.cpp:37

(gdb) p ch->affected
$2 = {<std::__cxx11::list<Affect*, std::allocator<Affect*> >> = std::__cxx11::list = {[0] = 0x559c58dbcd50, [1] = 0x559c58859020, [2] = 0x559c63bc9b20, [3] = 0x559c63bc9a30}, <No data fields>}

(gdb) p ((Affect *)(0x559c58dbcd50))->type
$4 = {<SkillReference> = {<GlobalReference<SkillManager, Skill>> = {<GlobalReferenceBase> = {_vptr.GlobalReferenceBase = 0x7f0b7b4a79b8 <vtable for XMLSkillReference+152>, name = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "inspire",  static emptyString = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = ""...

 p ((Affect *)(0x559c59103330))->type
$9 = warning: can't find linker symbol for virtual table for `XMLSkillReference' value
warning:   found `construction vtable for GlobalReference<SkillManager, Skill>-in-XMLSkillReference' instead
{<SkillReference> = {<GlobalReference<SkillManager, Skill>> = {<GlobalReferenceBase> = {_vptr.GlobalReferenceBase = 0x7f0b7b1249b8 <vtable for GlobalReferenceBase+16>, 
        name = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "charm person", 

This trace shows that the mob had 4 affects left: 2 inspire affects, prot evil and sanctuary, and the one being removed in this update call was "charm person" affect. Its removal handler called follower_stop() which in turn called affect_strip(gsn_charm_person) thus calling double deallocate for the same pointer.

Mudconnector

Добрый день!

Предельно извиняюсь, что пишу сюда, но увидел Руффину в администраторах мадконнектора. Надеюсь, не ошибся. Там проблема: я не могу войти, так как мне пишется, что "Вы превысили максимально допустимое количество попыток входа. Теперь, кроме имени пользователя и пароля, вы должны ввести код подтверждения, показанный на картинке ниже.", но никаких картинок нет. Также не могу зарегистрировать нового пользователя и связаться с KadVar, так как регистрация закрыта, для неё надо писать ему на почту, которая у него в профиле, а профили не видны незарегистрированным пользователям. Помогите, пожалуйста, разобраться. Мой ник на форуме: Харч.

Telegram: messages not escaped properly

  • MUD tags such as {hl are not stripped, i.e.
    {hlhttps://google.com{x should become https://google.com, instead it becomes lhttps://google.com

  • Single asterix and underscore interfere with Markdown syntax, causing error 400 "Bad Request: can't parse entities: Can't find end of the entity starting at byte offset ...".

This doesn't work: https://github.com/dreamland-mud/dreamland_code
This works fine: https://github.com/dreamland-mud/dreamland\\_code

Crash: lightning shield damage accesses invalid pointer

In lightning shield entry method, paf->type and paf->level are referenced after memory where paf points to was already de-allocated inside Room::affectRemove.

Backtrace:

#0  0x00007f64478bee97 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007f64478c0801 in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007f6447f15957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f6447f1bab6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f6447f1baf1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007f6447f1c8bf in __cxa_pure_virtual () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007f643cb33799 in GlobalReferenceBase::operator int const& (this=0x5647fa3e4fe8) at ../../../dreamland_code/src/gref/globalreference.h:16
#7  AffectHandlerTemplate<dummyAffect_LightningShield_TypeName>::entry (this=<optimized out>, room=0x5647f60966f0, ch=0x5647fb5a33c0, paf=0x5647fa3e4fc0)
    at ../../../dreamland_code/plug-ins/groups/class_warlock.cpp:413
#8  0x00007f6443608757 in rafprog_entry (ch=0x5647fb5a33c0, room=0x5647f60966f0) at ../../../dreamland_code/plug-ins/movement/movement.cpp:149
#9  Movement::callProgsFinish (this=0x7ffd0424a260, wch=0x5647fb5a33c0) at ../../../dreamland_code/plug-ins/movement/movement.cpp:265
#10 0x00007f6443603cbb in Movement::moveRecursive (this=0x7ffd0424a260) at ../../../dreamland_code/plug-ins/movement/movement.cpp:73
#11 0x00007f6443603a11 in Movement::move (this=0x7ffd0424a260) at ../../../dreamland_code/plug-ins/movement/movement.cpp:46
#12 0x00007f64436038d1 in move_char (ch=0x5647fb5a33c0, door=door@entry=3, argument=argument@entry=0x0) at ../../../dreamland_code/plug-ins/movement/move_utils.cpp:35
#13 0x00007f6441293ff8 in BasicMobileBehavior::move (this=this@entry=0x5647fb5a3be0, d=d@entry=3, pexit=pexit@entry=0x5647f5c53898, whosHunted=whosHunted@entry=0x7f64180be610)
    at ../../../dreamland_code/plug-ins/ai/tracking.cpp:123
#14 0x00007f644129423e in BasicMobileBehavior::trackLastFought (this=0x5647fb5a3be0, wch=0x7f64180be610) at ../../../dreamland_code/plug-ins/ai/tracking.cpp:113
#15 0x00007f644214282a in track_update () at ../../../dreamland_code/plug-ins/updates/update.cpp:1253

Here's how paf looks like:

(gdb) p *paf
...
 type = warning: can't find linker symbol for virtual table for `XMLSkillReference' value
warning:   found `construction vtable for GlobalReference<SkillManager, Skill>-in-XMLSkillReference' instead
{
    <SkillReference> = {
      <GlobalReference<SkillManager, Skill>> = {
        <GlobalReferenceBase> = {
          _vptr.GlobalReferenceBase = 0x7f644853b958 <vtable for GlobalReferenceBase+16>, 
          name = {
            <std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "\000\000\000\000\000\000\000\000g shield", 
            members of DLString: 
            static emptyString = <same as static member of an already seen type>
          }, 
          index = 104
        }, 
        members of GlobalReference<SkillManager, Skill>: 
        _vptr.GlobalReference = 0x7f64488a7858 <construction vtable for GlobalReference<SkillManager, Skill>-in-XMLSkillReference+24>
      }, <No data fields>}, 
    <XMLGlobalReference> = {
      <XMLVariable> = {
        <DLObject> = {
          _vptr.DLObject = 0x10, 
          linkCount = 30
        }, 
        members of XMLVariable: 
        _vptr.XMLVariable = 0x7f64488a7758 <construction vtable for XMLVariable-in-XMLSkillReference+24>
      }, <No data fields>}, <No data fields>}, 

Поддержка IDE и сборка под Windows

Исторически собирался под mingw компилятор. Нужно попытаться восстановить хотя бы старую сборку.

По поводу IDE - сейчас он как-то работает с эклипсом для С++, с включенным плагином CDT. Возможно, есть лучшие варианты IDE для проектов с autotools.

Crash: hierophant speech prog for empty skill group

(gdb) bt
#0  0x00007feae9277e97 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007feae9279801 in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007feae98ce957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007feae98d4ab6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007feae98d4af1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007feae98d4d24 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007feae98d0855 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007feada776822 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::at (__n=0, this=0x7fff8eebd6c0)
    at /usr/include/c++/7/bits/basic_string.h:1098
#8  Hierophant::tell (this=0x557e967cf1d0, victim=<optimized out>, speech=<optimized out>) at ../../../dreamland_code/plug-ins/misc_behaviors/hierophant.cpp:123
#9  0x00007feae0c0b523 in mprog_speech (msg=0x557e92afb7d0 "\336\324\317 \325\315\305\305\324 \315\317\312 \320\305\324\317\315\305", <incomplete sequence \303>, 
    talker=0x7fead0096d80, rch=0x557e967ce670) at ../../../dreamland_code/plug-ins/communication/channels.cpp:187
#10 SpeechChannel::triggers (this=<optimized out>, ch=0x7fead0096d80, msg=...) at ../../../dreamland_code/plug-ins/communication/channels.cpp:211
#11 0x00007feae0c01ce1 in GlobalChannel::run (this=0x557e8eaa9c10, ch=0x7fead0096d80, arg=...) at ../../../dreamland_code/plug-ins/communication/globalchannel.cpp:124
#12 0x00007feae677027b in InterpretHandler::handle (this=<optimized out>, d=<optimized out>, arg=<optimized out>)
    at ../../../dreamland_code/plug-ins/iomanager/interprethandler.cpp:174

Buggy code:

    for (GroupsMap::iterator i = groups.begin( ); i != groups.end( ); i++) {
        SkillGroup *group = skillGroupManager->find( i->first );
        DLString g = group->getShortDescr( );

        buf << "{G" << g.at( 0 ) << "{g" << g.substr( 1 ) << "{g:{x" << endl;
...

Finding out which pet was it, to recreate locally: pet and other helpful local variables were optimized out, so have to scroll through all people in the room to reach the pet:

(gdb) p ch->in_room->people->next_in_room->next_in_room->next_in_room->next_in_room->next_in_room->name
$11 = {<DLString> = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "legend beer lvivske \320\311\327\317 \314\330\327\317\327\323\313\317\305 \314\305\307\305\316\304\301", static emptyString = {<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >> = "", 

After adding debugging output, the failing skill group appeared to be weaponsmaster. It never intended to contain spells before and lacked shortDescr field.

Too many open fies

[May 14 20:32:44]:E: Error while saving .xml: Unable to open output stream for './var/db/player/XCg0XUP'
[May 14 20:32:52]:S: (Too many open files) DLFileOp::open ....

Crash: charmed mob checked as stealquest participant

(gdb) bt
#0  0x00007fdec0000650 in ?? ()
#1  0x00007fded2d5fb1c in Character::canCarryNumber (this=this@entry=0x5556c89e84e0) at ../../../../dreamland_code/plug-ins/anatolia/core/character.cpp:21
#2  0x00007fdec9ded644 in StealQuest::checkMobileClient (this=<optimized out>, pch=<optimized out>, mob=0x5556c89e84e0)
    at ../../../../dreamland_code/plug-ins/quest/stealquest/stealquest.cpp:356
#3  0x00007fdec9ded462 in StealQuest::checkItem (this=0x5556bc4c9940, pch=0x7fdeb4002810, obj=0x5556c89e8190)
    at ../../../../dreamland_code/plug-ins/quest/stealquest/stealquest.cpp:307
#4  0x00007fded0e8b6ae in ItemQuestModel::getRandomItem (this=this@entry=0x5556bc4c9940, pch=pch@entry=0x7fdeb4002810)
    at ../../../../dreamland_code/plug-ins/quest/core/questmodels.cpp:360
#5  0x00007fdec9defb9f in StealQuest::create (this=0x5556bc4c9940, pch=0x7fdeb4002810, questman=0x5556ca3724a0)
    at ../../../../dreamland_code/plug-ins/quest/stealquest/stealquest.cpp:50
#6  0x00007fdec9deacec in QuestRegistrator<StealQuest>::createQuest (this=<optimized out>, pch=0x7fdeb4002810, questor=0x5556ca3724a0)
    at ../../../../dreamland_code/src/lang/pointer.h:186
#7  0x00007fdecac05710 in Questor::doRequest (this=0x5556c10df348, client=client@entry=0x7fdeb4002810, arg=...) at ../../../../dreamland_code/src/lang/pointer.h:192
#8  0x00007fdecac102b4 in CQuest::run (this=<optimized out>, ch=<optimized out>, constArguments=...) at ../../../../dreamland_code/src/lang/pointer.h:186
#9  0x00007fded510a320 in InterpretHandler::handle (this=<optimized out>, d=0x5556c070df30, arg=<optimized out>) at ../../../dreamland_code/src/lang/pointer.h:186

(gdb) p victim->pIndexData->vnum
$11 = 11881

(gdb) p obj->pIndexData->vnum
$15 = 11805

(gdb) p victim->affected_by.value
$22 = 557696
(sanctuary infrared sneak flying; victim->affected only has sanctuary)

(gdb) p victim->master
$25 = (Character *) 0x7fdec011b7d0 // low-level player

Get rid of "player memory" abstraction

No need to keep only a subset of player info in memory anymore, can keep all profile fields. PCharacterManager will hold a map of offline and online PCharacters, classes such as PCMemoryInterface and PCharacterMemory will become obsolete.
As additional bonus, consider keeping all player items (inv, eq) in memory, introducing a concept of "offline object".

Fenia api: some fields are duplicated on the web

For 'Structures API' on https://dreamland.rocks/feniaapi.html, the table for read/write fields looks like this:

bitvector | какие биты добавятся полю, указанному в where
bitvector | какие биты добавятся полю, указанному в where
duration | длительность, -1 для вечных аффектов
duration | длительность, -1 для вечных аффектов

For 'Character API', read-write fields are listed first as "ro", then as "rw".

Crash: invalid virtual table when -Og option is used

#0  0x00007f9057ab36e3 in UndefinedOneHit::damEffectSlice (
    this=this@entry=0x7ffc2aa42e3e)
    at ../../../dreamland_code/plug-ins/fight/onehit_undef.cpp:1355
#1  0x00007f9057ab45a9 in UndefinedOneHit::postDamageEffects (
    this=0x7ffc2aa42e3e)
    at ../../../dreamland_code/plug-ins/fight/onehit_undef.cpp:173
#2  0x00007f9057aaba9e in OneHit::hit (this=0x7ffc2aa52e40)
    at ../../../dreamland_code/plug-ins/fight/onehit.cpp:78
#3  0x00007f9057a8eaa0 in one_hit_nocatch (ch=<optimized out>, 
    victim=victim@entry=0x7f90440025f0, secondary=secondary@entry=false)
    at ../../../dreamland_code/plug-ins/fight/fight.cpp:339
#4  0x00007f9057a8efd6 in one_hit (ch=<optimized out>, 
    victim=victim@entry=0x7f90440025f0, secondary=secondary@entry=false)
    at ../../../dreamland_code/plug-ins/fight/fight.cpp:345

*this at frame 0:

$2 = {
  <WeaponOneHit> = {
    <OneHit> = {
      <Damage> = <invalid address>, 
      members of OneHit: 
      _vptr.OneHit = 0x0, 
      skill = 0, 
      thac0 = 0, 
      victim_ac = 0, 
      orig_dam = 0
    }, 
    members of WeaponOneHit: 
    wield = 0x0, 
    secondary = false, 
    weapon_sn = 0, 
    weaponSkill = 0x0, 
    attack = 0
  }, <No data fields>}
(gdb) 

*this at frame 1:

3 = {
  <WeaponOneHit> = {
    <OneHit> = {
      <Damage> = <invalid address>, 
      members of OneHit: 
      _vptr.OneHit = 0x0, 
      skill = 0, 
      thac0 = 0, 
      victim_ac = 0, 
      orig_dam = 0
    }, 
    members of WeaponOneHit: 
    wield = 0x0, 
    secondary = false, 
    weapon_sn = 0, 
    weaponSkill = 0x0, 
    attack = 0
  }, <No data fields>}
(gdb) 

*this at frame 3:

$4 = {
  <Damage> = {
    _vptr.Damage = 0x7f9057ccfa38 <vtable for UndefinedOneHit+232>, 
    ch = 0x5629daa73490, 
    victim = 0x7f90440025f0, 
    killer = 0x5629daa73490, 
    dam_type = 1, 
    dam = 71, 
    immune = false, 
    dam_flag = 1
  }, 
  members of OneHit: 
  _vptr.OneHit = 0x7f9057ccf968 <vtable for UndefinedOneHit+24>, 
  skill = 120, 
  thac0 = -69, 
  victim_ac = -54, 
  orig_dam = 133
}

The error seems to be gone with -O2 but still happen with -O2.

CRASH: Implicit copy constructor results in uninitialized variable (gcc9)

#0  0x00007f7f6a048cc5 in DoorFunc::operator() (exit=0x2071b90, room=0x208a210, this=0x7fffd7220748) at ../../../DL/plug-ins/traverse/wanderer.cpp:74
74	        return behavior->canWander( room, exit );
(gdb) bt
#0  0x00007f7f6a048cc5 in DoorFunc::operator() (exit=0x2071b90, room=0x208a210, this=0x7fffd7220748) at ../../../DL/plug-ins/traverse/wanderer.cpp:74
#1  RoomRoadsIterator<DoorFunc, ExtraExitFunc, PortalFunc>::operator()<BroadTraverse<RoomTraverseTraits, RoomRoadsIterator<DoorFunc, ExtraExitFunc, PortalFunc>, PathWithDepthComplete>::AddHook> (act=..., room=0x208a210, this=0x7fffd7220690) at ../../../DL/plug-ins/traverse/roomtraverse.h:129
#2  BroadTraverse<RoomTraverseTraits, RoomRoadsIterator<DoorFunc, ExtraExitFunc, PortalFunc>, PathWithDepthComplete>::operator() (top=<optimized out>, start=0x7fffd7220760, 
    this=0x7fffd7220690) at ../../../DL/plug-ins/traverse/traverse.h:67
#3  room_traverse<RoomRoadsIterator<DoorFunc, ExtraExitFunc, PortalFunc>, PathWithDepthComplete> (src=<optimized out>, iter=..., complete=..., limit=limit@entry=5000)
    at ../../../DL/plug-ins/traverse/roomtraverse.h:189
#4  0x00007f7f6a048084 in Wanderer::pathWithDepth (this=this@entry=0x4c442a0, start_room=<optimized out>, depth=depth@entry=20, limit=limit@entry=5000)
    at ../../../DL/plug-ins/traverse/wanderer.cpp:182
(gdb) p *behavior
$1 = {<MobileBehavior> = <invalid address>, path = std::__cxx11::list<error reading variable: Cannot access memory at address 0x38b94c0dfff00b>}

DoorFunc::behavior field was not initialized and contained garbage. Issue discovered when porting to gcc 9.

BUG: Unparsed node <DLString::toInteger> on player load

[Nov 23 15:01:37]:N: [wiznet:sites] [email protected] has connected.
[Nov 23 15:01:37]:W: Unparsed node <DLString::toInteger> <
[Nov 23 15:01:37]:N: Loading Gosha.
[Nov 23 15:01:37]:N: Gosha has race troll and level 100

In player profile, what used to look like:

 <node name="edstate" type="XMLAttributeEditorState">
       <regs>
         <reg name="0">&apos;...

after saving took the form:

        <reg name="^@">&apos;...

Test checkboxes in markdown

Solar System Exploration, 1950s – 1960s

  • Venus
  • Earth (Orbit/Moon)
  • Mars
  • Jupiter
  • Mercury
  • Saturn
  • Uranus
  • Neptune
  • Comet Haley

Fenia core grows too big, lock table out of entries

Two issues combined here.

  1. FeniaSpellContext objects were never destroyed. Each casted spell resulted in new object in the fenia db. Number of objects in the fenia database grew up to 180k pretty fast. This leak was fixed in 66f7c51
  2. Initial number of BDB lock entries is too small to load 180k records, resulting in this error during DL startup:
[Mar 04 02:31:58]:N: Loading DbContext: fenia:objects...
BDB2055 Lock table is out of available lock entries
[Mar 04 02:32:06]:E: Dbc::get: Cannot allocate memory:
[Mar 04 02:32:06]:N: Total 175695 records loaded

Lock table size can be increased by calling DbEnv::set_lk_max_locks method, see this discussion for reference.

CRASH: in local version after about half an hour of work

Can be recreated with dreamland_world version b3e10c192ad2cace6f84df13e18551c882b80fde , dreamland_code version e99591ebbe14ab308f3a248a6dfdb33bc97812e4, all built according to instructions for local dev.

# ulimit -c unlimited
# ./bin/dreamland 
...
[Jan 19 09:40:01]:N: [wiznet:ticks] AREA & ROOM TICK!
[Jan 19 09:40:10]:N: [wiznet:ticks] CHAR TICK!
[Jan 19 09:41:10]:N: [wiznet:ticks] CHAR TICK!
[Jan 19 09:41:50]:N: [wiznet:ticks] AREA & ROOM TICK!
Segmentation fault (core dumped)
# gdb ./bin/dreamland core*
#0  create_item_for_mob (pReset=pReset@entry=0x1092e10, pObjIndex=0x0, mob=mob@entry=0x1178540, verbose=verbose@entry=true)
    at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:238
238	    if (pObjIndex->limit != -1 && pObjIndex->count >= pObjIndex->limit) 
(gdb) bt
#0  create_item_for_mob (pReset=pReset@entry=0x1092e10, pObjIndex=0x0, mob=mob@entry=0x1178540, verbose=verbose@entry=true)
    at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:238
#1  0x00007fefb66c7252 in reset_one_mob (mob=0x1178540) at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:349
#2  0x00007fefb66c75b3 in reset_room_mobs (pRoom=pRoom@entry=0x1093070) at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:410
#3  0x00007fefb66c791f in reset_room (pRoom=0x1093070, flags=flags@entry=0) at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:485
#4  0x00007fefb66c7ef9 in reset_area (pArea=0x120f170, flags=flags@entry=0) at ../../../dreamland_code/plug-ins/updates/update_areas.cpp:677

A null pObjIndex is passed to create_item_for_mob function. Likely cause: in the limited set of areas shipped for local dev, an item vnum is missing but is configured to be reset somewhere. Let's see what are room, obj and mob vnums:

gdb) set print pretty
(gdb) set print static no
(gdb) p mob->pIndexData->vnum
$5 = 5311
gdb) p mob->in_room->vnum
$6 = 5317
(gdb) p pReset->arg1
$8 = 601

Item 601 belongs to ofcol2.are which is not included in area.local package. To fix this crash, need to check for null obj index before calling create_item_for_mob function.

Travis improvements

  • use sendemail package to submit failure notifications to custom address, as built-in functionality doesn't work

  • configure PVS build and run it when TRAVIS_EVENT_TYPE=="cron"
    https://www.viva64.com/en/b/0661/

  • submit PVS report either by email or by uploading to gh-pages

cadmus character showing lots of russian text

Hiya,

I am testing out the docker image for local development, and when I log in cadmus, which is supposed to be an english character, I still get lots of russian text. Am I confused about how this works? If there's no way to turn off russian text, is there a way to make an english only version? I ask because I'm considering using dreamland for a base for a mud I'm working on, but I know nothing about russian so having russian text to translate would be a pain.

Thanks!

-Michael.

Deadlock in Berkley DB

An attempt to sync Fenia DB coincided with periodic archive script that runs db_checkpoint -1 && db_archive -d && db_dump fenia |bzip2 > ../fenia.dump.tbz2. Resulting stack trace:

#0  0x00007f45bb2359f3 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x00007f45bba008ab in __db_pthread_mutex_lock () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#2  0x00007f45bbaa858f in __lock_get_internal () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#3  0x00007f45bbaa8ef6 in __lock_get () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#4  0x00007f45bbad3c7a in __db_lget () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#5  0x00007f45bba1d01c in __bam_search () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#6  0x00007f45bba084db in ?? () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#7  0x00007f45bba0cbeb in ?? () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#8  0x00007f45bbac12b1 in __dbc_iput () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#9  0x00007f45bbabc460 in __db_put () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#10 0x00007f45bbad1f9b in __db_put_pp () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#11 0x00007f45bb9f386f in Db::put(DbTxn*, Dbt*, Dbt*, unsigned int) () from /usr/lib/x86_64-linux-gnu/libdb_cxx-5.3.so
#12 0x00007f45bc7df762 in DbContext::put (this=this@entry=0x557f6ba58eb8, k=<optimized out>, k@entry=4179398893, dat=...) at ../../../dreamland_code/src/io/txncontext.cpp:383
#13 0x00007f45bc798112 in Scripting::Object::Manager::put (this=this@entry=0x557f6ba58eb8, id=4179398893, 
    s="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<object type=\"ObjectWrapper\">\n  <guts>\n    <temperature>\n      <backref regtype=\"object\">-115568403</backref>\n      <target regtype=\"number\">20</target>\n    </te"...) at ../../../dreamland_code/src/fenia/object.cpp:221
#14 0x00007f45bc7997ea in Scripting::Object::save (this=0x557f70c4de40) at ../../../dreamland_code/src/fenia/object.cpp:124
#15 0x00007f45bc799cf9 in Scripting::Object::Manager::syncPut (this=this@entry=0x557f6ba58eb8, finishAt=finishAt@entry=0x7ffeab07afd0)
    at ../../../dreamland_code/src/fenia/object.cpp:245
#16 0x00007f45bc799db3 in Scripting::Object::Manager::sync (this=0x557f6ba58eb8, tickEnd=<optimized out>) at ../../../dreamland_code/src/fenia/object.cpp:304
#17 0x00007f45bcae924a in DreamLand::pulseEnd (this=this@entry=0x7ffeab07b100) at ../../dreamland_code/src/dreamland.cpp:200
#18 0x00007f45bcae9744 in DreamLand::run (this=0x7ffeab07b100) at ../../dreamland_code/src/dreamland.cpp:169
#19 0x0000557f69ca8f84 in main (argc=<optimized out>, argv=0x7ffeab07b5d8) at ../../dreamland_code/src/main.cpp:38

Lock wasn't released even after db_dump process was killed externally.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.