• 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!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Hero Contest #3 - Avatar

Status
Not open for further replies.
@Duruka,

  • Special Effect - Create a special effect at (Position of (Attacking unit)) using Abilities\Weapons\Bolt\BoltImpact.mdl
(Position of (Attacking unit)) = Leak.

  • Unit - Cause (Casting unit) to damage circular area after 0.00 seconds of radius 180.00 at (Position of (Target unit of ability being cast)), dealing (45.00 + (10.00 x (Real((Level of Earth Strike for (Casting unit)))))) damage of attack type Magic and damage type Normal
(Position of (Target unit of ability being cast)) = Leak.

  • Special Effect - Create a special effect at (Position of (Target unit of ability being cast)) using Objects\Spawnmodels\Naga\NagaDeath\NagaDeath.mdl
Same as above

  • Unit - Create 1 Deep Elemental for Player 1 (Red) at loc facing (X of (Position of (Casting unit))) degrees
(Position of (Casting unit)) = Leak.

  • Special Effect - Create a special effect at (Position of (Last created unit)) using war3mapImported\AquaSpike.mdx
(Position of (Last created unit)) = Leak.

  • Special Effect - Create a special effect at (Position of (Dying unit)) using war3mapImported\AquaSpike.mdx
  • Unit - Cause (Dying unit) to damage circular area after 0.00 seconds of radius 500.00 at (Position of (Dying unit)), dealing 75.00 damage of attack type Magic and damage type Cold
(Position of (Dying unit)) = Leak.

