Коллективные рынки и проблемма бартер-стендов HELP!

Пользовательские клиенты, программы, картосшиватели, боты, решение вопросов по ним

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение mdsanta » 23 ноя 2017, 01:04

Belonda писал(а):А вот это уже как я думаю задача для Джорбов т.к. по моему мнению альтернативный клиент не должен по возможностям быть богаче родного клиента.
Альтернативный клиент улучшает существующий функционал но не добавляет.
Но это мое мнение. :)

Дджорбы уже вечность не могут стенды сами по себе починить т.к. у них они как-то сильно хитро вкручены.
так что запостить то можно, но очень маловероятно. что они этим заморочатся. По опыту.
mdsanta
 
Сообщения: 306
Зарегистрирован: 04 окт 2016, 21:29

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение romovs » 23 ноя 2017, 01:19

mdsanta писал(а):На данном этапе - те кто может ручками обозначить расположение своих стендов - так же ручками обновляют свои топики.

Так мне ето хочетса как покупателю. Вот мой use case: захотел купить 5 разных вещей, обхожу рынок, делаю скриншоты с открытым стендом где попался товар и картой, сравниваю где дешевле и тут вспоминаю что хотел еще одну вещь купить - начинаю еще раз обходить...

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

Я несовсем понял насчет маркеров.
Под отоброжением тайла я имел в виду, в самом интерфейсе кликаеш на товар, появляетса тултип с тайлом и помеченым стендом ну или что-то вроде етого.
romovs
 
Сообщения: 8
Зарегистрирован: 07 мар 2014, 18:20

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение mdsanta » 23 ноя 2017, 01:25

[quote="romovs"][/quote]
я тебя понимаю.
или еще лучше - ссылка на скан рынка от владельцев. что бы может и не ходить вовсе ))


А то был ответ на пост, что люди и сами себе маркеры поставят на карте :)
mdsanta
 
Сообщения: 306
Зарегистрирован: 04 окт 2016, 21:29

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение not_a_cat » 23 ноя 2017, 02:51

Допустим, какой-то граббер данных есть.
 Лютейший говнокод
Код: Выделить всё
package haven.automation;

import java.util.List;
import haven.*;
import haven.res.ui.barterbox.* ;
import haven.res.ui.tt.q.qbuff.*;
import haven.factories.*;
import haven.res.ui.tt.ArmorFactory;
import haven.res.ui.tt.WearFactory;
import haven.res.ui.tt.defn.DefName;
import static haven.OCache.posres;

public class Plus implements Runnable {
    private GameUI gui;
    public static double BeaconX = 0;
    public static double BeaconY = 0;
    public double standX = 0;
    public double standY = 0;

    public Plus(GameUI gui) {
        this.gui = gui;
    }

