XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
MyRtZ

offline
Опыт: 6,530
Активность:
Приказ на продажу предмета
Приветствую
Работая с действиями над игроком который вышел из игры возник один вопрос:
Можно ли отдать приказ(ы) юниту на то что бы он продал предмет(ы) в его инвентаре?
После продажи предметов будет произведена раздача золота ливнувшего игрока союзникам, это очевидно.
В поиске ничего подобного не нашел
Старый 17.01.2011, 09:56
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
MyRtZ, сдается мне что нет, нужно делать через БД..
Старый 17.01.2011, 10:02
Метаморф
Карающая сила НЯ!
offline
Опыт: 7,528
Активность:
Если подумать, то можно. В принципе, это мазохизм и достаточно муторно на GUI (так как джасс мне не доступен), но всё же возможно. Придётся делать условие для каждого слота героя принадлежащего ливнувшему игроку, что если в слоте находится такая-то вещь, то она изымается, цену мы знаем изначально, офк, эта цена X. Каждому игроку добавляется голды X / на количество игроков. Всё осложняется кол-вом вещей...но создав отдельную категорию для лива копипастой можно сделать это быстрее.

Как-то так.
Старый 17.01.2011, 12:17
JassMan
свободен
offline
Опыт: 4,193
Активность:
local unit u=герой
local unit c=магазин (лавка)
local integer i=1
loop
    call IssueTargetOrder(u,"smart",UnitItemInSlot(u,i))
    call IssueTargetOrder(u,"smart",c)
    exitwhen(i==6)
    set i=i+1
endloop
это при условии что все слоты предметов заполнены. а так нужно еще проверять если в каждом слоте предмет
Старый 17.01.2011, 12:18
MyRtZ

offline
Опыт: 6,530
Активность:
Спасибо, сейчас затестирую
Старый 17.01.2011, 12:24
JassMan
свободен
offline
Опыт: 4,193
Активность:
Также нужно учесть, что все это происходит мгновенно, поэтому если юнит находится не рядом с магазином, то действия не успеют проделаться (наложатся друг на друга), и только последний предмет юнит побежит продавать — всё это будет, если юнит будет дальше дистанции [радиуса продажи предмета]
поэтому цикл врубать надо когда юнит стоит рядом с магазом на этой самой дистанции ( хотя её можно настроить в игровых константах)
Возможно придётся сделать задержку в 0.01 сек перед каждой продажей (если не получится вдруг, так как цикл работает мгновенно). А возможно и не придётся. . .
Старый 17.01.2011, 12:28
MyRtZ

offline
Опыт: 6,530
Активность:
В чем то ошибка, скорее всего в id приказа.
» Тестовый код
real udg_wait = 0.00

function AddWaitTime takes nothing returns nothing
    set udg_wait = udg_wait + 0.01
endfunction
function SimpleSellWithSleep takes nothing returns nothing
    local item Item
    local unit u = gg_unit_Hpal_0000 //SellTarget
    local unit c = gg_unit_ngme_0002 //Shop
    local integer i = 1
    local real x = GetUnitX(c)
    local real y = GetUnitY(c)
    call SetUnitPosition(u,x,y)
    loop
        set Item = UnitItemInSlot(u,i)
        if Item != null then
            call IssueTargetOrder(u,"smart",Item)
            call IssueTargetOrder(u,"smart",c)
            call TriggerSleepAction(udg_wait)
        endif
        set i = i + 1
        exitwhen i > 5
    endloop
    set u = null
    set c = null
    set Item = null
endfunction
function SimpleSell takes nothing returns nothing
    local item Item
    local unit u = gg_unit_Hpal_0000 //SellTarget
    local unit c = gg_unit_ngme_0002 //Shop
    local integer i = 1
    local real x = GetUnitX(c)
    local real y = GetUnitY(c)
    call SetUnitPosition(u,x,y)
    loop
        set Item = UnitItemInSlot(u,i)
        if Item != null then
            call IssueTargetOrder(u,"smart",Item)
            call IssueTargetOrder(u,"smart",c)
        endif
        set i = i + 1
        exitwhen i > 5
    endloop
    set u = null
    set c = null
    set Item = null
