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

Battletank Arena v3.02d

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Battletank Arena 3.02d



Contents

Hello respective THW community.


Today I would like to introduce you to Battletank Arena, a 3vs3 aiming arena game with the option of FFA mode. Your goal is simply to kill as many enemies as possible so that you will be the one to score the highest amount of kills. Slide on the icy terrain to escape your enemy or chase him down.
BEWARE, for you'll slowly lose hitpoint as you slide on ice and when you reach 1hp your sliding speed with dramatically decrease!

(I hadn't played warcraft and its wonderful scenarios on battle net for quite a long time and I came back to see that all games were hosted by bots and nearly no active players, I remember when I was hosting a game people would swarm joining in. Good old days...)

FEATURES

You are in control of a battletank with 4 unique spells and your goal is to destroy the enemy tanks by skillfully aiming your abilities towards them.




  • COMMANDS



  1. -dm DEATHMATCH If you choose this mode all tanks will become hostile to each other and the massacre can begin.
  2. -kills [###] Setup the kill limit to a number that ranges from 1 to 999. If the host does not setup a kill limit in the first 60 seconds of the game the limit will be automatically be set to a random number. (won't be a 3-digit one)



  • ABILITIES



  1. Napalm
    A straight line of fire. Your basic weapon against your enemies.
  2. Double Napalm
    A double curved line of fire. A more advanced version of the previous one. Can deal massive damage in the end.
  3. Z-K Fire
    This is a strange one, as it goes to a random direction. However if you manage to hit your enemy you'll see why this weapon can't be controlled.
  4. X Bombardement
    Starts as a cross expanding far from the cast point, then goes to a circular rampage.
  5. Milky Way
    There is reason why this one was named after our galaxy. Cast it on the enemy tanks and behold the annihilation.

SCREENSHOTS
OVERVIEW
screen1kt.jpg



A combination of Napalm & Double Napalm
screen10o.jpg



Initiation of X Bombardement
screen4f.jpg



Initiation of Milky Way
screen7ps.jpg



Finale of X Bombardement
screen5qq.jpg



Finale of Milky Way
screen8i.jpg



Comparement of the finales of X Bombardement & Milky Way
screen9ds.jpg



Z-K Fire
screen6by.jpg





TRIGGERS

Sliding Function - THANK YOU DAT-C3
  • SLIDING
    • Events
      • Time - globaltimer expires
    • Conditions
      • (Number of units in tanks) Greater than 0
    • Actions
      • Unit Group - Pick every unit in tanks and do (Actions)
        • Loop - Actions
          • Set tp1 = (Position of (Picked unit))
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Terrain type at tp1) Equal to Icecrown Glacier - Dark Ice
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Life of (Picked unit)) Greater than or equal to 1.00
                • Then - Actions
                  • Set tp2 = (tp1 offset by 8.00 towards (Facing of (Picked unit)) degrees)
                  • Unit - Move (Picked unit) instantly to tp2
                  • Custom script: call RemoveLocation(udg_tp2)
                  • Unit - Set life of (Picked unit) to ((Life of (Picked unit)) - 0.10)
                  • Camera - Pan camera for (Owner of (Picked unit)) to (tp1 offset by 250.00 towards (Facing of (Picked unit)) degrees) over 0.30 seconds
                  • Item - Pick every item in (Region centered at tp1 with size (140.00, 140.00)) and do (Actions)
                    • Loop - Actions
                      • Hero - Give (Picked item) to (Picked unit)
                      • Item - Remove (Picked item)
                • Else - Actions
                  • Set tp2 = (tp1 offset by 2.00 towards (Facing of (Picked unit)) degrees)
                  • Unit - Move (Picked unit) instantly to tp2
                  • Custom script: call RemoveLocation(udg_tp2)
                  • Item - Pick every item in (Region centered at tp2 with size (140.00, 140.00)) and do (Actions)
                    • Loop - Actions
                      • Hero - Give (Picked item) to (Picked unit)
                      • Item - Remove (Picked item)
            • Else - Actions
          • Custom script: call RemoveLocation(udg_tp1)
