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

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

Закрытая тема
 
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Запутался в глобалках Оо
Код:
scope HerbsPickup initializer Init
//================================================================================  ======================
globals
 private integer TempHerbID
 private real TempHerbX
 private real TempHerbY
endglobals
//================================================================================  ======================
private function HerbsPickup_condition takes nothing returns boolean
 return GetItemTypeId(GetManipulatedItem())=='I000'
endfunction
//================================================================================  ======================
private function PickedHerbRenew takes nothing returns nothing
 call RH_DestroyTimer(GetExpiredTimer())
 call CreateItem(TempHerbID,TempHerbX,TempHerbY)
endfunction

private function HerbsPickup_actions takes nothing returns nothing
 local item it=GetManipulatedItem()
 local timer t=CreateTimer()
 set TempHerbID=GetItemTypeId(it)
 set TempHerbX=GetItemX(it)
 set TempHerbY=GetItemY(it)
 call TimerStart(t,ALCHEMY_HERB_TIMER,false,function PickedHerbRenew)
 set it=null
 set t=null
endfunction
//================================================================================  ======================
private function Init takes nothing returns nothing
 local integer i=0
 set gg_trg_Herbs_pickup=CreateTrigger()
 loop
  exitwhen i==bj_MAX_PLAYER_SLOTS
  call TriggerRegisterPlayerUnitEvent(gg_trg_Herbs_pickup,Player(i),EVENT_PLAYER_UNIT_P  ICKUP_ITEM,null)
  set i=i+1
 endloop
 call TriggerAddCondition(gg_trg_Herbs_pickup,Condition(function HerbsPickup_condition))
 call TriggerAddAction(gg_trg_Herbs_pickup,function HerbsPickup_actions)
endfunction
//================================================================================  ======================
endscope

Предметов 'I000' на карте >1, соответственно возникла проблема в следующем - все взятые предметы, по истечению таймера, появляются в последнем присвоенном х y, а не на х y до момента взятия Оо
Я чего-то не знаю? В чем отличие public от private (по глобалкам)? Или здесь использовать struct?
Старый 13.07.2009, 23:31
NCrashed

offline
Опыт: 13,553
Активность:
Используй структуры, а не глобалки, тогда для каждого предмета будут свои переменные TempHerbX. TempHerbY

NCrashed добавил:
а private означает, что вне scope просто нельзя обратиться к глобалкам (только так вроде HerbsPickup.TempHerbX )

NCrashed добавил:
то есть внутри обращаешься как обычно, а вне области через ее имя
Старый 13.07.2009, 23:45
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
NCrashed добавил:
а private означает, что вне scope просто нельзя обратиться к глобалкам (только так вроде HerbsPickup.TempHerbX )

NCrashed добавил:
то есть внутри обращаешься как обычно, а вне области через ее имя
false, если приватный то к ней вообще нельзя обратится из вне
Старый 14.07.2009, 00:02
NCrashed

offline
Опыт: 13,553
Активность:
J, значит я перепутал с приватной функцией?
Старый 14.07.2009, 00:18
agentex

offline
Опыт: 34,834
Активность:
ты с публик перепутал.. к публику извне идет доступ так: "название области\либы"_"название глобалки\функции", а привайт юзается только в своей области\либе\структе.
Зевс, у тебя значения TempHerbX TempHerbY TempHerbID могут перезаписаться если взять итем до истечения таймера. Тут нужно юзать структы, раз уж за вжасс взялся.
Старый 14.07.2009, 01:07
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Думаю должно работать.
» code

Код:
library HerbsPickup initializer Init
//================================================================================    ======================
globals
 private integer array TempHerbID
 private real array TempHerbX
 private real array TempHerbY
 private integer TempHerbLast
 private timer array TempHerbTimer
endglobals
//================================================================================    ======================
private function HerbsPickup_condition takes nothing returns boolean
 return GetItemTypeId(GetManipulatedItem())=='I000'
endfunction
//================================================================================    ======================
private function GetTempHerbIndex takes timer tim returns integer
 local integer i=0
 loop
  exitwhen i>TempHerbLast
  if TempHerbTimer[i]==tim then
   set TempHerbLast=TempHerbLast-1
   call DestroyTimer(tim)
   set TempHerbTimer[i]=TempHerbTimer[TempHerbLast]
   set TempHerbTimer[TempHerbLast]=null
   return i
  endif
  set i=i+1
 endloop
 return -1
endfunction

private function PickedHerbRenew takes nothing returns nothing
 local integer i=GetTempHerbIndex(GetExpiredTimer())
 if i!=-1 then
  call CreateItem(TempHerbID[i],TempHerbX[i],TempHerbY[i])
 endif
