Хочу взяться за нелёгкое дело, заменить BJ-функции для всех людей на планете Земля, сколько смогу! Коли никто из профессиональных программистов до сих пор за 15 лет на самой известной игре Мира не смог сделать пользу для народа! Заодно это будет неплохой практикой в изучении jass-программирования.
Учебный материал у меня имеется, и какие-то обрывки информации можно найти в интернете. Я не буду спрашивать о каких-то конкретных BJ-функциях, и то, как их исправить, но разъясните мне, новичку, примерную структуру того, как нужно их переписывать и куда конкретно что писать? То есть как сделать это всё в виде библиотеки, чтобы можно было всё подключить одним движением для пользователя? Но на JNGP не желательно думаю, так как там могут быть баги и вирусы (а Я человек суеверный). Прошу обратить внимание что мне нужно чтобы стандартные названия остались, а "внутренняя мякоть" функций вся была переделана и оптимизирована. Как этого добиться?

Принятый ответ

Похожие вопросы:

ответ
вопервых ты в 1 и ту же ячейку пытаешся записать 2 значения (location и integer)
во вторых ты создаёш область по кординатам а следующей строчкой находиш эти же кординаты с помощью функций
в 3 ты сохранял точку в хэш и сразу же удалял её
и в 4 ты не инициализировал хэш
function Trig_SlayerUlt_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00V'
endfunction
function Ultaction takes nothing returns nothing
local timer st = GetExpiredTimer()
local integer sid = GetHandleId(st)
local unit su = LoadUnitHandle (udg_Hash, sid, 0)
if IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitEnemy( GetEnumUnit(), GetOwningPlayer(su)) == true then
call UnitDamageTargetBJ( su, GetEnumUnit(), 210.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
endif
set su = null
endfunction
function UltimateRun takes nothing returns nothing
local timer st = GetExpiredTimer()
local integer sid = GetHandleId(st)
local unit su = LoadUnitHandle (udg_Hash, sid, 0)
local integer suid = GetHandleId(su)
local location suloc = LoadLocationHandle(udg_Hash, sid, 1)
local effect sueff = LoadEffectHandle (udg_Hash, sid, 2)
local real x = GetLocationX( suloc )
local real y = GetLocationY( suloc )
local rect surect = Rect( x - 600.00*0.5, y - 600.00*0.5, x + 600.00*0.5, y + 600.00*0.5 )
local location random = Location (GetRandomReal(x-600*.5,x+600*.5), GetRandomReal (y-600*.5, y+600*.5))
local integer sc = LoadInteger (udg_Hash, sid, 10)
call SetUnitPositionLoc( su, random )
call SetUnitAnimation( su, "attack" )
call AddSpecialEffectLocBJ( random, "Abilities\\Spells\\Human\\Thunderclap \\ThunderClapCaster.mdl" )
call DestroyEffectBJ ( GetLastCreatedEffectBJ() )
call AddSpecialEffectLocBJ( random, "Abilities\\Spells\\Items\\AIil\\AIilTarget.mdl" )
call DestroyEffectBJ ( GetLastCreatedEffectBJ() )
call ForGroupBJ ( GetUnitsInRangeOfLocAll(250.00, suloc), function Ultaction )
set bj_wantDestroyGroup=true
call SaveInteger(udg_Hash,sid,10,sc + 1)
if sc >= 10 then
call SetUnitPositionLoc( su, suloc )
call DestroyEffectBJ( sueff )
call SetUnitPathing( su, true )
call SetUnitInvulnerable( su, false )
call PauseUnitBJ( false, su )
call SetUnitVertexColorBJ( su, 100, 100, 100, 0.00 )
call PauseTimer(st)
call DestroyTimer(st)
call FlushChildHashtable(udg_Hash, sid)
endif
set suloc = null
set random = null
set st = null
set su = null
set sueff = null
endfunction
function Trig_SlayerUlt_Actions takes nothing returns nothing
local timer st = CreateTimer()
local integer sid = GetHandleId(st)
local unit su = GetTriggerUnit()
local integer suid = GetHandleId(su)
local location suloc = GetUnitLoc(su)
local effect sueff
local real x=GetUnitX(su)
local real y=GetUnitY(su)
call AddSpecialEffectTargetUnitBJ ( "hand right", su, "Abilities\\Weapons \\PhoenixMissile\\Phoenix_Missile.mdl" )
set sueff = GetLastCreatedEffectBJ()
call SetUnitPathing( su, false )
call SetUnitInvulnerable( su, true )
call PauseUnitBJ( true, su )
call SetUnitVertexColorBJ( su, 100, 100, 100, 50.00 )
call SaveUnitHandle(udg_Hash, sid, 0, su)
call SaveAgentHandle(udg_Hash, sid, 1, suloc)
call SaveAgentHandle(udg_Hash, sid, 2, sueff)
call SaveAgentHandle(udg_Hash, suid, 0, st)
call SaveInteger (udg_Hash, sid, 10, 1)
call TimerStart( st, .3, true, function UltimateRun )
set suloc = null
set st = null
set su = null
set sueff = null
endfunction
===========================================================================
function InitTrig_SlayerUlt takes nothing returns nothing
set gg_trg_SlayerUlt = CreateTrigger ( )
set udg_Hash=InitHashtable()
call TriggerRegisterAnyUnitEventBJ ( gg_trg_SlayerUlt, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition ( gg_trg_SlayerUlt, Condition( function Trig_SlayerUlt_Conditions ) )
call TriggerAddAction ( gg_trg_SlayerUlt, function Trig_SlayerUlt_Actions )
endfunction
ответ
Steal nerves:
filterGetUnitsOfTypeIdAll - фильтр, вместо него должно быть написано либо null или Condition( function XXX) Короче зачем нужен фильтр? Фильтр при выборе всех юнитов сразу отсеивает не нужных, если по условию не подходит, то выкидывает.. Вам сразу достается готовая группа с нужными юнитами
А в качестве переменных используй GetFilterUnit, GetFilterPlayer. На гуи по-другому называют MatchingUnit
где XXX - название функции, эта функция возвращает boolean (то есть истину или ложь)
вбей в поиск названии функции, может найдешь ответ
например выделяем все здания UNIT_TYPE_STRUCTURE, а те, кто не является зданием отсеиваем
function XXX takes nothing returns boolean
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)
endfunction
насчет статьи не видел, это придет с пониманием. Главное начать. Сначала тупо конверт, и оптимизация. А дальше можешь сам
что у тебя там не работает скидывай сюда


Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
17
6 лет назад
0
оо если взялся давай целый вар мути лутше на каком нить движке
0
7
6 лет назад
0
ledoed, такую тему поднял, про которую Я могу написать тут целую книгу. И не думай что Я не смогу! У меня есть методы как один человек может сделать огромную работу... И мотивы есть интересные... Но давай всё таки не будем отклонятся от этого вопроса, так как возможно, это будет ещё одним аргумент в пользу принятия, или отказа от Warcraft-а!
0
15
6 лет назад
0
Не все утечны BJ-функции, но всё равно требуют переделки и оптимизации.
Зачастую проблема не в самих БЖ (хотя они тоже вносят свой вклад в лагодром и утечки), а в плохих алгоритмах, не удалении объектов и не обнулении переменных в коде который пишет сам мап-мейкер.
И вот трансляция GUI в JASS которую делает редактор при сборке карты, как раз таки порождает этот самый плохой код с плохими алгоритмами.
Комбинация JNGP + ALL.j отчасти исправляет это, насколько я знаю. Но что бы все работало идеально, это нужно переписать редактор карт, переписать сам движок варкрафта и что бы все мапмейкеры писали идеальный код.
А еще извини за вопрос, наверное это бестактно, но все же. Сколько тебе лет?
0
32
6 лет назад
0
Нахрен это кому нужно, вы сами не догадались почему никто гуи не доделывал? Все кто хотели - перешли на jass и забыли про утечки и много кликать, не говоря о том что наработок на jass куда больше.
0
7
6 лет назад
0
проблема не в самих БЖ
Проблема как раз в БЖ! И не важно на jass или на GUI вы пишете!
AlexSan:
И вот трансляция GUI в JASS которую делает редактор при сборке карты, как раз таки порождает этот самый плохой код с плохими алгоритмами.
Если Я ошибусь на jass - компилятор выдаст ошибку, а если ошибусь на GUI - не ошибусь, потому что там всё лишнее закрыто и замуровано. Не встречал ошибок на GUI, кроме одной, когда множество вложенностей оператора if (штук 30) в предыдущие else породили ошибку компилятора, и то, Я просто написал их без вложенности и всё поехало.
AlexSan:
Комбинация JNGP + ALL.j отчасти исправляет это
Я только что в предыдущем вопросе разбирался с этим, ставил JNGP + ALL.j, и с котом решали этот вопрос - НЕ РАБОТАЕТ!
Сколько тебе лет?
Не вижу смысла отвечать, но отвечу если будет смысл. Бывает старик не наигрался, а бывает ребёнок уже большой. И вообще, у нас тут тема программирования а не Клуб Знакомств!
quq_CCCP, Во-первых, есть люди которым трудно даже один простой триггер написать, уровень 5-ти летнего ребёнка. Но почему Warcraft 3 стал популярен и так долго держится? Потому что там есть редактор и возможность что-то творить самому, и лезут те кто не умеет программировать, но которым нужна практика на чём-нибудь попроще. Сам с этого начинал, потом выучил много языков программирования...
Во-вторых, если даже вы пишете на jass, то всё равно непонятно, как вам будут мешать переписанные функции-BJ? Скорее наоборот, не придётся каждый раз думать об утечках даже на jass.
И в-третьих, давайте по существу вопроса!? Я закрою его, но если нечего пока сказать то лучше не надо.
Мне порой даже кажется что это у вас любимая тема, обсуждать что jass лучше GUI. В каждом вопросе меня в этом убеждают! Давайте создадим отдельный вопрос и там будем обсуждать что лучше? Но сейчас Я хочу реальное дело сделать и мне нужна информация про BJ!
0
26
6 лет назад
0
никто в своем уме не использует бж функции делая код на jass, фееричный...
0
32
6 лет назад
Отредактирован quq_CCCP
0
Бж функции, это функции из Blizzard.j и Blizzard.ai (для кода карты и кода ии соответственно). Находятся эти файлы в war3path.mpq гуи использует бж функции, их там довольно много, многие тупо обертки, другие некоторые механизмы с созданием обьектов (функции для работы с группами, мультибордами) многие имеют много мусора и ненужных действий (к примеру create unit), конвертировать в текст триггер и посмотреть как оно выглядит не сложно, так же не сложно написать в виде текста свой алгоритм (примеры и статьи есть) это не сложно для простых задач, сложные задачи вы бы хрен реализовали на гуи и затратили бы уж точно не меньше времени. По мимо у утечек в гуи не рализовано нормальное использование координат, таймеров, триггеров. В jass можно создать и удалить таймер, на 1 раз чтобы сделать какую то задержку или реализовать спелл, на гуи же
это у вас не получится, придется юзать отдельный триггер + городить массивы...
Так что вы зря тут говорите что проще, а что сложнее.
1
15
6 лет назад
1
Проблема как раз в БЖ! И не важно на jass или на GUI вы пишете!
И вот ты снова показываешь свое незнание проблемы. БЖ есть лишь обертка над нативками которая выполняет некоторую работу. Если ты хочешь пораскрывать все БЖ, то эту работу тебе нужно будет каждый раз делать руками.
Создают проблемы лишь те БЖ где утекает объект и/или не обнулена переменная.
Основной источник проблем это неправильные алгоритмы и неправильная работа с памятью (читай утечки которые мапмейкер допускает сам).
Dagger667:
Если Я ошибусь на jass - компилятор выдаст ошибку, а если ошибусь на GUI - не ошибусь, потому что там всё лишнее закрыто и замуровано.
Ты опять таки, сравниваешь две разных вещи. Да, в ГУИ допустить ошибку в синтаксисе просто, но синтаксические ошибки есть лишь малая часть ошибок.
Что касается алгоритмических ошибок, то в Джассе их допускать немного сложнее, так как ты явно видишь что и когда вызывается, обнуляется и так далее.
Dagger667:
НЕ РАБОТАЕТ!
У всех работает, а у тебя нет?
Проблема в тебе и твоих кривых руках.
Dagger667:
отвечу если будет смысл
Твое упорство, самоуверенность и игнорирование всего что ты не понимаешь очень смахивает на то как ведут себя маленькие дети (и некоторые так и не выросшие не дети).
Dagger667:
потом выучил много языков программирования
Что-то не верится.
0
7
6 лет назад
Отредактирован Dagger667
0
не использует бж функции делая код на jass
Потому что они утечны и непродуманны, но стоит их переделать, как предпочтения изменятся. Потому что проще написать одну строку вызова функции чем городить...
quq_CCCP:
Находятся эти файлы в war3path.mpq
Они-то находятся там, то можно ли их заменить в нестандартном коде, в подключаемой библиотеке? quq_CCCP:
сложные задачи вы бы хрен реализовали на гуи
Почему нет? ... Да, на GUI не хватает базовых возможностей, таких как прибавление белого и зелёного урона, таймеров, многомерных массивов, создание героя из обычных юнитов, и прочего, но что мешает потом сделать эти функции, когда всё стандартное будет подправлено? Пушистик же занимается этим!? Я бы мог потом присоединиться к нему, когда сделанная работа будет внушительной. Или мог бы пойти по другому пути, есть идеи... И вообще, знаете, одни пытаются маленькой корявой отвёрткой построить самолёт, и делают это долго и мучительно, каждый раз борясь с утечками и прочим, а другие предпочитают поменять сам инструмент, что значительно ускорит и упростит работу, а в некоторых случаях и вообще перейдёт в новое качество! Туда так же можно добавить алгоритмы которые вообще не сравнятся с работай и миллиона модмейкеров! AlexSan:
Основной источник проблем это неправильные алгоритмы и неправильная работа с памятью
Ну, в BJ-функции.
AlexSan:
Да, в ГУИ допустить ошибку в синтаксисе просто,
Видимо опечатка, в jass.
AlexSan:
алгоритмических ошибок
Возможно. На этот случай jass остаётся. Всегда есть возможность, для особо дотошных, написать запутанный клубок кода на jass. Но одно другому не мешает!
AlexSan:
У всех работает, а у тебя нет?
У всех не работает! Я много читал на разных форумах как люди жаловались. Автор этого творения даже спорил на HIVEWORKSHOP о том что 100% или не 100% рабочая библиотка, так как vJass и cJass по разному работают. Хотя Я честно не понимаю причём тут это.
AlexSan:
Твое упорство, самоуверенность и игнорирование всего...
Так пишешь ложное! Все знают что проблема в BJ-функциях!
AlexSan:
Что-то не верится.
Не важно... Пусть не верится.

quq_CCCP, твой ответ жду особенно!
0
32
6 лет назад
0
Dagger667, а зачем ты спрашиваешь если не знаешь? Разумеется нужен хак редактора, чтобы что то там использовать по другому, не так как у близзардов - гуишник который упрямится слезть с гуи не сделает этого, работы там много и знаний нужно много, а не вялые познания там или тут утечка.
Пытаться что то там сделать - глупость, это никому не надо (тебе это тоже не надо, ты даже не сможешь), те кто делали руссификаторы и расширенные гуи тоже это поняли, их используют единицы и внезапно делают все те же костыли с утечками и вейтами + дурью. Отказ от развития есть деградация. Пошаришся по бж функциям и до тебя дойдет.
Переписать кару на jass не долго, особенно если тебе ничего нового выдумывать ненужно (футманы же у тебя, там дел на пару дней)
0
26
6 лет назад
0
Потому что они утечны и непродуманны, но стоит их переделать, как предпочтения изменятся. Потому что проще написать одну строку вызова функции чем городить...
Все знают что проблема в BJ-функциях!
да никто не использует бж функции если знает jass! ало!
делают свои функции, и это не занимает много времени
зачем лезть туда где вы абсолютно невежественны?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.