- Joined
- Feb 9, 2009
- Messages
- 1,814
Always love the clean description of the contents, very lovely.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
(7 ratings)
Approved
PluginSpellEffectanyone know how to open this map on editor? it always says missing unit data or invalid on both WE and JGNP. Thank you
It's ok playing on a really old warcraft 3 1.26.What version of the game/editor you trying to open it? This was build using the latest patch. If the problem persists i will post the map Object Data as well so people can import it to a blank map e just copy the code over from Trigger preview
It's ok playing on a really old warcraft 3 1.26.
Quick Question related to the Arrow Storm ability. how did you trigger it to detect whether your hero's Black arrow is currently active or not? is it possible to replicate this on older patches?
I use the "A unit is issued an order" event. When the unit active the black arrows it detects an an order and when it deactivates it it detects another order, then i save it in a global variable to be used by the Arrow Storm and other abilities. It can be done in any patch.
Cry of the banshee "Queen"?
Fixed. Thx for pointing it out.I tested Cry of the Banshee Queen in the latest patch, and I noticed a particular issue. It wasn't really effective as in it would only pick up one or two units. In my test, I was surrounded on all sides by enemy units.
I'm using the Possession missile effect, so it might be some shenanigan's from reforged, but the missile model is configurable.Nitpicks:
The missile for the Screaming Banshees spell appears to be too small in the SD version (and appears to be an orb for some reason?).
my 1.31b WE can't play it.Missing or invalid terrain layer information dataThis requires patch at least patch 1.31
Do you have a copy of the game or are you using the original version? Maybe it's a problem with the latest patch (bloody blizzard f**uking things up). Anyway, you can always use the ObjectData I provided and import it to an empty map and use the Preview Triggers tab in the thread to get the codes. You can use an MPQEditor to get the models and icons.my 1.31b WE can't play it.Missing or invalid terrain layer information data
thats why I did not update.because of Bliizard's awful patch update).
In the trigger editor menu bar, navigate to JASSHelper > Enable JASSHelper, Enable vJASS and turn them both on. These settings are off by default now in all maps/editors for some godforsaken reason.I always get errors for scripts
The order you import matters (unless you import all object data via .w3o at once but I think that overwrites your own custom data). If an ability uses a buff, when you paste the ability into a new map it will try to put that correct buff in the same data field. If the buff exists already you’re fine, but if it doesn’t then it will either be blank, populated by the default buff, or populated with another buff of the same rawcode as the original.For both issue heros, everything is imported
Thanks for the reply. For that reason I do the "all object data import via .w3o" but still the RangerPrecision doesn't add agility, the BlackArrow debuff doesn't spawn any skelies, ForsakenArrow doesn't have a visual (I just see the damage on the enemy units) and Whither Arrow doesn't even show up on her abilities even though it's added.In the trigger editor menu bar, navigate to JASSHelper > Enable JASSHelper, Enable vJASS and turn them both on. These settings are off by default now in all maps/editors for some godforsaken reason.
The order you import matters (unless you import all object data via .w3o at once but I think that overwrites your own custom data). If an ability uses a buff, when you paste the ability into a new map it will try to put that correct buff in the same data field. If the buff exists already you’re fine, but if it doesn’t then it will either be blank, populated by the default buff, or populated with another buff of the same rawcode as the original.
The WE does not check to update this field when you DO paste the buff because it doesn’t work retroactively like that. This applies to things like abilities lists for units, upgrades used/techtree requirements, units spawned by abilities, etc.. Think about the order when you are pasting over object data.
GUI Triggers must come after object data, since any references to specific objects need them to exist to work. For JASS/Lua triggers this is less important because you’ll likely have to update the rawcodes used manually anyway.
How about sharing your map so we can take a look?Thanks for the reply. For that reason I do the "all object data import via .w3o" but still the RangerPrecision doesn't add agility, the BlackArrow debuff doesn't spawn any skelies, ForsakenArrow doesn't have a visual (I just see the damage on the enemy units) and Whither Arrow doesn't even show up on her abilities even though it's added.
I changed all the .mdl to .mdx (not sure if that matters but that's how it looks in my assets) but that's as far as I'd want to go tinkering as I am not experienced with coding or triggers. If it's just because of the latest patch messing things up, I'll leave it at that. Otherwise I am trying to learn![]()
Hopefully it lets you open it. Black Arrow doesn't summon skeletons (although you can see something invisible causing damage occasionally), Forsaken Arrow doesn't have a visual and Ranger Precision doesn't proc.How about sharing your map so we can take a look?
is it possible I need to add string text somewhere? when i import the strings i get dozens of errors (3, 45, 55, 65, 123, 125, etc)
Have you figured out how to fix them?Hopefully it lets you open it. Black Arrow doesn't summon skeletons (although you can see something invisible causing damage occasionally), Forsaken Arrow doesn't have a visual and Ranger Precision doesn't proc.
library ForsekenArrow requires SpellEffectEvent, PluginSpellEffect, Utilities, Missiles, CrowdControl optional BlackArrow
/* ------------------------------------- Forseken Arrow v1.4 ------------------------------------ */
// Credits:
// Bribe - SpellEffectEvent
// Darkfang - Icon
// AZ - Arrow model
// JetFangInferno - Dark Nova model
/* ---------------------------------------- By Chopinski ---------------------------------------- */
/* ---------------------------------------------------------------------------------------------- */
/* Configuration */
/* ---------------------------------------------------------------------------------------------- */
globals
// The raw code of the Screaming Banshees ability
private constant integer ABILITY = 'A001'
// The missile model
private constant string MISSILE_MODEL = "world_expansion08_doodads_fx_9fx_raid2_sylvanas_wailingarrow_missile.mdl"
// The missile size
private constant real MISSILE_SCALE = 0.8
// The missile speed
private constant real MISSILE_SPEED = 1800.
// The Explosion model (fast void blink)
private constant string EXPLOSION_MODEL = "Blink Purple Caster.mdl"
// The Explosion size
private constant real EXPLOSION_SCALE = 3
// The fear model
private constant string FEAR_MODEL = "world_expansion08_doodads_fx_9fx_raid2_sylvanas_withingfire_impact.mdl"
// The the fear attachment point
private constant string ATTACH_FEAR = "chest"
// The attack type of the damage dealt
private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL
// The damage type of the damage dealt
private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_MAGIC
// Sound paths
private constant string LAUNCH_SOUND = "war3mapImported\\WArrowLaunch.mp3"
private constant string IMPACT_SOUND = "war3mapImported\\WArrowExplode.mp3"
// ============================ NEW VISUAL EFFECTS ============================
// 1. Despair aura – long lasting decaying effect at impact point
private constant string DESPAIR_MODEL = "DespairAuraPurple.mdl"
private constant real DESPAIR_SCALE = 7.0
private constant integer DESPAIR_RED = 255
private constant integer DESPAIR_GREEN = 255
private constant integer DESPAIR_BLUE = 255
private constant real DESPAIR_DURATION = 3.0
// 2. Violet pulse aura – attached to the arrow missile
private constant string TRAIL_MODEL = "VioletPulse.mdl"
private constant real TRAIL_SCALE = 1.2
private constant integer TRAIL_RED = 150
private constant integer TRAIL_GREEN = 0
private constant integer TRAIL_BLUE = 255
// 3. Caster enchantment – attached to Sylvanas on cast
private constant string CASTER_EFFECT_MODEL = "Soul Bow Enchantment Void.mdl"
private constant real CASTER_EFFECT_SCALE = 0.7
private constant integer CASTER_EFFECT_RED = 200
private constant integer CASTER_EFFECT_GREEN = 100
private constant integer CASTER_EFFECT_BLUE = 255
// 4. Launch flash (optional)
private constant string LAUNCH_FLASH_MODEL = "Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl"
private constant real LAUNCH_FLASH_SCALE = 1.0
endglobals
// Helper to set color on an effect
private function ApplyColor takes effect e, integer r, integer g, integer b returns nothing
if r >= 0 and g >= 0 and b >= 0 then
call BlzSetSpecialEffectColor(e, r, g, b)
endif
endfunction
// Helper to set scale if > 0
private function ApplyScale takes effect e, real s returns nothing
if s > 0 then
call BlzSetSpecialEffectScale(e, s)
endif
endfunction
// The Explosion AoE
private function GetAoE takes unit caster, integer level returns real
return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_AREA_OF_EFFECT, level - 1)
endfunction
// The duration of the Fear, Silence and Slow.
private function GetDuration takes unit caster, unit target, integer level returns real
if IsUnitType(target, UNIT_TYPE_HERO) then
return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_DURATION_HERO, level - 1)
else
return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_DURATION_NORMAL, level - 1)
endif
endfunction
// The slow amount
private function GetSlow takes unit target, integer level returns real
if IsUnitType(target, UNIT_TYPE_HERO) then
return 0.5 + 0.*level
else
return 0.5 + 0.*level
endif
endfunction
// The damage when passing through units
private function GetCollisionDamage takes unit source, integer level returns real
return level*GetHeroAgi(source, true)*0.5 + level*250
endfunction
// The damage when exploding
private function GetExplosionDamage takes unit source, integer level returns real
return level*GetHeroAgi(source, true)*0.5 + level*250
endfunction
// The missile collision size
private function GetCollisionSize takes integer level returns real
return 200. + 0.*level
endfunction
// Filter
private function Filtered takes player op, unit target returns boolean
return IsUnitEnemy(target, op) and /*
*/ UnitAlive(target) and /*
*/ not IsUnitType(target, UNIT_TYPE_STRUCTURE) and /*
*/ not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE)
endfunction
// --------------------------------------------------------------------------
// Helper function to play a sound at a point (leak‑free)
// --------------------------------------------------------------------------
private function PlaySfx takes string path, real x, real y, real z returns nothing
local sound snd = CreateSound(path, false, true, true, 10, 10, "DefaultEAXON")
call SetSoundChannel(snd, 0)
call SetSoundDistances(snd, 600.00, 10000.00)
call SetSoundDistanceCutoff(snd, 3000.00)
call SetSoundVolume(snd, 127)
call SetSoundConeAngles(snd, 0.0, 0.0, 127)
call SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
call SetSoundPitch(snd, 1.0)
call SetSoundPosition(snd, x, y, z)
call StartSound(snd)
call KillSoundWhenDone(snd)
set snd = null
endfunction
/* ---------------------------------------------------------------------------------------------- */
/* System */
/* ---------------------------------------------------------------------------------------------- */
private struct ForsekenArrow extends Missiles
real exp_damage
real aoe
real curse_duration
integer curse_level
integer level
integer ability
boolean curse
effect trail // violet pulse attached to missile
effect casterEffect // enchantment on Sylvanas
// Hashtable for delayed destruction of despair aura
private static hashtable timerTable = InitHashtable()
static method onDespairTimer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local effect e = LoadEffectHandle(timerTable, id, 0)
if e != null then
call DestroyEffect(e)
call RemoveSavedHandle(timerTable, id, 0)
endif
call DestroyTimer(t)
set t = null
endmethod
method onHit takes unit hit returns boolean
if Filtered(owner, hit) then
if UnitDamageTarget(source, hit, damage, true, false, ATTACK_TYPE, DAMAGE_TYPE, null) and curse then
static if LIBRARY_BlackArrow then
call BlackArrow.curse(hit, source, owner)
endif
endif
endif
return false
endmethod
method onFinish takes nothing returns boolean
local group g = CreateGroup()
local integer i = 0
local integer size
local unit u
local real duration
local unit blastDummy
local unit silenceDummy
local effect tempEffect
local effect despairEffect
local real groundZ
local location loc
local timer despairTimer
// ----- Destroy trail cleanly (force vanish) -----
if this.trail != null then
call BlzSetSpecialEffectAlpha(this.trail, 0)
call DestroyEffect(this.trail)
set this.trail = null
endif
// ----- Destroy caster enchantment -----
if this.casterEffect != null then
call DestroyEffect(this.casterEffect)
set this.casterEffect = null
endif
// Play impact sound
call PlaySfx(IMPACT_SOUND, x, y, z)
// --- Ground Z for effects that should sit on terrain ---
set loc = Location(x, y)
set groundZ = GetLocationZ(loc) + 10.0 // offset to lift slightly above ground
call RemoveLocation(loc)
// --- Void blink (fast explosion) – placed on terrain (groundZ) ---
set tempEffect = AddSpecialEffect(EXPLOSION_MODEL, x, y)
call BlzSetSpecialEffectZ(tempEffect, groundZ)
call BlzSetSpecialEffectScale(tempEffect, EXPLOSION_SCALE)
// --- Despair aura (ground effect) – created and destroyed after DESPAIR_DURATION ---
if DESPAIR_MODEL != "" then
set despairEffect = AddSpecialEffect(DESPAIR_MODEL, x, y)
call ApplyScale(despairEffect, DESPAIR_SCALE)
call ApplyColor(despairEffect, DESPAIR_RED, DESPAIR_GREEN, DESPAIR_BLUE)
call BlzSetSpecialEffectZ(despairEffect, groundZ)
// Schedule destruction after DESPAIR_DURATION
set despairTimer = CreateTimer()
call SaveEffectHandle(timerTable, GetHandleId(despairTimer), 0, despairEffect)
call TimerStart(despairTimer, DESPAIR_DURATION, false, function thistype.onDespairTimer)
set despairTimer = null
set despairEffect = null
endif
// --- Original blast dummy (decaying effect) ---
set blastDummy = CreateUnit(owner, 'h007', x, y, 0)
call UnitAddAbility(blastDummy, 'Aloc')
call SetUnitTimeScale(blastDummy, 1.0)
call UnitApplyTimedLife(blastDummy, 'BTLF', 2.00)
// --- Silence dummy ---
set silenceDummy = CreateUnit(owner, 'h005', x, y, 0)
call UnitAddAbility(silenceDummy, 'Aloc')
call IssuePointOrder(silenceDummy, "silence", x, y)
call UnitApplyTimedLife(silenceDummy, 'BTLF', 2.00)
// Original area damage and debuff application
call GroupEnumUnitsInRange(g, x, y, aoe, null)
set size = BlzGroupGetSize(g)
loop
exitwhen i == size
set u = BlzGroupUnitAt(g, i)
if Filtered(owner, u) then
if UnitDamageTarget(source, u, exp_damage, true, false, ATTACK_TYPE, DAMAGE_TYPE, null) then
set duration = GetDuration(source, u, level)
static if LIBRARY_BlackArrow then
if curse then
call BlackArrow.curse(u, source, owner)
endif
endif
call FearUnit(u, duration, FEAR_MODEL, ATTACH_FEAR, false)
call SilenceUnit(u, duration, null, null, false)
call SlowUnit(u, GetSlow(u, level), duration, null, null, false)
endif
endif
set i = i + 1
endloop
call DestroyGroup(g)
set g = null
set u = null
set blastDummy = null
set silenceDummy = null
set tempEffect = null
set loc = null
return true
endmethod
private static method onCast takes nothing returns nothing
local thistype this = thistype.create(Spell.source.x, Spell.source.y, 150, Spell.x, Spell.y, 50) // end height 50, closer to ground
set source = Spell.source.unit
set speed = MISSILE_SPEED
set model = MISSILE_MODEL
set scale = MISSILE_SCALE
set level = Spell.level
set owner = Spell.source.player
set vision = 500 // ensures dummy unit is created
set aoe = GetAoE(Spell.source.unit, Spell.level)
set damage = GetCollisionDamage(Spell.source.unit, Spell.level)
set collision = GetCollisionSize(Spell.level)
set exp_damage = GetExplosionDamage(Spell.source.unit, Spell.level)
static if LIBRARY_BlackArrow then
set curse_level = GetUnitAbilityLevel(Spell.source.unit, BlackArrow_ABILITY)
set curse = curse_level > 0
set ability = BlackArrow_BLACK_ARROW_CURSE
set curse_duration = BlackArrow_GetCurseDuration(curse_level)
else
set curse = false
endif
// Play launch sound
call PlaySfx(LAUNCH_SOUND, Spell.source.x, Spell.source.y, 50)
// --- Caster enchantment (on Sylvanas) ---
if CASTER_EFFECT_MODEL != "" then
set this.casterEffect = AddSpecialEffectTarget(CASTER_EFFECT_MODEL, source, "weapon")
call ApplyScale(this.casterEffect, CASTER_EFFECT_SCALE)
call ApplyColor(this.casterEffect, CASTER_EFFECT_RED, CASTER_EFFECT_GREEN, CASTER_EFFECT_BLUE)
endif
// --- Launch flash (optional) ---
if LAUNCH_FLASH_MODEL != "" then
call DestroyEffect(AddSpecialEffectTarget(LAUNCH_FLASH_MODEL, source, "weapon"))
endif
call launch()
// Attach violet pulse trail using the attach method
if TRAIL_MODEL != "" then
set this.trail = this.attach(TRAIL_MODEL, 0., 0., 0., TRAIL_SCALE)
call BlzSetSpecialEffectColor(this.trail, TRAIL_RED, TRAIL_GREEN, TRAIL_BLUE)
endif
endmethod
static method onInit takes nothing returns nothing
call RegisterSpellEffectEvent(ABILITY, function thistype.onCast)
// timerTable is initialized at declaration
endmethod
endstruct
endlibrary
I've been wondering the similiar thing. I looked up to the trigger and i can't found the setting in Withering Fire that says to limit the max arrow to 2 or 3. And it as you said, it only starts shooting 3 targets after the BA has been activated. But i can't found it on the BA trigger as well.Chopinski, i have discovered something last night, i was trying to use withering fire by itself and couldnt get it working, i went back to this map to test it, bringing sylvanas to lvl 20 without getting any other skills to obtain withering fire, she does not shoot 3 targets, it is only after getting black arrow and 'using it/autocast' it only starts shooting 3 targets after black arrow has been activated. I had a plan to use this for a unit of mine that can hit up to 9 targets. What do i need to change for this to work as just the withering fire ability?
So the one method in withering fire takes a boolean curse, which that method is in black arrow script. It is fully expecting the black arrow skill to have been used atleast once before getting withering fire, without black arrow being activated beforehand seems like the boolean is null, so therefore doesnt work till its been used once, So the part where it takes the boolean curse, i believe could be removed and the actions there adjusted to not include the curse changes and just have it set as the normal missile. I believe would be the fix to that.I've been wondering the similiar thing. I looked up to the trigger and i can't found the setting in Withering Fire that says to limit the max arrow to 2 or 3. And it as you said, it only starts shooting 3 targets after the BA has been activated. But i can't found it on the BA trigger as well.


