Помощь - Поиск - Пользователи - Календарь
Полная версия: Система торговли
UoKit.com Форумы > Ultima Online : Dev > Sphere Server > Архив готовых скриптов
KonstantiN
Обновленный скрипт от 7 числа этого месяца

Код

[comment information]
This script allows you to add 'tag.override.value' to any item in-game to modify the value of an item sold on a vendor.

Installation:

Open speakshopkeep.scp and replace the BUY command with NEW_BUY and the SELL command with NEW_SELL.

Enjoy.

[defname defnames_shop_sell]
vendor_limit_sell        25    //amount of items displayed in the sell list
vendor_limit_buy        25    //amount of items displayed in the buy list

vendor_limit_names        25    //limit of characters of items names in vendor list

[function new_buy]
if (<src.ischar>)
    if (<src.isplayer>)
        if !(<src.tag0.new_buysell>)
            src.tag.new_buysell=1
            src.timerf 1, tag.new_buysell=
            buy
            updatex
            src.timerf 1, f_packet_0x09e 0, <uid>
        endif
    endif
endif

[function new_sell]
if (<src.ischar>)
    if (<src.isplayer>)
        if !(<src.tag0.new_buysell>)
            src.tag.new_buysell=1
            src.timerf 1, tag.new_buysell=
            sell
            updatex
            src.timerf 1, f_packet_0x09e 1, <uid>
        endif
    endif
endif

[function f_packet_0x09e]
if (<uid.<argn2>.ischar>)
    if (<uid.<argn2>.npc>==brain_vendor)
        ctag.buysell=<argn1>
        if (<dargn1>==1)
            if (<uid.<argn2>.findlayer.28.rescount>)
                forcont <findlayer.21>
                    if (<uid.<argn2>.findlayer.28.findid.<baseid>>)
                        if (<tag0.override.value>) || (<value>)
                            if (<dlocal.x> < <ddef0.vendor_limit_sell>)
                                local.x += 1
                                local.uid<dlocal.x>=<uid>
                                local.uid<dlocal.x>.amount=<amount>
                                if (<tag0.override.value>)
                                    local.uid<dlocal.x>.value=<tag0.override.value>
                                else
                                    local.uid<dlocal.x>.value=<value>
                                endif
                            endif
                        endif
                    endif
                endfor
                if (<local.x>)
                    for x 1 <local.x>
                        if (strmatch(<local.packet>,0))
                            local.packet=d<local.uid<dlocal.x>>

w<uid.<local.uid<dlocal.x>>.dispiddec> w<uid.<local.uid<dlocal.x>>.color> w<uid.<local.uid<dlocal.x>>.amount>

