Вопросы по JASS кодированию
|
|
-
Caturn | Дата: Четверг, 01-12-2011, 23:38:03 | Сообщение # 1 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
1. не задавать тупых вопросов, мол как снять приписку(ки) BJ с функции. 2. задавать вопросы максимально чётко, если вы хотите получить столь же лаконичный и устраивающий ответ. 3. не задавать не аргументируемых вопросов, если у вас ошибка в коде, то выпишите её в сообщение; если у вас нет знаний как сделать тот или иной спел, ну или систему, то опишите её действие.
Просьба отвечать на них кто знает.
2 часть статьи по jass напишу намного позже, примерно пару месяцев. Я щас занят проектом, проект Dotа с открытым исходным кодом.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Пятница, 09-12-2011, 09:23:00 | Сообщение # 2 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Caturn, я знаю что ты написал не задовать вопросы про BJ но ответь please я немогу понять Вот я открыл скрипты blizzard и нашел там как убрать но понять не могу
Quote function AddSpecialEffectLocBJ takes location where, string modelName returns effect set bj_lastCreatedEffect = AddSpecialEffectLoc(modelName, where) return bj_lastCreatedEffect endfunction
что означают действия?
Quote set bj_lastCreatedEffect
я немонел как можно установить переменную на спецефкт который потом можно просто создать?
|
| | |
-
wetalq | Дата: Пятница, 09-12-2011, 09:54:41 | Сообщение # 3 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
на джасе лучше использовать координаты, функция будет такая
Code call DestroySpecialEffect(AddSpecialEffect(ModelName, x,y))
может я немножко ошибся, но примерно так делается удаления спецэффекта
Покупка предметов через способность
|
| | |
-
Caturn | Дата: Пятница, 09-12-2011, 21:04:50 | Сообщение # 4 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
wetalq, Если нужно создать спецэффект в центре области применения заклинания, то нам так и так нужно будет вызвать переменную типа Location, т.к. при действии set realX=GetLocationX(GetSpellTargetLoc()) функция ссылается на данные точки, и если данной локации нет(данные не в переменной), компилятор её создаст, но в последствии не удалит. И это будет равносильно утечки, и при выполнении работы на конкурс, судьи зачтут эту манипуляцию вне вашу пользу, и отнимут бал другой. Так что в данной ситуации юзать Location будет приемлемым.
local location loc_loc01=(GetSpellTargetLoc()) local real loc_realX=GetLocationX(loc_loc01) local real loc_realY=GetLocationY(loc_loc01) call RemoveLocation(loc_loc01) иные действия...
Nevermore, т.к. это ГУИ компилятор, то он тоже должен иметь свой набор "глобальных переменных", bj_lastCreatedEffect и есть та самая переменная. Ведь из вне откуда эффект создаться не может, он имеет тоже свои параметры, как и в виде "активных" переменных которые ссылаются на хиндл объекта, и сам хиндл. Иными словами, в jass мы можем иметь 2 типа эффектов, мгновенные (call DestroyEffect(AddSpecialEffect))) (которые при инициализации сразу удаляются, и в игре мы видим эффект) и длительные (local effect loc_effect01=AddSpecialEffect) (которые при инициализации не дадут нам нужного эффекта, а лишь спустя время, или "вечные"). А в ГУИ близзы всё правильно сделали с одной стороны, зачем делать 2 функции, если можно обойтись одной и не парить заботы картоделам.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Суббота, 10-12-2011, 14:21:30 | Сообщение # 5 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Caturn, wetalq, спс вроде понел по эффектам
вот так должно быть?
Quote call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIvi\\AIviTarget.mdl", юнит, "chest"))
Еще вопрос: Я где-то читал что можно как-то сократить Jass код вот этом месте
Quote function Trig_Trigger_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'AUan' ) ) then return false endif return true endfunction
подскажите как это зделать?
|
| | |
-
wetalq | Дата: Суббота, 10-12-2011, 16:07:38 | Сообщение # 6 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
| | |
-
Caturn | Дата: Суббота, 10-12-2011, 19:18:10 | Сообщение # 7 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Quote (Nevermore) function Trig_Trigger_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'AUan' ) ) then return false endif return true endfunction
Стандартная ГУИшная система условий. not части не равно, используется обильно при проверки числовых значений в jasse 2ой записью If not integer == 15 then if integer != 15 then
но я её пользуюсь не часто, когда делаю массовые системы.
Quote (wetalq) function Trig_Trigger_Conditions takes nothing returns boolean return GetSpellAbilityId() == 'AUan' endfunction Если ты делаешь условие триггера, то этот вариант будет не совсем правильным. Более правильный вариант. Code function func000_Conditions takes nothing returns boolean if (твоё условие(я) == false(числовые значения)) then call func000_Action(аргументы приемлимы) endif/else/esleif return false endfunction
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Воскресенье, 11-12-2011, 09:51:48 | Сообщение # 8 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
С такими жассерами как wetalq, и Caturn, можно Jass выучить за неделю
у меня проблема с эффектом когда я меняю Quote "Abilities\\Spells\\Items\\AIvi\\AIviTarget.mdl"
на другой эффект то у меня пишет ошибку
Quote Отсутствует корректный список аргументов
в чем проблема? С эффектом Quote "Abilities\\Spells\\Items\\AIvi\\AIviTarget.mdl" работает как меняю сразу ошибка.
|
| | |
-
wetalq | Дата: Воскресенье, 11-12-2011, 10:44:33 | Сообщение # 9 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
| | |
-
Nevermore | Дата: Воскресенье, 11-12-2011, 11:09:31 | Сообщение # 10 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
а спс wetalq, Jass всетаки странная штука
|
| | |
-
wetalq | Дата: Воскресенье, 11-12-2011, 11:14:46 | Сообщение # 11 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Quote (Nevermore) С такими жассерами как wetalq, и Caturn, можно Jass выучить за неделю
Caturn посильнее джасер чем я
Quote (Nevermore) Jass всетаки странная штука
и в тоже время отличная вещь
Покупка предметов через способность
|
| | |
-
Nevermore | Дата: Воскресенье, 11-12-2011, 11:31:54 | Сообщение # 12 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Quote Jass всетаки странная штука
и в тоже время отличная вещь
|
| | |
-
Caturn | Дата: Воскресенье, 11-12-2011, 23:13:50 | Сообщение # 13 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Офк, до полного идеала не хватает функций 25-40, впрочем любой jassер знает о чём я)
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Понедельник, 12-12-2011, 16:44:19 | Сообщение # 14 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Вопрос:
Когда в гуи устонавливаеш переменную типа Отряд то видно сто одной строчкой но если переводиш в Jass code то получается бесмыслится типа такого: Quote function Trig_Slow_Func004002003001 takes nothing returns boolean return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false ) endfunction
function Trig_Slow_Func004002003002001 takes nothing returns boolean return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false ) endfunction
function Trig_Slow_Func004002003002002001 takes nothing returns boolean return ( IsUnitVisible(GetFilterUnit(), GetOwningPlayer(udg_SlowCaster)) == true ) endfunction
function Trig_Slow_Func004002003002002002001 takes nothing returns boolean return ( IsUnitAliveBJ(GetFilterUnit()) == true ) endfunction
function Trig_Slow_Func004002003002002002002 takes nothing returns boolean return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_SlowCaster)) == true ) endfunction
function Trig_Slow_Func004002003002002002 takes nothing returns boolean return GetBooleanAnd( Trig_Slow_Func004002003002002002001(), Trig_Slow_Func004002003002002002002() ) endfunction
function Trig_Slow_Func004002003002002 takes nothing returns boolean return GetBooleanAnd( Trig_Slow_Func004002003002002001(), Trig_Slow_Func004002003002002002() ) endfunction
function Trig_Slow_Func004002003002 takes nothing returns boolean return GetBooleanAnd( Trig_Slow_Func004002003002001(), Trig_Slow_Func004002003002002() ) endfunction
function Trig_Slow_Func004002003 takes nothing returns boolean return GetBooleanAnd( Trig_Slow_Func004002003001(), Trig_Slow_Func004002003002() ) endfunction
как это убрать или заменить ?
|
| | |
-
wetalq | Дата: Понедельник, 12-12-2011, 18:20:48 | Сообщение # 15 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Code call GroupEnumUnitsInRange(TG, x3, y3, 256., null) loop set u = FirstOfGroup(TG) if IsUnitInGroup(u, DG) == false and IsUnitEnemy(u,GetOwningPlayer(dummy)) == true then call UnitDamageTarget(dummy, u, damage, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, null) endif call GroupAddUnit(DG, u) call GroupRemoveUnit(TG, u) exitwhen u == null endloop
я делаю тпе
Покупка предметов через способность
|
| | |
-
Caturn | Дата: Понедельник, 12-12-2011, 18:48:08 | Сообщение # 16 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
wetalq, было бы легче объявить в функции лишнего юнита и при инициализации вызвать функцию с возвращающим значением юнита.
офк, вот тут с объяснением. Nevermore, Если тебе нужно вызвать переменную типа группы, и делать действия с ней то вот jass аналог:
Code function fun0002 takes nothing returns nothing local unit unit01=GetEnumUnit()/эта функция возвращает выбранного юнита. call KillUnit(unit01) set unit01=null endfunction
function fun0001 takes nothing returns boolean return (IsUnitAlly(GetFilterUnit(),GetOwningPlayer(udg_Unit000))==false) then endfunction
function fun0001 takes nothing returns boolean //если мы заюзали хеш-таблицу set udg_unit000=LoadUnitHandle(hashtable,GetHandleId(GetTriggeringTrigger(),23) return (IsUnitAlly(GetFilterUnit(),GetOwningPlayer(udg_Unit000))==false) then //или return (IsUnitAlly(GetFilterUnit(),GetOwningPlayer(LoadUnitHandle(hashtable,GetHandleId(GetTriggeringTrigger(),23)))==false) then endfunction function fun0000 takes nothing returns nothing local unit unit01=GetTriggerUnit() local real X=GetUnitX(unit01) local real Y=GetUnitY(unit01) local real radius=675 local group group01=CreateGroup() //без инициализации переменной функция не сможет выполнять работу в триггере, CreateGroup() функция создания группы //если тебе нужно сравнить принадлежность юнита на врага юниту, используем глобальные переменные перед функцией выбора юнитов set udg_Unit000=unit01 //ну или можно воспользоваться хеш-таблицей call SaveUnitHandle(hashtable,GetHandleId(GetTriggeringTrigger()),23,unit01) //если мы воспользовались таблицей, то действия будут немного иначе, и придётся юзать глобальные переменные, если у нас в сопоставлении были переменные родительного рода, ну или мучатся и писать в аргументе юнита "загрузка юнита из таблицы" call GroupEnumUnitsInRange(group01,X,Y,radius,Condition(function fun0001)) //выбор юнитов по координатам. там где кондитион, эта функция сопоставления юнитов. call ForGroup(group01,function fun0002) //работа с юнитами в функции. //если тебе нужно взять всех юнитов в группу, без разбора пользуйся этой функцией call ForGroup(GroupEnumUnitsInRange(group01,X,Y,radius,null),function function0002) set unit01=null call DestroyGroup(group01) endfunction
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Среда, 14-12-2011, 15:54:50 | Сообщение # 17 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Вопрос:
Как создать текст на Jass без утечек и BJ?
и что это значит?
Quote call TriggerRegisterAnyUnitEventBJ( gg_trg_Trigger, EVENT_PLAYER_UNIT_DEATH )
|
| | |
-
Caturn | Дата: Среда, 14-12-2011, 19:36:03 | Сообщение # 18 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Nevermore, плавающий? Quote (Nevermore) call TriggerRegisterAnyUnitEventBJ( gg_trg_Trigger, EVENT_PLAYER_UNIT_DEATH ) функция говорит вроде сама за себя? не? офк, функция объявляет эвент(сценарий) для указанного триггера по которому оно будет работать. В данном случаи триггер будет работать когда указанная в условии(или любая) единица умрёт. Если тебе надо избавиться от BJ, то тут он совсем бесполезен(что с BJ, что без него один фиг). Есть ещё функции:
Code call TriggerAddCondition(Trigger,Condition(function funccon))
Condition - параметр отвечающий за истину или лож (если быть точнее то он позволяет проверять истинна или ложь). Тоже самое и с выбором юнитов в группу.
function - когда было произведено действие в игре, которое заставило работать триггер, триггер включает функцию проверки условий, которая должна обязательно вернуть логическое значение триггеру, FALSE или TRUE. Если функция не вернёт значение то будут утечки, большие.
GetTriggerEvalCount(Trigger) - на будущее, функция считывающая к-во действий функции триггера которое отвечает за условие, не важно, ложно ли было оно или истинно.
Ну и функция действия триггераCode call TriggerAddAction(Trigger,function funact)
function - если условие истинно то идёт действие триггера.
GetTriggerExecCount(Trigger) - функция считывающая к-во действий функции триггера которое отвечает за Действие.
При составлении триггера советую пользоваться таким методом: Code function fun002 takes nothing returns nothing //функции endfunction
function fun001 takes nothing returns boolean if (Услвоие) then call fun002() //(вызов действие триггера) endif //возможен также elseif и else return false //можно так же делать более 1 действия в триггере одновременно endfunction
function fun000 takes nothing returns nothing local trigger trigger01=CreateTrigger() call TriggerRegisterAnyUnitEventBJ(trigger01,Event) call TriggerAddCondition(trigger01,Condition(function fun001)) set trigger01=null endfunction
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Четверг, 15-12-2011, 18:01:37 | Сообщение # 19 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Quote Nevermore, плавающий?
да
|
| | |
-
Caturn | Дата: Четверг, 15-12-2011, 22:05:55 | Сообщение # 20 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Nevermore, ГУИшный вариант тоже безутечен. Code local texttag texttag01=CreateTextTag() call SetTextTagText(texttag01,"нужный текст",0.023) //переменная/текст/размер call SetTextTagPos(texttag01,X,Y,180) //переменная/позиции Х и Y, градус call SetTextTagColor(texttag01,255,10,10,255) //цвет call SetTextTagVelocity(texttag01,78*0.071/128*Cos(90*bj_DEGTORAD),78*0.071/128*Sin(90*bj_DEGTORAD)) /угл парения. формула 78*0.71/128*... скорость текста, а ...*Cos(90*PI) угл call SetTextTagPermanent(texttag01,false) // блокировка текста call SetTextTagLifespan(texttag01,2.00) // жизнь текста set texttag01=null
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |