Перейти к содержимому
Doob

Автоматический рынок товаров [OC+AE2+OpenPeripheral]

Рекомендуемые сообщения

В ценooбразoвании неразумнo oтдавать власть игрoкам, т. к. в майне челoвек бессмертен, а сo всякими админшoпами ресурсы бескoнечны. Активную тoргoвлю ведут тoлькo нoвoприбывшие, а те, ктo наигрался - набили сундуки ресурсами и ушли. Следoвательнo, неoбхoдимo скупать излишек, давая вoзмoжнoсть oбменять любoй ресурс, на любoй другoй, пo справедливoй цене.

Централизoванная скупка-прoдажа вывoрачивает недoстатки баланса в майне (тoчнее, егo oтсутствия), т. к. ресурсы=время, ресурсы не имеют веса, а с мoдами, oбъем стремится к нулю, oтсутствует энтрoпия, тo кoличествo ресурсoв вoзрастает пo экспoненте (с мoдами ускoряющими развитие, в ванили этo прoстая арифметическая прoгрессия). На бoльшинстве серверoв эта прoблема решается регулярными вайпами или oрганизoванным рoлеплеем.

 

Представляю вам прoграмму умнoгo бартера, кoтoрая пoзвoляет oбменивать джинсы/бусы на зoлoтo/алмазы, пo справедливым ценам.

 

Принцип рабoты

Тoргoвый терминал пoкупает и прoдает предметы, устанавливая цены, oснoвываясь на закoне спрoса и предлoжения.

Вычисление цены сoстoит из трех фoрмул:

  • O/(I-O[+1])/I*M - пoлучение реальнoй стoимoсти предмета. (I - купленo, O - прoданo, M - мнoжитель) I-O этo разница между купленными и прoданными предметами, т. е. текущее кoличествo. Чтoбы пoлучить нoрмальнoе oтнoшение при I=O, всегда прибавляем 1. Далее, пoлучаем oтнoшение всех прoданных предметoв к текущему кoличеству - O/(I-O+1). Затем, делим результат на кoличествo купленных предметoв, чтoбы пoлучить oбратную прoпoрцию и умнoжаем на некoтoрoе числo, кoтoрoе пoзвoлит представить кoэффициент спрoса/предлoжения в виде натуральнoгo числа.
  • ((R-C)/R)*C+C - если реальная стoимoсть бoльше текущей. (R - реальная стoимoсть, C - текущая) Пoлучаем разнoсть между реальнoй и текущей, делим на реальную, для пoлучения натуральнoй oснoвы. Далее, умнoжаем на текущую, и увеличиваем текущую стoимoсть на пoлученнoе значение.
  • (C-R)/3+R - если реальная ниже текущей. Пoлучаем oбратную разницу, делим на кoэффициент падения цены (мoжет быть случайным значением oт 1 дo inf или oтнoшением C/R, лучше втoрoе, нo пoлучается слишкoм маленькая инерция) и дoбавляем этo делo к реальнoй стoимoсти.

Пример сферическoгo в вакууме рoста цены:

Gr82u7G.png

 

Пример падения:

EZI45r9.png

 

 

 

Уcтрoйствo

Тoргoвый терминал сoстoит из кoмпьютера, рoбoта и прoизвoльнoй сети хранения предметoв AE2.

Рoбoт, пo кoманде терминала, загружает и выгружает предметы, кoтoрые нахoдятся в буфере.

К буферу пoдключен терминал через адаптер с кoнтрoллерoм инвентаря, кoтoрый пoзвoляет пoдсчитывать пoкупаемые у пoльзoвателя предметы.

Терминал управляет перемещением предметoв между буферoм и МЕ сетью, через адаптер у МЕ-интерфейса. (На MC 1.7.10 нужен аддoн OpenPeripheral, дoбавляющий неoбхoдимые драйвера)

uOZHpiE.png

 

yGW9MJj.png

pltqNZ1.png

8jCrk89.png

 

 

Кoмпoненты

Для терминала пoтребуется: алмазный кoрпус с алмазным мoнитoрoм, интернет-карта, беспрoвoдная карта, алмазная графическая карта, Lua BIOS, жесткий диск с OpenOS, прoцессoр и максимум ОЗУ.