endfunction
function InitTrig_Test takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerChatEvent(t,Player(0),"l",false)
    call TriggerAddAction(t, function SimpleSell)
    set t = CreateTrigger()
    call TriggerRegisterPlayerChatEvent(t,Player(0),"lW",false)
    call TriggerAddAction(t, function SimpleSellWithSleep)
    set t = CreateTrigger()
    call TriggerRegisterPlayerChatEvent(t,Player(0),"W+",false)
    call TriggerAddAction(t, function AddWaitTime)
    set t = null
    call SetPlayerState(Player(0),PLAYER_STATE_RESOURCE_GOLD, 1000000)
endfunction
После вписывания lw юнит(герой) перемещается на позицию лавки и просто мигает приказ "Передвигатся" и "Стоп".
С ваитом видно что он просто движется к лавке.
MyRtZ добавил:
После удаления call SetUnitPosition(u,x,y) в обеих функциях стало ясно что юнит просто движется к лавке(подходит и далее ничего не происходит) => Ошибка в Id приказа.
Помогите разобраться.

Отредактировано MyRtZ, 17.01.2011 в 13:07.
Старый 17.01.2011, 12:56
Doc

offline
Опыт: 63,163
Активность:
с чего ты взял, что это вообще будет работать, умник?
Старый 17.01.2011, 13:24
MyRtZ

offline
Опыт: 6,530
Активность:
Doc:
с чего ты взял, что это вообще будет работать, умник?
Сделайте систему наподобие этой только так что бы работала как надо, буду благодарен.
MyRtZ добавил:
Приказ о продаже почему-то не детектит :P
» Тест код для тех кому интересно
function DetectedOrder takes nothing returns nothing
    local integer i = GetIssuedOrderId()
    local string s = "Order Id = " + I2S(i)
    call DisplayTimedTextToPlayer(Player(0),0,0,20,s)
    set s = null
endfunction
function InitTrig_Order takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterUnitEvent(t,gg_unit_Hpal_0000, EVENT_UNIT_ISSUED_TARGET_ORDER)
    call TriggerRegisterUnitEvent(t,gg_unit_Hpal_0000, EVENT_UNIT_ISSUED_POINT_ORDER)
    call TriggerRegisterUnitEvent(t,gg_unit_Hpal_0000, EVENT_UNIT_ISSUED_ORDER)
    call TriggerAddAction(t, function DetectedOrder)
    set t = null
endfunction
Приказы о прокачке способности, перемещении и об атаке детектит
Старый 17.01.2011, 14:40
DioD

offline
Опыт: 45,134
Активность:
  1. Делаем отлов ВСЕХ приказов
  2. Делаем отображение приказов, лог их где либо (тем же прелоадером)
  3. Продаём вещи
  4. Смотрим приказы
как сделаете, выкладывайте информацию и мы поговорим.
Старый 17.01.2011, 14:42
Icy
Это Я!
offline
Опыт: 1,785
Активность:
MyRtZ, делать тебе никто не будет, но вот принцип скажу, ЭТОЖЕ ЛЕГКО, какой легко ПРОЩЕ НЕКУДА!!! ёлки шпильки! Просто даём приказ юниту отдать предмет магазину! ВОТ И ВСЁ!
П.с:
Только что проверил, так что самые умные заткнитесь! и не орите что это бред!
Старый 17.01.2011, 14:42
MyRtZ

offline
Опыт: 6,530
Активность:
DioD:
  1. Делаем отлов ВСЕХ приказов
  2. Делаем отображение приказов, лог их где либо (тем же прелоадером)
  3. Продаём вещи
  4. Смотрим приказы
