Форумы онлайн-игры "Сфера Миров"

Форумы посвящены онлайн-игре MUD "Сфера Миров", ее игровому миру и просто общению игроков.
Текущее время: 10-11, 13:02

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 75 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: 22-09, 14:07 
Не в сети
ньюб

Зарегистрирован: 11-08, 09:19
Сообщения: 41
Откуда: Планета Земля
Оттестил в локалке по этому тригу. Когда кастю сам - работает. Когда свиток/элик - не работает. Когда бяке даю свиток/элик - тоже тишина. Тем не менее, в кланканале меня упорно убеждают, что когда Аррид в мурашах, где личинки, выпил элик - личинки полезли... но верится слабо :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22-09, 14:07 
Не в сети
хайлевел

Зарегистрирован: 22-09, 13:20
Сообщения: 437
А можно ли как-нить организовать, чтобы проверялось когда моб произносит заклинание?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22-09, 14:16 
Не в сети
хайлевел
Аватара пользователя

Зарегистрирован: 18-07, 14:31
Сообщения: 478
Откуда: Home.Saratov.Russia
Думаю что нет. У моба есть событие на удачное применние боевого умения, а вот на произнесение каста нету.
Если очень надо и это будет использоваться, то можно попросить Кошира, что бы он попросил Элину сделать такое событие, ждать придется долго (зависит от наличия времени и желания у Элины), и тогда такое событие будет добавлено в ядро.

_________________
не суйте пальцы в разетку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22-09, 17:28 
Не в сети
ньюб

Зарегистрирован: 11-08, 09:19
Сообщения: 41
Откуда: Планета Земля
Если имелось в виду, можно ли сделать так, чтобы триггер на RTRG_CAST срабатывал только когда моб кастит, то можно. Просто делается проверка, является ли скастивший чар мобом или человеком. Если мобом - то отрабатываем триг, если человеком - то нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22-09, 23:33 
Не в сети
хайлевел

Зарегистрирован: 22-09, 13:20
Сообщения: 437
Ну там в данных триггера тип переменной CCharPlayer, что уже само собой исключает возможность каста мобом. Я просто предполагал, что значение этой переменной может быть NULL, что могло бы означать моба.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25-09, 14:37 
Не в сети
хайлевел

Зарегистрирован: 22-09, 13:20
Сообщения: 437
Еще вапрос ) Даже два )
Скажем нада мне сделать чтобы группа из одинаковых мобов появлялась по триггеру. Еси написать:
Код:
<...>
static CCharMob* Mob1;
static CCharMob* Mob2;
<..>
Mob1 = s_zone->FindMob( 100001 );
Mob2 = s_zone->FindMob( 100001 );
<...>

и срепопить двух одинаковых мобов, то Mob1 и Mob2 будут указывать на одного и того же моба, или на двух разных? Или такой подход можно применить только для уникальных (единственных) мобов?

И второй:
В каком порядке идет направление выходов в переменной комнаты CExit m_exits[6], и какое значение ана принимает, если выхода нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25-09, 15:23 
Не в сети
хайлевел
Аватара пользователя

Зарегистрирован: 18-07, 14:31
Сообщения: 478
Откуда: Home.Saratov.Russia
Мекор писал(а):
Еще вапрос ) Даже два )
Скажем нада мне сделать чтобы группа из одинаковых мобов появлялась по триггеру.


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

2. Во время загрузки до начала игрового цикла мобы не ходят.

3. Исходя из пунктов 1 и 2, на момент подготовки триггера у нас все мобы уже срепопились и находятся в известной нам зоне (комнате).

Поиск осуществляет следующим образом:
Код:
static CCharMob* mobs[MOB_COUNT];
static int mob_count = 0;

// ...

// Получаем колическтво комнат в зоне
int roomCount = s_zone->m_rooms.Count();
for (int i = 0; i < roomCount; i++) {
   CRoom* room = s_zone->m_rooms[i];
   for (CChar* cl = room->m_charList; cl; cl = cl->m_next) {
      // Вообще в зони не должно быть никого кроме мобов, сервер только стартует
      if (!cl->isMob()) continue;
      CCharMob* mob = (CCharMob*) cl;
      int protID = mob->prot()->m_id;
      // Проверка может быть сделана много раз для разных идентификаторов
      if (protID == /* нужный id моба */) {
         mobs[count++] = mob;
      }
   }
}