    @Override
    public void run() {
        Gob dreca = null;
        synchronized (gui.map.glob.oc) {
            for (Gob gob : gui.map.glob.oc) {
                try {
                    Resource res = gob.getres();
                    if (res != null && res.name.startsWith("gfx/terobjs/barterstand")) {
                        Coord2d plc = gui.map.player().rc;
                        if ((dreca == null || gob.rc.dist(plc) < dreca.rc.dist(plc)))
                            dreca = gob;
                    }
                } catch (Loading l) {
                }
            }
        }

        if (dreca == null) return;
        gui.map.wdgmsg("click", dreca.sc, dreca.rc.floor(posres), 3, 0, 0, (int) dreca.id, dreca.rc.floor(posres), 0, -1);
        //STORE STAND REL COORDS
        if ((BeaconX == 0) || (BeaconY == 0))
        {
            BeaconX = dreca.rc.x;
            BeaconY = dreca.rc.y;
        }
        standX = dreca.rc.x - BeaconX;
        standY = dreca.rc.y - BeaconY;
        //STORE STAND REL END
        try       
        {
            Thread.sleep(700);
        }
        catch(InterruptedException ex)
        {
            Thread.currentThread().interrupt();
        }   
        try {
            for (Widget w = gui.lchild; w != null; w = w.prev) {
                if (w instanceof Window) {
                    for (Widget sw = w.lchild; sw != null; sw = sw.prev) {
                        if (sw instanceof Shopbox) {
                            Shopbox SB = (Shopbox) sw;
                            String strout = "";
                            String num = "";
                            String q = "";
                            String name = "";
                            if (SB.num != null) num = SB.num.text;
                            if (SB.info() != null) {
                                Object[] SB_info = SB.info().toArray();
                                for (int j = 0; j<SB_info.length; j++)
                                {
                                    if (SB_info[j] instanceof ItemInfo)
                                    {
                                        ItemInfo str = (ItemInfo) SB_info[j];
                                        if (str instanceof QBuff)
                                        {
                                            QBuff str2 = (QBuff) str;
                                            q += (int) str2.q;
                                        }
                                        if (str instanceof ItemInfo.Name)
                                        {
                                            ItemInfo.Name str3 = (ItemInfo.Name) str;
                                            name += str3.str.text;
                                        }
                                    }
                                }
                            }

                            String pname = "";
                            String pres = "";
                            String pq = "";
                            String pnum = "";

                            if (SB.price != null){
                                pname += SB.price.name(); 
                                pnum += SB.pnum;
                                if (SB.pq == 0)
                                    pq = "Any";
                                else
                                    pq += (int) SB.pq;
                            }
                           
                            String spt = "|";
                            if ((name != "") && (pname != "")) {
                                strout += name + spt + q + spt + num + spt + pname + spt + pq + spt + pnum + spt + standX + spt + standY;
                                gui.msg(strout, java.awt.Color.white);
                                java.lang.System.out.print(strout+"\n");
                            }
                        }
                    }
                }
            }
        } catch (Loading l) {
           
        }
    }
}

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

Да-да, код получился таким же блевотным куском говна, как и автор. Но это пока еще не существенно. Извергает же этот мутант данные в таком формате:
 Товар|Q товара|Осталось|Цена (Единицы)|Цена (Качество)|Цена (Количество)|Координаты относительно первого стенда