как сделаете, выкладывайте информацию и мы поговорим.
Все сделано, некоторые детали указаны в моем прошлом сообщении.
Могу залить карту в которой происходил тест
Icy:
MyRtZ, делать тебе никто не будет, но вот принцип скажу, ЭТОЖЕ ЛЕГКО, какой легко ПРОЩЕ НЕКУДА!!!
ёлки шпильки! Просто даём приказ юниту отдать предмет магазину! ВОТ И ВСЁ!
:D
Если бы все так просто было
Старый 17.01.2011, 14:45
DioD

offline
Опыт: 45,134
Активность:
всё действительно так просто, этой функции в гуи нет, но она есть в коммоне, только что проверил, всё работает.
Старый 17.01.2011, 14:50
MyRtZ

offline
Опыт: 6,530
Активность:
DioD:
всё действительно так просто, этой функции в гуи нет, но она есть в коммоне, только что проверил, всё > работает.
Не нашел в common.j ничего подобного
:\
Старый 17.01.2011, 15:01
Icy
Это Я!
offline
Опыт: 1,785
Активность:
DioD:
всё действительно так просто, этой функции в гуи нет, но она есть в коммоне, только что проверил, всё работает.
Не знаю про какую ты функцию говоришь(но догадываюсь: ордер отдачи предмета), но у меня она есть на гуи(Боевая единица - Order UNIT to give ITEM to UNIT
Старый 17.01.2011, 15:04
MyRtZ

offline
Опыт: 6,530
Активность:
Закрывайте тему
Icy, thanks :q
Старый 17.01.2011, 15:16
Icy
Это Я!
offline
Опыт: 1,785
Активность:
MyRtZ, думаю как продать все предметы героя не составит особо тяжкого труда =)
Старый 17.01.2011, 15:21
MyRtZ

offline
Опыт: 6,530
Активность:
Icy:
MyRtZ, думаю как продать все предметы героя не составит особо тяжкого труда =)
лал, я уже сделал всё
Старый 17.01.2011, 15:22
DioD

offline
Опыт: 45,134
Активность:
function Trig_Untitled_Trigger_002_Actions takes nothing returns nothing
    local real X = GetUnitX(gg_unit_Hpal_0017)
    local real Y = GetUnitY(gg_unit_Hpal_0017)
    
    local real zz =  GetUnitX(gg_unit_hvlt_0020)
    local real zzz = GetUnitY(gg_unit_hvlt_0020)

    call SetUnitX(gg_unit_Hpal_0017,zz)
    call SetUnitY(gg_unit_Hpal_0017,zzz)
    
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,0),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,1),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,2),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,3),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,4),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,5),gg_unit_hvlt_0020)
    
    call SetUnitX(gg_unit_Hpal_0017,X)
    call SetUnitY(gg_unit_Hpal_0017,Y)
endfunction
вот так это выглядит, где хпал герой, а хволт лавка.
Старый 17.01.2011, 15:27
MyRtZ

offline
Опыт: 6,530
Активность:
DioD:
function Trig_Untitled_Trigger_002_Actions takes nothing returns nothing
    local real x =  GetUnitX(gg_unit_hvlt_0020)
    local real y = GetUnitY(gg_unit_hvlt_0020)
    call SetUnitX(gg_unit_Hpal_0017,x)
    call SetUnitY(gg_unit_Hpal_0017,y)
  
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,0),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,1),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,2),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,3),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,4),gg_unit_hvlt_0020)
    call UnitDropItemTarget(gg_unit_Hpal_0017,UnitItemInSlot(gg_unit_Hpal_0017,5),gg_unit_hvlt_0020)
endfunction
SetUnitX и SetUnitY по-моему не стоит юзать, думаю если возникнет препятствие по оси X то юнита откинет от припятствия а там уже искажение будет, хотя не испытывал это на деле
Тут нужно делать Loop к продаже, т.к продажа таким методом может не прокатить(продается только последний предмет). Не продаются предметы иногда просто от фейсинга юнита(юнит не успевает повернутся)
Старый 17.01.2011, 15:44
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 22:24.