разбор black russia

Sahiro

Участник
Автор темы
29
41
Всем здравствуйте, в этой теме будет разбор шифрования, raknet + разбор Json пакетов интерфейса ну и рабочий форк для подключения.
Частично опирался на эту тему
Вообщем, начнем сначала с шифрования, а с последним фиксом блек раша сделала довольно интересную штуку, разберу изменения от самп шифрования по пунктам.

1. Серверные пакеты теперь тоже шифруются.
2. Шифруются только пакеты с reliable надежностями, ненадежные пакеты или пакеты не имеющие надежности ( OPEN_CONNECTION_REQUEST и OPEN_CONNECTION_REPLY) не шифруются.
3. Шифруются именно пакеты а не датаграммы, raknet заголовки или ack не шифруются, байт контрольной суммы идет после надежности, каждый новый пакет в датаграмме шифруется по новому.

Перейдем к json интерфейс пакетам.
их формат такой
айди пакета 27, uint16 айди интерфейса, uint32 длина json, сам json.
json пакеты сначала попадают в c++ откуда они переходят в джава код и далее обрабатываются именно там. (для разбора джава кода использовал jadx, для этого просто импортируем apk в jadx)
Сначала json попадает в JNIJSONTransport в функцию OnJsonDataIncoming а затем идет в GUIMANAGER в функцию onPacketIncoming далее такой путь showGUI - showCurrentGUI - handleFragmentScreen - emitFragmentChange - onFragmentChange, тут хранятся айди почти всех json интерфейсов.