Код: Выделить всё
Mammoth Tusk|408|4 left|Gold Coins|Any|160|0.0|0.0
Raw Mammoth|389|41 left|Gold Coins|Any|2|0.0|0.0
Mammoth Hide|389|12 left|Gold Coins|Any|160|0.0|0.0
Ivory Figurine|400|6 left|Gold Coins|Any|30|0.0|0.0
Hide Strap|385|12 left|Gold Coins|Any|20|0.0|0.0
Bone Material|304|12 left|Gold Coins|Any|12|19.25|0.0
Bone Material|312|63 left|Gold Coins|Any|13|19.25|0.0
Bone Material|312|10 left|Gold Coins|Any|13|19.25|0.0
Bone Material|320|16 left|Gold Coins|Any|15|19.25|0.0
Bone Material|328|16 left|Gold Coins|Any|17|19.25|0.0
Bone Material|296|8 left|Silver Coins|Any|30|38.5|0.0
Coin of Silver||15 left|Frog's Crown|30|1|19.25|-88.0
Onion Braid|171|17 left|Silver Coins|Any|2|19.25|-88.0
Straw Doll|194|21 left|Silver Coins|Any|2|19.25|-88.0
Strawberries|93|10 left|Gold Coins|Any|10|38.5|-88.0
Beeswax|236|35 left|Gold Coins|Any|10|38.5|-88.0
Board of Walnutwood|214|8 left|Gold Coins|Any|3|2429.625|-9.625
Feldspar|217|63 left|Gold Coins|Any|75|2429.625|-9.625
Grand Brilliant Ruby|10|1 left|Gold Coins|Any|200|2429.625|-9.625
Small Brilliant Emerald|28|5 left|Gold Coins|Any|50|2429.625|-9.625
Large Brilliant Moonstone|23|1 left|Gold Coins|Any|75|2429.625|-9.625
Large Brilliant Turquoise|25|1 left|Gold Coins|Any|50|2429.625|-28.875
Large Brilliant Turquoise|25|1 left|Gold Coins|Any|50|2429.625|-28.875
Fair Brilliant Diamond|16|1 left|Gold Coins|Any|100|2429.625|-28.875
Large Brilliant Ruby|16|2 left|Gold Coins|Any|75|2429.625|-28.875
Feldspar|200|40 left|Gold Coins|Any|50|2429.625|-28.875
Fair Brilliant Onyx|13|1 left|Gold Coins|Any|40|2429.625|-28.875
Large Brilliant Opal|11|2 left|Gold Coins|Any|50|2429.625|-81.125
Fair Brilliant Ruby|20|3 left|Gold Coins|Any|40|2429.625|-81.125
Small Brilliant Diamond|18|2 left|Gold Coins|Any|50|2429.625|-81.125
Grand Brilliant Diamond|19|1 left|Gold Coins|Any|800|2429.625|-81.125
Feldspar|206|43 left|Gold Coins|Any|60|2429.625|-100.375
Fair Brilliant Sapphire|10|1 left|Gold Coins|Any|40|2429.625|-100.375
Fair Brilliant Opal|26|2 left|Gold Coins|Any|50|2429.625|-100.375
Fair Brilliant Jade|11|6 left|Gold Coins|Any|75|2429.625|-100.375
Feldspar|191|26 left|Gold Coins|Any|50|2429.625|-100.375
Coin of Gold||58 left|Petrified Seashell|10|4|2341.625|-358.875
Coin of Gold||58 left|Petrified Seashell|10|4|2341.625|-358.875
Slag|71|3 left|Cast Iron Coins|Any|2|2341.625|-358.875
Slag|70|60 left|Cast Iron Coins|Any|2|2341.625|-358.875
Metal Axe|379|1 left|Gold Coins|Any|310|2341.625|-339.625
Mole's Pawbone|11|1 left|Gold Coins|Any|6|2341.625|-339.625
Meatpie|194|41 left|Gold Coins|Any|1|2341.625|-339.625
Meatpie|194|63 left|Gold Coins|Any|1|2341.625|-339.625
Bar of Wrought Iron|298|27 left|Fine Clay|50|1|2299.0|-1166.0
Bar of Wrought Iron|301|15 left|Gold Coins|Any|100|2299.0|-1166.0
Bar of Wrought Iron|281|13 left|Gold Coins|Any|50|2299.0|-1166.0
Bar of Wrought Iron|270|42 left|Gold Coins|Any|30|2299.0|-1166.0
Bar of Wrought Iron|271|28 left|Fine Clay|45|1|2299.0|-1166.0
Mandrake Root|13|3 left|Gold Coins|Any|5|1439.625|1277.375
Crabshell|6|2 left|Silver Coins|Any|2|1439.625|1277.375
Crabshell|15|6 left|Silver Coins|Any|3|1439.625|1277.375
Straw Doll|144|31 left|Silver Coins|Any|2|1439.625|1296.625
Poppy Flower|131|40 left|Silver Coins|Any|1|1439.625|1296.625

Многие данные не захватываются (пока): содержимое сосудов, ингредиенты и FEP еды, украшения одежды, чеканка монет, параметры оружия и брони.

Хотелось бы сделать полностью автоматизированный скрипт для логина персонажа, входа на рынок, обхода стендов по списку вейпоинтов, сбора данных, форматирования данных в виде "список с возможностью фильтрации и сортировки + схема рынка с подсветкой стенда с выбранным товаром". Но пока я даже не знаю какими средствами лучше реализовать вторую часть задуманного.
not_a_cat
 
Сообщения: 253
Зарегистрирован: 02 фев 2017, 03:32

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение mdsanta » 23 ноя 2017, 07:27

+ 2 тонны респекта :)
mdsanta
 
Сообщения: 306
Зарегистрирован: 04 окт 2016, 21:29

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение Belonda » 23 ноя 2017, 13:44

Мне тут подумалось как мог бы выглядеть оффлайн рынок и на ум приходит опыт игры path of exile.
На форуме PoE есть специальный торговый раздел https://www.pathofexile.com/forum/view-forum/standard-trading-shops
Каждая тема в торговом разделе это отдельный магазин конкретного персонажа. В формате хиха отдельная тема может содержать информацию как по одному бартер стенду так и по нескольким и по большей части это зависит от того как удобно сообществу.
Добившись в перспективе поддержки от разработчиков можно будет прикрутить парсинг в картинки предметов продажи как в торговых предложениях PoE.

