Всем добра!
Хочу поделиться своим скриптом для Sphere 0.56b (на других не тестился).
Работает почти на 100%. Могут быть мелкие косяки.
Можно выставлять лоты, отменять, покупать, все как у людей.
Есть информация по каждому предмету. Базовые параметры, такие как Armor, Durability итд. + бонусы, такие как spell crit, speed cast, block итд. Все будет отображаться в информации о том или ином лоте (единственное что эти вещи нужно будет прописать вручную, для правильного отображения).
Есть фильтр. Аукцион можно сортировать на weapons/armor/resourses/containers и так далее.
Оформлена приятная навигация кнопок и текста.
Кому интересно - разберетесь.
Можете весь код кинуть в один файл или поделить его. Это уже как удобно.
Если будете использовать, пожалуйста, отмечайте автора. Буду благодарен.
СКРИН АУКА ТУТКод
// ============================================
// SPHERE 0.56B
// AUCTION SYSTEM BY MOLL DAYER 28.12.2025
// ============================================
[DEFNAME auction_settings]
AUCTION_TAX 5
AUCTION_MIN_PRICE 100
AUCTION_MAX_PRICE 100000000
AUCTION_MAX_SLOTS 10
AUCTION_DURATION 259200
AUCTION_CLEANUP_INTERVAL 600 // Проверка истекших каждые 10 минут
[CHARDEF n_auctioneer]
ID=c_man
NAME=Auctioneer
// CAN=010 | 02000 (MT_NONMOVER | MT_INVUL)
CAN=02012
ON=@Create
NPC=brain_vendor
COLOR=083ea
STR=100
DEX=100
INT=100
ITEMNEWBIE=i_shirt_plain
COLOR=0481
ITEMNEWBIE=i_pants_long
COLOR=0481
ITEMNEWBIE=i_boots_calf
COLOR=01
ON=@DClick
IF (<SRC.DISTANCE> > 3)
SRC.SYSMESSAGE @32 You are too far away.
RETURN 1
ENDIF
// Логика аукциона
f_auction_check_storage
SRC.CTAG0.auction_view = 1
SRC.CTAG0.auction_filter = 0
SRC.CTAG0.auction_info_item = 0
SRC.SDIALOG d_auction_interface
SAY @0481 Welcome to the Auction House, <SRC.NAME>!
RETURN 1
[FUNCTION f_auction_compact]
LOCAL.NEW_INDEX = 0
FOR n 1 <VAR0.auction_total_lots>
LOCAL.SLOT_UID = <VAR.auction_lot_<LOCAL.n>>
IF (<LOCAL.SLOT_UID>)
REF1 = <UID.<LOCAL.SLOT_UID>>
IF (<REF1>)
LOCAL.NEW_INDEX += 1
IF (<LOCAL.n> != <LOCAL.NEW_INDEX>)
VAR.auction_lot_<LOCAL.NEW_INDEX> = <LOCAL.SLOT_UID>
VAR.auction_lot_<LOCAL.n> =
ENDIF
ELSE
VAR.auction_lot_<LOCAL.n> =
ENDIF
ENDIF
ENDFOR
LOCAL.OLD_TOTAL = <VAR0.auction_total_lots>
VAR0.auction_total_lots = <LOCAL.NEW_INDEX>
FOR n <EVAL <LOCAL.NEW_INDEX> + 1> <LOCAL.OLD_TOTAL>
VAR.auction_lot_<LOCAL.n> =
ENDFOR
RETURN <LOCAL.NEW_INDEX>
[FUNCTION auction_compact_manual]
LOCAL.BEFORE = <SERV.VAR0.auction_total_lots>
LOCAL.AFTER = <f_auction_compact>
SYSMESSAGE @67 Compacted: <EVAL <LOCAL.BEFORE>> -> <EVAL <LOCAL.AFTER>> lots
SYSMESSAGE @67 Freed: <EVAL <LOCAL.BEFORE> - <LOCAL.AFTER>> slots
//////////////////////////////////////////////////////////////////////////////////////////////////
[DIALOG d_auction_interface]
50, 50
resizepic 0 0 3600 950 650
resizepic 10 10 3000 930 60
checkertrans 10 10 930 60
dtext 380 10 57 === AUCTION HOUSE ===
dtext 850 35 55 Gold: <EVAL <SRC.GOLD>>
IF (<SRC.CTAG0.auction_view> == 1)
button 50 35 2474 2474 1 0 1
dtext 90 35 55 Browse Auctions
ELSE
button 50 35 2151 2474 1 0 1
dtext 90 35 55 Browse Auctions
ENDIF
IF (0<SRC.CTAG0.auction_view> == 1)
button 50 35 2474 2474 1 0 1
dtext 90 35 55 Browse Auctions
ELSE
button 50 35 2151 2474 1 0 1
dtext 90 35 0481 Browse Auctions
ENDIF
IF (0<SRC.CTAG0.auction_view> == 2)
button 250 35 2474 2474 1 0 2
dtext 290 35 55 My Auctions
ELSE
button 250 35 2151 2474 1 0 2
dtext 290 35 0481 My Auctions
ENDIF
IF (0<SRC.CTAG0.auction_view> == 3)
button 450 35 9722 9722 1 0 3
dtext 490 35 55 Place New Lot
ELSE
button 450 35 9721 9724 1 0 3
dtext 490 35 0481 Place New Lot
ENDIF
///////////////////////////////////////////////////Кнопка Ресет, если надо
//button 650 35 4005 4007 1 0 4
//dtext 690 35 45 RESET
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CATEGORIES
resizepic 10 80 3000 180 560
checkertrans 10 80 180 560
dtext 50 90 1152 CATEGORIES
LOCAL.FILTER_Y = 120
FOR f 0 7
IF (<SRC.CTAG0.auction_filter> == <LOCAL.f>)
button 30 <LOCAL.FILTER_Y> 2474 2474 1 0 <EVAL 10 + <LOCAL.f>>
dtext 25 <LOCAL.FILTER_Y> 45 >
ELSE
button 30 <LOCAL.FILTER_Y> 2151 2474 1 0 <EVAL 10 + <LOCAL.f>>
ENDIF
LOCAL.FILTER_Y += 30
ENDFOR
LOCAL.COL0=0481
LOCAL.COL1=0481
LOCAL.COL2=0481
LOCAL.COL3=0481
LOCAL.COL4=0481
LOCAL.COL5=0481
LOCAL.COL6=0481
LOCAL.COL7=0481
IF (0<SRC.CTAG0.auction_filter> == 0)
LOCAL.COL0=55
ELIF (0<SRC.CTAG0.auction_filter> == 1)
LOCAL.COL1=55
ELIF (0<SRC.CTAG0.auction_filter> == 2)
LOCAL.COL2=55
ELIF (0<SRC.CTAG0.auction_filter> == 3)
LOCAL.COL3=55
ELIF (0<SRC.CTAG0.auction_filter> == 4)
LOCAL.COL4=55
ELIF (0<SRC.CTAG0.auction_filter> == 5)
LOCAL.COL5=55
ELIF (0<SRC.CTAG0.auction_filter> == 6)
LOCAL.COL6=55
ELIF (0<SRC.CTAG0.auction_filter> == 7)
LOCAL.COL7=55
ENDIF
dtext 70 120 <LOCAL.COL0> All Items
dtext 70 150 <LOCAL.COL1> Weapons
dtext 70 180 <LOCAL.COL2> Armor
dtext 70 210 <LOCAL.COL3> Shields
dtext 70 240 <LOCAL.COL4> Potions
dtext 70 270 <LOCAL.COL5> Resources
dtext 70 300 <LOCAL.COL6> Containers
dtext 70 330 <LOCAL.COL7> Other
dtext 40 615 65 By Moll Dayer v.1.8
resizepic 200 80 3000 540 560
checkertrans 200 80 540 560
IF (<SRC.CTAG0.auction_view> == 1)
dtext 400 90 1152 BROWSE AUCTIONS
LOCAL.VALID_COUNT = 0
LOCAL.MAX_LOTS = <VAR0.auction_total_lots>
FOR n 1 <LOCAL.MAX_LOTS>
LOCAL.SLOT_UID = <VAR0.auction_lot_<LOCAL.n>>
IF (<LOCAL.SLOT_UID>)
REF1 = <LOCAL.SLOT_UID>
IF (<REF1>)
LOCAL.PASS_FILTER = 0
IF (<SRC.CTAG0.auction_filter> == 0)
LOCAL.PASS_FILTER = 1
ELSE
LOCAL.ITEM_TYPE = <REF1.TYPE>
LOCAL.ITEM_CATEGORY = 7
IF (<LOCAL.ITEM_TYPE> == t_weapon_mace_smith) || (<LOCAL.ITEM_TYPE> == t_weapon_mace_sharp) || (<LOCAL.ITEM_TYPE> == t_weapon_sword) || (<LOCAL.ITEM_TYPE> == t_weapon_fence) || (<LOCAL.ITEM_TYPE> == t_weapon_bow) || (<LOCAL.ITEM_TYPE> == t_weapon_axe) || (<LOCAL.ITEM_TYPE> == t_weapon_xbow)
LOCAL.ITEM_CATEGORY = 1
ELIF (<LOCAL.ITEM_TYPE> == t_armor) || (<LOCAL.ITEM_TYPE> == t_armor_leather) || (<LOCAL.ITEM_TYPE> == t_clothing)
LOCAL.ITEM_CATEGORY = 2
ELIF (<LOCAL.ITEM_TYPE> == t_shield)
LOCAL.ITEM_CATEGORY = 3
ELIF (<LOCAL.ITEM_TYPE> == t_potion)
LOCAL.ITEM_CATEGORY = 4
ELIF (<LOCAL.ITEM_TYPE> == t_ore) || (<LOCAL.ITEM_TYPE> == t_ingot) || (<LOCAL.ITEM_TYPE> == t_log) || (<LOCAL.ITEM_TYPE> == t_board) || (<LOCAL.ITEM_TYPE> == t_leather) || (<LOCAL.ITEM_TYPE> == t_hide) || (<LOCAL.ITEM_TYPE> == t_cloth_bolt)
LOCAL.ITEM_CATEGORY = 5
ELIF (<LOCAL.ITEM_TYPE> == t_container)
LOCAL.ITEM_CATEGORY = 6
ENDIF
IF (<LOCAL.ITEM_CATEGORY> == <SRC.CTAG0.auction_filter>)
LOCAL.PASS_FILTER = 1
ENDIF
ENDIF
IF (<LOCAL.PASS_FILTER> == 1)
LOCAL.VALID_COUNT += 1
SRC.CTAG0.valid_lot_<LOCAL.VALID_COUNT> = <LOCAL.SLOT_UID>
ENDIF
ENDIF
ENDIF
ENDFOR
IF (<SRC.CTAG0.auction_page> > 0)
button 220 610 4014 4016 1 0 20
dtext 255 610 55 Previous Page
ENDIF
LOCAL.TOTAL_PAGES = <EVAL (<LOCAL.VALID_COUNT> - 1) / 8>
IF (<SRC.CTAG0.auction_page> < <LOCAL.TOTAL_PAGES>)
button 600 610 4005 4007 1 0 21
dtext 635 610 55 Next Page
ENDIF
dtext 210 100 55 Total: <EVAL <LOCAL.VALID_COUNT>>
SRC.CTAG0.valid_lot_count = <LOCAL.VALID_COUNT>
LOCAL.Y = 130
LOCAL.START = <EVAL (<SRC.CTAG0.auction_page> * 8) + 1>
LOCAL.END = <EVAL <LOCAL.START> + 7>
FOR n <LOCAL.START> <LOCAL.END>
IF (<LOCAL.n> <= <LOCAL.VALID_COUNT>)
LOCAL.LOT_UID = <SRC.CTAG0.valid_lot_<LOCAL.n>>
REF1 = <LOCAL.LOT_UID>
IF (<REF1.ISITEM>)
tilepichue 220 <LOCAL.Y> <REF1.DISPIDDEC> <EVAL <REF1.COLOR>>
dcroppedtext 280 <LOCAL.Y> 180 20 1152 <REF1.NAME>
dtext 470 <LOCAL.Y> 55 <EVAL <REF1.TAG0.auction_price>> gp
LOCAL.EXPIRE = <REF1.TAG0.auction_expire>
LOCAL.LEFT = <EVAL (<LOCAL.EXPIRE> - <SERV.TIME>) / 10>
IF (<LOCAL.LEFT> > 0)
LOCAL.HOURS = <EVAL <LOCAL.LEFT> / 3600>
LOCAL.DAYS = <EVAL <LOCAL.HOURS> / 24>
LOCAL.HOURS_LEFT = <EVAL <LOCAL.HOURS> % 24>
IF (<LOCAL.DAYS> > 0)
dtext 580 <LOCAL.Y> 995 <EVAL <LOCAL.DAYS>>d <EVAL <LOCAL.HOURS_LEFT>>h
ELSE
dtext 580 <LOCAL.Y> 995 <EVAL <LOCAL.HOURS>>h
ENDIF
ELSE
dtext 580 <LOCAL.Y> 32 Soon
ENDIF
button 650 <LOCAL.Y> 4005 4007 1 0 <EVAL 100 + <LOCAL.n>>
dtext 685 <LOCAL.Y> 67 BUY
button 209 <EVAL <LOCAL.Y> + 9> 2117 2118 1 0 <EVAL 5000 + <LOCAL.n>>
dtext 205 <EVAL <LOCAL.Y> + 25> 995 Info
LOCAL.Y += 55
ENDIF
ENDIF
ENDFOR
ELIF (<SRC.CTAG0.auction_view> == 2)
dtext 380 90 1152 MY ACTIVE LOTS
LOCAL.MY_COUNT = 0
FOR n 1 <VAR0.auction_total_lots>
LOCAL.SL_UID = <VAR0.auction_lot_<LOCAL.n>>
IF (<UID.<LOCAL.SL_UID>.ISITEM>)
IF (<UID.<LOCAL.SL_UID>.TAG0.auction_seller> == <SRC.UID>)
LOCAL.MY_COUNT += 1
SRC.CTAG0.my_lot_<LOCAL.MY_COUNT> = <LOCAL.SL_UID>
ENDIF
ENDIF
ENDFOR
IF (<SRC.CTAG0.auction_my_page> > 0)
button 220 610 4014 4016 1 0 30 // Кнопка Назад
dtext 255 610 55 Previous Page
ENDIF
IF (<LOCAL.MY_COUNT> > <LOCAL.END>)
button 600 610 4005 4007 1 0 31 // Кнопка Вперед
dtext 635 610 55 Next Page
ENDIF
dtext 210 100 55 Active: <EVAL <LOCAL.MY_COUNT>> / <EVAL <DEF.AUCTION_MAX_SLOTS>>
SRC.CTAG0.my_lot_count = <LOCAL.MY_COUNT>
LOCAL.Y = 130
LOCAL.START = <EVAL (<SRC.CTAG0.auction_my_page> * 8) + 1>
LOCAL.END = <EVAL <LOCAL.START> + 7>
FOR n <LOCAL.START> <LOCAL.END>
IF (<LOCAL.n> <= <LOCAL.MY_COUNT>)
LOCAL.LOT_UID = <SRC.CTAG0.my_lot_<LOCAL.n>>
REF1 = <LOCAL.LOT_UID>
IF (<REF1.ISITEM>)
tilepichue 220 <LOCAL.Y> <REF1.DISPIDDEC> <EVAL <REF1.COLOR>>
dcroppedtext 280 <LOCAL.Y> 180 20 1152 <REF1.NAME>
dtext 470 <LOCAL.Y> 55 <EVAL <REF1.TAG0.auction_price>> gp
// --- ВОЗВРАТ СЧЕТЧИКА ВРЕМЕНИ ---
LOCAL.EXPIRE = <REF1.TAG0.auction_expire>
LOCAL.LEFT = <EVAL (<LOCAL.EXPIRE> - <SERV.TIME>) / 10>
IF (<LOCAL.LEFT> > 0)
LOCAL.HOURS = <EVAL <LOCAL.LEFT> / 3600>
LOCAL.DAYS = <EVAL <LOCAL.HOURS> / 24>
LOCAL.HOURS_LEFT = <EVAL <LOCAL.HOURS> % 24>
IF (<LOCAL.DAYS> > 0)
dtext 580 <LOCAL.Y> 995 <EVAL <LOCAL.DAYS>>d <EVAL <LOCAL.HOURS_LEFT>>h
ELSE
dtext 580 <LOCAL.Y> 995 <EVAL <LOCAL.HOURS>>h
ENDIF
ELSE
dtext 580 <LOCAL.Y> 32 Soon
ENDIF
button 650 <LOCAL.Y> 4017 4018 1 0 <REF1.UID>
dtext 685 <LOCAL.Y> 45 CANCEL
button 209 <EVAL <LOCAL.Y> + 9> 2117 2118 1 0 <EVAL 6000 + <LOCAL.n>>
dtext 205 <EVAL <LOCAL.Y> + 25> 995 Info
LOCAL.Y += 55
ENDIF
ENDIF
ENDFOR
ENDIF
// --- ITEM INFO PANEL ---
resizepic 750 80 3000 190 560
checkertrans 750 80 190 560
dtext 815 90 1152 ITEM INFO
IF (<SRC.CTAG0.auction_info_item>)
REF1 = <SRC.CTAG0.auction_info_item>
IF (<REF1.ISITEM>)
dcroppedtext *760 110 170 40 1152 <REF1.NAME>
tilepichue 820 150 <REF1.DISPIDDEC> <EVAL <REF1.COLOR>>
dtext 760 620 55 Seller:
IF (<REF1.TAG0.auction_seller>)
dcroppedtext 800 620 170 20 995 <UID.<REF1.TAG0.auction_seller>.NAME>
ELSE
dtext 800 620 995 Unknown
ENDIF
LOCAL.Y = 180
IF (<REF1.TYPE>==t_armor) || (<REF1.TYPE>==t_armor_leather) || (<REF1.TYPE>==t_shield)
IF (<REF1.ARMOR> > 0)
dtext 760 <LOCAL.Y> 995 Armor: <EVAL <REF1.ARMOR>>
LOCAL.Y += 20
ENDIF
ENDIF
IF (<REF1.TYPE>==t_weapon_sword) || (<REF1.TYPE>==t_weapon_fence) || (<REF1.TYPE>==t_weapon_mace_sharp) || (<REF1.TYPE>==t_weapon_mace_staff) || (<REF1.TYPE>==t_weapon_bow) || (<REF1.TYPE>==t_weapon_axe)
dtext 760 <LOCAL.Y> 995 Damage: <REF1.DAM>
LOCAL.Y += 20
ENDIF
IF (<REF1.TYPE>==t_armor) || (<REF1.TYPE>==t_armor_leather) || (<REF1.TYPE>==t_shield) || (<REF1.TYPE>==t_weapon_sword) || (<REF1.TYPE>==t_weapon_fence) || (<REF1.TYPE>==t_weapon_mace_sharp) || (<REF1.TYPE>==t_weapon_mace_staff) || (<REF1.TYPE>==t_weapon_bow) || (<REF1.TYPE>==t_weapon_axe)
IF (<REF1.REQSTR> > 0)
dtext 760 <LOCAL.Y> 995 Req. Str: <EVAL <REF1.REQSTR>>
LOCAL.Y += 20
ENDIF
ENDIF
IF (<REF1.HITPOINTS> > 0)
dtext 760 <LOCAL.Y> 995 Durability: <EVAL <REF1.HITPOINTS>>/<EVAL <REF1.MAXHITS>>
LOCAL.Y += 30
ENDIF
/////////////////////////////////////////////////////////////////////////////////////////////////// === SET BONUSES ===
IF (<REF1.TAG0.level>)
dtext 760 <LOCAL.Y> 55 === SET BONUSES ===
LOCAL.Y += 20
dtext 760 <LOCAL.Y> 0481 Item Level: <EVAL <REF1.TAG0.level>>
LOCAL.Y += 20
IF (<REF1.ISEVENT.e_Gladiator>) || (STRMATCH("*Gladiator*","<REF1.NAME>")) || (STRMATCH("*Gladiator*","<REF1.TAG0.SET_NAME>"))
LOCAL.Y += 1
// Хар-ки
dtext 760 <LOCAL.Y> 57 HP: +<EVAL (5*<REF1.TAG0.level>)>
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 MP: +<EVAL (5*<REF1.TAG0.level>)>
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 SP: +<EVAL (5*<REF1.TAG0.level>)>
LOCAL.Y += 18
// Боевые бонусы
dtext 760 <LOCAL.Y> 57 Blocking: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Swing Speed: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Hit Chance: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Stamina Leech: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Mana Leech: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
// Урон и криты
dtext 760 <LOCAL.Y> 57 Phys Damage: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Phys Crit: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
// Магия
dtext 760 <LOCAL.Y> 57 Spell Damage: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Spell Crit: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
// Реген и лечение
dtext 760 <LOCAL.Y> 57 Heal Bonus: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Heal Crit: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
dtext 760 <LOCAL.Y> 57 Stability: +<EVAL <REF1.TAG0.level>>%
LOCAL.Y += 18
ELSE
dtext 760 <LOCAL.Y> 995 Set item (Lvl <EVAL <REF1.TAG0.level>>)
LOCAL.Y += 20
ENDIF
ENDIF
//////////////////////////////////////////////////////////////////////////////////////////////////
[DIALOG d_auction_interface button]
ON=0
RETURN 1
// --- Навигация и вкладки ---
ON=1 // Маркет (все лоты)
SRC.CTAG0.auction_view = 1
SRC.CTAG0.auction_page = 0
SRC.CTAG0.auction_info_item = 0
SRC.SDIALOG d_auction_interface
RETURN 1
ON=2 // Мои лоты
SRC.CTAG0.auction_view = 2
SRC.CTAG0.auction_my_page = 0
SRC.CTAG0.auction_info_item = 0
SRC.SDIALOG d_auction_interface
RETURN 1
ON=3 // Выставить новый лот
SRC.f_auction_count_my_lots
IF (<SRC.TAG0.auction_my_lots> >= <DEF.AUCTION_MAX_SLOTS>)
SRC.SYSMESSAGE @32 Maximum slots reached!
SRC.SDIALOG d_auction_interface
RETURN 1
ENDIF
SRC.SYSMESSAGE @0488 Target item to sell
SRC.TARGETFG f_auction_target_item
RETURN 1
ON=4 // Полный сброс (Админ-функция, если надо)
IF (<SRC.ISGM>)
SERV.VAR0.auction_total_lots = 0
FOR n 1 1000
SERV.VAR.auction_lot_<LOCAL.n> =
ENDFOR
SRC.SYSMESSAGE @0488 FULL AUCTION RESET!
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
// --- Фильтры категорий ---
ON=10 17
SRC.CTAG0.auction_filter = <EVAL <ARGN1>-10>
SRC.CTAG0.auction_page = 0
SRC.SDIALOG d_auction_interface
RETURN 1
// --- Листание страниц ---
ON=20 // Назад (Общий список)
IF (<SRC.CTAG0.auction_page> > 0)
SRC.CTAG0.auction_page -= 1
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
ON=21 // Вперед (Общий список)
// Высчитываем общее кол-во страниц (по 8 лотов на стр)
LOCAL.TOTAL_PAGES = <EVAL (<SRC.CTAG0.valid_lot_count> - 1) / 8>
IF (<SRC.CTAG0.auction_page> < <LOCAL.TOTAL_PAGES>)
SRC.CTAG0.auction_page += 1
ELSE
SRC.SYSMESSAGE @32 This is the last page.
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
ON=30 // Назад (Мои лоты)
IF (<SRC.CTAG0.auction_my_page> > 0)
SRC.CTAG0.auction_my_page -= 1
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
ON=31 // Вперед (Мои лоты)
// Высчитываем общее кол-во страниц для моих лотов
LOCAL.TOTAL_PAGES = <EVAL (<SRC.CTAG0.my_lot_count> - 1) / 8>
IF (<SRC.CTAG0.auction_my_page> < <LOCAL.TOTAL_PAGES>)
SRC.CTAG0.auction_my_page += 1
ELSE
SRC.SYSMESSAGE @32 This is the last page.
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
// --- Кнопки покупки (Диапазон 100-200) ---
ON=100 200
LOCAL.INDEX = <EVAL <ARGN1> - 100>
LOCAL.UID = <SRC.CTAG0.valid_lot_<LOCAL.INDEX>>
IF (<UID.<LOCAL.UID>>)
SRC.f_auction_buy <LOCAL.UID>
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
// --- Кнопки INFO (Диапазоны 5000 и 6000) ---
ON=5000 5100
LOCAL.INDEX = <EVAL <ARGN1> - 5000>
LOCAL.UID = <SRC.CTAG0.valid_lot_<LOCAL.INDEX>>
IF (<UID.<LOCAL.UID>>)
SRC.CTAG0.auction_info_item = <LOCAL.UID>
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
ON=6000 6100
LOCAL.INDEX = <EVAL <ARGN1> - 6000>
LOCAL.UID = <SRC.CTAG0.my_lot_<LOCAL.INDEX>>
IF (<UID.<LOCAL.UID>>)
SRC.CTAG0.auction_info_item = <LOCAL.UID>
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
// --- ОБРАБОТЧИК UID (ОТМЕНА ЛОТА) ---
// Этот блок должен быть последним. Он ловит ID кнопки, который является UID-ом предмета.
ON=0 0FFFFFFFF
IF (<UID.<ARGN1>.ISITEM>)
REF1 = <ARGN1>
IF (<REF1.TAG0.auction_seller> == <SRC.UID>)
// ОБЯЗАТЕЛЬНО: Обнуляем инфо-тег перед удалением!
SRC.CTAG0.auction_info_item = 0
SRC.f_auction_cancel <REF1.UID>
ENDIF
ENDIF
SRC.SDIALOG d_auction_interface
RETURN 1
//////////////////////////////////////////////////////////////////////////////////////////////////
[DIALOG d_auction_set_price]
200, 200
resizepic 0 0 3600 400 280
checkertrans 0 0 400 280
dtext 140 20 1152 === SET PRICE ===
IF (<UID.<SRC.CTAG0.auction_temp_item_src>>)
tilepichue 50 80 <UID.<SRC.CTAG0.auction_temp_item_src>.DISPIDDEC> <EVAL <UID.<SRC.CTAG0.auction_temp_item_src>.COLOR>>
dcroppedtext 130 80 200 20 67 <UID.<SRC.CTAG0.auction_temp_item_src>.NAME>
ENDIF
dtext 50 120 55 Price (min <EVAL <DEF.AUCTION_MIN_PRICE>>):
resizepic 50 145 3000 300 30
dtextentry 60 150 280 20 0fc 1
dtext 50 180 995 Duration: <EVAL <DEF.AUCTION_DURATION> / 86400> days
button 120 235 2076 2075 1 0 1
dtext 160 235
button 240 235 2073 2072 1 0 0
dtext 280 235
//////////////////////////////////////////////////////////////////////////////////////////////////
[DIALOG d_auction_set_price button]
ON=0
SRC.CTAG0.auction_temp_item_src =
SRC.SYSMESSAGE @995 Cancelled
SRC.SDIALOG d_auction_interface
RETURN 1
ON=1
LOCAL.P = <ARGTXT[1]>
IF !(<ISNUM <LOCAL.P>>)
SRC.SYSMESSAGE @32 Invalid number
SRC.SDIALOG d_auction_set_price
RETURN 1
ENDIF
IF (<EVAL <LOCAL.P>> < <DEF.AUCTION_MIN_PRICE>)
SRC.SYSMESSAGE @32 Too low
SRC.SDIALOG d_auction_set_price
RETURN 1
ENDIF
LOCAL.TEMP_UID = <SRC.CTAG0.auction_temp_item_src>
LOCAL.TEMP_PRICE = <EVAL <LOCAL.P>>
SRC.f_auction_place <LOCAL.TEMP_UID>,<LOCAL.TEMP_PRICE>
SRC.CTAG0.auction_temp_item_src =
SRC.SDIALOG d_auction_interface
RETURN 1
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_check_storage]
IF !(<VAR.auction_storage>) || !(<UID.<VAR.auction_storage>>)
f_auction_init
ENDIF
[FUNCTION f_auction_init]
IF !(<VAR.auction_storage>) || !(<UID.<VAR.auction_storage>>)
SERV.NEWITEM i_bag
NEW.P = 5283 1184 0
NEW.ATTR = attr_invis|attr_static|attr_move_never
NEW.NAME = Auction Storage
VAR.auction_storage = <NEW.UID>
ENDIF
IF !(<VAR0.auction_total_lots>)
VAR0.auction_total_lots = 0
ENDIF
IF !(<VAR0.auction_timer_active>)
VAR0.auction_timer_active = 1
TIMERF <DEF.AUCTION_CLEANUP_INTERVAL>,f_auction_timer
ENDIF
[FUNCTION f_auction_check_expired]
LOCAL.EXPIRED_COUNT = 0
LOCAL.NOW = <SERV.TIME>
LOCAL.MAX_LOTS = <VAR0.auction_total_lots>
FOR n 1 <LOCAL.MAX_LOTS>
LOCAL.SLOT_UID = <VAR.auction_lot_<LOCAL.n>>
IF (<LOCAL.SLOT_UID>)
REF1 = <UID.<LOCAL.SLOT_UID>>
IF (<REF1>)
IF (<REF1.TAG.auction_expire> < <LOCAL.NOW>)
LOCAL.SELLER = <REF1.TAG.auction_seller>
IF (<UID.<LOCAL.SELLER>>)
IF (<UID.<LOCAL.SELLER>.ISONLINE>)
UID.<LOCAL.SELLER>.SYSMESSAGE @32 [AUCTION] Lot expired: <REF1.NAME>
ENDIF
ENDIF
REF1.REMOVE
VAR.auction_lot_<LOCAL.n> =
LOCAL.EXPIRED_COUNT += 1
ENDIF
ELSE
VAR.auction_lot_<LOCAL.n> =
ENDIF
ENDIF
ENDFOR
IF (<LOCAL.EXPIRED_COUNT> > 0)
f_auction_compact
ENDIF
RETURN <LOCAL.EXPIRED_COUNT>
[FUNCTION f_auction_timer]
f_auction_check_expired
TIMERF <DEF.AUCTION_CLEANUP_INTERVAL>,f_auction_timer
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_target_item]
f_auction_check_storage
IF !(<ARGO>)
SRC.SYSMESSAGE @32 Not an item
RETURN 1
ENDIF
IF (<ARGO.CONT> != <SRC.FINDLAYER.21.UID>)
SRC.SYSMESSAGE @32 Must be in backpack
RETURN 1
ENDIF
IF (<ARGO.ATTR> & attr_newbie) || (<ARGO.ATTR> & attr_blessed)
SRC.SYSMESSAGE @32 Cannot sell blessed items
RETURN 1
ENDIF
SRC.CTAG0.auction_temp_item_src = <ARGO.UID>
SRC.SDIALOG d_auction_set_price
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_copy_item_tags]
LOCAL.SRC_UID = <ARGV[0]>
LOCAL.DST_UID = <ARGV[1]>
IF !(<UID.<LOCAL.SRC_UID>>) || !(<UID.<LOCAL.DST_UID>>)
RETURN 0
ENDIF
REF1 = <UID.<LOCAL.SRC_UID>>
REF2 = <UID.<LOCAL.DST_UID>>
IF (<REF1.HITPOINTS>)
REF2.HITPOINTS = <REF1.HITPOINTS>
REF2.MAXHITS = <REF1.MAXHITS>
ENDIF
TRY REF2.TAG.level = <REF1.TAG0.level>
TRY REF2.TAG.SET_ID = <REF1.TAG.SET_ID>
TRY REF2.TAG.SET_NAME = <REF1.TAG.SET_NAME>
TRY REF2.TAG.ench_type = <REF1.TAG0.ench_type>
// Бонусы сетов
TRY REF2.TAG.char_blocking = <REF1.TAG0.char_blocking>
TRY REF2.TAG.swingincrease = <REF1.TAG0.swingincrease>
TRY REF2.TAG.hitchanceincrease = <REF1.TAG0.hitchanceincrease>
TRY REF2.TAG.stamleech = <REF1.TAG0.stamleech>
TRY REF2.TAG.manaleech = <REF1.TAG0.manaleech>
TRY REF2.TAG.char_healbonus = <REF1.TAG0.char_healbonus>
TRY REF2.TAG.char_healcrit = <REF1.TAG0.char_healcrit>
TRY REF2.TAG.char_stability = <REF1.TAG0.char_stability>
TRY REF2.TAG.char_speed_damage = <REF1.TAG0.char_speed_damage>
TRY REF2.TAG.modfizdamage = <REF1.TAG0.modfizdamage>
TRY REF2.TAG.char_fiz_critical_damage = <REF1.TAG0.char_fiz_critical_damage>
TRY REF2.TAG.modspelldamage = <REF1.TAG0.modspelldamage>
TRY REF2.TAG.char_spell_critical_damage = <REF1.TAG0.char_spell_critical_damage>
// бонусы
TRY REF2.TAG.MODBONUS1 = <REF1.TAG.MODBONUS1>
TRY REF2.TAG.MODBONUS2 = <REF1.TAG.MODBONUS2>
TRY REF2.TAG.MODBONUS3 = <REF1.TAG.MODBONUS3>
TRY REF2.TAG.BONUS_MOD1 = <REF1.TAG.BONUS_MOD1>
TRY REF2.TAG.BONUS_MOD2 = <REF1.TAG.BONUS_MOD2>
TRY REF2.TAG.BONUS_MOD3 = <REF1.TAG.BONUS_MOD3>
RETURN 1
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_place]
LOCAL.ORIG_UID = <ARGV[0]>
LOCAL.P = <ARGV[1]>
IF !(<UID.<LOCAL.ORIG_UID>>)
SRC.SYSMESSAGE @32 Item lost
RETURN 1
ENDIF
REF1 = <UID.<LOCAL.ORIG_UID>>
SERV.NEWITEM <REF1.DEFNAME>
NEW.AMOUNT = <REF1.AMOUNT>
NEW.COLOR = <REF1.COLOR>
NEW.NAME = <REF1.NAME>
NEW.ATTR = attr_invis
NEW.CONT = <VAR.auction_storage>
f_auction_copy_item_tags <LOCAL.ORIG_UID>,<NEW.UID>
NEW.TAG.auction_seller = <SRC.UID>
NEW.TAG.auction_price = <LOCAL.P>
NEW.TAG.auction_expire = <EVAL <SERV.TIME> + (<DEF.AUCTION_DURATION> * 10)>
NEW.UPDATE
VAR0.auction_total_lots = <EVAL <VAR0.auction_total_lots> + 1>
VAR.auction_lot_<VAR0.auction_total_lots> = <NEW.UID>
REF1.REMOVE
SRC.UPDATE
SRC.SYSMESSAGE @0488 Listed for <EVAL <LOCAL.P>> gold
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_buy]
LOCAL.I = <ARGV[0]>
IF !(<UID.<LOCAL.I>>)
SRC.SYSMESSAGE @32 Gone
RETURN 1
ENDIF
REF1 = <UID.<LOCAL.I>>
LOCAL.P = <REF1.TAG.auction_price>
LOCAL.S = <REF1.TAG.auction_seller>
IF (<SRC.UID> == 0<LOCAL.S>)
SRC.SYSMESSAGE @32 Your own lot
RETURN 1
ENDIF
IF (<SRC.GOLD> < <EVAL 0<LOCAL.P>>)
SRC.SYSMESSAGE @32 Need <EVAL <LOCAL.P>> gold
RETURN 1
ENDIF
SRC.GOLD -= <LOCAL.P>
LOCAL.TAX = <EVAL (<LOCAL.P> * <DEF.AUCTION_TAX>) / 100>
LOCAL.PROFIT = <EVAL <LOCAL.P> - <LOCAL.TAX>>
IF (<UID.<LOCAL.S>>)
UID.<LOCAL.S>.NEWGOLD <LOCAL.PROFIT>
IF (<UID.<LOCAL.S>.ISONLINE>)
UID.<LOCAL.S>.SYSMESSAGE @0488 [AUCTION] Sold! +<EVAL <LOCAL.PROFIT>> gold
ENDIF
ENDIF
SERV.NEWITEM <REF1.DEFNAME>
NEW.AMOUNT = <REF1.AMOUNT>
NEW.COLOR = <REF1.COLOR>
NEW.NAME = <REF1.NAME>
NEW.CONT = <SRC.FINDLAYER.21.UID>
f_auction_copy_item_tags <LOCAL.I>,<NEW.UID>
NEW.BOUNCE
NEW.UPDATE
REF1.REMOVE
f_auction_remove_lot <LOCAL.I>
SRC.UPDATE
SRC.SYSMESSAGE @0488 Bought!
[FUNCTION f_auction_remove_lot]
LOCAL.LOT_UID = <ARGV[0]>
IF !(<LOCAL.LOT_UID>)
RETURN 0
ENDIF
LOCAL.TOTAL = <EVAL 0<VAR0.auction_total_lots>>
LOCAL.DONE = 0
FOR n 1 <LOCAL.TOTAL>
IF (<LOCAL.DONE> == 0)
IF (0<VAR0.auction_lot_<LOCAL.n>> == <LOCAL.LOT_UID>)
FOR m <LOCAL.n> <EVAL <LOCAL.TOTAL> - 1>
LOCAL.NEXT = <EVAL <LOCAL.m> + 1>
VAR.auction_lot_<LOCAL.m> = <VAR0.auction_lot_<LOCAL.NEXT>>
ENDFOR
VAR.auction_lot_<LOCAL.TOTAL> =
VAR0.auction_total_lots = <EVAL <LOCAL.TOTAL> - 1>
LOCAL.DONE = 1
ENDIF
ENDIF
ENDFOR
RETURN <LOCAL.DONE>
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_cancel]
REF1 = <ARGV[0]>
IF !(<REF1.ISITEM>)
RETURN 1
ENDIF
// 1. Возвращаем предмет игроку (в пак)
REF1.CONT = <SRC.FINDLAYER.21.UID>
REF1.UPDATE
// 2. Удаляем запись из базы аукциона
f_auction_remove_lot <REF1.UID>
SRC.SYSMESSAGE @67 Lot canceled and returned to your backpack.
RETURN 1
//////////////////////////////////////////////////////////////////////////////////////////////////
[FUNCTION f_auction_count_my_lots]
LOCAL.CNT = 0
LOCAL.MAX_LOTS = <VAR0.auction_total_lots>
IF !(<LOCAL.MAX_LOTS>)
LOCAL.MAX_LOTS = 0
ENDIF
FOR n 1 <LOCAL.MAX_LOTS>
LOCAL.SLOT_UID = <VAR.auction_lot_<LOCAL.n>>
IF (<LOCAL.SLOT_UID>)
REF1 = <UID.<LOCAL.SLOT_UID>>
IF (<REF1>)
IF (<REF1.TAG.auction_seller> == <SRC.UID>)
LOCAL.CNT += 1
ENDIF
ENDIF
ENDIF
ENDFOR
SRC.TAG0.auction_my_lots = <LOCAL.CNT>
[FUNCTION auction_force_cleanup]
LOCAL.CLEANED = <f_auction_check_expired>
SYSMESSAGE @67 Cleaned <EVAL <LOCAL.CLEANED>> expired lots
IF (<LOCAL.CLEANED> > 0)
SYSMESSAGE @67 Array was auto-compacted
ENDIF
[FUNCTION auction_reset_timer]
SERV.VAR0.auction_timer_active = 0
f_auction_init
SYSMESSAGE @67 Timer restarted
[FUNCTION auction_stats]
SYSMESSAGE @67 === AUCTION STATS ===
SYSMESSAGE @67 Total lots: <SERV.VAR0.auction_total_lots>
SYSMESSAGE @67 Timer active: <SERV.VAR0.auction_timer_active>
LOCAL.REAL_COUNT = 0
LOCAL.MAX_LOTS = <SERV.VAR0.auction_total_lots>
FOR n 1 <LOCAL.MAX_LOTS>
IF (<SERV.VAR.auction_lot_<LOCAL.n>>)
IF (<UID.<SERV.VAR.auction_lot_<LOCAL.n>>>)
LOCAL.REAL_COUNT += 1
ENDIF
ENDIF
ENDFOR
SYSMESSAGE @67 Real items: <EVAL <LOCAL.REAL_COUNT>>
IF (<LOCAL.MAX_LOTS> > 0)
LOCAL.EFFICIENCY = <EVAL (100 * <LOCAL.REAL_COUNT>) / <LOCAL.MAX_LOTS>>
SYSMESSAGE @67 Array efficiency: <EVAL <LOCAL.EFFICIENCY>>%
ELSE
SYSMESSAGE @67 Array efficiency: N/A (empty)
ENDIF
LOCAL.HOLES = <EVAL <LOCAL.MAX_LOTS> - <LOCAL.REAL_COUNT>>
IF (<LOCAL.HOLES> > 0)
SYSMESSAGE @32 Holes in array: <EVAL <LOCAL.HOLES>>
SYSMESSAGE @32 Use .auction_compact_manual to fix
ELSE
SYSMESSAGE @67 Array is compact (no holes)
ENDIF
[FUNCTION auction_info]
SYSMESSAGE @67 =============================
SYSMESSAGE @67 AUCTION SYSTEM INFO
SYSMESSAGE @67 =============================
SYSMESSAGE @995 Settings:
SYSMESSAGE @995 - Tax: <DEF.AUCTION_TAX>%
SYSMESSAGE @995 - Min price: <DEF.AUCTION_MIN_PRICE> gp
SYSMESSAGE @995 - Max price: <DEF.AUCTION_MAX_PRICE> gp
SYSMESSAGE @995 - Max slots per player: <DEF.AUCTION_MAX_SLOTS>
SYSMESSAGE @995 - Duration: <EVAL <DEF.AUCTION_DURATION> / 86400> days
SYSMESSAGE @995 - Cleanup interval: <EVAL <DEF.AUCTION_CLEANUP_INTERVAL> / 60> min
SYSMESSAGE @67 Current state:
auction_stats
///////////////////////////////////////////////////////////////////////////
IF (<SERV.VAR.auction_storage>)
IF (<UID.<SERV.VAR.auction_storage>>)
REF1 = <UID.<SERV.VAR.auction_storage>>
SYSMESSAGE @995 Storage container: OK
SYSMESSAGE @995 - UID: <REF1.UID>
SYSMESSAGE @995 - Location: <REF1.P>
LOCAL.ITEMS_IN_STORAGE = 0
FOR 0 <EVAL <REF1.CONTENTS> - 1>
LOCAL.ITEMS_IN_STORAGE += 1
ENDFOR
SYSMESSAGE @995 - Items inside: <EVAL <LOCAL.ITEMS_IN_STORAGE>>
ELSE
SYSMESSAGE @32 Storage container: MISSING!
SYSMESSAGE @32 Use .auction_reset to recreate
ENDIF
ELSE
SYSMESSAGE @32 Storage not initialized!
ENDIF
LOCAL.BROKEN_LOTS = 0
LOCAL.MAX_LOTS = <SERV.VAR0.auction_total_lots>
FOR n 1 <LOCAL.MAX_LOTS>
LOCAL.SLOT_UID = <SERV.VAR.auction_lot_<LOCAL.n>>
IF (<LOCAL.SLOT_UID>)
IF !(<UID.<LOCAL.SLOT_UID>>)
LOCAL.BROKEN_LOTS += 1
ENDIF
ENDIF
ENDFOR
IF (<LOCAL.BROKEN_LOTS> > 0)
SYSMESSAGE @32 Broken lots found: <EVAL <LOCAL.BROKEN_LOTS>>
SYSMESSAGE @32 Use .auction_compact to fix
ENDIF
// ========== ПОЛЬЗОВАТЕЛЬСКИЕ КОМАНДЫ ==========
[PLEVEL 1]
auction
auc
[FUNCTION auction]
LOCAL.FOUND = 0
FORINSTANCES n_auctioneer
IF (<DISTANCE> < 20)
TARGETF <UID>,f_auction_open_stone
LOCAL.FOUND = 1
RETURN 1
ENDIF
ENDFOR
IF !(<LOCAL.FOUND>)
SYSMESSAGE @32 No auction stone nearby!
ENDIF
[FUNCTION f_auction_open_stone]
IF (<ARGO.TYPE> == t_normal)
IF (STRMATCH("*Auction Stone*","<ARGO.NAME>"))
ARGO.CLICK
ENDIF
ENDIF
[EOF]