Buenos días, tardes, noches n_n
Como hace años que no subo ningún aporte al foro, al ver esto, supe que había que postearlo aquí para que cualquiera pueda usarlo. Todos los créditos van a leandrotp, el descubrió este asombroso truco.
Resumiendo el funcionamiento del sistema.
- Cuando transformas una unidad a un héroe 3 cosas suceden:
1_ Se otorgan los atributos y la unidad gana la habilidad para tener Habilidades de héroe('AHer').
2_ La unidad pierde las habilidades no permanentes y gana todas las habilidades de la nueva unidad.
3_ Se aplican las nuevas estadísticas de la unidad(vida, velocidad de movimiento).
Este sistema, intercepta la transformación en la primera etapa, y removiendo la habilidad, y "desmorfeamos" nuestra unidad, y al interrumpirla, los atributos y la habilidad 'AHer' permanecen.
Los efectos de este sistema sobre nuestra unidad son los siguientes:- La unidad ahora tiene atributos. Por lo que puedes agregarle fuerza/agi/int, pero solo con libros
- La unidad puede subir de nivel como un héroe. Pero no absorbe experiencia
- La unidad hereda las habilidades del héroe al cual se quiso transformar
- La unidad hereda los atributos base de este héroe, y gana atributo por nivel de este héroe
Detalles importantes del sistema- La unidad requiere tener la capacidad de usar objetos para que esto funcione
- La unidad no puede tener la habilidad Defender para que esto funcione
- En las constantes de juego, la vida por punto de fuerza, debe ser mayor a 1.
- Tengan en cuenta que todos los héroes por defecto tienen una defensa base de "-2" y por alguna razón, la defensa base de la unidad nueva será "-6" al hacerla heroica. O sea, aplica esta defensa base 3 veces sobre la unidad, antes de las bonificaciones de agilidad.
[jass]
function HeroicUnit_OnMorph takes nothing returns boolean
local unit u = GetTriggerUnit()
local trigger t = GetTriggeringTrigger()
if GetTriggerEventId() == EVENT_UNIT_STATE_LIMIT then
call DisableTrigger(t)
call UnitRemoveAbility(u, udg_HeroicUnit_MorphID)
elseif GetUnitTypeId(u) != udg_HeroicUnit_HeroeDummyID then
call UnitAddAbility(u, udg_HeroicUnit_MorphID)
call UnitAddAbility(u, udg_HeroicUnit_BonusID)
call UnitMakeAbilityPermanent(u, true, udg_HeroicUnit_BonusID)
call TriggerRegisterUnitStateEvent(t, u, UNIT_STATE_LIFE, GREATER_THAN, GetWidgetLife(u)+1.)
call RemoveItem(UnitAddItemById(u, udg_HeroicUnit_ItemID))
else
call UnitAddAbility(u, udg_HeroicUnit_DetectorID)
endif
set t = null
set u = null
return false
endfunction
function HeroicUnit_UnitMakeHeroic takes unit u returns boolean
local trigger t = CreateTrigger()
local real hp = GetWidgetLife(u)
local real mp = GetUnitState(u, UNIT_STATE_MANA)
call SetWidgetLife(u, GetUnitState(u, UNIT_STATE_MAX_LIFE))
call TriggerRegisterUnitEvent(t, u, EVENT_UNIT_ISSUED_ORDER)
call TriggerAddCondition(t, Condition(function HeroicUnit_OnMorph))
call UnitAddAbility(u, 'AInv')
call UnitAddAbility(u, udg_HeroicUnit_DetectorID)
call UnitAddAbility(u, udg_HeroicUnit_BonusID)
call RemoveItem(UnitAddItemById(u, udg_HeroicUnit_ItemID))
call UnitRemoveAbility(u, udg_HeroicUnit_BonusID)
call SetUnitAnimation(u, "stand")
call DestroyTrigger(t)
set t = null
return GetUnitAbilityLevel(u, 'AHer') > 0
endfunction[/jass]
[gui]HeroicUnit Configurables
Acontecimientos
Map initialization
Condiciones
Acciones
Set HeroicUnit_BonusID = Objeto Bonificación estadÃsticas de hÃ

roe (Fuerza +1)
Set HeroicUnit_DetectorID = Defender
Set HeroicUnit_HeroeDummyID = PaladÃn
Set HeroicUnit_ItemID = HeroicMorphTome
Set HeroicUnit_MorphID = HeroicMorph
-------- ----------- Creando variables ----------- --------
Set HeroicUnit_Unidad = Ninguna unidad
[/gui]
[gui]MakeUnitHeroic
Acontecimientos
Condiciones
Acciones
Custom script: call HeroicUnit_UnitMakeHeroic(udg_HeroicUnit_Unidad)
[/gui][/spoiler]
Para usarla simplemente deben configurar la variable HeroicUnit_Unidad y correr el detonador MakeUnitHeroic, de esta forma
[gui]Guia de uso
Acontecimientos
Condiciones
Acciones
Set HeroicUnit_Unidad = Ninguna unidad
Detonador - Run MakeUnitHeroic
(ignoring conditions)
[/gui]
Como toque final, también agregué una variación de la librería en la que puedes elegir la habilidad de transformación, así aprovechar una unidad con atributos base, atributos por nivel y capacidad de aprender habilidades.
[jass]function HeroicUnit_OnMorph takes nothing returns boolean
local unit u = GetTriggerUnit()
local trigger t = GetTriggeringTrigger()
if GetTriggerEventId() == EVENT_UNIT_STATE_LIMIT then
call DisableTrigger(t)
call UnitRemoveAbility(u, udg_HeroicUnit_MorphID)
elseif GetUnitTypeId(u) != udg_HeroicUnit_HeroeDummyID then
call UnitAddAbility(u, udg_HeroicUnit_MorphID)
//call UnitAddAbility(u, udg_HeroicUnit_BonusID)
//call UnitMakeAbilityPermanent(u, true, udg_HeroicUnit_BonusID)
call TriggerRegisterUnitStateEvent(t, u, UNIT_STATE_LIFE, GREATER_THAN, GetWidgetLife(u)+1.)
call RemoveItem(UnitAddItemById(u, udg_HeroicUnit_ItemID))
else
call UnitAddAbility(u, udg_HeroicUnit_DetectorID)
endif
set t = null
set u = null
return false
endfunction
function HeroicUnit_UnitMakeHeroic takes unit u returns boolean
local trigger t = CreateTrigger()
local real hp = GetWidgetLife(u)
local real mp = GetUnitState(u, UNIT_STATE_MANA)
call SetWidgetLife(u, GetUnitState(u, UNIT_STATE_MAX_LIFE))
call TriggerRegisterUnitEvent(t, u, EVENT_UNIT_ISSUED_ORDER)
call TriggerAddCondition(t, Condition(function HeroicUnit_OnMorph))
call UnitAddAbility(u, 'AInv')
call UnitAddAbility(u, udg_HeroicUnit_DetectorID)
call UnitAddAbility(u, udg_HeroicUnit_BonusID)
call RemoveItem(UnitAddItemById(u, udg_HeroicUnit_ItemID))
call UnitRemoveAbility(u, udg_HeroicUnit_BonusID)
call SetUnitAnimation(u, "stand")
call DestroyTrigger(t)
set t = null
return GetUnitAbilityLevel(u, 'AHer') > 0
endfunction[/jass]
[gui]HeroicUnit Variacion Configurables
Acontecimientos
Map initialization
Condiciones
Acciones
Set HeroicUnit_DetectorID = Defender
-------- ----------- Creando variables ----------- --------
Set HeroicUnit_Unidad = Ninguna unidad
Set HeroicUnit_MorphID = (Ability being cast)
Set HeroicUnit_ItemID = (Item-type of (Last created item))
Set HeroicUnit_HeroeDummyID = No unidad-tipo
[/gui]
[gui]MakeUnitHeroic Variacion
Acontecimientos
Condiciones
Acciones
Custom script: call HeroicUnit_UnitMakeHeroic(udg_HeroicUnit_Unidad)
[/gui]
Son lo mismo prácticamente. NO USEN AMBOS AL MISMO TIEMPO, SE CRUZARAN LOS SISTEMAS.
Espero que les haya gustado, y se diviertan con esta locura 
edit: aqui el link
http://www.epicwar.com/maps/263386/