На выходе цикла получаем полный список мобов и их количество (о размере массива позаботьтесь заранее или используйте PArray или PSet из Tools/Arrays.h)

Если мобы репопфтся на одной клетке и она заведомо известна, то все еще проще:
1. находим комнату по id.
2. выполняем поиск мобов только в этой комнате.

_________________
не суйте пальцы в разетку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25-09, 15:27 
Не в сети
хайлевел
Аватара пользователя

Зарегистрирован: 18-07, 14:31
Сообщения: 478
Откуда: Home.Saratov.Russia
Мекор писал(а):
И второй:
В каком порядке идет направление выходов в переменной комнаты CExit m_exits[6], и какое значение ана принимает, если выхода нет?


В файле types.h определено множество констант в перечислениях, среди них есть:
Код:
// Выходы из комнаты
enum RoomExit
{
 RE_NORTH  = 0,   // Север
 RE_EAST   = 1,   // Восток
 RE_SOUTH  = 2,   // Юг
 RE_WEST   = 3,   // Запад
 RE_UP     = 4,   // Вверх
 RE_DOWN   = 5,   // Вниз
 RE_PORTAL = 10,  // Портал, телепортация, призыв или иное магическое перемещение
 RE_NONE   = 100  // Спец-значение отсутсвие направления
};


Их и используй как идентификаторы для массива CExit m_exits[6].
RE_PORTAL и RE_NONE конечно не используй =)

_________________
не суйте пальцы в разетку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25-09, 15:44 
Не в сети
хайлевел

Зарегистрирован: 22-09, 13:20
Сообщения: 437
Т.е. еси я пральна понял то m_exits[RE_NORTH] указывает на клетку, которая находится на севере? А еси выхода на север нету чему равно значение? NULL?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25-09, 23:05 
Не в сети
хайлевел
Аватара пользователя

Зарегистрирован: 18-07, 14:31
Сообщения: 478
Откуда: Home.Saratov.Russia
Мекор писал(а):
Т.е. еси я пральна понял то m_exits[RE_NORTH] указывает на клетку, которая находится на севере? А еси выхода на север нету чему равно значение? NULL?


нет, стуктура данных все равно есть:
Код:
class CRoom {
// ..
public: // Данные
   CRoom* m_room;    // Комната
   int m_flags;      // Флаги
// ..
};

// ..

// Флаги выхода
enum ExitFlag
{
 EF_SECRET        = 0x01,  // Секретный выход
 EF_DOOR_CLOSED   = 0x02,  // Дверь закрыта
 EF_DOOR_LOCKED   = 0x04,  // Дверь заперта
 EF_NOT_AVAIL     = 0x08,  // Выход временно не доступен
 EF_NO_LOCK       = 0x10   // Не запирать при репопе
};


таким образом, код, на проверку доступности выхода выглядит вот так:
Код:
if (m_exits[RE_NORTH].m_room && (m_exits[RE_NORTH].m_flags & ~EF_NOT_AVAIL)) {
   // Выход доступен
}


На практике обычно известно, что выход есть, и не возникает необходимости проверять указытель на другую комнату на NULL.

_________________
не суйте пальцы в разетку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18-10, 20:16 
Не в сети
ньюб

Зарегистрирован: 16-07, 09:20
Сообщения: 61
интересует создание моба по прототипу и загрузка его в комнату.
интересует именно динамическая, а не телепорт из комнаты в которую лоадятся мобы во время репопа.
ато пробовал делать, дык при попытке переместить моба в комнату - вылетает в ошибку(при динамическом создании)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 23-10, 14:32 
Не в сети
хайлевел
Аватара пользователя

Зарегистрирован: 18-07, 14:31
Сообщения: 478
Откуда: Home.Saratov.Russia
Отсутствовал 2 недели, был в отпуске.

На практике нигде не встерчал динамического создания нового моба.
Даже в муравейнике где плодятся личинки они телепортятся и их число не может быть больше N в определенный момент времени. То же самое с драконом-посыльным.
Я подумаю, ответ напишу чуть позже.

_________________
не суйте пальцы в разетку


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 24-10, 22:11 
Не в сети
ньюб