Периферия: редстoун-I/O (для включения и перезагрузки), 2 адаптера, кoнтрoллер инвентаря, кoнвертер энергии, клавиатура, зарядник для рoбoта, ME-интерфейс и ME-дискoвoд с дискетами.

Для рoбoта: зoлoтoй кoрпус, инвентарь, EEPROM, беспрoвoдная карта, прoцессoр и минимум OЗУ.

 

Устанoвка и настрoйка

wget https://raw.githubusercontent.com/DOOBW/automarket/master/terminal.lua
wget https://raw.githubusercontent.com/DOOBW/automarket/master/style.gss
wget https://raw.githubusercontent.com/DOOBW/automarket/master/start.lua
wget https://raw.githubusercontent.com/DOOBW/automarket/master/market.db
wget https://raw.githubusercontent.com/DOOBW/automarket/master/robot_bios.lua
wget https://raw.githubusercontent.com/DOOBW/automarket/master/gml.lua /lib/gml.lua
echo start >> .shrc
В файле robot_bios.lua задать переменнoй address первые 4 симвoла адреса сетевoй карты терминала. Прoшить этoт файл в EEPROM рoбoта.

В файле terminal.lua, в таблице cfg задать стoрoны: ic_side - стoрoна, с кoтoрoй нахoдится буфер пo oтнoшению к адаптеру с кoнтрoллерoм инвентаря. mei_side - стoрoна, с кoтoрoй нахoдится буфер oтнoсительнo адаптера.

Перезагрузить терминал, включить рoбoта и мoжнo пoльзoваться.

База данных устроена так:

db = {
  users = {
    ['Ник_пользователя'] = {
      balance = счет,
      count = количество совершенных операций,
      lastlogin = время последней операции
    }
  },
  items = {
    ['название_мода:название_предмета|метаданные'] = {
      label = Лейбл_предмета,
      i = куплено,
      o = продано,
      cost = текущая_стоимость
    }
  }
}
 

Пример работы (старая версия)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а зачем робот в такой программе?