Java:
    public void onFragmentChange(int fragmentConst, @Nullable Bundle currentBundle) {
        FragmentManager supportFragmentManager;
        JNIActivity context = JNIActivity.getContext();
        FragmentTransaction fragmentTransactionBeginTransaction = (context == null || (supportFragmentManager = context.getSupportFragmentManager()) == null) ? null : supportFragmentManager.beginTransaction();
        int i = R.id.jniactivity_main_root_view;
        int i2 = R.id.jniactivity_notification_container;
        String fragmentTag = getFragmentTag(fragmentConst);
        if (fragmentTransactionBeginTransaction != null) {
            switch (fragmentConst) {
                case 1:
                    fragmentTransactionBeginTransaction.add(i, PlatesGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 2:
                    fragmentTransactionBeginTransaction.add(i, GUIFuelFill.class, currentBundle, fragmentTag);
                    break;
                case 6:
                    fragmentTransactionBeginTransaction.add(i, RentGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 11:
                    fragmentTransactionBeginTransaction.add(i, ChooseServerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 13:
                    fragmentTransactionBeginTransaction.add(i2, GUINotificationNewStyle.class, currentBundle, fragmentTag);
                    break;
                case 14:
                    fragmentTransactionBeginTransaction.add(i, MenuComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 16:
                    fragmentTransactionBeginTransaction.add(i, TaxiFragment.class, currentBundle, fragmentTag);
                    break;
                case 17:
                    fragmentTransactionBeginTransaction.add(i, TaxiOrderFragment.class, currentBundle, fragmentTag);
                    break;
                case 18:
                    fragmentTransactionBeginTransaction.add(i, TaxiRatingFragment.class, currentBundle, fragmentTag);
                    break;
                case 21:
                    fragmentTransactionBeginTransaction.add(i, TaxiMapFragment.class, currentBundle, fragmentTag);
                    break;
                case 22:
                    fragmentTransactionBeginTransaction.add(i, GUIDonate.class, currentBundle, fragmentTag);
                    break;
                case 24:
                    fragmentTransactionBeginTransaction.add(i, GUISmiEditor.class, currentBundle, fragmentTag);
                    break;
                case 25:
                    fragmentTransactionBeginTransaction.add(i, GUIPlayersList.class, currentBundle, fragmentTag);
                    break;
                case 27:
                    fragmentTransactionBeginTransaction.add(i, GUIRadialMenuForCar.class, currentBundle, fragmentTag);
                    break;
                case 28:
                    fragmentTransactionBeginTransaction.add(i, GUITuning.class, currentBundle, fragmentTag);
                    break;
                case 30:
                    fragmentTransactionBeginTransaction.add(i, HolidayEventsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 33:
                    fragmentTransactionBeginTransaction.add(i, GUIUsersInventory.class, currentBundle, fragmentTag);
                    break;
                case 34:
                    fragmentTransactionBeginTransaction.add(i, GUICarsTrunkOrCloset.class, currentBundle, fragmentTag);
                    break;
                case 35:
                    fragmentTransactionBeginTransaction.add(i, BlackPassBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 36:
                    fragmentTransactionBeginTransaction.add(i, GUISocialInteraction.class, currentBundle, fragmentTag);
                    break;
                case 37:
                    fragmentTransactionBeginTransaction.add(i, GUIDrivingSchool.class, currentBundle, fragmentTag);
                    break;
                case 38:
                    fragmentTransactionBeginTransaction.add(i, GUIRegistration.class, currentBundle, fragmentTag);
                    break;
                case 39:
                    fragmentTransactionBeginTransaction.add(i, TutorialGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 40:
                    fragmentTransactionBeginTransaction.add(i, GUIWoundSystem.class, currentBundle, fragmentTag);
                    break;
                case 42:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystem.class, currentBundle, fragmentTag);
                    break;
                case 43:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystemFinalWindow.class, currentBundle, fragmentTag);
                    break;
                case 45:
                    fragmentTransactionBeginTransaction.add(i, GUIFamilySystem.class, currentBundle, fragmentTag);
                    break;
                case 46:
                    fragmentTransactionBeginTransaction.add(i, GUIFractionSystem.class, currentBundle, fragmentTag);
                    break;
                case 47:
                    fragmentTransactionBeginTransaction.add(i, MenuSettingMainUiFragment.class, currentBundle, fragmentTag);
                    break;
                case 49:
                    fragmentTransactionBeginTransaction.add(i, CraftGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 50:
                    fragmentTransactionBeginTransaction.add(i, GUISpawnLocation.class, currentBundle, fragmentTag);
                    break;
                case 52:
                    fragmentTransactionBeginTransaction.add(i, GUISocialNetworkLink.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_ELECTRIC /* 56 */:
                    fragmentTransactionBeginTransaction.add(i, ElectricGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CATCH_STREAMER /* 57 */:
                    fragmentTransactionBeginTransaction.add(i, CatchStreamerGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 58:
                    fragmentTransactionBeginTransaction.add(i, GUIGasmanGame.class, currentBundle, fragmentTag);
                    break;
                case 59:
                    fragmentTransactionBeginTransaction.add(i, FishingGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 61:
                    fragmentTransactionBeginTransaction.add(i, YotubePlayerFragment.class, currentBundle, fragmentTag);
                    break;
                case 63:
                    fragmentTransactionBeginTransaction.add(i, InteractionWithNpcGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 64:
                    fragmentTransactionBeginTransaction.add(i, HalloweenAwardGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 65:
                    fragmentTransactionBeginTransaction.add(i, ActiveTaskGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 66:
                    fragmentTransactionBeginTransaction.add(i, AdminToolsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 67:
                    fragmentTransactionBeginTransaction.add(i, BrSimBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPGRADE_OBJECT_EVENT /* 68 */:
                    fragmentTransactionBeginTransaction.add(i, UpgradeObjectEventGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_GIFTS /* 69 */:
                    fragmentTransactionBeginTransaction.add(i, GiftsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 70:
                    fragmentTransactionBeginTransaction.add(i, PanelInfoGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 71:
                    fragmentTransactionBeginTransaction.add(i, CalendarGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_RATE_APP /* 72 */:
                    fragmentTransactionBeginTransaction.add(i, RateAppComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CASES /* 73 */:
                    fragmentTransactionBeginTransaction.add(i, CasesGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_BP_REWARDS /* 74 */:
                    fragmentTransactionBeginTransaction.add(i, BpRewardsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 75:
                    fragmentTransactionBeginTransaction.add(i, TanpinBannerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_VIDEO_PLAYER /* 76 */:
                    fragmentTransactionBeginTransaction.add(i, VideoPlayerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MARKETPLACE /* 77 */:
                    fragmentTransactionBeginTransaction.add(i, MarketplaceGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CLICKER /* 79 */:
                    fragmentTransactionBeginTransaction.add(i, ClickerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 80:
                    fragmentTransactionBeginTransaction.add(i, ChatGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 81:
                    fragmentTransactionBeginTransaction.add(i, ModuleDialogGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 82:
                    fragmentTransactionBeginTransaction.add(i, RatingGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 83:
                    fragmentTransactionBeginTransaction.add(i, InitializationFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_LOADER /* 84 */:
                    fragmentTransactionBeginTransaction.add(i, LoaderFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MAIN /* 85 */:
                    fragmentTransactionBeginTransaction.add(i, MainFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPDATE_MANAGER /* 86 */:
                    fragmentTransactionBeginTransaction.add(i, UpdateManagerFragment.class, currentBundle, fragmentTag);
                    break;
            }
            fragmentTransactionBeginTransaction.setReorderingAllowed(true).commitAllowingStateLoss();
        }
    }
Рабочий форк с api (апи для обработки некоторых json интерфейсов тоже есть)
GitHub
 

Ponyal

Новичок
22
21
Всем здравствуйте, в этой теме будет разбор шифрования, raknet + разбор Json пакетов интерфейса ну и рабочий форк для подключения.
Частично опирался на эту тему
Вообщем, начнем сначала с шифрования, а с последним фиксом блек раша сделала довольно интересную штуку, разберу изменения от самп шифрования по пунктам.

1. Серверные пакеты теперь тоже шифруются.
2. Шифруются только пакеты с reliable надежностями, ненадежные пакеты или пакеты не имеющие надежности ( OPEN_CONNECTION_REQUEST и OPEN_CONNECTION_REPLY) не шифруются.
3. Шифруются именно пакеты а не датаграммы, raknet заголовки или ack не шифруются, байт контрольной суммы идет после надежности, каждый новый пакет в датаграмме шифруется по новому.

Перейдем к json интерфейс пакетам.
их формат такой
айди пакета 27, uint16 айди интерфейса, uint32 длина json, сам json.
json пакеты сначала попадают в c++ откуда они переходят в джава код и далее обрабатываются именно там. (для разбора джава кода использовал jadx, для этого просто импортируем apk в jadx)
Сначала json попадает в JNIJSONTransport в функцию OnJsonDataIncoming а затем идет в GUIMANAGER в функцию onPacketIncoming далее такой путь showGUI - showCurrentGUI - handleFragmentScreen - emitFragmentChange - onFragmentChange, тут хранятся айди почти всех json интерфейсов.
Java:
    public void onFragmentChange(int fragmentConst, @Nullable Bundle currentBundle) {
        FragmentManager supportFragmentManager;
        JNIActivity context = JNIActivity.getContext();
        FragmentTransaction fragmentTransactionBeginTransaction = (context == null || (supportFragmentManager = context.getSupportFragmentManager()) == null) ? null : supportFragmentManager.beginTransaction();
        int i = R.id.jniactivity_main_root_view;
        int i2 = R.id.jniactivity_notification_container;
        String fragmentTag = getFragmentTag(fragmentConst);
        if (fragmentTransactionBeginTransaction != null) {
            switch (fragmentConst) {
                case 1:
                    fragmentTransactionBeginTransaction.add(i, PlatesGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 2:
                    fragmentTransactionBeginTransaction.add(i, GUIFuelFill.class, currentBundle, fragmentTag);
                    break;
                case 6:
                    fragmentTransactionBeginTransaction.add(i, RentGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 11:
                    fragmentTransactionBeginTransaction.add(i, ChooseServerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 13:
                    fragmentTransactionBeginTransaction.add(i2, GUINotificationNewStyle.class, currentBundle, fragmentTag);
                    break;
                case 14:
                    fragmentTransactionBeginTransaction.add(i, MenuComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 16:
                    fragmentTransactionBeginTransaction.add(i, TaxiFragment.class, currentBundle, fragmentTag);
                    break;
                case 17:
                    fragmentTransactionBeginTransaction.add(i, TaxiOrderFragment.class, currentBundle, fragmentTag);
                    break;
                case 18:
                    fragmentTransactionBeginTransaction.add(i, TaxiRatingFragment.class, currentBundle, fragmentTag);
                    break;
                case 21:
                    fragmentTransactionBeginTransaction.add(i, TaxiMapFragment.class, currentBundle, fragmentTag);
                    break;
                case 22:
                    fragmentTransactionBeginTransaction.add(i, GUIDonate.class, currentBundle, fragmentTag);
                    break;
                case 24:
                    fragmentTransactionBeginTransaction.add(i, GUISmiEditor.class, currentBundle, fragmentTag);
                    break;
                case 25:
                    fragmentTransactionBeginTransaction.add(i, GUIPlayersList.class, currentBundle, fragmentTag);
                    break;
                case 27:
                    fragmentTransactionBeginTransaction.add(i, GUIRadialMenuForCar.class, currentBundle, fragmentTag);
                    break;
                case 28:
                    fragmentTransactionBeginTransaction.add(i, GUITuning.class, currentBundle, fragmentTag);
                    break;
                case 30:
                    fragmentTransactionBeginTransaction.add(i, HolidayEventsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 33:
                    fragmentTransactionBeginTransaction.add(i, GUIUsersInventory.class, currentBundle, fragmentTag);
                    break;
                case 34:
                    fragmentTransactionBeginTransaction.add(i, GUICarsTrunkOrCloset.class, currentBundle, fragmentTag);
                    break;
                case 35:
                    fragmentTransactionBeginTransaction.add(i, BlackPassBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 36:
                    fragmentTransactionBeginTransaction.add(i, GUISocialInteraction.class, currentBundle, fragmentTag);
                    break;
                case 37:
                    fragmentTransactionBeginTransaction.add(i, GUIDrivingSchool.class, currentBundle, fragmentTag);
                    break;
                case 38:
                    fragmentTransactionBeginTransaction.add(i, GUIRegistration.class, currentBundle, fragmentTag);
                    break;
                case 39:
                    fragmentTransactionBeginTransaction.add(i, TutorialGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 40:
                    fragmentTransactionBeginTransaction.add(i, GUIWoundSystem.class, currentBundle, fragmentTag);
                    break;
                case 42:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystem.class, currentBundle, fragmentTag);
                    break;
                case 43:
                    fragmentTransactionBeginTransaction.add(i, GUIEntertainmentSystemFinalWindow.class, currentBundle, fragmentTag);
                    break;
                case 45:
                    fragmentTransactionBeginTransaction.add(i, GUIFamilySystem.class, currentBundle, fragmentTag);
                    break;
                case 46:
                    fragmentTransactionBeginTransaction.add(i, GUIFractionSystem.class, currentBundle, fragmentTag);
                    break;
                case 47:
                    fragmentTransactionBeginTransaction.add(i, MenuSettingMainUiFragment.class, currentBundle, fragmentTag);
                    break;
                case 49:
                    fragmentTransactionBeginTransaction.add(i, CraftGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 50:
                    fragmentTransactionBeginTransaction.add(i, GUISpawnLocation.class, currentBundle, fragmentTag);
                    break;
                case 52:
                    fragmentTransactionBeginTransaction.add(i, GUISocialNetworkLink.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_ELECTRIC /* 56 */:
                    fragmentTransactionBeginTransaction.add(i, ElectricGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CATCH_STREAMER /* 57 */:
                    fragmentTransactionBeginTransaction.add(i, CatchStreamerGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 58:
                    fragmentTransactionBeginTransaction.add(i, GUIGasmanGame.class, currentBundle, fragmentTag);
                    break;
                case 59:
                    fragmentTransactionBeginTransaction.add(i, FishingGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 61:
                    fragmentTransactionBeginTransaction.add(i, YotubePlayerFragment.class, currentBundle, fragmentTag);
                    break;
                case 63:
                    fragmentTransactionBeginTransaction.add(i, InteractionWithNpcGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case 64:
                    fragmentTransactionBeginTransaction.add(i, HalloweenAwardGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 65:
                    fragmentTransactionBeginTransaction.add(i, ActiveTaskGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 66:
                    fragmentTransactionBeginTransaction.add(i, AdminToolsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 67:
                    fragmentTransactionBeginTransaction.add(i, BrSimBannerComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPGRADE_OBJECT_EVENT /* 68 */:
                    fragmentTransactionBeginTransaction.add(i, UpgradeObjectEventGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_GIFTS /* 69 */:
                    fragmentTransactionBeginTransaction.add(i, GiftsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 70:
                    fragmentTransactionBeginTransaction.add(i, PanelInfoGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 71:
                    fragmentTransactionBeginTransaction.add(i, CalendarGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_RATE_APP /* 72 */:
                    fragmentTransactionBeginTransaction.add(i, RateAppComposeGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CASES /* 73 */:
                    fragmentTransactionBeginTransaction.add(i, CasesGUIFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_BP_REWARDS /* 74 */:
                    fragmentTransactionBeginTransaction.add(i, BpRewardsGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 75:
                    fragmentTransactionBeginTransaction.add(i, TanpinBannerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_VIDEO_PLAYER /* 76 */:
                    fragmentTransactionBeginTransaction.add(i, VideoPlayerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MARKETPLACE /* 77 */:
                    fragmentTransactionBeginTransaction.add(i, MarketplaceGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_CLICKER /* 79 */:
                    fragmentTransactionBeginTransaction.add(i, ClickerGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 80:
                    fragmentTransactionBeginTransaction.add(i, ChatGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 81:
                    fragmentTransactionBeginTransaction.add(i, ModuleDialogGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 82:
                    fragmentTransactionBeginTransaction.add(i, RatingGuiFragment.class, currentBundle, fragmentTag);
                    break;
                case 83:
                    fragmentTransactionBeginTransaction.add(i, InitializationFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_LOADER /* 84 */:
                    fragmentTransactionBeginTransaction.add(i, LoaderFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_MAIN /* 85 */:
                    fragmentTransactionBeginTransaction.add(i, MainFragment.class, currentBundle, fragmentTag);
                    break;
                case ScreenId.SCREEN_UPDATE_MANAGER /* 86 */:
                    fragmentTransactionBeginTransaction.add(i, UpdateManagerFragment.class, currentBundle, fragmentTag);
                    break;
            }
            fragmentTransactionBeginTransaction.setReorderingAllowed(true).commitAllowingStateLoss();
        }
    }
Рабочий форк с api (апи для обработки некоторых json интерфейсов тоже есть)
GitHub
Это получается теперь можно первый миллион рублей заработать?
1789900543618.png
 
  • Нравится
Реакции: CastelloFAM

Sahiro

Участник
Автор темы
29
41
Обновил на актуальную версию игры, скачать можно также на гитхабе
 

danyka111

Участник
9
0
да, через setbotfood над указать айди еды для покупки, но эвента при открытии меню ларька нету, так что бот не может знать открыто у него меню ларька или не
Привет, ты не копался более подробно с ларьком? Я зачекал что будет если подойти на ларек в квесте с апк версии игры там подсказка выскакивает где тебе на экран нужно тапнуть, потом открывается меню ларька. В пайраке получилось выцепить только 87 интерфейс какой то, предполагаю что это и есть подсказка ибаная в квесте, никак не пойму как ответить на неё. Так же что за айдишники еды у setbotfood не знаешь?
[16:21:03] [ICON] id=0 xyz=(2744.193603515625, -2429.078369140625, 21.821575164794922) type=85 style=0


[16:21:03] [QUEST-GO] [63] {'c': 1}


[16:21:03] [QUEST-GO] [39] {'c': 1}


[16:21:03] [QUEST-GO] marker: id=0 type=85 pos=(2744.2,-2429.1,21.8)


[16:21:03] [ICON+] id=0 pos=(2744.193603515625, -2429.078369140625, 21.821575164794922) type=85 style=0


[16:21:03] [QUEST-GO] trigger hit: quest 'Перекусить в уличном киоске'


[16:21:03] [QUEST-GO] [13] {'o': 1, 't': 3, 'i': 'Цель изменена', 'd': 3, 's': -1, 'b': 3}


[16:21:03] [QUEST TASK] Closed: {'c': 1}





[16:21:03] ============================================================


[16:21:03] [QUEST TASK]


[16:21:03] [QUEST TASK] m=5 | t=4 | mt=0 | ma=1 | mc=#0BDA51 | f=0


[16:21:03] ------------------------------------------------------------


[16:21:03] Перекусить в уличном киоске


[16:21:03] ============================================================








[16:21:03] ============================================================


[16:21:03] [NOTIFICATION]


[16:21:03] [NOTIFICATION] t=3 | d=3 | s=-1 | b=3 | has_button=False | k=''


[16:21:03] ------------------------------------------------------------


[16:21:03] Цель изменена


[16:21:03] ============================================================





[16:21:03] [NPC DIALOG] Closed: {'c': 1}


[16:21:03] [AUDIO] Playing stream: quest/NextTarget.ogg


[16:21:05] [QUEST-GO] tx move: (2744.2, -2429.1, 21.8)


[16:21:05] [QUEST-GO] tx ok, movement_id=2


[16:21:07] [QUEST-GO] move end: status=arrived


[16:21:07] [QUEST-GO] distance to marker: 0.00м


[16:21:07] [QUEST-GO] state: at_marker


[16:21:08] [QUEST-GO] tx pickup_interact: id=18


[16:21:08] [QUEST-GO] tx ok


[16:21:09] [ICON DEL] id=0


[16:21:09] [QUEST-GO] ===== IFACE 87 FULL DUMP =====


[16:21:09] [QUEST-GO] type=<class 'dict'>


[16:21:09] [QUEST-GO] 'o': 1 (type=int)


[16:21:09] [QUEST-GO] 'id': 23 (type=int)


[16:21:09] [QUEST-GO] JSON: {"o": 1, "id": 23}


[16:21:09] [QUEST-GO] =============================
 

SlopAI

Новичок
1
0
Привет, Есть ли информация как скипать JSON диалоги? например во время активации промокода - /promo > "Активировать промокод" >(смена json на второй) > (ввести промо). На моменте смены диалога первый не закрывается, и сервер/клиент не дает ввести промокод, потому что первый JSON диалог не был закрыт.
Есть ли какая-то уже наработанная база апишек? буду благодарен если предоставишь.