Jaina Hero Concept

This bundle is marked as high quality. It exceeds standards and is highly desirable.
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
Another unique spell pack, very interactive with the player with VJASS and Lua support. Bump to High Quality

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
2,010
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 21
Joined
May 16, 2012
Messages
644
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
 
Level 6
Joined
Jun 18, 2011
Messages
168
I love your hero concepts. They are my absolute favorite. These spells and your Damage Interface System, Spellweaver's Talent Kitchen and TriggerHappy's Codeless Save/Load are some of the best things to ever happen to the development of my Knight's of The Round Table map. I hope you are still going to keep doing these.

This one is so perfect to give Nimue (The Lady of The Lake) a bunch of neat talents for her new talent tree. Another option is I swap some of these to be some of her default abilities and have her current ones become talents to enhance these. There are so many possibilities.

I'll add a comment on your other concepts to tell you how I'm using them if you'd like or I'll try to get an updated map development page posted sooner or later. I am trying to learn quantum mechanics right now, so I'm gonna have to put the development aside awhile.

There are so many people to thank on here too... Bribe, Magtheridon, Vexorian, Dr Super Good, Uncle... All the people you've gotten work from or worked with... MetalSonic, Mythic, AZ... all the artists... Darkfang, Redeemer, Blizzard, CrazyRussian, KelThuzad, Redeemer, AbstractCreativity, Karowana, Zipifinator, AnsonRuk, N'ixStudio, EvilCryptLord, JesusHipster, Darky29, NFWar... and so many more. I still need to get the hive shirt and then maybe I'd have an easier time naming everyone. All the people on discord are also super helpful, but their names are more often not the same as here... especially that guy that has a different name everytime I check the discord I just know him by the smiling kid with freckles avatar, but then there is someone else that uses the same one. Is Ralle like the main creator of the hive?

Thank you Chopinski and everyone that helps bring these hero concepts about. They are so so helpful in keeping my passion project a fun experience for players as time goes on.
 
Level 9
Joined
May 19, 2016
Messages
156
Sorry to ask but does this Pack still work for current patch (2.01.2) ? never had problems with it now it crashes.
 
Level 9
Joined
May 19, 2016
Messages
156
You're going to have to be more specific by providing a testmap or sequence of steps to produce a crash.
Oh sorry, i wanted to know if other people get the crash too with the retail patch.
If i start the Map it crashes after loading with the code:
57610801-1A24-4558-A54F-D0CFCAB23BC5
Happens to me with Both given versions of it.
 
Level 45
Joined
Feb 27, 2007
Messages
5,578
Blizzard made some change to the way one must refer to or use or get children from the ConsoleUI frame, and currently doing it any other way causes a crash. I don't know the specifics because I don't much with UI stuff, but I know @Tasyen does so I will continue to ping them. I investigated this resource and found that (at least) these two functions cause a crash:
JASS:
// In the Interface library near the bottom:
//-----------------------------------
private static method onInit takes nothing returns nothing
    local integer i = 0

    call BlzFrameSetAlpha(BlzGetFrameByName("SimpleInventoryCover", 0), 0)
    call BlzFrameSetScale(BlzGetFrameByName("InventoryText", 0), 0.0001)
    call BlzFrameSetAbsPoint(BlzGetFrameByName("ConsoleUI", 0), FRAMEPOINT_TOPLEFT, 0.0, 0.633)    //crash here
    call BlzFrameSetVisible(BlzGetFrameByName("ResourceBarFrame", 0), false)
    call BlzFrameSetVisible(BlzGetFrameByName("UpperButtonBarFrame", 0), false)
    call BlzFrameSetVisible(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI", 0), 7), false)    //crash here
    call BlzFrameSetVisible(BlzFrameGetChild(BlzFrameGetChild(BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 5),0), false)
    call BlzFrameSetParent(BlzGetFrameByName("MiniMapFrame", 0), BlzGetFrameByName("ConsoleUIBackdrop", 0))

    //... rest omitted for brevity but there are probably more references in the rest of the trigger
endmethod


// In the GetMainSelectedUnit library:
//-----------------------------------
private function init_functionAt0s takes nothing returns nothing
    local integer i = 0
    local framehandle console = BlzGetFrameByName("ConsoleUI", 0)
    local framehandle bottomUI = BlzFrameGetChild(console, 1)
    local framehandle groupframe = BlzFrameGetChild(bottomUI, 5)
    local framehandle buttonContainer
    //globals
    set containerFrame = BlzFrameGetChild(groupframe, 0)    //Crash here
    set Group = CreateGroup()
    // give this frames a handleId
        loop 
        exitwhen i >= BlzFrameGetChildrenCount(containerFrame) - 1
        set buttonContainer = BlzFrameGetChild(containerFrame, i)
        set frames[i] = BlzFrameGetChild(buttonContainer, 0)
        set i = i + 1
    endloop
    call DestroyTimer(GetExpiredTimer())
endfunction
This bug affects a lot of things right now, but I'm unsure if it will be fixed or just remain this way forever. People will have to fix such resources.
 
Like Pyrogasm said the crash comes from the ui triggers, reforged 2.0 changed the frame children hierarchy therefore BlzFrameGetChild from old map script onto blizzard frames can produce crashs.

The crashs are from chopinski's custom UI resource, maybe he fixed it in the UI system post. UI v1.6



One is an old code only approach to hide background UI.
call BlzFrameSetAbsPoint(BlzGetFrameByName("ConsoleUI", 0), FRAMEPOINT_TOPLEFT, 0.0, 0.633) //crash here

that is meant to hide the idle worker button.
call BlzFrameSetVisible(BlzFrameGetChild(BlzGetFrameByName("ConsoleUI", 0), 7), false) //crash here

one is from my resource, GetMainSelectedUnit
local framehandle bottomUI = BlzFrameGetChild(console, 1)
->
local framehandle bottomUI = BlzFrameGetParent(BlzGetFrameByName("SimpleInfoPanelUnitDetail", 0))
 
Top