Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Любой способ кэша

Упомянутые в теме пользователи:

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 12 из 13
  1. #1
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399

    Любой способ кэша

    Все привет! Решил спектатор написать и пошли проблемы с аргументами обработчика событий. Изначально сервер шлет гуид и тд в виде 23423423;HPT=12312;MPT=12345; и тд.

    Для выведения аргументов нашел всего 2 способа :
    1) Сплитать строку (как по мне метод полный отстой), куча мусора
    2) паирсить его циклом так :

    PHP код:
        -- Юнит ивенты не прокаютвся инфа парсится от сюда
        
    function spectator:CHAT_MSG_ADDON(eventprefixmessagechannelsender)
            if 
    prefix == "ARENASPEC" and channel == "WHISPER" and sender == "" then
                local tbl 
    loadstring(format([[
                    for 
    kv in next, {%s} do
                        print(
    kv)
                    
    end
                
    ]], message))()
            
    end
        end 
    Вроде как все ок, в массив все забивается и можно делать ассоциации с обычными ивентами прямо из цикла передавая в loadstring нужные аргументы. НО for k, v in next, {%s} do это дело при каждом событии создает и заполняет массив, в результате чего имеем кучу мусора как и с первым методом (который в урина спектаторе бай малако). Кэшировать через слабые таблицы я это дело не могу, попросту ловлю сообщения , что я дебил и %s имеет нулевое значение =) Кто сталкивался сюда или пм хоть какую то инфу.

  2. #2
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    так как я не знаю зачем нужны метатаблицы, у меня один вариант- через сплит, но если много ненужной инфы идет, то можно через финд, еще можно матчем выдергивать нужное по тегу.
    а %s - space же вроде? а там в строке вроде пробелов нету? может надо было большую %S?.. хотя, неважно, это ж в метатаблице, там может свои правила..
    дело в том , что методы которые идут от string так же загаживают как и создание масивов. Только в моем случае это загаживает массивами , а в случаев с string загаживается строками, и кроме того со строкми это же тупо парсинг вот к примеру передает гуид, ауру начало и конец действия , что бы пропарсить гуид нужно перебрать циклом (имею в виду сплит или гасаб или маф) 16 символов т.е 16 итераций. В моем случае идет набор пар ключ-значение и это уже рекурсивный перебор причем без всякого парса. Грубо говоря я делаю то же самое что руками заполить массив {[1] = 0x002342352f; AUR=12321;} и сразу получаю доступ к заполненым элементам. Это все дело без проблем выгружает гарбаж колектор т.к ссылок на эти массив нет негде кроме функции которая вызывается внутри глобал нейм спейса и уничтожается при следующем сборе мусора. Но вызывать сбощик мусора не разумно т.к он будет собирать со всего нейм спейса и посадит ф.п (ивенты очень часто идут).

    ЗЫ метаметоды это те же самые перегрузки операторов , они так же мало чем помогут. И дело в том , что я даже не знаю возможно ли сделать то , что я хочу.
    Последний раз редактировалось DreamlØlz; 07.05.2017 в 05:25.

  3. #3
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    в любом случае это двойная работа, из строки, которая сама по себе считай как таблица, делать другую таблицу, а потом эту новую таблицу перебирать. и зачем её хранить?
    я б по простому сделал:
    PHP код:
    function spectator:HPT(a,b)
        
    local _,_,HPT,MPT b:find("(%d+);%a+=(%d+)") -- "23423423;HPT=12312;MPT=12345;"

    end

    function spectator:CHAT_MSG_ADDON(eventprefixmessagechannelsender
        if 
    prefix == "ARENASPEC" and channel == "WHISPER" and sender == "" then
            local a
    ,strsplit(';',message,2)
            
    spectator[b:sub(1,3)](a,b)
        
    end
    end 
    соответственно под каждый тип сообщения, а их там 4-5(?), своя функция со своим шаблоном.
    хотя наверное мастера шаблонов и один шаблон на все типы могут запилить, типа деформатора.
    Ну там не все так просто. Что бы понять проще /etrace в спектаторе нажать =) Там не все ивенты идут одинаковыми , а спектр аддон может за 30 сек до нескольких мегабайт вырости ... Там именно такой метод и используют , только там около 6 параметров которые сплитать придется =\ Вот и сижу в раздумьях ... Можно было бы кэшировать , тогда использовался бы всего 1 массив и расход памяти был бы только 1 раз на 6 байт.

  4. #4
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    можно игнорировать AUR, а инфу об аурах брать с комбатлога. остальные типы сообщений вроде простые, редко больше одного аргумента несут.
    Тогда придется конвертить гуиды их 16 теричной системы т.к спектр передает в десятичной.

  5. #5
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    луа автоматом конвертирует: /run print(0x00CE2 == 3298).
    все равно мне кажется лучше строку шаблоном разбивать. а то что 30м. накапливается, это скорей всего из-за чего то другого. метатаблицы какиенибудь заюзаны которые не перегружаются как должны, а новые создаются, тада да, может накопится.
    Там нет мет вообще. Та и мета таблицы работают немного по другому как ты тумаешь. Метаметод может быть только один и обьявляется он то же 1 раз как прототип с которого наследуешь методы =)

  6. #6
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    когда аддон ждать то? или будет чит?
    я читы не пишу , только функционал патчей выше , иза того что случайно случилось и удалил темку. Пока что сложно сказать, времени особо нету...

  7. #7
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    спектатор это же функцианал патчей выше?
    так вот, самый простой способ сделать легальный чит, который в случае если ты заходишь на арену как зритель, фиксирует команду1 как пати1,2,3, а вторую команду на аренафрейм1,2,3. в этом случае будут приходить юнит_эвенты. мсг_аддон и сам аддон станут не нужными, зато будут работать обычные аддоны. ну и кнопку смены фракции сделать, чтоб неймплейты можно было вкл/выкл.
    ну сделать юнита в принципи можно , имею в виду в пати запихать гуиды и в арену запихать гуиды , но эти юнит ивенты типа UNIT_HEALTH и тд для пати и арены шлет сервер, так что в любом случае придется хп дефолтом OnUpdate как в принципи близы и сделали, а ауры по комбат логу ...
    ЗЫ плейты типа иза левой фракции пропадают?

  8. #8
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    не, это клиент дает луа юнит эвенты. в клиенте есть инфа полюбому. неймплейты же показывает хп не имея юнитида.


    да там если можешь осматривать, то плейты не пакажет и наоборот. переключатель надо
    Не, там сервер шлет пакеты по типу комбат лога, которые клиент преобразует в юнит ивенты причем только для типичных юнитов ... Я добавил новые юниты но для них ивенты не идут =/ Хотя некто не мешает сделать это из комбат лога т.к клиент на основе этих пакетов и формирует юнит ивенты

    ЗЫ я так и не понял как пушить в игру например фрейму в виде указателя на луа таблицу, почему то шлется только юзер дата, причем в десятичной системе исчисления

    - - - Updated - - -

    мб в ночи проникну в близовский обьект менеджер и уже от туда что то смогу делать, нужно только зацепиться за какой нибудь оффсэт и уже от туда капать =)
    Последний раз редактировалось DreamlØlz; 29.06.2017 в 11:41.

  9. #9
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    на крайняк, с помощью унлокера и "юнитфокус на онупдате" и эвенту фокус ченжед, можно инфу собирать.
    ну а по чат_мсг_аддон не получиться собрать нормальный аддон, там баг на баге.
    инфа о касте, например, то что сервер присылает, беспалезная.
    по идеи нужно старттайм и ендтайм, но приходит только длинна каста, а это уже ошибка в минус пинг.
    помимо этого, длина каста приходит без учета модификаторов скорости игроков. такую же и с тултипа спелла можно было бы взять. с комбатлога тоже не получить ендтайм.


    я в этом не шарю, но знаю что готовых объект менеджеров много. нужно всего лишь подключить, перебрать объекты, взять по гуиду и поставить ему юнитид.
    кстати, ща клиент иногда сам устанавливает кого нибудь на аренафреймы, баг какойта.
    Я так и не понял как он определяет игроков из одной команды =)
    ЗЫ на сколько я понял инит ивенты это мусорка) Проще через комбат лог все делать т.к в разы больше инфы идет ... с обьект менеджером то же какой то гемор пошел) по гуиду ауру то получаю и тд , функция возвращает айди , кастер и тд , но не возвращает старттайм и енд тайм =)
    Последний раз редактировалось DreamlØlz; 01.07.2017 в 15:24.

  10. #10
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    через комбатлог, ауры не развешать, кастбар не запилить, хп/мп неопределить.
    PHP код:
    #pragma once

    #include "Spell.h"

    class Aura {
    public:
        
    int pointer;
        
    AuraRec entry;
        
    Spell spell;
        
    int id;
        const 
    charname;

        
    Aura(int addr) :pointer addr } {
            
    entry = *(AuraRec*)addr;
            
    id entry.AuraId;
            
    spell Spell(id);
            
    name spell.name;
        }

        
    int RemainingMilliSecs() {
            
    int endTime entry.EndTime;
            return 
    endTime == endTime PerformanceCount();
        }

        
    bool IsValid() { return id != && RemainingMilliSecs() >= 0; }
        
    uint64 CasterGuid() { return entry.CreatorGuid; }
    }; 
    PHP код:
    void  ReadAuras() {
            if (
    auras_readed)
                return;

            
    int idx addr 0xC50;
            
    int count = *(int*)(addr 0xDD0);

            if (
    count == -1) {
                
    idx = *(int*)(addr 0xC58);
                
    count = *(int*)(addr 0xC54);
            }
            for (
    int i 0count; ++i) {
                
    Auraaura{ new Aura(idx 24 i) };
                if (
    aura->IsValid()
                    && 
    aura->name != ""
                    
    && std::none_of(std::begin(auras), std::end(auras), [&](Auraa) { return strcmp(a->nameaura->name) == 0; })) {
                    
    printf("id = %d\n"aura->id);
                    
    auras.push_back(aura);
                }
            }
            
    auras_readed true;
            return;
        } 
    Вроде робит, осталось только в стэк луа просунуть, addr получается из луа штата т.е это штат + смещение от базы игрока (player)
    Последний раз редактировалось DreamlØlz; 01.07.2017 в 17:39.

  11. #11
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    я имел ввиду комбатлог который в игре уже.

    я не понимаю зачем тебе там нужны ауры? там нужно всего лишь объектам назначить унитиды, а уже в игре можно соберать инфу с UnitAura(), UnitCastingInfo(), ну и т.д. плюс юнит эвенты попрут. они кстати идут, когда по ошибке в АренаЭнемиФрейм кто та попадает.
    не не идут они, идут только для пати арена, рейд и тд , те которые я добовляю не идут , но к примеру UnitAura и тд работает для этих обьектов. Проще написать 2 метода для аур и кастов и работать только с гуидами

  12. #12
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,202
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399
    Цитата Сообщение от decemberx Посмотреть сообщение
    это сложная и непонятная схема.
    Почему сложная?

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. ой ой ой темку в корзинку
    от embrace в разделе Корзина
    Ответов: 1
    Последнее сообщение: 29.08.2016, 11:04

Ваши права

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