Зарегистрирован: 22-09, 01:42
Сообщения: 12
Попробую я ответить.

Я не проверял короткое решение, но сначала напишу его, а потом то, как работало у меня.

Короткое:
Код:
CCharMob *mob = g_db.CreateMob(MOB_MUNBER);
mob->InitNew();
g_db.FindRoom(ROOM_NUMBER)->EnterIntoRoom(mob);

Длинное и точно работающее: переопределить класс моба (заодно можно AI поменять и еще кое что), а уже потом вышеописанные действия, например:

Код:
class CShamanMob : public CCharMob
{
protected:
  CShamanMob(CMobPrototype* prot, CMopPopData* popData) : CCharMob(prot, popData) {}

public:
  static CCharMob* Factory(CMobPrototype* prot, CMopPopData* popData = 0)
  {
    return new CShamanMob(prot, popData);
  }

  _declspec(dllexport) virtual bool LookAI(FightSituation& fs)
  {
    CmdSpeak("Достали!");
    return CCharMob::LookAI(fs);
  }

  _declspec(dllexport) virtual bool StandAI(FightSituation& fs)
  {
    CmdSpeak("Все достали!");
    return CCharMob::StandAI(fs);
  }

  _declspec(dllexport) virtual bool FightAI(FightSituation& fs)
  {
    CmdSpeak("Всэх зарэжу!");
    return CCharMob::FightAI(fs);
  }

  _declspec(dllexport) virtual void AttackTarget(CChar* target)
  {
    LookToChar(target);
    CmdSpeak("Замочу!!");
    CCharMob::AttackTarget(target);
  }
  public:
};

extern "C" void _declspec(dllexport) LoadTriggers()
{
  g_trgMng.LoadMobFactory(MOB_NUMBER, CShamanMob::Factory);
}

Как ни странно, переопределенные AI работают только у мобов созданных вручную.
У созданных системой репопа переопределенный AI не работает.
Очевидно ,здесь недоработки, наткнувшись на которые я забил на попытки написание своей зоны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 24-10, 23:02 
Не в сети
хайлевел

Зарегистрирован: 22-09, 13:20
Сообщения: 437
По поводу изменения AI мобов. В частности добавление каких-то оригинальных умений (другое мне как-то не было нужды делать :))

Код:
class CBasiliskMob : public CNecromantMob
{
 protected:

   CBasiliskMob( CMobPrototype* prot, CMopPopData* popData ) :
     CNecromantMob( prot, popData )
   {}

 public:
   static CCharMob* Factory( CMobPrototype* prot, CMopPopData* popData ) { return new CBasiliskMob( prot, popData ); }
 
 public: // AI

   // Стоячий AI
   bool StandAI( FightSituation& fs );

   // Боевой AI
   bool FightAI( FightSituation& fs );

   // Каменное проклятье
   bool StoneCurseCast( FightSituation& fs );

 // Для порождения через фабрику
 friend class CDB;
};

//И дальше собсна определение функций
// Стоячий AI
bool CBasiliskMob::StandAI( FightSituation& fs )
{
 if( rand("CNecromantMob::StandAI")%2)
   if( StoneCurseCast( fs ) )
    return true;
 
 return CNecromantMob::StandAI( fs );
}


// Боевой AI
bool CBasiliskMob::FightAI( FightSituation& fs )
{
 if( rand("CNecromantMob::FightAI")%2)
   if( StoneCurseCast( fs ) )
    return true;
 
 return CNecromantMob::FightAI( fs );
}

Ну и патом загрузка фабрики моба. И все нормально работает при репопе. И вот с динамическим созданием мобов не сталкивался, имх можно легко обойтись и без этого.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 24-10, 23:21 
Не в сети
ньюб

Зарегистрирован: 22-09, 01:42
Сообщения: 12
Мекор писал(а):
По поводу изменения AI мобов. В частности добавление каких-то оригинальных умений (другое мне как-то не было нужды делать :))
[skip]
Ну и патом загрузка фабрики моба. И все нормально работает при репопе. И вот с динамическим созданием мобов не сталкивался, имх можно легко обойтись и без этого.


Что то тоже при репопе не работает, можешь рабочий пример выслать?
serb[круглыя собачка]mail.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 75 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by Forumenko © 2006–2014
Русская поддержка phpBB