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

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

Ответ
 
silumin

offline
Опыт: 11,153
Активность:
Уровень умения
У меня проблема, уже голову сломал.
Ситуация вкратце:
  • Создаётся юнит для каждого игрока онлайн (играющего)
  • Есть итемы, поднимая которые, юнит получает умения
  • Для каждого из юнитов заведён основной массив [6], в котором хранятся ID умений.
  • Когда юнит поднимает предмет... основной массив ID умений копируется в рабочий массив (сделан для всех прееров)... проверяется, есть ли ID изучаемого умения (на который ссылается поднятый предмет)... если нету - умение изучается и его ID вписывается в рабочий массив в свободную ячейку и происходит обратное копирование из рабочего массива в основной... если ID изучаемого умения присутствует, то повышается уровень умения и всё.
  • для повышения уровня умения использовал: SetUnitAbilituLevel и пробывал IncUnitAbilityLevel (последняя ещё что-то возвращает)
Теперь проблема:
Умения меняют уровень в следующем порядке: 1-1-2-3, т.е. беру итем - 1лвл, беру ещё итем - 1лвл всёравно, беру итем - 2лвл, беру итем - 3лвл.
Мб кто подскажет в чём проблема? Если нужно выложу саму мапу.
Старый 22.02.2008, 07:48
adic3x

offline
Опыт: 108,439
Активность:
если можно не мапу а только код/скрин тригера

я вообще не понял, ты как, на гуи или жассе делал?

теперь как бы я делал... массивы тут ненужны. качаешь нью ген ве... - он даст возможность вносить равкоды ака ид ручками... если тебе надо приаттачить какой либо равкод абилы к равкоду итема просто ставишь ему последнии три чара равкода одинаковыми, as example: 'A000' and 'I000'; 'A000'=='I000'-0x08000000 (пишу в хексе) - если это неясно спрашуй поясню конекретнее, ссыль на редактор тут:

http://xgm.guru/forum/showthread.php?t=13118

теперь по самой абиле... абила я так понимаю не геройская и не итемная...
Код:
i='A000' // rawcode of ability, which added or increased level

// for increase
if GetUnitAbilityLevel(<your unit>, i)==0x00then
 call UnitAddAbility(u, i)
else
 call IncUnitAbilityLevel(u, i)
endif

// for decrease
if GetUnitAbilityLevel==0x00then
 call UnitRemoveAbility(u, i)
else
 call DecUnitAbilityLevel(u, i)
endif


теперь, если ты хочешь что бы эта абила была еще и изучаемой и т.д. тебе либо сделать в красный крестик пустышку, отлавливать тригером ее изучение и добавлять твою не геройскую абилу, либо воообще сделай свой красный крестик через спелл бук=)

если что непонятно написал - уточняй)))
Старый 22.02.2008, 09:35
silumin

offline
Опыт: 11,153
Активность:
Код:
function AddSpellMod takes nothing returns nothing

local integer i
local integer index
local integer SPlvl

set i = 0
set index = 0
set SPlvl = 0
set udg_ItemID = GetItemTypeId (udg_PUitem)
set udg_key = "2crt"
call CRTmassive()

if (udg_ItemID == 1227894832) then
        loop
             exitwhen (index != 0) 
              if (udg_CRTmass[i] == 'A00I') then
                 set SPlvl = GetUnitAbilityLevel (udg_TrigUnit, 'A00I')
                 set SPlvl = SPlvl + 1
                 call SetUnitAbilityLevel (udg_TrigUnit, 'A00I', SPlvl)
                 set index = 1
                 //set udg_key = "2org"  
                 //call CRTmassive()
              endif
              if (udg_CRTmass[i] < 0) then
                 call UnitAddAbility (udg_TrigUnit, 'A00I')
                 set udg_CRTmass[i] = 'A00I'
                 set index = 1
                 set udg_key = "2org"                                                                         
                 call CRTmassive()
              endif
              set i = i + 1
              if (i == 7) then 
                 set index = 1
              endif
        endloop
   endif
endfunction

CRTmassive - функция копирования массивов
udg_key - ключ для установки "направления" копирования

А массивы ИД умений нужны будут для некоторых триггерных спеллов и для возможности удаления умений (мне так проще)
Код немного кривоватый и много лишнего, но он использовался как временный. До него делал так: создавал 3 одинаковых умения с разными характеристиками, а дальше просто отслеживал if'ами ИД умения и заменял его на его более высокий аналог. Минус, что это геморойно, не по-нормальному и умения "скачут" по панели. А выше приведённая функция пашет странно.

Отредактировано FellGuard, 27.02.2008 в 03:05.
Старый 22.02.2008, 11:39
silumin

