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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Проблемы с вычислением. (Добавление маны герою.)
Проблемы с вычислением.
lawsonДата: Суббота, 13 Августа 2011, 12:28:54 | Сообщение # 1
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Так вот проблема в чем: я сделал ауру при которой любой юнит обладающий ею при использовании любого заклинания востанавливал определенный процент маны от маны которую он потратил на заклинание. В общем у меня все работает ману я восстанавливаю но не могу сделать это с каждым уровнем.
Вот код и где у меня проблемы:

function GetManaVoid takes nothing returns nothing
local unit u = LoadUnitHandle(Hash, GetHandleId(GetExpiredTimer()), 0) - загружаю юнита
local real m = LoadReal(Hash, GetHandleId(GetExpiredTimer()), 1) - GetUnitState(u, UNIT_STATE_MANA) - загружаю его предыдущее кол-во маны -(минус) его теперищнее кол-во маны: тоесть этим я узнаю сколько маны он затратил на заклинание(здесь проблема)
local real r = 0.15 * I2R(GetUnitAbilityLevel(u, 'B00Z')) - увеличиваю процент востановлиной маны с каждым уровенм(здесь проблема)
local real mana = m * r - кол-во маны для восстановления, умножаю процент на кол-во затраченной маны
call SetUnitState(u, UNIT_STATE_MANA, GetUnitState(u, UNIT_STATE_MANA) + mana) - устанавливаю ману герою.
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Polymorph\\PolyMorphTarget.mdl", u, "head"))
set u = null
call FlushChildHashtable(Hash, GetHandleId(GetExpiredTimer()))
call DestroyTimer(GetExpiredTimer())
endfunction

function Trig_Damage_Aura_Actions takes nothing returns nothing
local timer t = CreateTimer()
call TimerStart(t, 1.2, false, function GetManaVoid)
call SaveUnitHandle(Hash, GetHandleId(t), 0, GetTriggerUnit()) - сохраняю юнита
call SaveReal(Hash, GetHandleId(t), 1, GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA)) - сохраняю кол-во его маны во время использования заклинания
set t = null
endfunction

Кароче код работает но почему то даже если у героя 4 уровень этой способность он все равно восстанавливает 15% от потеряной маны не учитывая что я процент умножаю на уровень спелла => 0.15 * I2R(GetUnitAbilityLevel(u, 'B00Z'))
Если не сложно объясните в чем проблема я как только не пытался считать и увеличивал вермя таймера все равно одно и тоже. Он постоянно дает лишь 15% процентов от потраченной маны.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Суббота, 13 Августа 2011, 16:58:18
 

Mep3aB4uKДата: Суббота, 13 Августа 2011, 14:12:46 | Сообщение # 2
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Выложи весь код, с собитием и условием...
Также(если так еще не сделал) для проверки убирай у юнита реген маны
 

swdnДата: Суббота, 13 Августа 2011, 15:31:42 | Сообщение # 3
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 32
Блокировки:
Quote (lawson)
Кароче код работает но почему то даже если у героя 4 уровень этой способность он все равно восстанавливает 15% от потеряной маны не учитывая что я процент умножаю на уровень спелла => 0.15 * I2R(GetUnitAbilityLevel(u, 'B00Z'))
Если не сложно объясните в чем проблема я как только не пытался считать и увеличивал вермя таймера все равно одно и тоже. Он постоянно дает лишь 15% процентов от потраченной маны.

Узнать уровень баффа не получится, он либо есть (1), либо его нет (0).

В твоём случае необходимо узнавать уровень способности, которая даёт бафф (а не уровень самого баффа). Вместо 'B00Z' поставь равкод этой способности.
 

lawsonДата: Суббота, 13 Августа 2011, 16:42:05 | Сообщение # 4
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
swdn, Ладно тогда сделаю действительно через пик юнитов и поиск источника бафа. Пфф
Как так я делал такой же триггер на получению больше золота за убитого крипа если юнит обладает опр. бафом все там работает и с каждым уровнем бафа дает больше золота.
Ну все сделал с пиком юнита и поиском у него способности. Тему можно закрывать если ни кто не предложит вариант по легче.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Суббота, 13 Августа 2011, 16:46:01
 

Mep3aB4uKДата: Суббота, 13 Августа 2011, 17:42:57 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Может такой вариант будет проще...
Юнит изучает абилу
сохраняеш юнита
добавить событие
а там если юнит хас баф
%*уровень абилы (сохраненного юнита)
 

lawsonДата: Суббота, 13 Августа 2011, 18:17:40 | Сообщение # 6
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Mep3aB4uK, Нет я думал на счет этого варианта но здесь во первых не хочу использовать глобалки во вторых 2 триггера против моего 1.
Да все помоему закрывайте тему.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Суббота, 13 Августа 2011, 18:32:47
 

FkoFFДата: Суббота, 13 Августа 2011, 19:58:32 | Сообщение # 7
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Сочно, ничего не скажешь. Нуба можно узнать по первым строкам кода.

GetExpiredTimer() встречается в коде 4 раза. Вбиваем в переменную - снизит нагрузку.
GetHandleId() встречается в коде 3 раза. Вбиваем в переменную - снижаем нагрузку.

Алгоритм вообщем то кривокос, ну да ладно, уж его то мне пережевывать лень ) Короче то что ты хочешь сделать делается по другому, и бафф тут не подойдет.


 

lawsonДата: Суббота, 13 Августа 2011, 20:19:01 | Сообщение # 8
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
FkoFF, Я написал что сделал уже. А на счет GetExpiredTimer() ты прав это я так начал писать не давно думал чем меньше локалок и вообще перменных в коде тем лучше.
ТАк чтож я здесь не правильно сделал? Мало перменных написал? FkoFF, Ну если ты можешь сделать проще и лучше сделай, я тебе даже спасибо скажу. Только без cJass.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Суббота, 13 Августа 2011, 20:34:11
 

FkoFFДата: Суббота, 13 Августа 2011, 21:08:21 | Сообщение # 9
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (lawson)
FkoFF, Я написал что сделал уже. А на счет GetExpiredTimer() ты прав это я так начал писать не давно думал чем меньше локалок и вообще перменных в коде тем лучше. ТАк чтож я здесь не правильно сделал? Мало перменных написал? FkoFF, Ну если ты можешь сделать проще и лучше сделай, я тебе даже спасибо скажу. Только без cJass.


я не пользуюсь надстройками, методами стандартного джасса все делается достаточно просто:

пикаешь в радиусе героя, обладающего аурой - всех юнитов, которые могут кастовать спеллы (макс мана > 0) и в хт прибиваешь значение уровня его ауры. Производишь это действие раз в 0.5-1 секунду, меньше - ненужно.

Когда кто то кастует спелл - (фиксируешь событие "начинает применять способность") - добавляешь все через ту же хт еще одно значение, обозначающее количество маны.

Другой триггер отлавливает привод способности в действие - вычитывает значение из хт хэндла юнита и уже делаешь все действия. Ах да - условие срабатывания обоих триггеров - наличие значений в хт. Работать будет безотказно и красочно. А ауру можешь оставить красоты ради.


 

lawsonДата: Суббота, 13 Августа 2011, 23:43:36 | Сообщение # 10
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
FkoFF, Да ладно мне и так сойдет, для моих знаний жасса. Мне больше и не надо главное без утечек и глюков.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

FkoFFДата: Суббота, 13 Августа 2011, 23:54:53 | Сообщение # 11
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (lawson)
FkoFF, Да ладно мне и так сойдет, для моих знаний жасса. Мне больше и не надо главное без утечек и глюков.

как ты будешь узнавать уровень баффа? )


 

lawsonДата: Суббота, 13 Августа 2011, 23:59:57 | Сообщение # 12
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FkoFF)
как ты будешь узнавать уровень баффа

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

Добавлено (13-08-2011, 23:59)
---------------------------------------------
Тока не фыркай все нормально работает

function GetManaVoid takes nothing returns nothing
local unit u = LoadUnitHandle(Hash, GetHandleId(GetExpiredTimer()), 0)
local real m = LoadReal(Hash, GetHandleId(GetExpiredTimer()), 1) - GetUnitState(u, UNIT_STATE_MANA)
local real r = 0.15 * LoadInteger(Hash, GetHandleId(GetExpiredTimer()), 2)
local real mana = m  * r
call SetUnitState(u, UNIT_STATE_MANA, GetUnitState(u, UNIT_STATE_MANA) + mana)
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Polymorph\\PolyMorphTarget.mdl", u, "head"))
set u = null
call FlushChildHashtable(Hash, GetHandleId(GetExpiredTimer()))
call DestroyTimer(GetExpiredTimer())
endfunction

function Trig_Damage_Aura_Actions takes nothing returns nothing
local timer t = CreateTimer()
local group g = CreateGroup()
local unit d
call GroupEnumUnitsInRange(g, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 800, null)
loop
set d = FirstOfGroup(g)
exitwhen d == null
if (GetUnitTypeId(d) == 'E007') then
call SaveInteger(Hash, GetHandleId(t), 2, GetUnitAbilityLevel(d, 'A06D'))
endif
call GroupRemoveUnit(g, d)
endloop

call TimerStart(t, 1., false, function GetManaVoid)
call SaveUnitHandle(Hash, GetHandleId(t), 0, GetTriggerUnit())
call SaveReal(Hash, GetHandleId(t), 1, GetUnitState(GetTriggerUnit(), UNIT_STATE_MANA))
call DestroyGroup(g)
set g = null
set d = null
set t = null
endfunction


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Воскресенье, 14 Августа 2011, 00:01:10
 

HexingДата: Воскресенье, 14 Августа 2011, 09:25:42 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Code
GetHandleId(t)
и
Code
GetTriggerUnit()
в переменные. Меньше функций быстрее код.


 

lawsonДата: Понедельник, 15 Августа 2011, 22:41:48 | Сообщение # 14
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Hexing)
GetHandleId(t)

На счет этого согласен, слишком я разленился.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Проблемы с вычислением. (Добавление маны герою.)
  • Страница 1 из 1
  • 1
Поиск:

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