Heads up: Prefer (Triggering unit) than (Casting unit) and (Dying unit), it functions faster.
Unit - Damage Area: this action damages every unit with no restrictions; it damages ally units too and your caster if he is found within that area. Prefer something like:

  • Set Point1 = (Position of (Triggering unit))
  • Custom script: set bj_wantDestroyGroup = true
  • Unit Group - Pick every unit in (Units within 500.00 of (Point) matching ((Matching unit) belongs to an enemy of (Owner of (Triggering unit)) Equal to True) and do (Actions)
    • Loop - Actions
      • Unit - Cause (Triggering unit) to damage (Picked unit) dealing 300.00 damage of attack type Spells and damage type Normal
  • Custom script: call RemoveLocation (udg_Point1)
 
Level 5
Joined
Dec 15, 2009
Messages
145
Well, I think I fixed all that, but I couldn't find
  • ((Matching unit) belongs to an enemy of (Owner of (Triggering unit))
and I didn't know if
  • (Owner of (Matching unit)) Equal to (Random player from (All enemies of (Owner of (Triggering unit))))
would work, so I left that for now.
 

Attachments

  • Duruka's Submission.w3x
    68.9 KB · Views: 30
Level 5
Joined
Dec 15, 2009
Messages
145
Unit Comparison just gives me all the even responses, no Owned by Player, or belongs to Player. There is
  • (Matching unit) Equal to (Random unit from (Units owned by (Random player from (All enemies of (Owner of (Triggering unit))))))
but I don't know if it would work.

Edit: I won't update again until Monday, I'm going away for the weekend.
 
Level 7
Joined
May 8, 2009
Messages
102
You think that by converting your GUI trigger into Custom script will actually enhance your coding "look"? It's so easy to understand that that custom script is conversion. Now provide us with your GUI function, because you'll receive a really low score in Coding.

I love your Tsunami spell by the way; the morph animation gives it a great twist, no matter how simple the spell is.


nah I converted to custom text cause I wanted to check for leaks and the guide I was reading was asking me to convert to custom text so I figured why would they mind so I left them as is anyway.. Here's the GUI triggers: and btw thanks for actually noticing me lol :D

Here is next WIP:
 

Attachments

  • Contest Entry.w3x
    99.3 KB · Views: 52
Level 7
Joined
Jan 18, 2010
Messages
61
This is my second wip, the hero is nearing completion :D
The spells are all working gameplay-wise, the eye-candy part is NOT done so don't expect too much flashyness.


The Holy Warrior puts a unit (friend or enemy) in a state of repentance for x seconds. While repenting, damage taken is increased by 50%. After repenting, the unit is fully healed. Stun duration is 4 / 5 / 6 seconds on enemies, 4 / 3 / 2 seconds on allies.


The Holy Warrior's attacks heal the most badly damaged nearby friendly unit by a percentage of damage dealt. Once a unit has been healed by TWS, it can not be healed by TWS again for up to 60 seconds, depending on how much health it received compared to its maximum health. Heals 33% / 66% / 100% of damage dealt.


While this ability is active, a percentage of all damage taken by the Holy Warrior is added to his Righteous Fury. When the ability is deactivated, the Warrior receives for 10 seconds a damage bonus equal to his Fury. Drains mana while active. Stores 33% / 66% / 100% of damage as Righteous Fury.


The Holy Warrior unleashes a blast of holy energy, damaging all nearby enemies. The amount of damage depends on the amount of life missing from all nearby friendly units (including those that died recently).



I'd like to know your opinions about the balance and originality part for this hero, because I'm not sure I can estimate those too well.

Of course, if anyone sees bugs in any of the spells, I'd really like to know about them :D

Well, good luck and have fun everyone

I looked at some of the maps that people have posted here and I found a problem in some of them.


When a hero has an ability based on an existing game ability and uses it on a unit that already has that ability used on them, the 2 abilities conflict and only one stays on the target.

Example: Suppose you have an ability based on Warden's Shadow Strike that does DoT. And suppose your second hero is a Warden.

So the Warden does Shadow Strike on an enemy, and then you use your custom ability on that enemy. Then, the DoT from the Shadow Strike dissappears and only the custom one remains. Or if you cast your ability on an enemy, then the Warden does Shadow Strike on that same enemy then the custom DoT vanishes.

Which would be unpleasant if for example a level 1 ability cancelled out a level 3 ability. Or even more unpleasant if the buff from the custom ability is used in some triggers for more effects.


I'm not sure how serious it is (= how many score points it costs) but I guess it's better to be aware of it :)

Cheers
 

Attachments

  • hc_holyw2.w3x
    46.7 KB · Views: 50
Last edited by a moderator:
Level 11
Joined
May 16, 2007
Messages
288
Already asked it twice (pages 7 and 17), but asking again since the judges seem to be ignoring me (sorry for the huge text):
Is UnitStatus allowed?

Everyone's saying it is, but no judge ever mentioned it yet, need to know if I'll have to rewrite the code or I can go on and create the other spells (since it's definitely not just a simple script).
 
Level 25
Joined
Jun 5, 2008
Messages
2,573
Anyway my new skillset icons should look like this now(i may change the 2nd icon though):
 

Attachments

  • 4.jpg
    4.jpg
    2.5 KB · Views: 115
  • 3.jpg
    3.jpg
    2.2 KB · Views: 116
  • 2.jpg
    2.jpg
    2.6 KB · Views: 134
  • 1.jpg
    1.jpg
    2.3 KB · Views: 133
Level 11
Joined
May 16, 2007
Messages
288
@Kingz: let me guess... some kind of undead / zombie / evil stuff hunter?

@TRD: I'm posting a WIP as soon as soon as I finish my second spell.... which can take a while, considering the problem I'm having with it. Something is breaking the multi-instanceability of the spell, the problem is: (afaik) in theory it should be working fine. Here's the code (incomplete, I'll finish it as soon as I can fix the problem) if someone wants to take a look (dunno if this could be considered teamwork, if so, I'll remove it). I have a feeling the problem is related to passing the structs around with the timers, but I'm not sure. (oh, and ignore any leaks you may find, I'll deal with them later).

JASS:
scope HydroSpheres initializer init

globals
    //RAWCODE STUFF
    private constant integer Spell_ID = 'A002'
    //rawcode of the spell
    private constant integer Dummy_ID = 'e000'
    //rawcode of the dummy unit
    private constant integer Locust_ID = 'Aloc'
    //rawcode of the locust spell
    private constant integer Dummy_Height_Enabler = 'Amrf'
    //allows modification of the dummy's flying height
    private constant integer Hero_ID = 'H000'
    //rawcode of the hero's normal form
    private constant integer Avatar_ID = 'H001'
    //rawcode of the hero's alternate form
    
    //DAMAGE / MANA STUFF
    private constant real DPS = 5.0
    //starting damage per second
    private constant real DPSinc = 1.0
    //damage increases by this vaule per second
    private constant real mana = 50.0
    //mana drain when spheres detonate
    private constant real manaInc = 0.0
    //increase of mana drain per level (not used in the hero), put here for more config options
    private constant real drain = 0.3
    // % of mana restored to the hero (0,3 = 30%)
    private constant real drainInc = 0.0
    //increase of mana restored per level (not used in the hero), put here for more config options
    
    //VISUAL STUFF
    private constant integer spheres = 3
    //starting number of spheres
    private constant integer sInc = 1
    //increase of spheres per level
    private constant integer uInc = 2
    //how many spheres are added (ultimate form)
    private constant string mdlPath = "Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl"
    //model path of the spheres
    private constant real rad = 125.0
    //radius of the sphere circle
    private constant real z = 30.0
    //z height of the dummy unit
    
    //ANIMATION STUFF
    private constant real animTimer = 1.0
    //duration of the animation
    private constant string Anim = "spell"
    //animation played
    private constant integer A_red = 255
    private constant integer A_green = 255
    private constant integer A_blue = 255
    private constant integer A_alpha = 95
    //vaules for the RGBA colors of the avatar that appears
    private constant real fdTime = 0.06
    //fade timer period for the avatar
    
    //MOVEMENT STUFF
    private constant real mTimer = 0.025
    //timer period for the movement of the spheres
    private constant real dist = 25.0
    //distance in WC3 units moved every mTimer period
    private constant real aDist = 5.0
    //angle in degrees moved every mTimer period
    
endglobals

//calculates damage per second
private constant function DamagePS takes integer time returns real
    return DPS + DPSinc * time
endfunction

//calculates the mana drained according to level
private constant function Mana takes integer level returns real
    return mana + manaInc * (level - 1)
endfunction

//calculates the mana restored according to level
private constant function Drain takes integer level returns real
    return drain + drainInc * (level - 1)
endfunction

//calculates how many spheres are spawned
private function Spheres takes integer level, boolean ultimate returns integer
    if ultimate == true then
        return spheres + sInc * (level - 1) + uInc
    else
        return spheres + sInc * (level - 1)
    endif
endfunction
//****************************************************************************************
//****************************************************************************************
//******************************* END OF SETUP SECTION ***********************************
//****************************************************************************************
//****************************************************************************************

globals
    private Table Tab
endglobals

private struct Data
    unit caster
    unit target
    unit avatar
    unit dummy
    boolean exists
    integer counter
    integer time
    real t
    real mn
    real dr
    integer array id [8190]
    real x
    real y
endstruct

private struct SData
    effect sfx
    unit dummy
    real angl
    
    method onDestroy takes nothing returns nothing
        call DestroyEffect(sfx)
        call KillUnit(dummy)
    endmethod
endstruct

private struct FD
    integer alpha
    unit avt
    
    static method create takes integer a, unit avt returns FD
        local FD Fade = FD.allocate()
        set Fade.alpha = a
        set Fade.avt = avt
        return Fade
    endmethod
endstruct
//****************************************************************************************

private function Conditions takes nothing returns boolean
    return GetSpellAbilityId()==Spell_ID
endfunction

//****************************************************************************************

private function FadeAvatar takes nothing returns nothing
    local timer T = GetExpiredTimer()
    local FD Fade = FD(GetTimerData(T))
    set Fade.alpha = Fade.alpha - 5
    if Fade.alpha == 0 then
        call RemoveUnit(Fade.avt)
        call Fade.destroy()
        call ReleaseTimer(T)
    else
        call SetUnitVertexColor(Fade.avt, A_red, A_green, A_blue, Fade.alpha)
    endif
endfunction

private function MLoop takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local Data D = Data(GetTimerData(t))
    local integer countMax = D.counter
    local real dmg
    local boolean du = false
    local integer id
    local SData SD
    local real x = GetUnitX(D.dummy)
    local real y = GetUnitY(D.dummy)
    local real oX
    local real oY
    local real tX = GetUnitX(D.target)
    local real tY = GetUnitY(D.target)
    local real dX = tX - x
    local real dY = tY - y
    local real dbp = SquareRoot(dX * dX + dY * dY)
    local real angl = Atan2(tY - y, tX - x)
    if dbp <= dist + 20.0 then
        call SetUnitX(D.dummy, tX)
        call SetUnitY(D.dummy, tY)
        set du = true
    else
        call SetUnitX(D.dummy, (x + dist * Cos(angl)))
        call SetUnitY(D.dummy, (y + dist * Sin(angl)))
    endif
    set D.t = D.t + mTimer
    loop
        exitwhen D.counter == 0
        set id = D.id[D.counter]
        set SD = Tab[id]
        set oX = GetUnitX(SD.dummy)
        set oY = GetUnitY(SD.dummy)
        set SD.angl = SD.angl + aDist
        call SetUnitX(SD.dummy, (x + rad * Cos(SD.angl * bj_DEGTORAD)))
        call SetUnitY(SD.dummy, (y + rad * Sin(SD.angl * bj_DEGTORAD)))
        set D.counter = D.counter - 1
    endloop
    set D.counter = countMax
endfunction

private function Start takes nothing returns nothing
    local timer T = GetExpiredTimer()
    local Data D = Data(GetTimerData(T))
    local FD Fade
    local timer t
    local timer mt = CreateTimer()
    local location loc = Location(D.x, D.y)
    local SData SD
    local real x
    local real y
    local integer countMax
    local unit u
    if D.exists == true then
         set Fade = FD.create(A_alpha, D.avatar)
         set t = CreateTimer()
         call SetTimerData(t, integer(Fade))
         call TimerStart(t, fdTime, true, function FadeAvatar)
    endif
    set u = CreateUnitAtLoc(GetOwningPlayer(D.caster), Dummy_ID, loc, 0.0)
    call UnitAddAbility(u, Locust_ID)
    call UnitAddAbility(u, Dummy_Height_Enabler)
    call UnitRemoveAbility(u, Dummy_Height_Enabler)
    call SetUnitFlyHeight(u, z, 0)
    set D.dummy = u
    set countMax = D.counter
    loop
        exitwhen D.counter == 0
        set x = D.x + rad * Cos(((360/countMax)*D.counter) * bj_DEGTORAD)
        set y = D.y + rad * Sin(((360/countMax)*D.counter) * bj_DEGTORAD)
        set loc = Location(x, y)
        set SD = SData.create()
        set SD.dummy = CreateUnitAtLoc(GetOwningPlayer(D.caster), Dummy_ID, loc, 0.0)
        set SD.angl = ((360/countMax)*D.counter)
        call UnitAddAbility(SD.dummy, Locust_ID)
        call UnitAddAbility(SD.dummy, Dummy_Height_Enabler)
        call UnitRemoveAbility(SD.dummy, Dummy_Height_Enabler)
        call SetUnitFlyHeight(SD.dummy, z, 0)
        set SD.sfx = AddSpecialEffectTarget(mdlPath, SD.dummy, "origin")
        set Tab[GetHandleId(SD.dummy)]=integer(SD)
        set D.id[D.counter]=GetHandleId(SD.dummy)
        set D.counter = D.counter - 1
    endloop
    set D.counter = countMax
    call SetTimerData(mt, integer(D))
    call TimerStart(mt, mTimer, true, function MLoop)
    call ReleaseTimer(T)
    set t = null
    set T = null
    set mt = null
    set u = null
endfunction

private function Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit()
    local unit target = GetSpellTargetUnit()
    local integer level = GetUnitAbilityLevel(caster, Spell_ID)
    local unit A
    local Data D = Data.create()
    local timer t = CreateTimer()
    set D.caster = caster
    set D.target = target
    set D.mn = Mana(level)
    set D.dr = Drain(level)
    set D.x = GetUnitX(caster)
    set D.y = GetUnitY(caster)
    if GetUnitTypeId(caster)==Hero_ID then
        set D.counter = Spheres(level, false)
        set A = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), Avatar_ID, GetUnitX(caster), GetUnitY(caster), GetUnitFacing(caster))
        call SetUnitColor(A, GetPlayerColor(GetOwningPlayer(caster)))
        call SetUnitX(A, GetUnitX(caster))
        call SetUnitY(A, GetUnitY(caster))
        call UnitAddAbility(A, Locust_ID)
        call SetUnitVertexColor(A, A_red, A_green, A_blue, A_alpha)
        call SetUnitAnimation(A, Anim)
        set D.avatar = A
        set D.exists = true
        call SetTimerData(t, integer(D))
        call TimerStart(t, animTimer, false, function Start)
    else
        set D.counter = Spheres(level, true)
        call SetTimerData(t, integer(D))
        call TimerStart(t, 0.0, false, function Start)
    endif
    set t = null
    set A = null
    set caster = null
    set target = null
endfunction

//****************************************************************************************

private function init takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(trig, Condition(function Conditions))
    call TriggerAddAction(trig, function Actions)
    set Tab = Table.create()
    set trig = null
endfunction

endscope
 
Level 22
Joined
Dec 31, 2006
Messages
2,216
It's quite late now so I'm not able to do a really thorough check, but I noticed you use CreateUnitAtLoc() and there's no point in using that. Just use CreateUnit() and use the coordinates you used to create the location in the first place :D
 
Level 11
Joined
May 16, 2007
Messages
288
It's quite late now so I'm not able to do a really thorough check, but I noticed you use CreateUnitAtLoc() and there's no point in using that. Just use CreateUnit() and use the coordinates you used to create the location in the first place :D

/facepalm for not remembering CreateUnit(), ty! (and I even use it in another part of the spell... /doublefacepalm)
 
Level 11
Joined
May 16, 2007
Messages
288
Everyone seems to be posting the skillset icons, so, hey, why not do it too?
It's going to be a water / ice (... man, water seems to be quite popular, every contest there's a water hero) theme hero skilled at taking down mages and disabling units.

