• 🏆 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!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

[Spell] How to do Impetus Like Spell in GUI Version ?

Status
Not open for further replies.
Level 2
Joined
Apr 7, 2010
Messages
21
Hello is there any one could make this spell with Floating text damage above targeted unit ??
http://www.hiveworkshop.com/forums/attachment.php?attachmentid=106590&stc=1&d=1317137628 <<< See the picture there is a description about the passive impetus ability that i got from Elemental TD ( you will understand after see the picture).

since iam a newbie if you could please give the sample map too.
because iam a little confuse about a spell that must using the dummy ( exactly confuse in dummy part ).

Note : The Spell is in GUI version And the Spell is Passive ability like in the pic i show you and you only be able get this spell if you have a special item like example orb of frost. all player can have an impetus ability if they get Orb of frost special item.
 

Attachments

  • Impetus.JPG
    Impetus.JPG
    57 KB · Views: 624
Last edited:
Level 8
Joined
Dec 9, 2009
Messages
397
Having it auto cast doesn't really do anything, you'd be checking in the damage trigger if attacker has ability.
I'm not getting any floating text like your trigger says.
I don't see any bonus damage based on my distance.
Your skill has an AOE setting for some reason :/

You'll need some kind of Damage Detection System (DDS)

and make trigger for,
condition
DmgOff = 0
If AttackingUnit has SKILL
set TempLoc1 to position of AttackingUnit
set TempLoc2 to Position of DamagedUnit
Distance = Calculate the distance between them
set Damage = Distance x Bonus
set DmgOff = 1
Make AttackingUnit damage DamagedUnit for Damage
set DmgOff = 0
 
Level 2
Joined
Apr 7, 2010
Messages
21
Having it auto cast doesn't really do anything, you'd be checking in the damage trigger if attacker has ability.
I'm not getting any floating text like your trigger says.
I don't see any bonus damage based on my distance.
Your skill has an AOE setting for some reason :/

You'll need some kind of Damage Detection System (DDS)

and make trigger for,
condition
DmgOff = 0
If AttackingUnit has SKILL
set TempLoc1 to position of AttackingUnit
set TempLoc2 to Position of DamagedUnit
Distance = Calculate the distance between them
set Damage = Distance x Bonus
set DmgOff = 1
Make AttackingUnit damage DamagedUnit for Damage
set DmgOff = 0

could you give me complete trigger ?


I have a map that remake this ability in GUI, but it's still as a auto-cast spell. With some edits, you could make your dream comes true :ogre_haosis:
View attachment 106617
Credits should given to Tom_Kazansky
Glad to be able to help

That cool. BUt i want that in Passive form so i can put it in the item
 
