XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Оптимизация
Цитата:
constant function S takes nothing returns integer
return 'A02B' // Spell rowcode
endfunction

constant function C takes nothing returns integer
return 'e000' // Caster rowcode
endfunction

function Trig_Scatter_Conditions takes nothing returns boolean
return (GetSpellAbilityId()== S() )
endfunction

function Trig_Scatter_Actions takes nothing returns nothing
local location l=GetSpellTargetLoc()
local location m
local location u=GetUnitLoc(GetTriggerUnit())
local integer c=3+3*GetUnitAbilityLevelSwapped(S(),GetTriggerUnit())
local unit t=GetTriggerUnit()
local unit p
loop
exitwhen c<=0
set p=CreateUnit(GetOwningPlayer(t),C(),GetUnitX(t),GetUnitY(t),90)
set m=PolarProjectionBJ(l,GetRandomReal(0,360),GetRandomReal(0,360))
call IssuePointOrderByIdLoc(p,851984,m)
call UnitApplyTimedLifeBJ(.5,'BTLF',p)
call RemoveLocation(m)
set c=c-1
endloop
call RemoveLocation(u)
call RemoveLocation(l)
endfunction

function InitTrig_Scatter takes nothing returns nothing
set gg_trg_Scatter = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Scatter,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Scatter,Condition(function Trig_Scatter_Conditions))
call TriggerAddAction(gg_trg_Scatter,function Trig_Scatter_Actions)
endfunction


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

Мне еще очень надо написать функцию, которая бы возращала компоненты кода

constant function Remove takes nothing returns что-то
return call remove location x
endfunction
Где х некая переменная.
Зачем это надо?
Код становится в 20 раз короче, надеюсь на вашу помощь.

Кто нибудь знает как сделать вызов 1 из 3 юнитов дамми без кучи If else.
Это надо сделать для того что-бы можно было сделать 3 вида дами атакеров каждый уникален.

Отредактировано DioD, 02.03.2006 в 09:55.
Старый 02.03.2006, 09:25
zibada

offline
Опыт: отключен
Цитата:
Мне еще очень надо написать функцию, которая бы возращала компоненты кода

constant function Remove takes nothing returns что-то
return call remove location x
endfunction
Где х некая переменная


такого делать нельзя.
можно извратнуться, и написать функцию создания "самоуничтожающейся" через 0.01 сек точки (вот здесь написано, как такое сделать с эффектами, на точки это легко переносится), тогда не придется никогда писать RemoveLocation вообще... но имхо, это стрельба из пушки по воробьям =)

Цитата:
Кто нибудь знает как сделать вызов 1 из 3 юнитов дамми без кучи If else.
Это надо сделать для того что-бы можно было сделать 3 вида дами атакеров каждый уникален.

можно как-то так:

local integer array u
local integer u1
set u[0] = 'xxxx'
set u[1] = 'yyyy'
set u[2] = 'zzzz'
set u1 = u[GetRandomInt(0, 2)]

в u1 будет рандомный тип из описанных.
для более навороченных случаев, опять-таки, можно юзать кэш.
Старый 02.03.2006, 10:28
DioD

offline
Опыт: 45,134
Активность:
Большое спасибо, возник только один вопрос по ожиданию,
Цитата:
call TriggerSleepAction( )
call PolledWait( )


Что лучше использовать для тригеров? Вопрос возник после просмотра ДотЫ, там во многих местах встречается Polled.


Цитата:
function Trig_DestroyFx_Actions takes nothing returns nothing
local effect f=bj_lastCreatedEffect
call TriggerSleepAction( 1.00 )
call DestroyEffect(f)
set f=null
endfunction


Я всё-же нашел что мне было нужно, может кому-то интересно, вот кусок этой функции.

Просто больше спросить негде, так что ногами не бейте.
Как известно в картах типа доты 10 игроков и 2 компа,
также есть еще 2 стороны, крипы и злые крипы, стоит ли
жертвовать нейтралами ради шестого места в командах?

Отредактировано DioD, 02.03.2006 в 12:26.
Старый 02.03.2006, 12:17
NETRAT

offline
Опыт: 83,712
Активность:
DioD оба ожидания в ацтой. Если уж очень приперло вешать очередь триггеров, то лучше call TriggerSleepAction( ) так как он проверки не делает. Лучше использовать таймеры - то есть разбивать функцию на две части и вторую часть заносить в действие таймера. Конечно, если время ожидания невелико, а переменных которые нужны во второй части достаточно много, то можно и TriggerSleepAction

