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

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

 
Warden
:::...
offline
Опыт: 26,106
Активность:
ИИ_SkillCodeSystem
В этой статье я расскажу о самом удобном способе заставить героя учить и использовать заклинания.

Система о которой будет идти речь называется – Skill Code System.

Skill Code System (в дальнейшем, просто - SC) – основана на комбинации Cache + ID converter, что дает обширные возможности в ее использовании.

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

Конечно какие-то знания в JASS вам необходимы, но я думаю, что большинство меня отлично поймет и оценит мою идею.

Для того чтобы использовать SC вам потребуется :

1.В CustomScriptCode (Нестандартный код) следуйщие функции :

» CustomScriptCode functions


function chr takes integer i returns string
local string abc = "abcdefghijklmnopqrstuvwxyz"
local string ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local string digits = "0123456789"
if i >= 65 and i <= 90 then
return SubString(ABC, i-65,i-64)
elseif i >= 97 and i <= 122 then
return SubString(abc, i-97,i-96)
elseif i >= 48 and i <= 57 then
return SubString(digits, i-48,i-47)
endif
return ""
endfunction

function CPos takes string StrData, string ToFind, integer From returns integer
local integer FromPos = From
loop
exitwhen (SubString(StrData, FromPos, FromPos+1) == ToFind) or (SubString(StrData, FromPos, FromPos+1) == "")
set FromPos = FromPos + 1
endloop
if (SubString(StrData, FromPos, FromPos+1) == ToFind) then
return FromPos
endif
return -1
endfunction

function int takes string Str returns integer
local integer Pos = CPos("ABCDEFGHIJKLMNOPQRSTUVWXYZ", Str, 0) + 65
if Pos == 64 then
set Pos = CPos("0123456789", Str, 0) + 48
endif
if Pos == 47 then
set Pos = CPos("abcdefghijklmnopqrstuvwxyz", Str, 0) + 97
endif
if (Str == "") then
return 0
else
return Pos
endif
endfunction

function ID2String takes integer itemid returns string
return chr(itemid/256/256/256) + chr(ModuloInteger(itemid/256/256, 256)) + chr(ModuloInteger(itemid/256, 256)) + chr(ModuloInteger(itemid, 256))
endfunction

function String2ID takes string str returns integer
return int(SubString(str,0,1))*256*256*256 + int(SubString(str,1,2))*256*256 + int(SubString(str,2,3))*256 + int(SubString(str,3,4))
endfunction

function RunSkillCodeForUnit takes unit u returns nothing
local integer i = 1
local integer end = GetStoredInteger(udg_cache, "MaxHeroLevel", "") * 4
local string unitID = UnitId2String(GetUnitTypeId(u))
local string skillcode = GetStoredString(udg_cache, "SkillCodeFor", unitID)
loop
exitwhen i > end
call SelectHeroSkill(u, String2ID(SubStringBJ(skillcode, i, i + 4)))
set i = i + 4
endloop
set unitID = null
set skillcode = null
endfunction


2.Глобальная переменная gamecache (буфер игры) – cache (udg_cache)
3. Записать в кэш число равное максимальному уровню героя (см. пример)

Код:
call StoreInteger (udg_cache, "MaxHeroLevel", "", 10)


4.Инициализировать SC для юнитов (см. далее)

Я думаю все понятно, значит осталось только научить вас записывать SC
Покажу вам практический пример на [offline]паладине[/offline] :

Код:
local string h = UnitId2String('Hpal')

local string s1 = "AHhb" // Благодать
local string s2 = "AHds" // Божественный щит
local string s3 = "AHad" // Доспехи веры
local string s4 = "AHre" // Воскрешение

local string skillcode = s1+s2+s3+s1+s2+s4+s3+s1+s2+s3
call StoreString (udg_cache, "SkillCodeFor", h, skillcode)


Поясняю :

Переменная h – id нужного юнита (Чтобы его узнать – нажмите Ctrl + D в редакторе объектов)

Переменные s# – Перечень способностей героя
Переменная skillcode – в эту переменную записываются переменные s# - в нужной вам последовательности (Герой будет учить заклинания в той последовательности, в которой вы их запишите)

call StoreString (udg_cache, "SkillCodeFor", h, skillcode) – запись SC в кэш, для дальнейшего использования.

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

Записав все данные SC в кэш – вы можете их использовать функцией RunSkillCodeForUnit – применрно так :

call RunSkillCodeForUnit(udg_u) – остальное система сделает автоматически!

Рассказывать о том как это работает не имеет смысла в этой статье, главное, что это работает =)
Прикрепленные файлы
Тип файла: w3x Skill Code System.w3x (38.2 Кбайт, 116 просмотров )
Старый 27.03.2007, 15:28
Vash
Удалён
offline
Опыт: 1,722
Активность:
неплохо
ВСЁ получилось, просто олично.
Но это только ведь использование и учение заклинаний, но всё равно отлично.
Спс Warden !!!
Старый 27.03.2007, 15:56
Toadcop

