Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
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
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
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.
Well i have official Warcraft 3 Reforged copy and starting WE via bnet launcher so i'm pretty sure i do have latest version it still doesn't work just saying
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.
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.
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
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.
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.
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))
This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
By continuing to use this site, you are consenting to our use of cookies.