Сейчас 11:58:09 Пятница, 19 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Использование таймера без создания новой функции
Использование таймера без создания новой функции
Samedy_Дата: Понедельник, 05 Октября 2015, 22:24:32 | Сообщение # 1
7 уровень
Группа: Проверенные
Сообщений: 371
Награды: 0
Репутация: 18
Блокировки:

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

Добавлено (05 Октября 2015, 22:24:32)
---------------------------------------------
Вообще, если кто может предложить любую альтернативу триггеру (только без wait'a), пожалуйста, предложите))

 

Samedy_Дата: Вторник, 06 Октября 2015, 11:51:13 | Сообщение # 2
7 уровень
Группа: Проверенные
Сообщений: 371
Награды: 0
Репутация: 18
Блокировки:
Borodach, спасибо, что отозвался. Глобалка здесь не подойдет, я думаю.
Попробовал сейвить интегер - не работает:
Код
function EndSupport takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local integer id = GetHandleId(t)
     local unit u = LoadUnitHandle(udg_Hash, id, 0)
     local integer iId = GetConvertedPlayerId(GetOwningPlayer(u))
     local unit u2 = LoadUnitHandle(udg_Hash,  33*iId, 0)
     local integer Agi = LoadInteger(udg_Hash, iId*13, 0)
  local integer Str = LoadInteger(udg_Hash, iId*14, 0)
  local integer Int = LoadInteger(udg_Hash, iId*15, 0)
  call ModifyHeroStat(bj_HEROSTAT_AGI, u2, bj_MODIFYMETHOD_ADD,Agi)
  call ModifyHeroStat(bj_HEROSTAT_STR, u2, bj_MODIFYMETHOD_ADD,Str)
  call ModifyHeroStat(bj_HEROSTAT_INT, u2, bj_MODIFYMETHOD_ADD,Int)
     call ShowUnitShow(u)
     call SetUnitLifePercentBJ(u, GetUnitLifePercent(u2))
     set t = null
     set u = null
     set u2 = null
endfunction

function Trig_Support_Actions takes nothing returns nothing
     local unit sUnit = GetSpellAbilityUnit()  
     local unit tUnit = GetSpellTargetUnit()
     local timer dTimer = CreateTimer()
     local integer id
     local integer iId = GetConvertedPlayerId(GetOwningPlayer(sUnit))
     local integer Agi = GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)
  local integer Str = GetHeroStatBJ(bj_HEROSTAT_STR, tUnit, true)
  local integer Int = GetHeroStatBJ(bj_HEROSTAT_INT, tUnit, true)
     local integer dAgi = (GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
  local integer dStr = (GetHeroStatBJ(bj_HEROSTAT_STR, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
  local integer dInt = (GetHeroStatBJ(bj_HEROSTAT_INT, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
     call ShowUnitHide(sUnit)
     call AddSpecialEffectTargetUnitBJ("origin", tUnit, "Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl")
     call SaveInteger(udg_Hash, iId*13, 0, Agi)
     call SaveInteger(udg_Hash, iId*14, 0, Str)
     call SaveInteger(udg_Hash, iId*15, 0, Int)
  call ModifyHeroStat(bj_HEROSTAT_AGI, tUnit, bj_MODIFYMETHOD_ADD,dAgi)
  call ModifyHeroStat(bj_HEROSTAT_STR, tUnit, bj_MODIFYMETHOD_ADD,dStr)
  call ModifyHeroStat(bj_HEROSTAT_INT, tUnit, bj_MODIFYMETHOD_ADD,dInt)
     call TimerStart(dTimer, 10, false, function EndSupport)
     set id = GetHandleId(dTimer)
     call SaveUnitHandle(udg_Hash, id, 0, sUnit)
     call SaveUnitHandle(udg_Hash, 33*iId, 0, sUnit)

     set sUnit = null
     set tUnit = null
     set dTimer = null
endfunction

Добавлено (06 Октября 2015, 10:14:40)
---------------------------------------------
Сейчас подумал, а ведь все статы - это же реальные числа, почему не выдает ошибок и карта спокойно запускается, когда я их как целочисленные использую?

Добавлено (06 Октября 2015, 10:18:16)
---------------------------------------------
Все-таки использую глобалки, понял как нужно. Но вопрос остается, почему статы - целые числа, а не реальные?? В редакторе объектов они же реальные.

Добавлено (06 Октября 2015, 11:33:16)
---------------------------------------------

Код
function EndSupport takes nothing returns nothing
     local timer t = GetExpiredTimer()
     local integer id = GetHandleId(t)
     local unit u = LoadUnitHandle(udg_Hash, id, 0)
     local integer iId = GetConvertedPlayerId(GetOwningPlayer(u))
     local unit u2 = udg_unit[iId]
     local integer Exp = GetHeroXP(u2)
     local integer Agi = (GetHeroStatBJ(bj_HEROSTAT_AGI, u2, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', u))))))  
     local integer Str = (GetHeroStatBJ(bj_HEROSTAT_STR, u2, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', u))))))  
     local integer Int = (GetHeroStatBJ(bj_HEROSTAT_INT, u2, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', u))))))  
     call ShowUnitShow(u)
     call SetUnitLifePercentBJ(u, GetUnitLifePercent(u2))
     call ModifyHeroStat(bj_HEROSTAT_AGI,u2,bj_MODIFYMETHOD_SUB,Agi)  
     call ModifyHeroStat(bj_HEROSTAT_STR,u2,bj_MODIFYMETHOD_SUB,Str)  
     call ModifyHeroStat(bj_HEROSTAT_INT,u2,bj_MODIFYMETHOD_SUB,Int)  
     call AddHeroXPSwapped(Exp, u, true)
     call SuspendHeroXPBJ(true, u)
     call SetUnitPositionLoc(u,GetUnitLoc(u2))
     set t = null
     set u = null
     set u2 = null
endfunction

function Trig_Support_Actions takes nothing returns nothing
     local unit sUnit = GetSpellAbilityUnit()  
     local unit tUnit = GetSpellTargetUnit()
     local timer dTimer = CreateTimer()
     local integer id
     local integer iId = GetConvertedPlayerId(GetOwningPlayer(sUnit))
     local integer dAgi = (GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
  local integer dStr = (GetHeroStatBJ(bj_HEROSTAT_STR, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
  local integer dInt = (GetHeroStatBJ(bj_HEROSTAT_INT, tUnit, true)*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
     set udg_sprt_Agi[iId] = GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)
     set udg_sprt_Str[iId] = GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)
     set udg_sprt_Int[iId] = GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)
     call SuspendHeroXPBJ(false, sUnit)
     call ShowUnitHide(sUnit)
     call AddSpecialEffectTargetUnitBJ("origin", tUnit, "Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl")
  call ModifyHeroStat(bj_HEROSTAT_AGI, tUnit, bj_MODIFYMETHOD_ADD,dAgi)
  call ModifyHeroStat(bj_HEROSTAT_STR, tUnit, bj_MODIFYMETHOD_ADD,dStr)
  call ModifyHeroStat(bj_HEROSTAT_INT, tUnit, bj_MODIFYMETHOD_ADD,dInt)
     call TimerStart(dTimer, 10, false, function EndSupport)
     set id = GetHandleId(dTimer)
     call SaveUnitHandle(udg_Hash, id, 0, sUnit)
     set udg_unit[iId] = tUnit

     set sUnit = null
     set tUnit = null
     set dTimer = null
endfunction

В чем дело?
Пытался после окончания таймера давать столько статов, сколько в глобалках (указаны), но это как-то странно работает. Всем атрибутам одинаковое значение присваивается.
Затем попытался вычислять статы - вообще не работает.
Любые действия с юнитами производится, а со статами что-то не так.

Добавлено (06 Октября 2015, 11:51:13)
---------------------------------------------

Цитата Samedy_ ()
 call ModifyHeroStat(bj_HEROSTAT_AGI,u2,bj_MODIFYMETHOD_SUB,Agi)  
     call ModifyHeroStat(bj_HEROSTAT_STR,u2,bj_MODIFYMETHOD_SUB,Str)  
     call ModifyHeroStat(bj_HEROSTAT_INT,u2,bj_MODIFYMETHOD_SUB,Int)  

Исправил на GetHeroAgi/Str/Int - заработало. Теперь понял, почему не стоит использовать bj-функции.
 

BorodachДата: Вторник, 06 Октября 2015, 16:06:13 | Сообщение # 3
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Не верно сохранял в хеш.
Код

function EndSupport takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit tUnit = LoadUnitHandle(udg_Hash, id, 3)
local unit sUnit =LoadUnitHandle(udg_Hasg,id,4)
local integer Agi = LoadInteger(udg_Hash, id, 0)
local integer Str = LoadInteger(udg_Hash, id, 1)
local integer Int = LoadInteger(udg_Hash, id, 2)
call ModifyHeroStat(bj_HEROSTAT_AGI, tUnit, bj_MODIFYMETHOD_ADD,Agi)
call ModifyHeroStat(bj_HEROSTAT_STR, tUnit, bj_MODIFYMETHOD_ADD,Str)
call ModifyHeroStat(bj_HEROSTAT_INT, tUnit, bj_MODIFYMETHOD_ADD,Int)
call ShowUnitShow(tUnit)
call SetUnitLifePercentBJ(tUnit, GetUnitLifePercent(sUnit))
call DestroyTimer(t) // удаляешь таймер из памяти
call FlushChildHandle(udg_Hash,id)  // очищаешь хэш от не нужных данных (писал из памяти)
set t = null
set sUnit = null
set tUnit = null
endfunction

function Trig_Support_Actions takes nothing returns nothing
local unit sUnit = GetSpellAbilityUnit()
local unit tUnit = GetSpellTargetUnit()
local timer dTimer = CreateTimer()
set id = GetHandleId(dTimer)   // ид локального таймера
local integer Agi = GetHeroStatBJ(bj_HEROSTAT_AGI, tUnit, true)
local integer Str = GetHeroStatBJ(bj_HEROSTAT_STR, tUnit, true)
local integer Int = GetHeroStatBJ(bj_HEROSTAT_INT, tUnit, true)
set Agi = (Agi *(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
set Str = (Str*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
set Int = (Int*(1+R2I((0.25*I2R(GetUnitAbilityLevelSwapped('A03U', sUnit))))))
call ShowUnitHide(sUnit)
call AddSpecialEffectTargetUnitBJ("origin", tUnit, "Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl")
call SaveInteger(udg_Hash, id, 0, Agi)      // сохраняешь в первом столбике номер таймера
call SaveInteger(udg_Hash, id, 1, Str)      //во втором столбике очередуешь цифры, чтоб не совпадали
call SaveInteger(udg_Hash, id, 2, Int)
call ModifyHeroStat(bj_HEROSTAT_AGI, tUnit, bj_MODIFYMETHOD_ADD,Agi)
call ModifyHeroStat(bj_HEROSTAT_STR, tUnit, bj_MODIFYMETHOD_ADD,Str)
call ModifyHeroStat(bj_HEROSTAT_INT, tUnit, bj_MODIFYMETHOD_ADD,Int)
call TimerStart(dTimer, 10, false, function EndSupport)
call SaveUnitHandle(udg_Hash, id, 3, tUnit)
call SaveUnitHandle(udg_Hash, id, 4, sUnit)
set sUnit = null
set tUnit = null
set dTimer = null
endfunction


Karamba


Сообщение отредактировал Borodach - Вторник, 06 Октября 2015, 16:08:48
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Использование таймера без создания новой функции
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz