Kenshi245
offline
Опыт:
2,252Активность: |
Помогите со скиллом
Помогите пожалуйста написать скилл на джассе чтобы он не юзал функции из blizzard.j и не имел утечек памяти, скилл делает следующее: Скилл называется Ballance Life: Берет всех дружественных юнитов вокруг кастера и подсчитывает общее количество ХП, затем делит эти хп межту всеми юнитами поровну. Сам пробовал написать, но получалось криво и и извращениями. |
27.03.2008, 13:12 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
|
27.03.2008, 13:25 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
По идее что-то типа этого должно получиться:
function Trig_BallanceLife_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'САМ_СКИЛЛ' ) ) then return false endif return true endfunction function Trig_Ballance_Life_Actions takes nothing returns nothing local location loc = GetUnitLoc(GetTriggerUnit()) local group groupA = GetUnitsInRangeOfLocMatching(300, loc, null) local group groupB = groupA local unit unitA local real HP = 0 local integer Nunits = 0 loop set unitA=FirstOfGroup(groupA) exitwhen unitA==null Nunits = Nunits + 1 set HP = HP + GetUnitState(UnitA, UNIT_STATE_LIFE) call GroupRemoveUnit(groupA,unitA) endloop set HP = HP / Nunits loop set unitA=FirstOfGroup(groupB) exitwhen unitA==null call SetUnitState(UnitA,UNIT_STATE_LIFE,GetUnitState(UnitA, UNIT_STATE_LIFE)+HP call GroupRemoveUnit(groupB,unitA) endloop endfunction |
27.03.2008, 14:08 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
а, так тебе надо не написать, а помочь довести до ума? так и говорите)
Код:
+ на мой код будет ругаццо обычный редактор, смотри соседний топи про жасс нью ген пак |
27.03.2008, 14:20 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
Почему-то редактор ругается на это:
set HP = HP + GetUnitState(UnitA, UNIT_STATE_LIFE) Где тут ошибка? Kenshi245 добавил: Цитата:
А можешь плиз написать комменты, а то я только начал джасс юзать, и еще не умею на лету читать чужой код? |
|
27.03.2008, 14:37 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
ща попробую...
Код:
ADOLF добавил: вообще мой код всегда не особо понятен непосвещеннім, поєтому лучше спрашивай что конкретно неясно |
27.03.2008, 17:37 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
Короче какие бывают способы переборки каждого юнита в группе и выполнения действия, кроме такого?
loop set unitA=FirstOfGroup(groupA) exitwhen unitA==null call GroupRemoveUnit(groupA,unitA) endloop Kenshi245 добавил: Или вот еще проблема - есть функция call ForGroup(GetUnitsInRangeOfLocAll(1000, loc), function MyFunction ) Она должна на каждого юнита в радиусе выполнять функцию MyFunction И я даже могу передать туда параметры call ForGroup(GetUnitsInRangeOfLocAll(1000, loc), function MyFunction(lala) ) Но обратно я ничего получить не могу, то есть выполнив MyFunction как мне получить что-нибуть обратно? |
27.03.2008, 20:58 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
теперь обьясняю, (зри мой пример) есть глобальные переменные - их область видимости - весь код (надеюсь это понятно) - ими я и пользуюсь
теперь конструкция call ForGroup(GetUnitsInRangeOfLocAll(1000, loc), function MyFunction ) неверна, выкладываю код используемой в них функции Код:
т.е. обьект создает и неудаляется еще раз самое главное - параметры в ФорГроуп передаются через глобалки |
28.03.2008, 10:25 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
А зачем они создает еще одну группу? local group g = CreateGroup() и что здесь значит call DestroyBoolExpr(filter)? |
28.03.2008, 11:13 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
Это действие удаляет фильтер функцию... но если подумать то это делать не такуж и обязательно |
|
28.03.2008, 13:53 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
они не шарят=/ |
|
28.03.2008, 15:53 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
Это упрощает работу с этими функциями через GUI |
|
28.03.2008, 16:58 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
а как мне присвоить переменной группу в радиусе, не используя близовскую функцию GetUnitsInRangeOfLocMatching, и чтоб было граммотно и без утечек памяти? |
28.03.2008, 18:34 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
call GroupEnumUnitsInRange(g, X, Y, radius, filter)
это самый оптимальный вариает, принимает группу и запихивает в нее юнитов в радиусе от указаной точки (X, Y) |
28.03.2008, 19:26 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
GroupEnumUnitsInRangeOfLoc - а этот вроде тоже стандартный, мне по координатам просто не удобно, если потом локацию удалить то, наверное утечки и не будет вовсе...
local location loc = GetUnitLoc(GetTriggerUnit()) local group groupA = CreateGroup() call GroupEnumUnitsInRangeOfLoc(groupA, loc, 300, null) <- ошибку выдает Отредактировано Kenshi245, 28.03.2008 в 19:50. |
28.03.2008, 19:42 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Во первых надо так:
local group groupA = CreateGroup() call GroupEnumUnitsInRange(groupA, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 300, null) во вторых чтобы адольф не плакал можеш сдлеать глабальную группу в третих ошибки нет, ищи проблему гдето рядом в коде Jon добавил: учись работать с координатами, точки это не по трукодерски |
28.03.2008, 20:04 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
Всеравно ошибку выдает, именно когда вставляю этот код. ((( Expected a code statement |
28.03.2008, 20:12 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
выложи всю функцию в которой используеш этот код |
28.03.2008, 20:18 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Kenshi245
offline
Опыт:
2,252Активность: |
Ошибка была в том, что я после всего этого объявил еще несколько переменных, не знал, что так нельзя. |
28.03.2008, 20:51 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
кста напомню что оно часто ругаеться не на ту строку, к примеру если ошибка в строке 19, то оно может ругать на 20, на 18 и т.д. |
28.03.2008, 21:55 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|