Part of an ability
  • LB DAMAGE
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer A) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (LaBomba_Dummy[(Integer A)] is alive) Equal to True
            • Then - Actions
              • Set LaBomba_OFFSET[(Integer A)] = (LaBomba_OFFSET[(Integer A)] + 40)
              • -------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
              • Special Effect - Create a special effect at ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 0.00) degrees) using Abilities\Weapons\SteamTank\SteamTankImpact.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 90.00) degrees) using Abilities\Weapons\SteamTank\SteamTankImpact.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) - 90.00) degrees) using Abilities\Weapons\SteamTank\SteamTankImpact.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 180.00) degrees) using Abilities\Weapons\SteamTank\SteamTankImpact.mdl
              • Special Effect - Destroy (Last created special effect)
              • -------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
              • Unit Group - Pick every unit in (Units within 95.00 of ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 0.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LaBomba_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LaBomba_Dummy[(Integer A)] to damage (Picked unit), dealing 30.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 95.00 of ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 90.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LaBomba_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LaBomba_Dummy[(Integer A)] to damage (Picked unit), dealing 30.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 95.00 of ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) - 90.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LaBomba_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LaBomba_Dummy[(Integer A)] to damage (Picked unit), dealing 30.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 95.00 of ((Position of LaBomba_Dummy[(Integer A)]) offset by (Real(LaBomba_OFFSET[(Integer A)])) towards ((Facing of LaBomba_Dummy[(Integer A)]) + 180.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LaBomba_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LaBomba_Dummy[(Integer A)] to damage (Picked unit), dealing 30.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
            • Else - Actions
              • Do nothing
Part of another ability
  • LZB CIRCLE
    • Events
      • Time - Every 0.02 seconds of game time
    • Conditions
    • Actions
      • For each (Integer A) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (LZB_Dummy[(Integer A)] is alive) Equal to True
            • Then - Actions
              • Unit - Make LZB_Dummy[(Integer A)] face ((Facing of LZB_Dummy[(Integer A)]) - 5.00) over 0.00 seconds
              • Special Effect - Create a special effect at ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 0.00) degrees) using Abilities\Weapons\RocketMissile\RocketMissile.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 90.00) degrees) using Abilities\Weapons\RocketMissile\RocketMissile.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) - 90.00) degrees) using Abilities\Weapons\RocketMissile\RocketMissile.mdl
              • Special Effect - Destroy (Last created special effect)
              • Special Effect - Create a special effect at ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 180.00) degrees) using Abilities\Weapons\RocketMissile\RocketMissile.mdl
              • Special Effect - Destroy (Last created special effect)
              • -------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------
              • Unit Group - Pick every unit in (Units within 85.00 of ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 0.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LZB_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LZB_Dummy[(Integer A)] to damage (Picked unit), dealing 35.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 85.00 of ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 90.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LZB_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LZB_Dummy[(Integer A)] to damage (Picked unit), dealing 35.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 85.00 of ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) - 90.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LZB_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LZB_Dummy[(Integer A)] to damage (Picked unit), dealing 35.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
              • Unit Group - Pick every unit in (Units within 85.00 of ((Position of LZB_Dummy[(Integer A)]) offset by (Real(LZB_CIRCLE[(Integer A)])) towards ((Facing of LZB_Dummy[(Integer A)]) + 180.00) degrees)) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) belongs to an ally of (Owner of LZB_Dummy[(Integer A)])) Equal to False
                    • Then - Actions
                      • Unit - Cause LZB_Dummy[(Integer A)] to damage (Picked unit), dealing 35.00 damage of attack type Chaos and damage type Normal
                    • Else - Actions
                      • Do nothing
            • Else - Actions
Initiation
  • Initialization
    • Events
      • Time - Elapsed game time is 0.01 seconds
    • Conditions
    • Actions
      • Trigger - Turn on ITEMS a1 <gen>
      • Trigger - Run MB Creation <gen> (ignoring conditions)
      • -------- --------- --------
      • Game - Display to (All players) for 10.00 seconds the text: |cFF008000Host can ...
      • -------- --------- --------
      • Wait 60.00 seconds
      • Trigger - Turn off Kill Limit <gen>
      • Trigger - Turn off Deathmatch <gen>
      • Trigger - Turn off WTF <gen>
      • Trigger - Turn on NO Deathmatch <gen>
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Kill Limit <gen> is on) Equal to True
        • Then - Actions
          • Set MAX_KILLS = 0
          • If (MAX_KILLS Equal to 0) then do (Set MAX_KILLS = (Random integer number between (Random integer number between 20 and 30) and (Random integer number between 40 and 60))) else do (Do nothing)
          • Game - Display to (All players) for 15.00 seconds the text: (First player to reach + ((String(MAX_KILLS)) + kills wins!))
          • Multiboard - Change the title of Multiboard to (|cFF008000Player Statistics|r + ([ + ((String(MAX_KILLS)) + kills to win])))
        • Else - Actions
Initiation of the most simple ability implemented: (Napalm)
  • BOMBA
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Napalm
    • Actions
      • Set B_Point[(Player number of (Owner of (Casting unit)))] = (Position of (Casting unit))
      • Unit - Create 1 1_DUMMY for (Owner of (Casting unit)) at B_Point[(Player number of (Owner of (Casting unit)))] facing (Target point of ability being cast)
      • Custom script: call RemoveLocation(udg_B_Point[GetConvertedPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))])
      • Set BOMBA_Dummy[(Player number of (Owner of (Casting unit)))] = (Last created unit)
      • Unit - Add a 0.65 second Generic expiration timer to BOMBA_Dummy[(Player number of (Owner of (Casting unit)))]

Changelong

1.01b: Original Release (1vs1)
2.00: Added two more player slots (2vs2), Added -dm mode, Added kill limit
2.01b: Fixed various performance bugs
3.01b: Major update. Added two more player slots and reworked ability triggers to reduce the amount of triggers.
3.02c: Reworked many triggers. Mostly the "Sliding" triggers, 12 Triggers became 1! Introduced to the no-leaking system. All in this patch was updated thanks to Dat-C3
3.02d: BIG UPDATE - IMPROVED mapPreview and added a fitting loading screen! Also fixed some bugs.