Собственно как это будет выглядеть на практике.
В любой игровой клиент встраивается функция чтения содержимого бартер стендов и записывается в текстовый файл.
Содержимое текст файла копируется в новый топик на форуме обрамляя условным тегом
[super_trade_thread]название предмета | цена | количество | x-cord | y-cord[/super_trade_thread] (содержимое урезано для примера)
Скриптами форума содержимое тега парсится в удобный для просмотра вид включая ссылку на карту где по координатам из GET аргументов будет установлен маркер местонахождения бартер стенда.

Этот функционал не нарушает по моему мнению концепций самого ХиХа и фактически представляет возможности доступные любому игроку в игре.

А вот что бы нарушить концепции можно начать рассматривать вопрос создания агрегатора торговых предложений аналогичные PoE http://poe.trade :)
heaven and hearth: События
belondaatreides.github.io
Аватара пользователя
Belonda
 
Сообщения: 116
Зарегистрирован: 11 июл 2017, 00:17

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение Tobaz » 23 ноя 2017, 14:24

Мне кажется можно просто сохранять в csv, который нормально импортируется в гугл-документы. Частенько торговцы держат прайсы именно там.

Учитывая масштаб карт в игре и веб-картах (реальный размер тайла 100 на 100 пикселей) даже не стоит пытаться показывать там несколько маркеров рядом. Будет путаница.
Даже по положению одного маркера на карте будет непросто понять где именно нужный стенд. Придется или делать очень компактные маркеры или уменьшать масштаб карты.
Tobaz
 
Сообщения: 75
Зарегистрирован: 15 сен 2016, 10:24

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение LOMS » 23 ноя 2017, 14:31

Tobaz писал(а):Мне кажется можно просто сохранять в csv, который нормально импортируется в гугл-документы. Частенько торговцы держат прайсы именно там.

Учитывая масштаб карт в игре и веб-картах (реальный размер тайла 100 на 100 пикселей) даже не стоит пытаться показывать там несколько маркеров рядом. Будет путаница.
Даже по положению одного маркера на карте будет непросто понять где именно нужный стенд. Придется или делать очень компактные маркеры или уменьшать масштаб карты.

Либо я что-то пропустил, либо об отображении стендов на карте речь вообще не шла.
Но раз уж ты упомянул за маркеры, то это тоже зависит от реализации. В твоём городе кафе, отделения банков и торговые точки исчисляются сотнями и теснятся ещё плотнее, но наврядли ты испытываешь особый дискомфорт при работе с гугл/яндекс картами.
Аватара пользователя
LOMS
 
Сообщения: 1430
Зарегистрирован: 16 мар 2012, 05:07

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение Belonda » 23 ноя 2017, 15:11

Tobaz писал(а):Мне кажется можно просто сохранять в csv, который нормально импортируется в гугл-документы.

Запостить результаты чтения данных с бартер стендов на форуме и в гугл-документы чувствуется разница в количестве необходимых действий для рядового игруна? :)
Учитываем что логин на форуме по умолчанию есть у всех кто играет в ХиХ потому что этот логин создается автоматически в отличии от логина в гугл-документы.
Промолчу про сложности распространения информации в случае с гугл-документами.

Tobaz писал(а):даже не стоит пытаться показывать там несколько маркеров рядом.

Тот кто пойдет путем публикации всех бартер стендов на одной карте по умолчанию будет заниматься тем что рыть себе яму. :)
heaven and hearth: События
belondaatreides.github.io
Аватара пользователя
Belonda
 
Сообщения: 116
Зарегистрирован: 11 июл 2017, 00:17

Re: Коллективные рынки и проблемма бартер-стендов HELP!

Сообщение not_a_cat » 27 ноя 2017, 05:40

Список товаров CF в формате таблицы с поиском (фильтрацией) и сортировкой: https://certainly-not-a-cat.github.io/fair_report
Также прикручена svg-карта с метками стендов и маркером прилавка с товаром из списка под курсором.
 
Изображение
not_a_cat
 
Сообщения: 253
Зарегистрирован: 02 фев 2017, 03:32

Пред.След.

Вернуться в Programmer's Magic & Arcana

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

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