offline
Опыт: 54,313
Активность:
ты гений =) !

Toadcop добавил:
кстати это описание сиситемы (твоей) а не чего то вообще общего ! т.е. это не статья а мануал пользования твоей системой (которая очень примитивная...)
Старый 27.03.2007, 17:12
dk

offline
Опыт: 60,293
Активность:
ИМХО я уже много раз говорил, что описание своей наработки я статьей не считаю...
По наработке: норм, оригинальный способ со строкой мне понравился...
Старый 28.03.2007, 14:30
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
оригинальный способ со строкой
ну как для кого =)
Старый 28.03.2007, 23:12
Warden
:::...
offline
Опыт: 26,106
Активность:
Toadcop - помоему типя вечно все неустраивает =)
Старый 31.03.2007, 19:40
DioD

offline
Опыт: 45,134
Активность:
пустые ключи в кеше крашат вар
Старый 01.04.2007, 14:17
Vanguard
Оборотень модмэйкер
offline
Опыт: 3,011
Активность:
Короче чёто у меня не получается, копирую всё из этой карты в свою, при сохранении выдаёт кучу ошибок
Старый 03.08.2007, 19:39
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Vanguard
Наверно забыл CustomCode скопировать?
Старый 03.08.2007, 19:47
Vanguard
Оборотень модмэйкер
offline
Опыт: 3,011
Активность:
Не, CustomCode скопировал. А теперь тригеры не отключаются при ашипке, а просто карту нельзя запустить. Хотел бы я аи создать.
Старый 03.08.2007, 19:54
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
Хотел бы я аи создать.

Создать? Ты же копируешь чужой...
Старый 03.08.2007, 20:03
Vanguard
Оборотень модмэйкер
offline
Опыт: 3,011
Активность:
Ну тогда копировать, просто я имел ввиду создать карту с аи.
Старый 03.08.2007, 20:11
Vanguard
Оборотень модмэйкер
offline
Опыт: 3,011
Активность:
Народ, объясните в чём моя ошибка, делаю всё как в описании и нифига.
Старый 05.08.2007, 15:25
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
руки кривые
Значед, не "всё так, как в описании". И вообще, мы не телепаты. Откуда мы
можем знать в чём ошибка?
Старый 05.08.2007, 21:01
Void

offline
Опыт: 1,632
Активность:
Warden - ты использовал свой SC в карте Grand Battle, но я заметил глюк в том, что герои качают магию только первого уровня и только один раз. Если на карту поставить героя 7 уровня записанного в скилкоде, тогда он прокачает магии, но если он получит после этого уровень он больше не качает магии. Сам проверь, в Grand Battle.
Старый 08.08.2007, 20:40
Kodoo
Ł☼√ę
offline
Опыт: 12,845
Активность:
Я сделал всё как в примере, вообще всё, разве что героев не так расставил. Выдаёт кучу ошибок, вот даю карту в которую я всё скопировал, может у меня просто редактор левый, у вас пойдёт?
Старый 27.12.2008, 20:09
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Kodoo, переменная кеш пишется как "cache", а не "cashe". Больше ошибок не наблюдал.
Старый 27.12.2008, 20:50
Kodoo
Ł☼√ę
offline
Опыт: 12,845
Активность:
Цитата:
Сообщение от Hellfim
Kodoo, переменная кеш пишется как "cache", а не "cashe". Больше ошибок не наблюдал.

Ы. Спасибо Hellfim. Мда... бывают и такие ошибки.
Старый 27.12.2008, 20:56
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Warden чтобы упростить юзерам работу при применении наработки, предлагаю автоматически определять Максимальный Уровень Героев, а не юзать Кэш!

Примерно вот так:
» Функции определения Максимального Уровня героя

Код:
function DeleteMaxLevelUnit takes unit uDel returns nothing
    call TriggerSleepAction( 0.05 )
    call RemoveUnit( uDel )
endfunction

function GetMaxLevel takes nothing returns integer
local unit u = null
local integer maxLevel = 0
    call CreateNUnitsAtLoc( 1, 'Hpal', Player(PLAYER_NEUTRAL_PASSIVE), GetRectCenter(GetPlayableMapRect()), bj_UNIT_FACING )
    set u = GetLastCreatedUnit()
    call ShowUnitHide( u )
    call SetHeroLevelBJ( u, 5000, false )
    set maxLevel = GetHeroLevel(u)
    call DeleteMaxLevelUnit(u)
    return maxLevel
endfunction



тобиш функция GetMaxLevel() возвращает число Интеджер равное максимально-возможному уровню героя!

Отредактировано Gres, 27.12.2008 в 21:54.
Старый 27.12.2008, 21:16

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

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

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

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



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