offline
Опыт: 11,153
Активность:
Сегодня при очередном тестировании карты заметил, что алгоритм работает нормально если между 1м и 2м изучением юнит атаковал кого-нибудь т.е. уровни идут последовательно, без задержек: 1 - 2 - 3... Есть соображения?
Старый 22.02.2008, 23:02
adic3x

offline
Опыт: 108,439
Активность:
silumin.код просто ужасный... цикл вообще не нужен имхо)

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

по сабжу в блоке иф ты проверяешь если у юнита есть абила циклом... GetUnitAbilityLevel(u, 'A000')!=0x00 - сделает тоже самое... и я вообще то неуверен что твоя красота с индексами правильно пашет)

я же вроде написал код вверху)
Старый 23.02.2008, 10:46
silumin

offline
Опыт: 11,153
Активность:
Цитата:
Сообщение от ADOLF
silumin.код просто ужасный... цикл вообще не нужен имхо)

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

по сабжу в блоке иф ты проверяешь если у юнита есть абила циклом... GetUnitAbilityLevel(u, 'A000')!=0x00 - сделает тоже самое... и я вообще то неуверен что твоя красота с индексами правильно пашет)

я же вроде написал код вверху)

Шастать по массивам по средствам индексов у меня получается проще...
Объясни плз что означает 0х00 в выражении GetUnitAbilityLevel(u, 'A000')!=0x00, какой тип данных эти нули? Мб пропускаю что-нить интересное.
Старый 23.02.2008, 15:41
J
expert
offline
Опыт: 48,447
Активность:
silumin
Цитата:
Объясни плз что означает 0х00

Это бональная цыфра "0" в глазах асемблериста, наверно получил эту дурную привычку у тоадкопа...
Старый 23.02.2008, 15:44
silumin

offline
Опыт: 11,153
Активность:
Цитата:
Сообщение от Jon
silumin
Это бональная цыфра "0" в глазах асемблериста, наверно получил эту дурную привычку у тоадкопа...

И jass это нормально воспринимает? Как будет выглядеть цифра 2 или 5 из 10й СИ в формате ХхХХ?.. С какой СИ оперирует jass (имхо 32, есть ИД умений с буквами выше F)?
Старый 23.02.2008, 19:03
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от цитатка из статьи
8-и значная
Чтобы указать, что это именно 8-ти значная, перед значением ставят “0”, т.е. “0<значение>”
10-ти значная
Ну это обычные числа
16-ти значная
Чтобы указать, что это именно 16-ти значная, перед значением ставят “0x”, т.е. “0x<значение>”
256-ти значная
Чтобы указать, что это именно 256-ти значная, значение выделяют одинарными кавычками, т.е. “ ’<значение>’ ”
Старый 23.02.2008, 19:15
silumin

offline
Опыт: 11,153
Активность:

спс, честно говоря, не знал... Только всёравно не знаю почему ИД умений включают числа выше F)
Старый 23.02.2008, 20:30
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
Только всёравно не знаю почему ИД умений включают числа выше F)

обычно равкоды идут в 256 в asc ii
и спокойно переводят в любую другую сисму (юзать вин калк/скачать acs ii tabl)

Цитата:
Это бональная цыфра "0" в глазах асемблериста, наверно получил эту дурную привычку у тоадкопа...

0x00 forever ! а кто бы говорил... Ж, я крайне против твоей действительно вредной привычки рассказывать всем, что все кодят неправильно, а твои говно табуляции и прочь проявления говнокодерства - это тру
Старый 24.02.2008, 12:12
silumin

offline
Опыт: 11,153
Активность:
Почти всё сделано, вот теперь закупорился на такой проблеме: хочу сделать возможность удаления скиллов посредствам строки в чате.
Могу отследить какой игрок прописал тот или иной ключ на удаление скилла
Могу удалить сам скилл.
Знаю ИД юнита у которого нужно удалить скилл ( у всех игроков один одинаковый юнит, так понимаю кодируются они все под одним ИД)
Но как вместо "ТригерингЮнит" поставить выражение типа "Юнит с ИД хххх, пренадлежащий Игроку Х"
Или как это можно организовать по другому.
Заранее спс
Старый 27.02.2008, 01:42
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Группируй.. Формируй группу с фильтром:
Код:
globals
   filterfunc Ftr
endglobals

//  -> create filter
function ff_gen takes nothing returns boolean
  return GetUnitTypeId(GetFilterUnit()) == 'hfoo'
endfunction

...
  set Ftr = Filter(function ff_gen)
...
//  <-