w<uid.<local.uid<dlocal.x>>.value> w<qval <eval strlen(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ?

<eval strlen(<uid.<local.uid<dlocal.x>>.name>)>:<ddef0.vendor_limit_names>> <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <asc <uid.<local.uid<dlocal.x>>.name>>:<strsub 0

<ddef0.vendor_limit_names> <asc <uid.<local.uid<dlocal.x>>.name>>>>
                        else
                            local.packet=<local.packet> d<local.uid<dlocal.x>>

w<uid.<local.uid<dlocal.x>>.dispiddec> w<uid.<local.uid<dlocal.x>>.color> w<uid.<local.uid<dlocal.x>>.amount>

w<uid.<local.uid<dlocal.x>>.value> w<qval <eval strlen(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ?

<eval strlen(<uid.<local.uid<dlocal.x>>.name>)>:<ddef0.vendor_limit_names>> <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <asc <uid.<local.uid<dlocal.x>>.name>>:<strsub 0

<ddef0.vendor_limit_names> <asc <uid.<local.uid<dlocal.x>>.name>>>>
                        endif
                        local.packetlength += <eval <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <eval strlen(<uid.<local.uid<dlocal.x>>.name>)

>:<ddef0.vendor_limit_names>> +14>
                    endfor
                    if (<dlocal.x> > 5)
                        uid.<argn2>.speak You have many items I am interested in.
                    else
                        uid.<argn2>.speak What would you like to sell?
                    endif
                    sendpacket 09e w<eval <local.packetlength> +9> d<argn2> w<local.x> <local.packet>
                else
                    uid.<argn2>.speak Sorry you have nothing of interest.
                endif
            else
                uid.<argn2>.speak Sorry I am not buying any items at this time.
            endif
        else
            if (<uid.<argn2>.findlayer.26.rescount>)
                forcont <uid.<argn2>.findlayer.26>
                    if (<tag0.override.value>) || (<value>)
                        if (<dlocal.x> < <ddef0.vendor_limit_buy>)
                            local.x += 1
                            local.uid<dlocal.x>=<uid>
                            if (<tag0.override.value>)
                                local.uid<dlocal.x>.value=<tag0.override.value>
                            else
                                local.uid<dlocal.x>.value=<value>
                            endif
                        endif
                    endif
                endfor
                forcont <uid.<argn2>.findlayer.27>
                    if (<tag0.override.value>) || (<value>)
                        if (<dlocal.x> < <ddef0.vendor_limit_buy>)
                            local.x += 1
                            local.uid<dlocal.x>=<uid>
                            if (<tag0.override.value>)
                                local.uid<dlocal.x>.value=<tag0.override.value>
                            else
                                local.uid<dlocal.x>.value=<value>
                            endif
                        endif
                    endif
                endfor
                if (<local.x>)
                    for x 1 <local.x>
                        if (strmatch(<local.packet>,0))
                            local.packet=d<local.uid<dlocal.x>>

w<uid.<local.uid<dlocal.x>>.dispiddec> w<uid.<local.uid<dlocal.x>>.color> w<uid.<local.uid<dlocal.x>>.amount>

w<uid.<local.uid<dlocal.x>>.value> w<qval <eval strlen(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ?

<eval strlen(<uid.<local.uid<dlocal.x>>.name>)>:<ddef0.vendor_limit_names>> <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <asc <uid.<local.uid<dlocal.x>>.name>>:<asc <strsub 0

<ddef0.vendor_limit_names> <uid.<local.uid<dlocal.x>>.name>>>>
                        else
                            local.packet=<local.packet> d<local.uid<dlocal.x>>

w<uid.<local.uid<dlocal.x>>.dispiddec> w<uid.<local.uid<dlocal.x>>.color> w<uid.<local.uid<dlocal.x>>.amount>

w<uid.<local.uid<dlocal.x>>.value> w<qval <eval strlen(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ?

<eval strlen(<uid.<local.uid<dlocal.x>>.name>)>:<ddef0.vendor_limit_names>> <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <asc <uid.<local.uid<dlocal.x>>.name>>:<asc <strsub 0

<ddef0.vendor_limit_names> <uid.<local.uid<dlocal.x>>.name>>>>
                        endif
                        local.packetlength += <eval <qval <eval strlen

(<uid.<local.uid<dlocal.x>>.name>)> < <ddef0.vendor_limit_names> ? <eval strlen(<uid.<local.uid<dlocal.x>>.name>)

>:<ddef0.vendor_limit_names>> +14>
                    endfor
                    if (<dlocal.x> > 5)
                        uid.<argn2>.speak I have many goods for sale.
                    else
                        uid.<argn2>.speak What would you like yo buy?
                    endif
                    ctag.buysell=
                    sendpacket 09e w<eval <local.packetlength> +9> d<argn2> w<local.x> <local.packet>
                else
                    uid.<argn2>.speak Sorry I do not have any items in stock at this time.
                endif
            else
                uid.<argn2>.speak Sorry I am not selling any items at this time.
            endif
        endif
    endif
endif
return 1

[function f_packet_0x9f]
ref1=<local.char>
ref2=((<local.6> | (<local.5> * 256)) | (( <local.4> | (<local.3> * 256)) * 65536))
for x 1 <local.8>
    local.item<dlocal.x>=((<local.<eval <local.item> +12>> | (<local.<eval <local.item> +11>> * 256)) | ((

<local.<eval <local.item> +10>> | (<local.<eval <local.item> +9>> * 256)) * 65536))
    local.item<dlocal.x>.amount=(<local.<eval <local.item> +13>> | <local.<eval <local.item> +14>>)
    local.item += 6
endfor
if (<ref1.ctag0.buysell>)
    for x 1 <local.x>
        if (<ref1.findlayer.21.finduid.<local.item<dlocal.x>>>)
            if (<ref1.findlayer.21.finduid.<local.item<dlocal.x>>.amount>==<dlocal.item<dlocal.x>.amount>)
                local.value += <eval <ref1.findlayer.21.finduid.<local.item<dlocal.x>>.value> *

<dlocal.item<dlocal.x>.amount>>
                ref1.findlayer.21.finduid.<local.item<dlocal.x>>.remove
            elseif (<ref1.findlayer.21.finduid.<local.item<dlocal.x>>.amount> >=

<dlocal.item<dlocal.x>.amount>)
                local.value += <eval <ref1.findlayer.21.finduid.<local.item<dlocal.x>>.value> *

<dlocal.item<dlocal.x>.amount>>
            endif
        endif
    endfor
    if (<local.value>)
        if (<ref2.findlayer.29.more1> >= <local.value>)
            ref2.timerf 1, speak I have bought your items for <dlocal.value> gold pieces.
            if (<dlocal.value>==1)
                ref2.sound=53
            elseif (<dlocal.value> < 5)
                ref2.sound=54
            else
                ref2.sound=55
            endif
            ref2.findlayer.29.more1 -= <local.value>
            while (<dlocal.value> >= 65535)
                serv.newitem=i_gold
                new.amount=65535
                new.cont=<ref1.findlayer.21>
                local.value -= 65535
            endwhile
            if (<local.value> > 0)
                serv.newitem=i_gold
                new.amount=<local.value>
                new.cont=<ref1.findlayer.21>
            endif
            ref2.timerf 1, Thank you.
        else
            ref2.timerf 1, speak I can not afford to purchase that from  you.
        endif
    else
        ref2.timerf 1, speak Sorry, your items have no value to me.
    endif
else
    for x 1 <local.x>
        if (<uid.<local.item<dlocal.x>>.tag0.override.value>)
            local.cost += <uid.<local.item<dlocal.x>>.tag0.override.value>)
        else
            local.cost += <uid.<local.item<dlocal.x>>.value>
        endif
    endfor
    if (<eval <ref1.findlayer.21.rescount i_gold> +<ref1.findlayer.29.rescount i_gold>> >= <dlocal.cost>) ||

(<ref1.isgm>)
        for x 1 <local.x>
            if (<uid.<local.item<dlocal.x>>.amount>==<dlocal.item<dlocal.x>.amount>)
                uid.<local.item<dlocal.x>>.cont=<ref1.findlayer.21>
            else
                uid.<local.item<dlocal.x>>.amount -= <local.item<dlocal.x>.amount>
                serv.newitem=<uid.<local.item<dlocal.x>>.baseid>
                new.amount=<local.item<dlocal.x>.amount>
                new.cont=<ref1.findlayer.21>
            endif
            if (strmatch(<local.items>,0))
                local.items=<uid.<local.item<dlocal.x>>.name>
            else
                if !(<local.item<eval <local.x> +1>>)
                    local.items=<local.items>, and <uid.<local.item<dlocal.x>>.name>
                else
                    local.items=<local.items>, <uid.<local.item<dlocal.x>>.name>
                endif
            endif
        endfor
        ref2.timerf 1, speak Here <qval <dlocal.x>==1 ?is:are> your <qval <dlocal.x>==1 ?item:items>

<local.items>.
        ref2.timerf 1, speak That will be <dlocal.cost> gold.
        if (<dlocal.value>==1)
            ref2.sound=53
        elseif (<dlocal.value> < 5)
            ref2.sound=54
        else
            ref2.sound=55
        endif
        if !(<ref1.isgm>)
            ref2.findlayer.29.more1 += <local.cost>
            if (<ref2.findlayer.29.more1> > <ref2.findlayer.29.more2>)
                ref2.findlayer.29.more1=<ref2.findlayer.29.more2>
            endif
            forcont <ref1.findlayer.21>
                if (<local.cost>)
                    if (<type>==t_gold)
                        if (<amount> > <local.cost>)
                            amount -= <local.cost>
                            update
                            local.cost=
                        else
                            local.cost -= <amount>
                            remove
                        endif
                    endif
                endif
            endfor
            if (<local.cost>)
                forcont <ref1.findlayer.29>
                    if (<local.cost>)
                        if (<type>==t_gold)
                            if (<amount> > <local.cost>)
                                amount -= <local.cost>
                                update
                                local.cost=
                            else
                                local.cost -= <amount>
                                remove
                            endif
                        endif
                    endif
                endfor
            endif
        endif
        ref2.timerf 1, speak Thank you very much!
    else
        ref2.timerf 1, speak Sorry but you can not afford that.
    endif
endif
ref2.updatex
return 1

[eof]

vpopaj
постоянно ругается на строки с
uid.<argn2>.speak
Sirocco
src.timerf 1, f_packet_0x09e 1, <uid>

ну по идее это серийка вендора. Достаточно проверить что туда попадает. А в каком виде оно собственно ругается?
vpopaj
При продаже-покупке тупо крашит клиент, а если много вещей на продажу вендору , то тупо вылетает сервак.
Мне нужна функция , чтобы можно было продавать-покупать вещи от вендоров, на сумму более 9999 стандартных
vpopaj
Система идёт в треш. Багерская шляпа. Есть что-то рабочее , а то очень надо ...
Sirocco
Несовместимое устройство руки в слоте жопа детектед.
vpopaj
Если нечего сказать по теме - свободен уважаемый.... Детские подъ**ки оставь гоп подружкам, когда сЭмки будешь жЭвать на лавочке... Если будешь конечно..
Warstone
Есть. У меня. На RunUO. А сферойды - сами напишут.
vpopaj
Помощи опять же 0 =) А жаль... Если реально у кого-нибудь есть рабочая система для обычных веников - буду благодарен , если поделятся! tongue.gif
Sirocco
Цитата(vpopaj @ 16.1.2013, 0:10) *

Если нечего сказать по теме - свободен уважаемый.... Детские подъёбки оставь гоп подружкам, когда сЭмки будешь жЭвать на лавочке... Если будешь конечно..

А зачем же ты приперся ко мне на шард донимать этим вопросом персонал по гмпейджам... совсем мозг отказал?
vpopaj
Ты что-то путаешь! Какой шард ??!!
Sirocco
Цитата(vpopaj @ 16.1.2013, 14:30) *

Ты что-то путаешь! Какой шард ??!!

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

Ну чтож я тут отвечу... no way dude!
vpopaj
А, да, спалили меня =) Признаюсь. Но, ВЧИТЫВАЙСЯ в вопрос, - 9999 гп , а не вещей.
Sirocco
Цитата(vpopaj @ 17.1.2013, 0:40) *

А, да, спалили меня =) Признаюсь. Но, ВЧИТЫВАЙСЯ в вопрос, - 9999 гп , а не вещей.

