• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Jaina Hero Concept

logo-png.395560

jaina-png.395559
intro-png.395558

Jaina, The Daughter of the Sea . In this Hero Concept, Jaina is a main Mage specialized in heavy damage. Thanks to all that have been credited for their awesome work on models, effects, icons and code libraries, and please, if you find that no credit was given to you for your work here or credit were given by mistake, let me know, so I can fix it. Enjoy!

Water Elemental

Crushing Wave

Water Shield

Brilliance Aura

Mana Orb

Living Tide

Bad Weather


water-elemental-png.395566


waterelemental-gif.395570

crushing-wave-png.395563


crushingwave-gif.395568

water-shield-png.395567


watershield-gif.395571

brilliance-aura-png.395562

mana-orb-png.395565


manaorb-gif.395569

living-tide-png.395564


AvEkKR0.gif

bad-weather-png.395561


badweather-gif.395572


credits-png.395557

  • Dreamcraft (WCU)
  • AZ
  • Darkfang
  • MyPad
  • General Frank
  • Magtheridon96
  • Bribe
  • Vexorian
  • Blizzard

02/20/2022
  • Release
02/20/2022
  • Crushing Wave v1.1
    • Updated to use the new CrowdControl system
  • Brilliance Aura v1.1
    • Removed a leak inside the onCast method and minor code optimization
  • Water Shield v1.1
    • Minor code optimization
02/04/2023
  • Water Elemental v1.1
    • Water elementals now spawn 250 units in front of Jaina instead of on top of her.
    • Added spawn effect.
  • Updated to use version 2.8 of Missiles library. This fixes a bug when Living Tide tries to go over higher ground terrain or cliffs.

For those who cant open the map due to a problem in the editor when trying to load Object Data, get the Object Data here
Contents

Hero Concept (Map)

Hero Concept (Map)

Reviews
Wrda
Simplify (both in VJASS and Lua version): Same logic here: You forgot to null "source" local variable in Brilliance Aura (VJASS) You could store GetRandomInt into a variable, as an improvement in Water Orb. Function GetDuratoin in Water Orb and...

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,864
Simplify (both in VJASS and Lua version):
JASS:
        static method onCast takes nothing returns nothing
            local thistype this
           
            if effect[Spell.target.id] == null then
                set effect[Spell.target.id] = AddSpecialEffectTarget(MODEL, Spell.target.unit, ATTACH)
            endif

            if IsUnitEnemy(Spell.target.unit, Spell.source.player) then
                if offense[Spell.target.id] != 0 then
                    set this = offense[Spell.target.id]
                else
                    set this = thistype.allocate()
                    set timer = NewTimerEx(this)
                    set id = Spell.target.id
                    set target = Spell.target.unit
                    set group = CreateGroup()
                    set defensive = false
                    set offense[id] = this
                endif

                set source = Spell.source.unit
                set player = Spell.source.player
                set level = Spell.level
                set amount = GetBoltDamage(source, level)
                set angle = GetAngle(source, level)
                set aoe = GetAoE(source, level)

                call TimerStart(timer, GetDuration(source, level), false, function thistype.onExpire)
            else
                if defense[Spell.target.id] != 0 then
                    set this = defense[Spell.target.id]
                else
                    set this = thistype.allocate()
                    set timer = NewTimerEx(this)
                    set id = Spell.target.id
                    set target = Spell.target.unit
                    set group = CreateGroup()
                    set defensive = true
                    set amount = 0
                    set defense[id] = this
                endif

                set source = Spell.source.unit
                set player = Spell.source.player
                set level = Spell.level
                set amount = amount + GetAmount(source, level)
                set aoe = GetExplosionAoE(source, level)

                call TimerStart(timer, GetDuration(source, level), false, function thistype.onExpire)
            endif
        endmethod
->
static method onCast takes nothing returns nothing
local thistype this

if effect[Spell.target.id] == null then
set effect[Spell.target.id] = AddSpecialEffectTarget(MODEL, Spell.target.unit, ATTACH)
endif

if IsUnitEnemy(Spell.target.unit, Spell.source.player) then
if offense[Spell.target.id] != 0 then
set this = offense[Spell.target.id]
else
set this = thistype.allocate()
set timer = NewTimerEx(this)
set id = Spell.target.id
set target = Spell.target.unit
set group = CreateGroup()
set defensive = false
set offense[id] = this
endif

set source = Spell.source.unit
set player = Spell.source.player
set level = Spell.level
set amount = GetBoltDamage(source, level)
set angle = GetAngle(source, level)
set aoe = GetAoE(source, level)
else
if defense[Spell.target.id] != 0 then
set this = defense[Spell.target.id]
else
set this = thistype.allocate()
set timer = NewTimerEx(this)
set id = Spell.target.id
set target = Spell.target.unit
set group = CreateGroup()
set defensive = true
set amount = 0
set defense[id] = this
endif