endfunction

private function HerbsPickup_actions takes nothing returns nothing
 local item it=GetManipulatedItem()
 set TempHerbTimer[TempHerbLast]=CreateTimer()
 set TempHerbID[TempHerbLast]=GetItemTypeId(it)
 set TempHerbX[TempHerbLast]=GetItemX(it)
 set TempHerbY[TempHerbLast]=GetItemY(it)
 call TimerStart(TempHerbTimer[TempHerbLast],ALCHEMY_HERB_TIMER,false,function PickedHerbRenew)
 set it=null
endfunction
//================================================================================    ======================
private function Init takes nothing returns nothing
 local integer i=0
 set gg_trg_Herbs_pickup=CreateTrigger()
 loop
  exitwhen i==bj_MAX_PLAYER_SLOTS
  call TriggerRegisterPlayerUnitEvent(gg_trg_Herbs_pickup,Player(i),EVENT_PLAYER_UNIT_P    ICKUP_ITEM,null)
  set i=i+1
 endloop
 call TriggerAddCondition(gg_trg_Herbs_pickup,Condition(function HerbsPickup_condition))
 call TriggerAddAction(gg_trg_Herbs_pickup,function HerbsPickup_actions)
endfunction
//================================================================================    ======================
endlibrary

Старый 14.07.2009, 03:58
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
2Hellfim
Появляются... только все сразу... хз даже через struct тоже самое... Оо
Старый 14.07.2009, 23:44
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Зевс. Вот пожалуйста, работает довольно исправно.
» раскрыть
Код:
globals
    real ALCHEMY_HERB_TIMER = 30.00
endglobals
//================================================================================  =====

scope HerbsPickup initializer Init

globals
    private code hps_function
    private trigger HerbsPickup = CreateTrigger()
    private integer count = 0
    private hps array hr
endglobals

struct hps
    private real x
    private real y
    private timer time
    private integer id
    private integer i

    private method AddObject takes nothing returns nothing
        call TimerStart(.time, ALCHEMY_HERB_TIMER, false, hps_function)
        set hr[count] = this
        set .i = count
        set count = count + 1
    endmethod

    private method DeleteObject takes nothing returns nothing
        call DestroyTimer(.time)
        set count = count - 1
        set hr[.i] = hr[count]
        set hr[.i].i = .i
    endmethod

    method PickedHerb_Renew takes nothing returns nothing
        if (.time == GetExpiredTimer()) then
            call CreateItem(.id, .x, .y)
            call .DeleteObject()
        endif
    endmethod

    static method HerbsPickup_Actions takes nothing returns nothing
        local item m_item = GetManipulatedItem()
        local hps this = hps.create()
        set .x = GetItemX(m_item)
        set .y = GetItemY(m_item)
        set .id = GetItemTypeId(m_item)
        set .time = CreateTimer()
        call SetItemUserData(m_item, 100)
        call .AddObject()
        set m_item = null
    endmethod
endstruct

private function HerbsPickup_Timer takes nothing returns nothing
    local integer i = count - 1
    loop
        call hr[i].PickedHerb_Renew()
        exitwhen (i == 0)
        set i = i - 1
    endloop
endfunction

private function HerbsPickup_Conditions takes nothing returns boolean
    return GetItemType(GetManipulatedItem()) == ITEM_TYPE_CAMPAIGN and GetItemUserData(GetManipulatedItem()) == 0
endfunction

private function Init takes nothing returns nothing
    local integer i = 0
    set hps_function = function HerbsPickup_Timer
    loop
        exitwhen (i == 11)
        call TriggerRegisterPlayerUnitEvent(HerbsPickup, Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, null)
        set i = i + 1
    endloop
    call TriggerAddCondition(HerbsPickup, Condition(function HerbsPickup_Conditions))
    call TriggerAddAction(HerbsPickup, function hps.HerbsPickup_Actions)
endfunction

endscope

Пытался использовать один таймер, не вышло. Интересно, это вообще возможно осуществить без лишней мороки. Создавать отдельный таймер для каждого растения как-то не хорошо.
Прикрепленные файлы
Тип файла: w3x HerbsPickup.w3x (15.2 Кбайт, 8 просмотров )

