Здравствуйте, гость ( Вход | Регистрация )

> Auction System, Sphere 0.56b
Moll Dayer
сообщение 17.1.2026, 2:47
Сообщение #1


**

Neophyte
Сообщений: 17
Регистрация: 1.12.2021
Группа: Пользователи
Наличность: 95
Пользователь №: 20.137
Возраст: 36



Всем добра!
Хочу поделиться своим скриптом для 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]

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



Ответить в эту темуОткрыть новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 4.2.2026, 9:28
Designed by Nickostyle