Гм, я, например вообще эти две команды не использую, а PolledWait на мой взгляд - это дурной тон так как он частенько проверяет свое время жизни (и, кстати, из BJ)

А каким образом ты хочешь пожертвовать? Компов заменить на нейтралов? Они же воевать не будут друг с другом. Думаю, что это не обязательно. В контре, кстати говоря, командная игра именно 5*5
Старый 02.03.2006, 14:13
DioD

offline
Опыт: 45,134
Активность:
Как-то я с таймерами не дружу, то ошибки то криво работает, но если не очень трудно, можно ссылку на какой-нибудь готовый пример.
А про замену компов нейтралами, они дерутся, просто необходимо добавить их в карту как игроков.
То-есть выставить им приоритеты врагов и союзников.
Я сейчас печатая карту и хочу сделать её особеной и несколько унакальной, именно для этого требуются 6 игроков на сторону.
А ожидания у меня есть почти во всех тригерах, что не особо мне нравится.
И еще один вопрос по RB+Cache , стоит ли делать малый заголовок а необходимые функции выносить в самый верх тригеров которые их используют.
Старый 02.03.2006, 15:16
Markiz

offline
Опыт: 11,432
Активность:
Netrat: полледвэйт работает нормально при любой скорости игры.
Старый 02.03.2006, 15:50
DioD

offline
Опыт: 45,134
Активность:
Кстати, какие еще полезности есть кроме
call DoNotSaveReplay()
?
Старый 02.03.2006, 15:56
TiM
Старичок
offline
Опыт: 8,594
Активность:
можно выкидывать читеров в винду путем запуска бесконечного цикла.
Старый 02.03.2006, 16:14
DioD

offline
Опыт: 45,134
Активность:
Вот такие фичи мне очень пригодятся, функцию в студию пожалуста.
Кстати я почти сделал "магию" осталось подогнать под JESP и готово.
Старый 02.03.2006, 16:24
NETRAT

offline
Опыт: 83,712
Активность:
Markiz да, я знаю, однако мало кто меняет скорость игры, и, потом, это слишком уж Rapidly

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

DioD так ты собираешься выставить Neutral Passive против Neutral Hostile или как?
ожидания - это не по-кодерски. Все следует делать на основе событийной модели. Это, конечно понятно, что те же WaitForSingleObject(VC++) в винде реализованы через проверки, однако, они намного более оптимальны чем мы те же проверки делали бы ручками в программе

Таймеры нормально работают, просто ты не умеешь их готовить...

О чем ты спрашивал в последнем вопросе - что-то не совсем понимаю?
Старый 02.03.2006, 17:15
DioD

offline
Опыт: 45,134
Активность:
Так всем спасибо за ответы, остальное я уже решил при момощи яндекса, всё-таки поисковики это сила.
Я очень долго мучил одну карту AoM , типа век мифов, там это реализовано четко и ясно.
Но вытащить эту туму полностью пока не смог, уж очень там замутно и нет ориентиров типа названий или моделей внутри кода.
А что мешает написаь тему типа если кто то напишет greedisgood = плаер стэйт леав?
Кстати что лучше использовать для хранения констант
Глобальные переменные
Кеш
Константы
Старый 03.03.2006, 07:52
NETRAT

offline
Опыт: 83,712
Активность:
Константы, конечно, если не получится, то без разницы что. Дело в том что глобалки переносить сложнее, однако доступ к ним осуществляется быстрее чем к кешу
что за карта AoM? - может линк кинь
Старый 03.03.2006, 11:35
DioD

offline
Опыт: 45,134
Активность:
А мне не надо что либо переносить, я буду эксперементировать с защитой так как могу, может даже сделаю огромную кучу переменных и всё перемешаю а потом оптимизирую.

Тогда код будет нечитаем человеком.



Кстати тут реализовано многое что хотели сделать в MyDotA.
Только вдобавок сделано то чего в доте нет и никогда небыло.

Отредактировано NETRAT, 03.03.2006 в 14:24.
Старый 03.03.2006, 13:43
NETRAT

