• 🏆 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!

Swashbuckler Spellpack





swashbuckler2-png.246934

Swashbuckler

Cunning Hero, adept at manipulating combat situations, engaging in and disengaging out of it. Can learn Snare Trap, Persecute, Riposte, and Turmoil.

Attacks land units.



Background

The Swashbuckler, even if human by blood, wouldn't ever comply with the Alliance force and their ideals. As a rebel, he is likely to be found among bandit groups, or in tavern tables, boasting about thrilling stories he lived to tell - be them truthful or not.

Attributes:
Attribute:Starting Amount+ per Level
Strength:19+2.20
Agility:19+2.30
Intelligence:13+1.50
Primary Attribute: Agility

Hero's Role


Even if a strongly combat oriented hero, the Swashbuckler is highly tactical. His abilities involve destabilizing the enemy troops, be it by detaining them from escape with his net traps, or provoking them into compulsive fighting. Such manipulation skills, with the addition of the ability to persecute specific enemies, make of the Swashbuckler a good hunter of the enemies' key units, or heroes.

swashb_preview-png.246930

Hero's Skills:


BTNEnsnare.png
Snare Trap:

Leaves a net trap on the ground to be sprung as soon an enemy enters its range. After 1 second sprung, unfolds and binds units within its radius, greatly slowing them for 75% and causing them to miss 33% of their attacks. If cast directly upon enemy units, those are immediately bound instead.

persecute4_better-png.246933
Persecute:

Throws a paint projectile at a unit, marking it as a persecuted target. Units targeting it have their move and attack speed raised. The mark wears off in 20 seconds.

upload_2016-8-29_9-45-51-png.246932
Riposte: (Passive Ability)

Gives a chance of blocking and immediately retaliating an incoming melee attack. The attacker is stunned for 1 second and is dealt damage. Only front attacks can be countered this way.

turmoil2-png.246931
Turmoil:

The Swashbuckler forces all units nearby to engage in a cloud of chaotic combat. Units are lost control upon, and will melee-attack random units without regard to team, with doubled attack speed and an armor reduction. Units inside Turmoil are unable to cast spells. Allies inside it evade 50% of the attacks received. Lasts 10 seconds.

=> Full spell codes here <=



Informations

Submission Content:

- W3X: Test map containing the whole entry
- MDX: Swashbuckler model
- MDX: Persecute Projectile SFX model
- MDX: Persecute Target SFX model
- MDX: Snare Trap Projectile SFX model
- MDX: Turmoil Effect SFX model
- MDX: Turmoil Target SFX model
- BLP: Swashbuckler Icon (BTN, DISBTN)
- BLP: Persecute Icon (BTN, DISBTN)
- BLP: Riposte Icon (BTN, DISBTN, PASBTN)
- BLP: Turmoil Icon (BTN, DISBTN)


Model Technical Info:

- Animation - Cast Backswing: 0.510
- Animation - Cast Point: 0.300
- Animation - Run Speed: 250
- Animation - Walk Speed: 250
- Death Time: 3.40
- Selection Scale: 1.25

- Combat - Animation Backswing: 0.600
- Combat - Animation Damage Point: 0.150

- Sound - Unit Sound Set: Bandit

snaretrap_preview-gif.246958
=> Hero model here <=


by Team CockroachesInYourPants
HappyCockroach and Quilnez
indent-right-png.247000
Contents

Swagbuckler (No CD No Manacost) (Map)

[HC8] Swashbuckler.w3x (Map)

Reviews
KILLCIDE
Third place for Hero Contest #8. A great model by HappyCockroach that is well complimented by your abilities. Needs Fixed Snare Trap Nothing Persecute Nothing Riposte Nothing Turmoil Nothing Suggestions Keep in mind that making the struct...
Level 37
Joined
Jul 22, 2015
Messages
3,485

Needs Fixed

  • Snare Trap
    • When you deallocate the spell instance, you should be nulling player owner as well

  • Persecute
    • local player p isn't nulled in static method initializeSpell

  • Riposte
    • local player p isn't nulled in static method initializeSpell

  • Turmoil
    • When you deallocate the spell instance, you should be nulling player owner as well
    • local player p isn't nulled in static method onInit for the TurmoilAI struct
    • When you deallocate a TurmoilAI instance, you should be nulling player owner as well