(the ultimate is metamorphosis-like, that's why the icon is the hero's alternate form)
 

Attachments

  • icons_8115_btn.jpg
    icons_8115_btn.jpg
    4.5 KB · Views: 180
  • icons_5744_btn.jpg
    icons_5744_btn.jpg
    4 KB · Views: 176
  • icons_8141_pas.jpg
    icons_8141_pas.jpg
    4.7 KB · Views: 148
  • icons_4909_btn.jpg
    icons_4909_btn.jpg
    2 KB · Views: 147
Level 6
Joined
Aug 26, 2009
Messages
221
Really i want to participate but my pc is broken:cry:


The-Rave, The Dragon Master
Model : Goblin with sword

Primary Attribute : Strength
Race : Goblin (mercenaries)

He is a traveler, a goblin who not likes technology and choose to live with nature. In nature he found his destiny, to be a protector of nature, by learning to be a dragon master. He's technique and strength is powerful. With the power of Rave stone, He become a great dragon master with charismatic power, and give a name to himself, "The-Rave"

Role : Damage absorber/Tanker
Skill : Under construction.

Are spellbook allowed?
Are Sub-skill allowed?
 
Level 5
Joined
Dec 15, 2009
Messages
145
Got back from camping, and fixed my hero so some of his spells don't damage your own units.
 

Attachments

  • Duruka's Submission.w3x
    69.3 KB · Views: 59
Oh another ice/water hero :p

Anachron also is making one, seems that ice is really popular.
Haha, take a look at my idea:

Hero Name: Living Water

Abilities:

Stream: The Living Water allows itself be controlled by the laws of physics, flowing vaguely towards water in the indicated direction. Upon reaching water, or if no water is to be found after travelling too far, the living water regains control of its essence. Any units hit by the Living Water in Stream form are carried with it, and enemies take damage over time.

Cloud: The Living Water evaporates and takes to the skies. Living Water in Cloud Form flies, cannot be hit by physical attacks and moves faster, although winds may blow it in slightly random directions and it cannot attack.

Storm: The Living Water evaporates into a slower, heavier Cloud Form which cannot be blown by wind, but can take physical damage, and begins to rub its particles together. After 5 seconds, thunder begins to strike nearby enemies, targeting those on highest health first. Each thunderbolt costs some mana to cast. When the Living Water runs out of mana,

Augmentation: The Living Water has learned to control its life waters more easily, allowing it to manipulate its being in different ways. When in normal form, its attacks deal splash damage in a small radius. While in Cloud or Storm form, it rains gently upon the ground, slowly restoring mana and life to nearby friendly units, and in Stream form it can now pass over cliffs, forming a temporary waterfall. Units falling over a waterfall take large damage.


Feedback on abilities welcome.

At least mine is unique, being a transformy-hero.

EDIT: Actually, I'm thinking of replacing storm with an ability that fits the following description:

An ability which has a different effect based on the form the Living Water is currently in:
Normal Form: Launches a wave of water which damages and knocks back anything it hits
Cloud Form: A thunderbolt which deals damage and stuns enemies in a small radius. Enemies nearer the point of impact take more damage and are stunned for longer.
Stream Form: A jet of water shoots upwards, tossing any units carried by the stream in the targeted direction, and dealing damage to them when they land.

Still thinking of a name for it...
 
Level 5
Joined
Dec 15, 2009
Messages
145
Alright, this is my final entry (unless there's anymore big bugs). I forgot to add credits in the last one.
 

Attachments

  • Duruka's Submission.w3x
    69.6 KB · Views: 104
Status
Not open for further replies.
Top