offline
Опыт: 83,712
Активность:
Ну, вообще-то по слухам в MyDota реализовано достаточно...
Смысл в том что разобраться в любом коде вполне реально - всегда стоит вопрос - стоит ли то время, которое было потрачено на обфускацию того эффекта, который получен в результате. То есть возьмем, к примеру, Доту - в ней разобраться и убрать результаты обфускации достаточно просто (кстати говоря ее параллельно можно значительно оптимизировать) однако займет около 8 часов(во всяком случае у меня), зато после этого я точно буду знать что к чему и смогу делать с нею все что захочу. Имеет ли для меня смысл потратить на это 8 часов? На данный момент - нет
Тогда зачем еще все усложнять? Увеличить время которое я должен буду потратить? Так ведь я его и так не стану тратить...
спасибо за линк
Старый 03.03.2006, 14:22
DioD

offline
Опыт: 45,134
Активность:
Лично мне непонятно стремление некоторых личностей защитить свои творения всеми мыслимыми и немыслимыми способами, особенно это относится к доте.
Так как я используя ориентиры - линки на модели внутри кода, очень быстро разбил весь код на группы.

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

Кстати, я не обнаружил РБ+кеш внутри заголовка доты но в различных его частях наблюдается одно и тоже.

Кстати мне очень нужен конвертер стринговых команд в числовой набор.
Так как через список неудобно работать.

Всё нашел сам, но возник один вопрос чисто по джазу.
Инициация многих тригеров написана так
Цитата:
function InitTrig_Что-то takes nothing returns nothing
local triger T = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(T,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(T,Condition(function Trig_Scatter_Conditions))
call TriggerAddAction(T,function Trig_Scatter_Actions)
endfunction


Зачем это сделано, я не понимаю.

Отредактировано DioD, 04.03.2006 в 12:12.
Старый 03.03.2006, 15:23
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
Кстати, я не обнаружил РБ+кеш внутри
Прально, там его нет, именно поэтому возможны баги и нереальна поддержка мультиинстанса

Я всегда пишу в логическом порядке то есть
Код:
local triger T = CreateTrigger()
call TriggerAddAction(T,function Trig_Scatter_Actions)
call TriggerRegisterAnyUnitEventBJ(T,EVENT_PLAYER_UNIT_SPELL_EFFECT)
Кондишны я вообще не пишу - не вижу смысла
Старый 04.03.2006, 13:37
DioD

offline
Опыт: 45,134
Активность:
Скажу большой секрет, это скатер из доты так как он был, только переименованы переменные.
А кусок тригера с локалкой это компонент такого навыка как импектус, который сделан через глобальные переменный и воще непонятно как работает.
Старый 04.03.2006, 13:58
DioDUnderCry
Access Denied by NETRAT
offline
Опыт: 92
Активность:
Здрасте все.

Мне нужно написать функцию для превращения любого кто атакует союзника в овцу.

Цитата:
function TA2Sheep takes nothing returns nothing
call IssueImmediateOrderBJ( GetAttacker(), "stop" )
call CreateNUnitsAtLoc( 1, 'h00D', GetOwningPlayer(GetAttackedUnitBJ()), GetUnitLoc(GetAttacker()), bj_UNIT_FACING )
call UnitAddAbilityBJ( 'Aloc', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A00S', GetLastCreatedUnit() )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "polymorph", GetAttacker() )
call UnitApplyTimedLifeBJ( 0.50, 'BTLF', GetLastCreatedUnit() )
endfunction


Так вот эту функцию мне надо написать и разместить так что-бы написав
call TA2Sheep
Эта функия запускалась
Старый 05.03.2006, 11:14
Медведь
ФффыррфррфффФФфф!
offline
Опыт: 21,702
Активность:
DioDUnderCry её надо написать в кастом-коде карты. Подробнеее - в редакторе тригов, справа, где древовидный каталог триггеров и категорий жмёшь на значок карты, в самом верху. Слева появляются:
--поле для комментариев (верх)
--поле для кода (низ)
вот в это нижнее и пишешь функцию

ЗЫ ну не хотите вы ФАКи читать, так хотя бы World Editor Help зади и прочти!
Старый 05.03.2006, 22:24
NETRAT

offline
Опыт: 83,712
Активность:
Медведь ну если учесть что DioD и DioDUnderCry - один человек, то для меня достаточно странно, если он не знает что такое кастом код ... я вообще не понял суть вопроса, учитывая набор постов этого пользователя в этой теме
Старый 05.03.2006, 22:27
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 05:50.