Last edited:
Level 9
Joined
Aug 7, 2009
Messages
380
You just need to use another base passive ability which add a buff to enemy unit on attack like slow poison... etc (use the same buff as the Impetus spell use). And your trigger should be like this:

  • Set TempUnit = (Triggering unit)
  • Set TempUnit2 = (Damage source)
  • Set TempReal = (Damage taken)
  • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • ((TempUnit2) has an item of type [YourItem]) Equal to (==) True
      • (TempUnit has buff Impetus ) Equal to (==) True
    • Then - Actions
      • Unit - Remove Impetus buff from TempUnit
      • Set TempLoc = (Position of TempUnit2)
      • Set TempLoc2 = (Position of TempUnit)
      • Set TempReal = ((Distance between TempLoc and TempLoc2) x ([The number of percent of the distance as damage))
      • Floating Text - Create floating text that reads (|c0000FFFF+ + ((String((Integer(TempReal)))) + |r)) above TempUnit with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
      • Floating Text - Change (Last created floating text): Disable permanence
      • Floating Text - Change the lifespan of (Last created floating text) to 3.00 seconds
      • Unit - Cause TempUnit2 to damage TempUnit, dealing TempReal damage of attack type Chaos and damage type Universal
    • Else - Actions
That's all i guess. Good luck
Still no answer for this, so ... here it goes
 
Level 2
Joined
Apr 7, 2010
Messages
21
You just need to use another base passive ability which add a buff to enemy unit on attack like slow poison... etc (use the same buff as the Impetus spell use). And your trigger should be like this:

  • Set TempUnit = (Triggering unit)
  • Set TempUnit2 = (Damage source)
  • Set TempReal = (Damage taken)
  • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • ((TempUnit2) has an item of type [YourItem]) Equal to (==) True
      • (TempUnit has buff Impetus ) Equal to (==) True
    • Then - Actions
      • Unit - Remove Impetus buff from TempUnit
      • Set TempLoc = (Position of TempUnit2)
      • Set TempLoc2 = (Position of TempUnit)
      • Set TempReal = ((Distance between TempLoc and TempLoc2) x ([The number of percent of the distance as damage))
      • Floating Text - Create floating text that reads (|c0000FFFF+ + ((String((Integer(TempReal)))) + |r)) above TempUnit with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
      • Floating Text - Change (Last created floating text): Disable permanence
      • Floating Text - Change the lifespan of (Last created floating text) to 3.00 seconds
      • Unit - Cause TempUnit2 to damage TempUnit, dealing TempReal damage of attack type Chaos and damage type Universal
    • Else - Actions
That's all i guess. Good luck
Still no answer for this, so ... here it goes

  • ((TempUnit2) has an item of type [YourItem]) Equal to (==) True
    • (TempUnit has buff Impetus ) Equal to (==) True
That condition part : "Equal to what ???
 
Level 9
Joined
Aug 7, 2009
Messages
380
Ok, let me explain how it works...
1st, when the unit attack the enemy, it'll add a "dummy buff" to that unit. This dummy buff allow we to check if it is hit by the unit have this "Impetus ability" or not
Once the damage of this attacker is done to the attacked unit, this dummy buff will be removed and do the damage, etc..
So, that conditions
The 1st one check if attacking unit is having the item or not (instead of checking if it have the ability or not, we check item)
And the second line, it checks if the attacked unit is attacked by a unit that have this item by checking if it has the buff "impetus" or not
If need more help, just post here, if needed pm me (i'm not always on the hive)

Edit: The "True" option you can check it at the end of the box show up when you click at the line of "True" if that's what you're asking
 
Level 2
Joined
Apr 7, 2010
Messages
21
Do i need something like damage detection ?
sorry iam really a little confuse. So. can you make an example for me by giving a sample map ?
 
Last edited:
Level 20
Joined
Jul 14, 2011
Messages
3,213
@thedarkgodzz: I've been where you are, knowing nothing and wanting stuff the easy way. Life's not like that. You'll have to work a bit to get what you want, since you're the one that want's... what you want :) Besides, do it once, and the knowledge will remain for the rest of your life, So, I'll give you a small tutorial about this so you can understand how some stuff works:

Warcraft 3 doesn't have a good damage detection system, that's why there a custom created Damage Detection System, which detects when a damage is dealed and then does the actions you choose to. Is not necessary, but is good to have it. I use http://www.hiveworkshop.com/forums/...-v1-2-1-a-149098/?prev=search=GDD&d=list&r=20. You can check it, it's easy to use and to implement into your map. You don't have to understand it, just copy / paste and follow the only 5 instructions it has.

In this case, using a DDS will improve the action, because you need to check when the target actually receives the damage, and Warcraft only detects when a unit attacks a unit, wich is innacurate. Make your life easier, install the DSS :).

I'll assume you're installing the DSS and explain how to make the trigger:

You have an attacking unit (GDD_DamageSource), and a Attacked Unit (GDD_DamagedUnit), you also need 2 Point variables (Position of GDD_DamageSource, and Position of GDD_DamagedUnit). You also have the distance between these two positions. so, create these variables and ser their values in the actions the same way Striker21 explained you before. I'll do it by parts, and then show you the whole trigger:

  • TEST
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (Level of Impetus for GDD_DamageSource) Equal to 1
    • Actions
      • Set Point1 = (Position of GDD_DamageSource)
      • Set Point2 = (Position of GDD_DamagedUnit)
This part is easy. Point1 and Point2 are Variables for Type: Point. Use action: 'Set Variable' and choose 'Point1', then choose the = value, changing (Triggering Unit) for GDD_DamageSource, same for Point2.

Now, the damage is not Integer, it's a Variable of type 'Real'. Use 'Set Variable' Action, choose 'Real', and choose = value of Real to 'Arithmetic'. Change the first value (to the left) with 'Distance between Temp_Point and Temp_Point' Then do your maths in the second value (to the right). You can do all the 'Arithmetic' you like, as long as you know what you're doing =) Gets a bit messy when you have like 8 Arithmetic functions in the same formula, because of all the parentheses and stuff... But this is a small triggering tutorial, not a Math class.
  • Set Real = ((Distance between Point1 and Point2) x Do your maths to manipulate the distance however you like)
Now, you have to actually deal the damage :)
  • Unit - Cause GDD_DamageSource to damage GDD_DamagedUnit, dealing Real damage of attack type Chaos and damage type Universal