Suggestions

  • Keep in mind that making the struct private doesn't automatically make the members private
  • Snare Trap
    • After your FoG loop in static method onCast, you have this:
      JASS:
      if (fog != null) then
          call GroupClear(TempGroup)
          set fog = null
      endif
      This can all be done in the same block the unit passes a filter where you set this.sprung = true
    • I would add an extra note that if they wanted to change the model effects for the trap or the net, they should refer to NET_DUMMY_ID & TRAP_DUMMY_ID

  • Persecute
    • I would add an extra note that if they wanted to change any of the buff effects, they should refer to the ability or the buff(s) in Object Editor

  • Riposte
    • When you are beginning to deallocate in static method onPeriodic, you have this:
      JASS:
      if (this.sfx != null) then
          call DestroyEffect(this.sfx)
          set this.sfx = null
      endif
      The only way this.sfx will ever be null is if you set it to null. Seems like a useless check to me
    • Instead of calling GetWorldBounds(), you can use bj_mapInitialPlayableArea

  • Turmoil
    • For the Turmoil buff in Object Editor, you have the Target Attachment Point set to "overhread"
    • You should add an extra note that the "snared" buff you are referring to in private function AllowJump is the buff ID of Snare Trap

Status

Awaiting Update
 

Kazeon

Hosted Project: EC
Level 33
Joined
Oct 12, 2011
Messages
3,449
Hello. Thanks for reviewing.

Nulling player variable is not needed, but doing so is also fine. You need to null other types of agents because they can be destroyed. If an agent is destroyed and a local variable is still referencing to it, there will happen so called reference leak: the variable is referencing to an object but that object and variable are no longer accessible in any way. It's super minor but the leak will stay there until the game ends. Meanwhile, a player will never be destroyed. So reference leak won't happen in this case.

The point of using private keyword is to make the struct (members) inaccessible for other libraries/scopes/structs. Using private struct is very useful for restricting other libraries/scopes to access that struct, but the other structs inside the same library/scope can use/access its members freely. As long as the user (or other libraries/scopes) can not access the struct at all, I think it's totally fine not to privatize its members. I have always done this thing for long actually.

The only way this.sfx will ever be null is if you set it to null. Seems like a useless check to me
The stun struct is also used to pause/stun the caster, without special effect. But yeah, it's kind of nerdy optimization.

I would add an extra note..
They can ask me directly if they want to modify the spell. But I doubt it will ever happen.
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
Lol no need for the reference leak explanation :p I know what they are. I sort of forgot players are treated as statics, so there is in fact no need to null them.

No need for the encapsulation explanation either xD I know what it does. I figured that if you are going to stop the struct from being called from other scopes, you should stop other structs being able to access members they shouldn't have access too as well. Just good programming practice.

Did you want to work on any of the suggestions or should I just approve it?

They can ask me directly if they want to modify the spell. But I doubt it will ever happen.
Lol the point of notes is so that they don't have to message you. Nothing negative about putting a note about where to change the buff model or whatever so that the user doesn't waste time figuring out where.
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
Third place for Hero Contest #8. A great model by HappyCockroach that is well complimented by your abilities.

Needs Fixed

  • Snare Trap
    • Nothing
  • Persecute
    • Nothing
  • Riposte
    • Nothing
  • Turmoil
    • Nothing

Suggestions

  • Keep in mind that making the struct private doesn't automatically make the members private
  • Snare Trap
    • After your FoG loop in static method onCast, you have this:
      JASS:
      if (fog != null) then
          call GroupClear(TempGroup)
          set fog = null
      endif
      This can all be done in the same block the unit passes a filter where you set this.sprung = true
    • I would add an extra note that if they wanted to change the model effects for the trap or the net, they should refer to NET_DUMMY_ID & TRAP_DUMMY_ID
  • Persecute
    • I would add an extra note that if they wanted to change any of the buff effects, they should refer to the ability or the buff(s) in Object Editor
  • Riposte
    • When you are beginning to deallocate in static method onPeriodic, you have this:
      JASS:
      if (this.sfx != null) then
          call DestroyEffect(this.sfx)
          set this.sfx = null
      endif
      The only way this.sfx will ever be null is if you set it to null. Seems like a useless check to me
    • Instead of calling GetWorldBounds(), you can use bj_mapInitialPlayableArea
  • Turmoil
    • For the Turmoil buff in Object Editor, you have the Target Attachment Point set to "overhread"
    • You should add an extra note that the "snared" buff you are referring to in private function AllowJump is the buff ID of Snare Trap

Status

Approved
 

Kazeon

Hosted Project: EC
Level 33
Joined
Oct 12, 2011
Messages
3,449
Just correcting the status here...
Thank you! I didn't realize the status.

This is the most melee-ish and solid spellpack in the contest, also contains some of the most complicated spells I every made. Too bad it was banished in abyss for so long. I should've given it more attention. The model was well-appreciated tho.
 
Top