ни слова про "гп" ни в одной теме... про 99999 стандартных, чего стандартных не ясно
Kanibal
Цитата(Sirocco @ 18.1.2013, 0:23) *

ни слова про "гп" ни в одной теме... про 99999 стандартных, чего стандартных не ясно


Еще есть ограничение на кучу с монетами в 65535 гп. Скоро и его будет обходить.
Sirocco
Цитата(Kanibal @ 18.1.2013, 7:21) *

Еще есть ограничение на кучу с монетами в 65535 гп. Скоро и его будет обходить.

Да легко... нужно просто расширить кол-во бит для переменной amount.
Doberman
С этого момента, пожалуйста, поподробнее.
Sirocco
Цитата(Doberman @ 18.1.2013, 9:28) *

С этого момента, пожалуйста, поподробнее.

Забей... Нужны исходники сферы...
Kanibal
Цитата(Sirocco @ 18.1.2013, 10:17) *

Забей... Нужны исходники сферы...


Сам же сказал легко, а теперь про исходники заговорил. Или просто так, где-то услышал и ляпнул про "кол-во бит для переменной amount".
Wap
Исходники клиента, скорее. Сфера не мешает скупать вещи дороже 65535, деньги начисляются верно, только отображение глючит, и глючит оно потому, что в пакетах скупки для цены выделено только 2 байта.
Kanibal
Цитата(Wap @ 18.1.2013, 10:43) *