Now, to create the floating text that displays the damage, you have to do the next:
  • Floating Text - Create floating text that reads (|c0000FFFF+ + ((String(Real))) + |r)) above GDD_DamagedUnit with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
You have to use 3 concatenated strings (one of them within one of the other two). I'll tell you how to make it. (These values are found inside the action that folows 'Create floating text that reads...' <Select 'Concatenated Strings>

'String1' + 'String2'. Pick 'String1' and, again, do 'Concatenated Strings' To have 'String1' + 'String2' again.

Now choose 'String 1' and type: |cFFFF0000+ <- This is the code for RED. The Plus sign is not part of the code, it will be displayed in RED like +200.
Now choose 'String 2' and select: 'Convert Real to String', and choose your 'Real' variable.
Now accept. You'll see in the left '|cffff0000 + ((String(Real)) + 'String 2'', or something like that.
Choose 'String 2' and type |r <- This closes the code for RED. Anything between the |cffff0000 and |r will be 'Red'

  • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
It will make the floating text move to the skies... But you want make it fade after a while, so, we disable the permanence of the floating text (It's permanent by default?
  • Floating Text - Change (Last created floating text): Disable permanence
Now you have to tell Warcraft when the Floating Text will start fading
  • Floating Text - Change the fading age of (Last created floating text) to 1.00 seconds
It will now fade and turn transparent/invisible, but will remain there, you need to destroy it or your game will lag after a while. That's why we use:
  • Floating Text - Change the lifespan of (Last created floating text) to 3.00 seconds
Now, least but MOST important, you have to clean the mess done. You created two 'Points' to tell Warcraft where your units where standing, you have to destroy those using an amazing action called. 'Use Custom Script'
  • Custom script: call RemoveLocation(udg_Point1)
  • Custom script: call RemoveLocation(udg_Point2)
If you used named different than Point1 and Point2, just change it for call RemoveLocation(udg_YOURpointVARIABLEname). Also, to prevent your game from crashing, and your unit to deal infinite amounts of damage to the target, you can turn off the trigger at the beginning of the actions (It won't skip the remaining actions in it) and then turn it off at the end. It will prevent loop.


And, the magic is done. Here's the whole trigger:

  • TEST
    • Events
      • Game - GDD_Event becomes Equal to 0.00
    • Conditions
      • (Level of Impetus for GDD_DamageSource) Equal to 1
    • Actions
      • Trigger - Turn off (this trigger)
      • Set Point1 = (Position of GDD_DamageSource)
      • Set Point2 = (Position of GDD_DamagedUnit)
      • Set Real = ((Distance between Point1 and Point2) x Do your maths to manipulate the distance however you like)
      • Unit - Cause GDD_DamageSource to damage GDD_DamagedUnit, dealing Real damage of attack type Chaos and damage type Universal
      • Floating Text - Create floating text that reads (|c0000FFFF+ + ((String(Real))) + |r)) above GDD_DamagedUnit with Z offset 0.00, using font size 10.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency
      • Floating Text - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees
      • Floating Text - Change (Last created floating text): Disable permanence
      • Floating Text - Change the fading age of (Last created floating text) to 1.00 seconds
      • Floating Text - Change the lifespan of (Last created floating text) to 3.00 seconds
      • Custom script: call RemoveLocation(udg_Point1)
      • Custom script: call RemoveLocation(udg_Point2)
      • Trigger - Turn on (this trigger)


Everytime you pick an item, all the items abilities are added to the hero. That's why you just have to check if the level of the ability the item has for that unit is 1, it means the unit has the item. You don't even have to show the Passive Ability icon in the unit Command Panel. You can give the item abilities information in the item tooptip, and reserve the Unit Command Pannel for other active abilities. (This is just a tip, use it however you like)
 
Last edited:
Level 8
Joined
Dec 9, 2009
Messages
397
That trigger will create an endless loop, and crash the game, without adding a condition to it
  • Conditions
  • DMGoff = 0
Then put these between your damage trigger
  • Set DMGoff = 1
  • Unit - Cause GDD_DamageSource to damage GDD_DamagedUnit, dealing Real damage of attack type Chaos and damage type Universal
  • Set DMGoff = 0
That makes sure you don't trigger your damage trigger, with your triggered damage.
 
Level 20
Joined
Jul 14, 2011
Messages
3,213
I forgot the part of 'Follow Weep's instructions' wich are something like:

"If your trigger damages infinitely, you can turn off in the beginning and turn it on again at the ending of the trigger. it will prevent looping". <- That's how I prevent damage loops in my map :) though your solution may work too. @Ultimatony.
 
Level 2
Joined
Apr 7, 2010
Messages
21
i dont know why but its failed (i do according what you tell me)

here i put the map of my sample

please on the map to find the error.
maybe you can repair it ?
 

Attachments

  • Impetus.w3x
    52.9 KB · Views: 85
Level 20
Joined
Jul 14, 2011
Messages
3,213
The thing is: If you pay more attention and read carefully, you'll life will be easier and happier :)

Your trigger is perfect, the only thing is:
Weep's Damage Detection System said:
-- How To Implement --
- Be sure "Automatically create unknown variables while pasting trigger data" is enabled in the World Editor general preferences.
- Copy the trigger category "GDD" from the demo map and paste it into your map. (Alternately: create the variables listed in the globals block below, create a trigger named GUI Friendly Damage Detection", and paste in this entire text.)
- Create your damage triggers using Game - Value Of Real Variable, select GDD_Event as the variable, and leave the rest of the settings to the default "becomes Equal to 0.00".

In your trigger, you're using as an event: GDD_Damage, not GDD_Event. That's what it isn't working. I changed it from GDD_Damage to GDD_Event, tested and works. Btw, the only trigger you need from GDD is "GUI Friendly Damage Detection", you can delete the rest, since they're there for testing purposes, and the color code: |c0000ffff is TEAL, red is |cffff0000 (swap F's and 0's).

If you don't want to show decimals, you have to convert Real to Integer
  • Set Int = (Integer(Real))
  • Floating Text - Create floating text that reads (|cffff0000 + ((String(Int)) + |r)) above GDD_DamagedUnit with ...
 
Last edited:
Level 2
Joined
Apr 7, 2010
Messages
21
do you know how to make that the damage not just come/count from

(Distance between Point1 and Point2 x 2.00 ) but also it count the INT of damage source ????

so the impetus damage dealt to enemy is "Distance Point1 and Point2 x 2.00 x Int of damage source !!!

if you know please show me how to do that and the floating text part if it needed to be changed please show me what i must change so it can show the total damage that dealt to enemy properly !!
 
Last edited:
Level 20
Joined
Jul 14, 2011
Messages
3,213
Hehehehe... 'funny'. You can add that part of 'Real Intelligence of GDD_DamageSource' to the 'Real' variable.

You have a variable of type 'Real' called 'Real' (wich works with decimals) and, so far, is set to add ((Distance between Point1 and Point2) x 2.00) damage.
  • Set Real = ((Distance between Point1 and Point2) x 2.00)
To get rid of decimals, we transform it into a Integer Variable
  • Set Int = (Integer(Real))
And the Floating Text reads the Int variable, not the damage dealt.
  • Floating Text - Create floating text that reads (|c0000FFFF + ((String(Int)) + |r)) above GDD_DamagedUnit with Z
So, you are adding damage, but directly to the 'damage', and not to the Real variable that is converted later to Int variable, and later converted to String, in order to be displayed by the Floating Text.

---------------- What to do?
Add This damage:
  • Unit - Cause GDD_DamageSource to damage GDD_DamagedUnit, dealing (Real x (Real((Intelligence of GDD_DamageSource (Exclude bonuses)))))
To This Variable
  • Set Real = ((Distance between Point1 and Point2) x 2.00)
And just cause the DamageSource to deal 'Real' (The variable) damage to DamagedUnit.

Would be something like:

  • Set Real = ((Distance between Point1 and Point2) x (2.00 x (Real((Intelligence of GDD_DamageSource (Exclude bonuses)))))))
Example: If distance between points is 500, and intelligence of the hero is 50 Damage dealt would be:

500 x 2 = 1.000
1.000 x 50 = 50.000 <- A lot.
 
Status
Not open for further replies.
Top