Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Патчи на рассмотрении (http://mangos.ytdb.ru/forumdisplay.php?f=49)
-   -   [patch]real usage of MapDifficulty.dbc (http://mangos.ytdb.ru/showthread.php?t=3855)

rsa 07.03.2011 15:11

[patch]real usage of MapDifficulty.dbc
 
Что-то тут совсем скучно стало. Попробую повеселить
собственно сабж.
внимание! патч не полностью совместим с чистым ядром, но наложить вручную можно. при наличии интереса Team сделаю версию для clean core.
https://github.com/rsa/mangos/commit...739a20c957e2dd
оно же диффом
https://github.com/rsa/mangos/commit...0c957e2dd.diff
Что делает патч? Да в общем-то почти и ничего. Просто вместо использования специально подготавливаемого обрезка таблицы из темы, мы используем всю таблицу (а в ней есть некоторые данные, нужные серверу, так в частности верные сообщения при запрете входа в инстанс, а также флаг наличия кондиций для входа)
ну и некоторые эти данные уже используются (хотя их использование в HandleAreaTriggerOpcode() с моей точки зрения грязный хак, но так уж сделано в оригинале).
использование остальных данных уже требует custom патчей на календарь от LordJZ, верный расчет времени сброса инстансов и находящийся в наст. время в работе патч на CMSG_SET_SAVED_INSTANCE_EXTEND.

TOM_RUS 07.03.2011 15:57

Код:

-    //uint32      textFlags;                                // 19
+    uint32      mapDifficultyFlags;                        // 19

уже в корне неверно. Это битмаска, как-то связанная с локализацией и не имеет ничего общего с тем, как вы эти данные используете...

И вообще почему тема в разделе скриптов?

rsa 07.03.2011 16:48

Цитата:

Сообщение от TOM_RUS (Сообщение 19819)
Код:

-    //uint32      textFlags;                                // 19
+    uint32      mapDifficultyFlags;                        // 19

уже в корне неверно. Это битмаска, как-то связанная с локализацией и не имеет ничего общего с тем, как вы эти данные используете...

И вообще почему тема в разделе скриптов?

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

Vladimir 07.03.2011 17:27

Насколько я помню "char* areaTriggerText" сам клиент выдает на TRANSFER_ABORT_DIFFICULTY

rsa 07.03.2011 17:45

Цитата:

Сообщение от Vladimir (Сообщение 19822)
Насколько я помню "char* areaTriggerText" сам клиент выдает на TRANSFER_ABORT_DIFFICULTY

возможно и выдает, но не на TRANSFER_ABORT_DIFFICULTY точно, а на что именно - я не знаю. знал бы - естественно вставил бы его. получать при входе в HOR или яму сарона сообщение о недостаточном уровне как-то поднадоело, раз в ДБЦ есть совершенно легальное сообщение о требуемом квесте.

TOM_RUS 07.03.2011 17:53

Код:

signed int __cdecl Packet_SMSG_TRANSFER_ABORTED(int _4D4, int a2, int a3, CDataStore *a4)
{
  MapEntry *mapEntry; // edi@3
  char *luaText2; // eax@10
  MapDifficultyEntry *mapDiffEntry; // eax@13
  char *luaText; // [sp-10h] [bp-4DCh]@5
  signed int v9; // [sp-Ch] [bp-4D8h]@5
  int v10; // [sp-8h] [bp-4D4h]@5
  char buf[1024]; // [sp+4h] [bp-4C8h]@23
  char a1[64]; // [sp+404h] [bp-C8h]@10
  char v13[64]; // [sp+444h] [bp-88h]@17
  char v14[64]; // [sp+484h] [bp-48h]@16
  int mapId; // [sp+4C4h] [bp-8h]@1
  unsigned __int8 v16; // [sp+4C8h] [bp-4h]@17
  unsigned __int8 v17; // [sp+4C9h] [bp-3h]@10
  char reason; // [sp+4CAh] [bp-2h]@1
  unsigned __int8 diff; // [sp+4CBh] [bp-1h]@13

  CDataStore__GetInt32(a4, (int)&mapId);
  CDataStore__GetInt8(a4, (int)&reason);
  if ( mapId >= g_MapDB.minIndex )
  {
    if ( mapId <= g_MapDB.maxIndex )
    {
      mapEntry = (MapEntry *)g_MapDB.Rows[mapId - g_MapDB.minIndex];
      if ( mapEntry )
      {
        switch ( reason )
        {
          case 1:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_ERROR";
            goto LABEL_20;
          case 2:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_MAX_PLAYERS";
            goto LABEL_20;
          case 3:
          case 0xC:
          case 0xD:
          case 0xE:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_NOT_FOUND";
            goto LABEL_20;
          case 4:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_TOO_MANY_INSTANCES";
            goto LABEL_20;
          case 6:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_ZONE_IN_COMBAT";
            goto LABEL_20;
          case 7:
            CDataStore__GetInt8(a4, (int)&v17);
            SStrPrintf(a1, 64, "TRANSFER_ABORT_INSUF_EXPAN_LVL%d", v17);
            luaText2 = FrameScript__GetText(a1, -1, 0);
            goto LABEL_21;
          case 0xB:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_NEED_GROUP";
            goto LABEL_20;
          case 0xF:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_REALM_ONLY";
            goto LABEL_20;
          case 8:
            CDataStore__GetInt8(a4, (int)&diff);
            mapDiffEntry = (MapDifficultyEntry *)GetMapDifficultyInfoByMapIdAndDifficulty(mapEntry->MapID, diff, 0);
            if ( !mapDiffEntry || (luaText2 = mapDiffEntry->areaTriggerText, !luaText2) || !*luaText2 )
            {
              SStrPrintf(v14, 64, "TRANSFER_ABORT_DIFFICULTY%d", diff + 1);
              luaText2 = FrameScript__GetText(v14, -1, 0);
            }
            goto LABEL_21;
          case 9:
            CDataStore__GetInt8(a4, (int)&v16);
            SStrPrintf(v13, 64, "TRANSFER_ABORT_UNIQUE_MESSAGE%d", v16);
            luaText2 = FrameScript__GetText(v13, -1, 0);
            goto LABEL_21;
          case 0xA:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES";
            goto LABEL_20;
          case 0x10:
            v10 = 0;
            v9 = -1;
            luaText = "TRANSFER_ABORT_MAP_NOT_ALLOWED";
LABEL_20:
            luaText2 = FrameScript__GetText(luaText, v9, v10);
LABEL_21:
            if ( luaText2 )
            {
              if ( *luaText2 )
              {
                SStrPrintf(buf, 1024, luaText2, mapEntry->name);
                ChatFrame__AddMessage(buf, 0, 0, 0, 0, 0, 0, 0i64, 0, 0i64, 0, 0, 0);
              }
            }
            break;
          default:
            break;
        }
      }
    }
  }
  ConsolePrintf("World transfer aborted...");
  sub_409550();
  return 1;
}


rsa 07.03.2011 17:59

Значит будем копать Player::SendTransferAborted
поскольку сообщение приходит левое.

Разобрался. Приходит (и видимо проблема моя). Но в чате... Категорически некрасиво, себе лучше оставлю как здесь опубликовано.
А для общественности - часть в MisсHandler() не читать, остальное в силе.


Текущее время: 00:25. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS