Да это я знаю я спрашивал как выглядит вот эта функция в BJ
function AngleXY takes real х1, real y1,real x2, real y2 returns real return 57.2957795*Atan2(y2-y1,x2-x1) endfunction
Добавлено (26-02-2011, 14:04) --------------------------------------------- Я тоже тогда вывел одну функцию из BJ Это функция в замен функции UnitHastItemOfType только без утечек.
Code
function ItemFromUnit takes unit u, integer id returns boolean local integer index = 0 loop exitwhen index > 5 if id == GetItemTypeId(UnitItemInSlot(u, index)) then return true endif set index = index + 1 endloop return false endfunction
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 26 Февраля 2011, 14:08:28
real ConvertReal(real min,real max,real r) { whilenot r<max { r-=max } whilenot r>min { r+=max } return r }
Возвращает число в указанном диапозоне. Если не понятно то вот на обычном джас
Code
function ConvertReal takes real min,real max,real r returns real loop exitwhen r<max set r=r-max endloop loop exitwhen r>min set r=r+max endloop return r endfunction
Сообщение отредактировал rixt7956 - Воскресенье, 27 Февраля 2011, 12:54:32
Добавлено (27-02-2011, 23:22) --------------------------------------------- SirNikolas, только у меня к тебе вопрос, не легче вызывать функцию на прямую, ведь в твоих функциях, меняется только 2 константы, и я думаю их не так уж и трудно выучить.
Функция для тех кому хочеться выводить сообщения только для одного игрока или для его союзников. Простенькая но взамен DisplayTextToForce()
Code
function DTP takes player p, string text, boolean b returns nothing local integer i = 0 if (b == false) then call DisplayTextToPlayer(p, 0, 0, text) else loop exitwhen i > bj_MAX_PLAYERS if (IsPlayerAlly(Player(i), p)) then call DisplayTextToPlayer(Player(i), 0, 0, text) endif set i = i + 1 endloop endif endfunction
define { DamagePhysical(u, w, a) = UnitDamageTarget(u, w, a, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) DamagePure(u, w, a) = UnitDamageTarget(u, w, a, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS) DamageMagic(u, w, a) = UnitDamageTarget(u, w, a, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS) }
Нанесение физического, чистого и магического урона соответственно.
Quote (lawson)
Не ну так не интересно тут же тема JASS а не cJASS давайте писать полезные функ-ции на понятном БОЛЬШИНСТВУ языке!
Code
function DamagePhysical takes unit u, widjet w, real a returns nothing UnitDamageTarget(u, w, a, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endfunction function DamagePure takes unit u, widjet w, real a returns nothing UnitDamageTarget(u, w, a, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS) endfunction function DamageMagic takes unit u, widjet w, real a returns nothing UnitDamageTarget(u, w, a, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS) endfunction
Сообщение отредактировал rixt7956 - Понедельник, 28 Февраля 2011, 12:42:23
не легче вызывать функцию напрямую, ведь в твоих функциях меняется только 2 константы, и, я думаю, их не так уж и трудно выучить.
cJASS сделан для того, чтобы было удобней писать. К тому же, при сохранении все приведется к тому виду, что написан справа от знака равенства, это не будет считаться вызовом функции.
function XY takes nothing returns nothing local real X = GetWidgetX(юнит) local real Y = GetWidgetY(юнит) if X <= MinX or X >= MaxX then or Y <= MinY or Y >= MaxY call SetUnitX(юнит,GetWidgetX(юнит2) call SetUnitY(юнит,GetWidgetY(юнит 2) endif endfunction
Что-то типо этого (писал без редактора..), вообщем функция определяет позицию юнита, если он за границами карты, телепортировать к юниту 2. Может понадобится, если использовать SetUnitX/Y..
Добавлено (28-02-2011, 23:02) --------------------------------------------- Поправьте, если чё не так.
romaN-1998, функция бессмысленная. Надо проверять не юнита а точку и не проводить выход за пределы карты. То есть нужная функция будет выглядеть примерно вот так:
Code
globals real udg_MinX = GetRectMinX(GetPlayableMapArea) real udg_MinY = GetRectMinY(GetPlayableMapArea) real udg_MaxX = GetRectMaxX(GetPlayableMapArea) real udg_MaxY = GetRectMaxY(GetPlayableMapArea) endglobals
function CME takes real x, real y returns boolean return x > udg_MinX and x < udg_MaxX and y > udg_MinY and y < udg_MaxY endfunction
в последствии во все триггеры с движением юнита (а лучше в функцию по смещению юнита) следует вбить условие
globals real udg_MinX = GetRectMinX(GetPlayableMapArea) real udg_MinY = GetRectMinY(GetPlayableMapArea) real udg_MaxX = GetRectMaxX(GetPlayableMapArea) real udg_MaxY = GetRectMaxY(GetPlayableMapArea) endglobals
Ни че не понимаю зачем в глобальный приставка udg_?
FkoFF, Я понял бы если ты создал глобалки в редакторе переменных, но
Quote (FkoFF)
globals real udg_MinX = GetRectMinX(GetPlayableMapArea) real udg_MinY = GetRectMinY(GetPlayableMapArea) real udg_MaxX = GetRectMaxX(GetPlayableMapArea) real udg_MaxY = GetRectMaxY(GetPlayableMapArea) endglobals
Не являеться ли извращением над своим кодом, временем, и своими руками
Сообщение отредактировал rixt7956 - Вторник, 01 Марта 2011, 14:00:48
как бы это как раз то что ты выложил, только сделанное нормальным путем. В твоей функции основная проблема - не возможно откатить юнита на предыдущую позицию. Моя же ф-я дает эту возможность