set source = Spell.source.unit
set player = Spell.source.player
set level = Spell.level
set amount = amount + GetAmount(source, level)
set aoe = GetExplosionAoE(source, level)
endif
call TimerStart(timer, GetDuration(source, level), false, function thistype.onExpire)
endmethod

Same logic here:
JASS:
        static method onCast takes nothing returns nothing
            local unit source = GetTriggerUnit()
            local integer level = GetUnitAbilityLevel(source, ABILITY)
            local integer i = 0
            local thistype this

            if level > 0 then
                static if STACK then
                    set this = thistype.allocate()
                    set timer = NewTimerEx(this)
                    set id = GetUnitUserData(source)
                    set unit = source
                    set field = ABILITY_RLF_MANA_REGENERATION_INCREASE
                    set ability = BlzGetUnitAbility(source, ABILITY)
                    set levels = BlzGetAbilityIntegerField(ability, ABILITY_IF_LEVELS)
                    set bonus = GetBonusManaRegen(source, level)

                    loop
                        exitwhen i == levels
                            call BlzSetAbilityRealLevelField(ability, field, i, BlzGetAbilityRealLevelField(ability, field, i) + bonus)
                            call IncUnitAbilityLevel(source, ABILITY)
                            call DecUnitAbilityLevel(source, ABILITY)
                        set i = i + 1
                    endloop
                   
                    call TimerStart(timer, GetDuration(source, level), false, function thistype.onExpire) //remove
                else
                    if struct[GetUnitUserData(source)] != 0 then
                        set this = struct[GetUnitUserData(source)]
                    else
                        set this = thistype.allocate()
                        set timer = NewTimerEx(this)
                        set id = GetUnitUserData(source)
                        set unit = source
                        set field = ABILITY_RLF_MANA_REGENERATION_INCREASE
                        set ability = BlzGetUnitAbility(source, ABILITY)
                        set levels = BlzGetAbilityIntegerField(ability, ABILITY_IF_LEVELS)
                        set bonus = 0
                        set struct[id] = this
                    endif
                   
                    if bonus == 0 then
                        set bonus = GetBonusManaRegen(source, level)

                        loop
                            exitwhen i == levels
                                call BlzSetAbilityRealLevelField(ability, field, i, BlzGetAbilityRealLevelField(ability, field, i) + bonus)
                                call IncUnitAbilityLevel(source, ABILITY)
                                call DecUnitAbilityLevel(source, ABILITY)
                            set i = i + 1
                        endloop
                    endif

                    call TimerStart(timer, GetDuration(source, level), false, function thistype.onExpire) //remove
                endif
                //call TimerStart etc...
            endif
        endmethod
You forgot to null "source" local variable in Brilliance Aura (VJASS)

You could store GetRandomInt into a variable, as an improvement in Water Orb.
Function GetDuratoin in Water Orb and Bad Weather? ;)
Living Tide correction: "While active, mana is drained and the further away Living Tide is from Jaina the more mana is drained from her (mana drained is increased)."

I like how certain spells interact with each other, another great spell pack.

Approved
 
Level 6
Joined
Dec 29, 2019
Messages
82
Blizzard breaking things... What a surprise!
It does look rather a patch issue (opened the map with no problems a few minutes ago).
Well long story short, i can check code for map via Hive so it's not a problem, but i would like to extract model file for Water Shield effect from the map, can you guys maybe send me a link for source ? :) + I am currently looking for some cool universal ability which contains various data fields something which fits perfectly for creating custom abilities.
 
Well long story short, i can check code for map via Hive so it's not a problem, but i would like to extract model file for Water Shield effect from the map, can you guys maybe send me a link for source ? :) + I am currently looking for some cool universal ability which contains various data fields something which fits perfectly for creating custom abilities.
Most of the time you can click the "View Resources in Use" on the map.
I couldn't find the relevant model there, so maybe check the credited authors if you don't get a link to the resource.
 
Level 20
Joined
May 16, 2012
Messages
635
Well long story short, i can check code for map via Hive so it's not a problem, but i would like to extract model file for Water Shield effect from the map, can you guys maybe send me a link for source ? :) + I am currently looking for some cool universal ability which contains various data fields something which fits perfectly for creating custom abilities.
You can always use a MPQEditor, like this to extract whatever you want from unprotected maps.
 
Hello i cannot open the map and it's not because object data.
View attachment 433539
Blizzard breaking things... What a surprise!
Lol this tends to happen rather frequent with various maps, i noticed this concept tends to do that more, however, my simple fixing of this is to open up the, Illidan hero Concept( this one seems to work everytime no issues) then open up any other and it should open with no problems. Just a little tip for anyone that has that issue

On a side note, love all the concepts, they are amazing lol
 
Top