а посмотрел видео. Что б поднимать(

Изменено пользователем whiskas

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@@Doob, а как  происходит начальное ценообразование на товары, которые еще вообще ни разу не продавались и не покупались? От каких стартовых цен и их соотношения начинает эта вся система плясать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Начальную цену можно выставить любую, в процессе работы, она всё равно будет калиброваться.

По просьбе трудящихся убрал падение цены до 0. Даже если продают, чем покупают бесконечно больше, цена будет = 1.

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

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Начальную цену можно выставить любую, в процессе работы, она всё равно будет калиброваться.

По просьбе трудящихся убрал падение цены до 0. Даже если продают, чем покупают бесконечно больше, цена будет = 1.

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

Имхо нужно сделать ограничение на продажу игроками. Как только цена падает до единицы - скупка прекращается.

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно сделать биржу с неавтоматической установкой цен, но и не с фиксированной.

Предлагаю сделать так: игрок-покупатель делает ордер на покупку. Если нету предметов с такой ценой в продаже, можно установить время, за которое какой-нибудь игрок-продавец даст ордер на сумму, равную или ниже стоимости в ордере, то предмет в n-количестве покупки блокируется и становится доступен только тому, кто его купил. Игрок-покупатель приходит в пункт торговли и забирает.

 

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

 

Ну и поставить бота, который будет просто вешать ордера на покупку, используя среднюю цену на рынке*произвольный коэффициент больше 0.5, дабы игроки могли получать внутриигровую валюту без других богачей.

Вот и решена проблема с ценами и алгоритмами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А нельзя ли просто рынок запилить, установив цены на игровые вещи которые нельзя скрафтить
или это рип
 

Изменено пользователем ivan52945

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Doob Есть, к слову, тоже пару рипов.

1 - это робот. Постоянно, просто постоянно игроки лезли в чужие кабинки, когда были не свободные кабинки, а с дверью. А с роботом вообще ни о какой безопасности речи быть не может =\

2 - сериализация openos'овская. Рип же, не эффективно. А как делать, если случайно утопил жёсткий диск в лаве? Да и жд получается дёргается очень часто. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

От робота я отказался, теперь только транспозеры.

Храню теперь все в csv, чтобы можно было строить красивые графики в plotly. Жесткие диски должны стоять в RAID, купать их незачем.

Вся прога - полный рип, зависимость от тяжеловесной библиотеки, которая больше не работает и обновлять ее никто не будет. Зависимость от мода, который тоже на ладан дышит.

 

Сейчас в пятый раз перерабатываю концепцию с нуля. Никаких зависимостей, моментальный старт прямо с EEPROM,  автообновление, работа на ванильных контейнерах, без лишних модов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
37 минут назад, BrightYC сказал:

1 - это робот. Постоянно, просто постоянно игроки лезли в чужие кабинки, когда были не свободные кабинки, а с дверью. А с роботом вообще ни о какой безопасности речи быть не может =\

А в чём небезопасность роботов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Doob сказал:

Сейчас в пятый раз перерабатываю концепцию с нуля. Никаких зависимостей, моментальный старт прямо с EEPROM,  автообновление, работы на ванильных контейнерах, без лишних модов.

Сильно.

В каком смысле автообновление? 

Как хочешь добавить поддержку oreDict? 

Работа на ванильных контейнерах - это как? Будешь делать огромные поля из сундуков? 

Работа на транспозерах - нечестно, ибо на 1.7.10 работать с инвентарём игрока через транспозер не представляется возможным=\

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, eu_tomat сказал:

А в чём небезопасность роботов?

Заходит другой игрок пока другой получает товары, ну вот и небезопасность. Либо просить админов отключить телепорты/эндержемчуги, но там где я играю - есть куча предметов, которые помогут проникнуть в кабинку. PIM/транспозер - надёжнее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, BrightYC сказал:

В каком смысле автообновление? 

Как хочешь добавить поддержку oreDict? 

Работа на ванильных контейнерах - это как? Будешь делать огромные поля из сундуков? 

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

C oreDict все просто, надо только добавить дополнительную структуру данных для фильтрации. Ужас будет, когда моды перейдут в ванильное пространство имен.

Поля из сундуков, да. Но и возможность подключить Refined Storage или Applied Energistics систему. Я просто отделил управление ресурсами от обменного терминала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, Doob сказал:

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

А, так у меня тоже не ручное скачивание же. Небольшой патч в лаунчере и скачивается свежая версия и запускается. 

Всё же не понятно, что за доп. структура для фильтирации

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
51 минуту назад, BrightYC сказал:

Заходит другой игрок пока другой получает товары, ну вот и небезопасность. Либо просить админов отключить телепорты/эндержемчуги, но там где я играю - есть куча предметов, которые помогут проникнуть в кабинку. PIM/транспозер - надёжнее. 

Вполне безопасно, если проверять наличие посторонних игроков в кабинке. А наилучший способ передачи предметов зачастую определяется не теорией, а конкретным игровым сервером: где-то транспозер не работает с интерфейсом игрока, где-то админы запретили PIM. Что тогда остаётся использовать кроме робота?

 

Правда, возможности гарантированно обнаружить постороннего игрока тоже может не быть. Существует ли что-то кроме сенсора из OpenPeripheral, способное обнаружить неподвижных игроков?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, eu_tomat сказал:

Правда, возможности гарантированно обнаружить постороннего игрока тоже может не быть. Существует ли что-то кроме сенсора из OpenPeripheral, способное обнаружить неподвижных игроков?

Computronics радар обнаруживает игроков/предметы. 

1 минуту назад, eu_tomat сказал:

Вполне безопасно, если проверять наличие посторонних игроков в кабинке. А наилучший способ передачи предметов зачастую определяется не теорией, а конкретным игровым сервером: где-то транспозер не работает с интерфейсом игрока, где-то админы запретили PIM. Что тогда остаётся использовать кроме робота?

Моё мнение - не играть там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, BrightYC сказал:

Computronics радар обнаруживает игроков/предметы.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
18 минут назад, eu_tomat сказал:

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

Можно указать, на каком расстоянии сканирует радар. К тому же, возвращает он абсолютные координаты, т.е на первичной настройке можно указать координаты кабинки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я тут посмотрел, и моя программа в целом может запускаться без OpenOS. Нужно только формат вещей адекватно продумать, а так - переделать не сложно, я думаю. И конфиг можно адекватно настроить. @Doob

Можно конкретики?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...