Добавлен quq_CCCP,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
vJass
Тип:
Наработка
Damage Modify System
Система позволяющая повышать силу атаки юнита на некоторое кол-во единиц, система повышает только зелёную (дополнительную) атаку юнита, от 1 до 1000. Для работы системы необходимы 4 способности, это спеллбук и 3 способности на основе "Предмет: повышение силы атаки", с 11 уровнями у каждой способности...
Инфо-Способностей
Повышение силы атаки(1-10\100\1000)
1 - 0\0\0
2 - 1\10\100
3 - 2\20\200
4 - 3\30\300
5 - 4\40\400
6 - 5\50\500
7 - 6\60\600
8 - 7\70\700
9 - 8\80\800
10 -9\90\900
11 -10\100\1000
1 - 0\0\0
2 - 1\10\100
3 - 2\20\200
4 - 3\30\300
5 - 4\40\400
6 - 5\50\500
7 - 6\60\600
8 - 7\70\700
9 - 8\80\800
10 -9\90\900
11 -10\100\1000
Система даёт 3 функции:
function ModifyUnitDamage takes unit WhichUnit, real Damage returns nothing
function UnitDamageIsModified takes unit WhichUnit returns boolean
function FlushDamageModify takes unit WhichUnit returns nothing
Функция ModifyUnitDamage изменяет силу атаки юнита на некоторое число от 0 до 1000.
функция UnitDamageIsModified проверяет изменяли ли мы силу атаки функцией ModifyUnitDamage.
функция FlushDamageModify убирает бонус урона, удаляя способность на основе Спеллбука.
функция UnitDamageIsModified проверяет изменяли ли мы силу атаки функцией ModifyUnitDamage.
функция FlushDamageModify убирает бонус урона, удаляя способность на основе Спеллбука.
код системы
library DamageModifySystem initializer InitSpellBook
//==================================================================================
// Автор quq_CCCP, сделано для XGM.RU
//Даёт функцию "ModifyUnitDamage" чтобы изменить урона юниту,
//функцию "UnitDamageIsModified" чтобы проверить добовляли ли урон юниту функцией "ModifyUnitDamage"
//а так же "FlushDamageModify" чтобы удалить бонус урона и всё что сним связяно у указанного юнита.
// >>>ПРЕДЕЛ +1000 ед. УРОНА ЮНИТУ!!!<<<
//Для работы библиотеки необходимы 4 способности, подробнее смотри в Редакторе обьектов...
//==================================================================================
globals
//Настройки библиотеки
private integer DM_SPELLBOOK = 'A000' //Равкод спеллбука с нужными способностями.
private integer DM_IN_DMG_A = 'A002' //Равкод спосбности на основе 'Altg', имеет 11 уровней даёт урон от 1 до 10
private integer DM_IN_DMG_B = 'A003' //Тоже самое, только увеличивает урон от 10 до 100
private integer DM_IN_DMG_C = 'A001' //Тоже самое, только увеличивает урон от 100 до 1000
private integer MAX_PLAYERS_ALLOVED = 11// Максимум игроков в карте, нужно чтобы запретить им спеллбук.
//хештаблица, не рекоммендуется изменять!
private hashtable DM_DATA
endglobals
private function InitSpellBook takes nothing returns nothing
local integer nIndex = 0
set bj_lastCreatedUnit = CreateUnit( Player( 14 ), 'hfoo', 0.00, 0.00, 0.00 )
call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_A )
call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_B )
call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_C )
call UnitAddAbility( bj_lastCreatedUnit, DM_SPELLBOOK )
call RemoveUnit( bj_lastCreatedUnit )
loop
exitwhen nIndex > MAX_PLAYERS_ALLOVED
call SetPlayerAbilityAvailable( Player( nIndex ), DM_SPELLBOOK, false )
set nIndex = nIndex + 1
endloop
set DM_DATA = InitHashtable( )
endfunction
private function CalcLevel takes real dmg, integer abId returns integer
local string level = I2S( R2I( dmg ) )
local integer nlength = StringLength( level )
if abId == DM_IN_DMG_A then
if nlength == 1 then
return S2I( SubString( level, 0, 1 ) ) + 1
elseif nlength == 2 then
return S2I( SubString( level, 1, 2 ) ) + 1
elseif nlength == 3 then
return S2I( SubString( level, 2, 3 ) ) + 1
elseif nlength == 4 then
return S2I( SubString( level, 3, 4 ) ) + 1
endif
elseif abId == DM_IN_DMG_B then
if nlength == 2 then
return S2I( SubString( level, 0, 1 ) ) + 1
elseif nlength == 3 then
return S2I( SubString( level, 1, 2 ) ) + 1
elseif nlength == 4 then
return S2I( SubString( level, 2, 3 ) ) + 1
endif
elseif abId == DM_IN_DMG_C then
if nlength == 3 then
return S2I( SubString( level, 0, 1 ) ) + 1
elseif nlength == 4 then
return S2I( SubString( level, 0, 2 ) ) + 1
endif
endif
return 1
endfunction
function UnitDamageIsModified takes unit WhichUnit returns boolean
return LoadBoolean( DM_DATA, GetHandleId( WhichUnit ), 0 )
endfunction
function ModifyUnitDamage takes unit WhichUnit, real Damage returns nothing
if Damage < 0 or Damage > 1000.00 then // проверка на некорректный аргумент Damage
call BJDebugMsg( "|cffff0000ОШИБКА!|r - невозможно повысить силу атаки на " + I2S( R2I( Damage ) ) + " единиц." )
return
endif
if not UnitDamageIsModified( WhichUnit ) then
call UnitAddAbility( WhichUnit, DM_SPELLBOOK )
call SaveBoolean( DM_DATA, GetHandleId( WhichUnit ), 0, true )
endif
call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_A, CalcLevel( Damage, DM_IN_DMG_A ) )
call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_B, CalcLevel( Damage, DM_IN_DMG_B ) )
call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_C, CalcLevel( Damage, DM_IN_DMG_C ) )
endfunction
function FlushDamageModify takes unit WhichUnit returns nothing
call UnitRemoveAbility( WhichUnit, DM_SPELLBOOK )
call FlushChildHashtable( DM_DATA, GetHandleId( WhichUnit ) )
endfunction
endlibrary
Так же можно скачать карту пример:
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован quq_CCCP
Где то на форуме, в библиотеке функций по пойму, была схожая наработка, только там дамаг минимум по 5 был, и там она давала урон на 1 удар, сейчас уже не найдёш, даже жаль что закрыли библиотеку функций. Много там нужного было
Отредактирован quq_CCCP
так же можно делать отрицательный бонус к атаке)
Про 10 абил, ну еще может 20?, будет очень интересно, делать их в РО.
Отредактирован quq_CCCP
Интересно кто это минусит, узнать бы чё ему не понравилось?
Или это чувак которому больше делать нечего, он тока минусует чужие труды
ну и понятнее, так мне кажется более наглядно для не особо продвинутых, что мы берем из 125 символ 5 и конвертируем его в число 5.
Если есть идеи делитесь, я не откажусь от полезных советов.