Исходники клиента, скорее. Сфера не мешает скупать вещи дороже 65535, деньги начисляются верно, только отображение глючит, и глючит оно потому, что в пакетах скупки для цены выделено только 2 байта.


Ну WAP, исходники клиента получить и попровить вообще проще некуда. Достаточно только ASM знать на хорошем уровне.

Кстати как вариан переписать полностью всю систему торговли, тогда хоть миллионами продавать и покупать можно.
Sirocco
Цитата(Kanibal @ 18.1.2013, 12:42) *

Сам же сказал легко, а теперь про исходники заговорил. Или просто так, где-то услышал и ляпнул про "кол-во бит для переменной amount".

Ну так у нас то они есть...
Нужны именно исходники сферы... речь вообще не о скупке, а об ограничении переменной AMOUNT.
человек же сказал про кучку монеток...
Wap
Цитата(Sirocco @ 18.1.2013, 11:45) *

Ну так у нас то они есть...
Нужны именно исходники сферы... речь вообще не о скупке, а об ограничении переменной AMOUNT.
человек же сказал про кучку монеток...
Пост был такой:
Цитата(Kanibal @ 18.1.2013, 5:21) *

Еще есть ограничение на кучу с монетами в 65535 гп. Скоро и его будет обходить.
По-моему, человек говорит о кривом отображении сумм в скупке, если они превышают 65535. Это вытекает из протокола UO.
Sirocco
Извините мысли на расстоянии читать не умею, вижу только то что написано.
Kanibal
Цитата(Wap @ 18.1.2013, 13:18) *

Пост был такой:По-моему, человек говорит о кривом отображении сумм в скупке, если они превышают 65535. Это вытекает из протокола UO.


Нет, как раз было про <amount>
KonstantiN
Вы что тут тут демагогию развели, есть впоросы там ссылку в теме, для не понятлявых к автору, если ты на половину слепой или контуженый то к врачам сходи,а потом в общество людей приходи. остальные ну что вы мусор разводите, сами за него говрите и посмотрите что за топик ,а потом его содержание, при этом ни какого порядка ни когда тут быть не сможет, если так будем продолжать
vpopaj
Вот так явился злой содатель темы и всех построил =)
А на самом деле , пытался достучаться на Сфере Комьюнити до человека, который выкладывал скрипт там - без результата.. Всё осталось как есть. Будем ждать, время покажет =) cool.gif
KonstantiN
скай посдений билд и их скрипипак там много чего переделанно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.