Отредактировано Линкольн, 15.07.2009 в 19:43.
Старый 15.07.2009, 16:51
J
expert
offline
Опыт: 48,447
Активность:
а сколько может быть максимум предметов указного типа на карте? 100? 200? 500? создайте структуру с таким массивом, в фильтре занесите все предметы в массив, а из функции откуда вызываете фильтр запускайте один таймер, в таймере удаляйте
если требуется MUI то создавайте таймер каждый раз при запуске кода, и атачте на него номе структуры так: http://xgm.guru/forum/showpost.php?p=411884 , ну и все...
Старый 15.07.2009, 17:18
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
2J
дык все дело в патче... поэтому я отказался и от кэша, и от функций типа H2I и тд
Старый 15.07.2009, 20:07
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Зевс, во-первых там код кривой, я сейчас заметил =) А во-вторых, кто появляется сразу?

Hellfim добавил: Вот прямой код
» code

Код:
library HerbsPickup initializer Init
//================================================================================      ======================
globals
 private timer array TempHerbTimer
 private integer array TempHerbId
 private real array TempHerbX
 private real array TempHerbY
 private integer TempHerbLast
endglobals
//================================================================================      ======================
private function HerbsPickup_condition takes nothing returns boolean
 return GetItemTypeId(GetManipulatedItem())=='I000'
endfunction
//================================================================================      ======================
private function GetTempHerbIndex takes timer tim returns integer
 local integer i=0
 loop
  exitwhen i>TempHerbLast
  if TempHerbTimer[i]==tim then
   set TempHerbLast=TempHerbLast-1
   call DestroyTimer(tim)
   set TempHerbTimer[i]=TempHerbTimer[TempHerbLast]
   set TempHerbId[i]=TempHerbId[TempHerbLast]
   set TempHerbX[i]=TempHerbX[TempHerbLast]
   set TempHerbY[i]=TempHerbY[TempHerbLast]
   set TempHerbTimer[TempHerbLast]=null
   set TempHerbId[TempHerbLast]=0
   set TempHerbX[TempHerbLast]=0
   set TempHerbY[TempHerbLast]=0
   return i
  endif
  set i=i+1
 endloop
 return -1
endfunction

private function PickedHerbRenew takes nothing returns nothing
 local integer i=GetTempHerbIndex(GetExpiredTimer())
 if i!=-1 then
  call CreateItem(TempHerbId[i],TempHerbX[i],TempHerbY[i])
 endif
endfunction

private function HerbsPickup_actions takes nothing returns nothing
 local item it=GetManipulatedItem()
 set TempHerbTimer[TempHerbLast]=CreateTimer()
 set TempHerbId[TempHerbLast]=GetItemTypeId(it)
 set TempHerbX[TempHerbLast]=GetItemX(it)
 set TempHerbY[TempHerbLast]=GetItemY(it)
 call TimerStart(TempHerbTimer[TempHerbLast],ALCHEMY_HERB_TIMER,false,function PickedHerbRenew)
 set it=null
endfunction
//================================================================================      ======================
private function Init takes nothing returns nothing
 local integer i=0
 set gg_trg_Herbs_pickup=CreateTrigger()
 loop
  exitwhen i==bj_MAX_PLAYER_SLOTS
  call TriggerRegisterPlayerUnitEvent(gg_trg_Herbs_pickup,Player(i),EVENT_PLAYER_UNIT_P      ICKUP_ITEM,null)
  set i=i+1
 endloop
 call TriggerAddCondition(gg_trg_Herbs_pickup,Condition(function HerbsPickup_condition))
 call TriggerAddAction(gg_trg_Herbs_pickup,function HerbsPickup_actions)
endfunction
//================================================================================      ======================
endlibrary

Старый 15.07.2009, 20:32
J
expert
offline
Опыт: 48,447
Активность:
Зевс, где ты в моем посте увидел слово кеш или функцию H2I?

J добавил:
Hellfim, тебе за функцию GetTempHerbIndex() присуждается -1 бал
Старый 15.07.2009, 22:14
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
J
Код:
function I2FX takes integer h returns effect
    return h
    return null
endfunction

Так-то!

Hellfim добавил:
Почему?
Старый 15.07.2009, 22:22
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Так-то!
это атачится на таймер хендл эффекта, в случае зевса хендла нет, есть номер структуры, и его не надо подвергать воздействию РБ
Старый 15.07.2009, 22:25
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
J, это не будет работать в 1.23б, так?
Старый 15.07.2009, 22:25
J
expert
offline
Опыт: 48,447
Активность:
почему?

J добавил:
нет РБ, нет кеша, нет хеша, работать будет на любой версии
Старый 15.07.2009, 22:41
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Спасибо всем... Hash и Struct решили проблему. Тему можно закрыть.
Старый 15.07.2009, 23:23
Закрытая тема

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

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

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

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



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