function smthn  takes nothing returns nothing
  local group g = CreateGroup()
  local player p = Player(integer)
  // -> form group
  call GroupEnumUnitsOfPlayer(g, p, ff_gen)
  // <-
 ***
  call DestroyGroup(g)
  set g = null
  set p = null
endfunction
...
здесь особенность - лучше делать фильтр глобальным, там есть свои отрицательные ньюансы с локальными фильтрами.. Лучше сделать один глобальный и более гибкий - 1) не надо будет пересоздавать объект (фильтр) - вару легче, 2) включить в проверку локальные данные можно опосредованно - через кэш, через данные приатаченные к FilterUnit-у, или триггеру, например

FellGuard добавил:
есть кстати просто функция GroupEnumUnitsOfType - можно сделать аналогично, с фильтром по игроку уже ну вобщем, экспериментируй.

FellGuard добавил:
кто как пишет - дело каждого, хотя
ADOLF, мне кажется разумным соблюдать балланс между понятностью кода, оформлением и отсутствием лишних затрат) Т.е. не принципиально ставить просто 0 или 0х00, один фиг внутреннее представление не меняется а парсер читает 3 лишних символа ;)

Отредактировано FellGuard, 27.02.2008 в 03:25.
Старый 27.02.2008, 03:29
adic3x

offline
Опыт: 108,439
Активность:
FellGuard, написал кучу кода, совершенно ненужного в данном случае, и читает мне тут что то про лишнии символы) *rofl*
Код:
call UnitRemoveAbility(u_mpu[GetPlayerId(GetTriggerPlayer())], 0x41303030)


тока непроверял возращает ли чатМесаг тригер плаера... т.е. изначально занести юнитов в аррей в соответсвие с индексами игроков)
Старый 27.02.2008, 11:08
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
Но как вместо "ТригерингЮнит" поставить выражение типа "Юнит с ИД хххх, пренадлежащий Игроку Х"
я кнешна помню про твою любофф к массивам... =)

FellGuard добавил:
а фтыкнул, юнит один. Ну ладно, Адольф победил *лол*

FellGuard добавил:
код всеравно не буду убирать, в др. ситуации полезно :Р
Старый 27.02.2008, 11:49
silumin

offline
Опыт: 11,153
Активность:
Я всё сделал так:
Код:
call GroupAddGroup( GetUnitsOfPlayerAndTypeId(udg_Player, 'h000'), udg_GroupUnits )
call UnitRemoveAbilityBJ( i, GroupPickRandomUnit(udg_GroupUnits) )


i - ИД абилки
как я понял функция GetUnitsOfPlayerAndTypeId(udg_Player, 'h000') возвращает всех юнитов с указанным ИД принадлежащих определённому игроку. А на карте у каждого игрока только 1 юнит с таким ИД. Понатно что при рандомном выборе юнита из группы всегда будет выбираться один юнит т.к. только он и есть в группе.

Ну и естественно перетряска массива умений игрока на наличие и удаления абилки, ИД которой хранится в <i>.

Отредактировано silumin, 27.02.2008 в 19:38.
Старый 27.02.2008, 19:32
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
silumin, если юнит один то его действительно лучше запомнить в массив с самого начала или там в течение игры
Код:
u_mpu[0] = Player 1 unit
u_mpu[1] = Player 2 unit
...
u_mpu[n] = Player n+1 unit
такой огород городить изза одного юнита неоптимально, Адольф прав
Старый 27.02.2008, 20:45
adic3x

offline
Опыт: 108,439
Активность:
silumin, что то ты не то пишешь ТТ=/

твой код - первая инструкция добовляет к одной группе юнитов другую, вторая, гхм, зачем рандом юнит?

короче, скачай джасс крафт и возми библиотеки коммон.дж и близзард.дж оттуда, или извлеки их мпку редактором из архива вар3х.мпку\скриптс

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

и поехали ка мы наверное в жасс раздел...
Старый 28.02.2008, 13:42
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
ADOLF просьба не юзать HEX в ответах для юзеров, не надо их загружать ещё чем-то
Старый 28.02.2008, 20:11
StarTraveller

offline
Опыт: 965
Активность:
HEX система вычисления удобная когда работать с большими (ну или не очень) числами которые кратные степени 2йки.
напр.
1024 =0х400
2048 = 0х800
4096 = 0х1000
8192 = 0х2000
ну и т.д.
2147483648 = 0х80000000 (это максимальное значения integer в джассе вроде.)
ну правдо в том что не имеет смысла просто везде подрят использовать НЕХ если тока для "защиты" кода.
Старый 29.02.2008, 01:47
Ответ

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

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

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

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



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