NOTE: Many versions that include various gameplay and performance fixes aren't even posted here. (I lost track of them)
Credits

Dat-C3 This guy helped me fixing the triggers, alot!
Frankster For that super amazing double barrel tank model.
noob_smoke For the kill streak sound system.
McGregor For supporting me, kind of... xD




ANY FEEDBACK IS APPRECIATED

Keywords:
Battletank,arena,shooting,aimimg,slide,skill,pvp,technology,mini-game,mini,game
Contents

Battletank Arena v3.02d (Map)

Reviews
Vengeancekael - Date: 2012/May/17 00:45:14 Reasons: Other: Check out the tutorials section: Tutorials Check out the Map Development Section: Map Development Section Check out the World Editor Help Zone (Trigger issues, object editor, overall...
You wouldn't need that trigger if you used co-ordinates to move the units as opposed to locations. I'll give an example:

  • Custom script: call SetUnitX(udg_Unit, udg_CurrentX + udg_Speed * Cos(udg_Angle))
  • Custom script: call SetUnitY(udg_Unit, udg_CurrentY + udg_Speed * Sin(udg_Angle))
For setting the "udg_Angle" you'd need to multiple the desired angle by bj_DEGTORAD i.e:

  • Custom script: set udg_Angle = udg_DesiredAngle * bj_DEGTORAD
(Might need to change capitalisation if an error occurs provided the variables you have used exist)

Modifying those to lines to apply to your sliding will make it so that it is by default controllable without the need of a second trigger to change the facing angle as well as make the game not lag on (very poor) computers or when there is a lot of people sliding at once, it'll also make it so much smoother.
 
He means something like this even though I can't get it working... ;

Then - Actions
Set Facing = (Facing of (Picked unit))
Custom script: set udg_Angle = udg_Facing * bj_DEGTORAD
Set Speed = 21.00
Set su = (Picked unit)
Set tp2 = (tp1 offset by 10.00 towards (Facing of (Picked unit)) degrees)
Custom script: call SetUnitX(udg_su, GetLocationX(udg_tp2) + udg_Speed * Cos(udg_Angle))
Custom script: call RemoveLocation(udg_tp2)
Set tp2 = (tp1 offset by 9.00 towards (Facing of (Picked unit)) degrees)
Set Speed = 10.00
Custom script: call SetUnitY(udg_su, GetLocationY(udg_tp2) + udg_Speed * Sin(udg_Angle))
Custom script: call RemoveLocation(udg_tp2)
Unit - Set life of (Picked unit) to ((Life of (Picked unit)) - 0.28)
Camera - Pan camera for (Owner of (Picked unit)) to (tp1 offset by 250.00 towards (Facing of (Picked unit)) degrees) over 0.40 seconds

- However there is two ways to do it, and I made them both down there for you :thumbs_up:
 

Attachments

  • Target Gaming Arena Fix1.w3x
    865.4 KB · Views: 66
I was just showing you what he meant, as well the movement isn't that out of control. It allows for animations and movement/custom movement systems during moving the unit constantly since the GUI one can't do that. Indeed, it is fine currently if thats the way you made it, and wanted it.

bj_DEGTORAD means what it says, Degrees to Radians I think.

By the way don't double post.
 
Dat-C3, that. . .really isn't how you use it XD

Look at the example of one of my spells which uses it, Example taken from my spell "Chaos Portal"

  • -------- Projectile movement setup --------
  • Custom script: set udg_CP_TempX = GetUnitX(udg_CP_U)
  • Custom script: set udg_CP_TempY = GetUnitY(udg_CP_U)
  • Custom script: set udg_CP_Angle = (GetUnitFacing(udg_CP_U) * bj_DEGTORAD)
  • -------- Projectile movement --------
  • Custom script: call SetUnitX(udg_CP_U, udg_CP_TempX + udg_CP_CageSpeed * Cos(udg_CP_Angle))
  • Custom script: call SetUnitY(udg_CP_U, udg_CP_TempY + udg_CP_CageSpeed * Sin(udg_CP_Angle))
As you can see there is /no/ use of points involved or needed in executing this. Note that "CP_CageSpeed" in this example is a pre-set configurable (meaning I set it elsewhere exterior to the loops) The rest is fairly self explanatory, do it right and your setup should look something similar to this
 
Level 4
Joined
Sep 12, 2008
Messages
111
" Custom script: set udg_CP_TempX = GetUnitX(udg_CP_U)
Custom script: set udg_CP_TempY = GetUnitY(udg_CP_U)"

The GetUnitX and Y are points aren't they?

X and Y are reals. They're not points(location).

Getting the X of the position of (udg_CP_U) doesn't leak? Doesn't it set up a point so it can grab the X? its just like (unit pos.) position of triggering unit it looks like that way anyways...

tumblr_lx5lqyG19e1qaa7gwo1_400.jpg


" That stuff is too advanced for me to understand, I remember when I was placing random units all over the field and then some enemy ones and just pressing F9 to have fun. I wish things were still that simple. "

true+story.jpg
 
Last edited:
Top