1. Are you planning to upload your awesome spell or system to Hive? Please review the rules here.
    Dismiss Notice
  2. Updated Resource Submission Rules: All model & skin resource submissions must now include an in-game screenshot. This is to help speed up the moderation process and to show how the model and/or texture looks like from the in-game camera.
    Dismiss Notice
  3. DID YOU KNOW - That you can unlock new rank icons by posting on the forums or winning contests? Click here to customize your rank or read our User Rank Policy to see a list of ranks that you can unlock. Have you won a contest and still havn't received your rank award? Then please contact the administration.
    Dismiss Notice
  4. Don’t forget to sign up for the Hive Cup. There’s a 555 EUR prize pool. Sign up now!
    Dismiss Notice
  5. The Hive Workshop Cup contest results have been announced! See the maps that'll be featured in the Hive Workshop Cup tournament!
    Dismiss Notice
  6. The results are out! Check them out.
    Dismiss Notice
  7. The poll for Hive's 12th Concept Art Contest is up! Go cast your vote for your favourite genie!
    Dismiss Notice
  8. The raddest synthwave tracks were chosen - Check out our Music Contest #12 - Results and congratulate the winners!
    Dismiss Notice
  9. Check out the Staff job openings thread.
    Dismiss Notice
Dismiss Notice
60,000 passwords have been reset on July 8, 2019. If you cannot login, read this.

Summon Roflcopter v0.3

Submitted by Garfield1337
This bundle is marked as approved. It works and satisfies the submission rules.
A lulzy spell i made. The Roflcopter is made of floating text as well as the bombs he drops.

Summon Roflcopter
Call for the aid of a Roflcopter. The Rolfcopter will fly in a line and throw bombs beneath it.
Level 1 - 50 damage per bomb.
Level 2 - 100 damage per bomb.
Level 3 - 150 damage per bomb.

Requires:
-SpellEffectEvent (by Bribe) (Also the libraries that are required by this one: Table and RegisterPlayerUnitEvent)
-TimerUtils (Any, i used Vexorian's though)

Code
Code (vJASS):
library Roflcopter initializer Init requires TimerUtils, II, SpellEffectEvent, Z

    //Configurables and whatnot
    globals
        private constant integer SPELL_RAW         = 'A000'
        private constant string EXPLOSION_EFFECT   = "Abilities\\Weapons\\CannonTowerMissile\\CannonTowerMissile.mdl"
        private constant real HEIGHT               = 350.0 //Roflcopter height
        private constant real SPIN_PERIOD          = 0.16 //Period between each propeller change
        private constant attacktype ATTACK_TYPE    = ATTACK_TYPE_NORMAL
        private constant damagetype DAMAGE_TYPE    = DAMAGE_TYPE_NORMAL
        private constant weapontype WEAPON_TYPE    = WEAPON_TYPE_WHOKNOWS
    endglobals
   
    private constant function DAMAGE takes unit caster,integer lvl returns real
        return lvl * 50. //Damage dependency of level.
        //You can also make damage depend on caster's stats by refering to unit variable 'caster'
    endfunction
   
    private constant function TRAVEL_LENGTH takes integer lvl returns real
        return 1400. //How long does roflcopter fly
    endfunction
   
    private constant function BOMB_PERIOD takes integer lvl returns real
        return 0.5 //How often will roflcopter throw bombs
    endfunction
   
    private constant function BOMB_AOE takes integer lvl returns real
        return 200. //Area of effect for bomb explosion
    endfunction
   
    private constant function ROFLCOPTER_SPEED takes integer lvl returns real
        return 7. //Movement speed or roflcopter
    endfunction
   
    private constant function BOMB_SPEED takes integer lvl returns real
        return 7. //Fall speed of bombs
    endfunction
   
    private function FILTER takes unit caster,unit target,integer lvl returns boolean
        //Filters which units will be damaged on explosion
        return IsPlayerEnemy(GetOwningPlayer(caster),GetOwningPlayer(target)) /*
        */
and IsUnitType(target,UNIT_TYPE_GROUND) /*
        */
and not IsUnitType(target,UNIT_TYPE_DEAD)
    endfunction
   
    private function EFFECTS takes unit caster,unit target,real x,real y,real z,integer lvl returns nothing
        //You can add here anything you want to happen on explosion given the above arguments
        //For example, you can set damaged targets on fire with a spell casted by dummy or something
    endfunction
   
    //Don't change stuff below
    //===================================================================
    globals
        private constant string R1 = "ROFL:ROFL:LOL\n                      ^\n             ---------------\\           L\n           / [   ]            =====   O\n         /                  /             L\n        [_________/\n           I            I\n       \\-----------------"
        private constant string R2 = "                   LOL:ROFL:ROFL\n                      ^\n             ---------------\\\n           / [   ]            ===== LOL\n         /                  /\n        [_________/\n           I            I\n       \\-----------------"
        private constant string R3 = "   ROFL:ROFL:LOL\n                        ^\n               /---------------\nLOL =====             [   ] \\\n                  \\                  \\\n                    \\_________]\n                        I            I\n                    -----------------/"
        private constant string R4 = "                      LOL:ROFL:ROFL\n                        ^\n   L          /---------------\n  O   =====             [   ] \\\n   L             \\                  \\\n                    \\_________]\n                        I            I\n                    -----------------/"
        private constant real DEVIATION = 100.0
    endglobals
   
    private keyword roflcopter
   
    private struct instance
        integer n
        unit u
        real bs
        real rs
        real d
        real a
        integer lv
   
        method add takes nothing returns nothing
            set .n = .n + 1
        endmethod
       
        method sub takes nothing returns nothing
            set .n = .n - 1
            if .n == 0 then
                call .destroy()
            endif
        endmethod
   
        static method create takes unit u,real x,real y returns thistype
            local thistype this = thistype.allocate()
            local integer l = GetUnitAbilityLevel(u,SPELL_RAW)
            set .u = u
            set .bs = BOMB_SPEED(l)
            set .rs = ROFLCOPTER_SPEED(l)
            set .d = DAMAGE(u,l)
            set .a = BOMB_AOE(l)
            set .lv = l
            call roflcopter.create(this,x,y,TRAVEL_LENGTH(l),BOMB_PERIOD(l))
            return this
        endmethod
   
    endstruct
   
    private keyword bomb
   
    private struct roflcopter
        texttag t = CreateTextTag()
        instance i
        real x
        real y
        real l
        real a
        timer bp
        timer sp
        integer p
       
        method execute takes nothing returns nothing
            set .x = .x + .i.rs * Cos(.a)
            set .y = .y + .i.rs * Sin(.a)
            call SetTextTagPos(.t,.x - DEVIATION,.y,HEIGHT)
            set .l = .l - .i.rs
            if .l <= 0 then
                call .destroy()
            endif
        endmethod
   
        implement II
       
        static method bombdrop takes nothing returns nothing
            local thistype this = thistype(GetTimerData(GetExpiredTimer()))
            call bomb.create(.i,.x,.y,HEIGHT)
        endmethod
       
        static method spin takes nothing returns nothing
            local thistype this = thistype(GetTimerData(GetExpiredTimer()))
            if .p == 1 then
                call SetTextTagText(.t,R2,0.023)
                set .p = 2
            elseif .p == 2 then
                call SetTextTagText(.t,R1,0.023)
                set .p = 1
            elseif .p == 3 then
                call SetTextTagText(.t,R4,0.023)
                set .p = 4
            else
                call SetTextTagText(.t,R3,0.023)
                set .p = 3
            endif
        endmethod
   
        static method create takes instance i,real x,real y,real l,real p returns thistype
            local thistype this = thistype.allocate()
            local real a = Atan2(y - GetUnitY(i.u),x - GetUnitX(i.u))
            if a < 0 then
                set a = 2 * bj_PI + a
            endif
            set .i = i
            set .l = l
            set .a = a + bj_PI / 2
            set .bp = NewTimer()
            call TimerStart(.bp,p,true,function thistype.bombdrop)
            call SetTimerData(.bp,this)
            set .sp = NewTimer()
            call TimerStart(.sp,SPIN_PERIOD,true,function thistype.spin)
            call SetTimerData(.sp,this)
            call SetTextTagPermanent(.t,false)
            call SetTextTagVisibility(.t,true)
            set .x = x + l / 2 * Cos(a - bj_PI / 2) - DEVIATION
            set .y = y + TRAVEL_LENGTH(i) / 2 * Sin(a - bj_PI / 2)
            call SetTextTagPos(.t,.x,.y,HEIGHT)
            if a < bj_PI then
                set .p = 1
                call SetTextTagText(.t,R1,0.023)
            else
                set .p = 3
                call SetTextTagText(.t,R3,0.023)
            endif
            call .start()
            call .i.add()
            return this
        endmethod
       
        method destroy takes nothing returns nothing
            call DestroyTextTag(.t)
            call ReleaseTimer(.bp)
            call ReleaseTimer(.sp)
            call .end()
            call .i.sub()
            call .deallocate()
        endmethod
   
    endstruct
   
    private struct bomb
        static thistype This
        static group g = CreateGroup()
        texttag t = CreateTextTag()
        instance i
        real x
        real y
        real h
       
        method execute takes nothing returns nothing
            set .h = .h - .i.bs
            call SetTextTagPos(.t,.x,.y,.h)
            if .h <= 3.00 then
                call .destroy()
            endif
        endmethod
       
        implement II
       
        static method create takes instance i,real x,real y,real h returns thistype
            local thistype this = thistype.allocate()
            set .i = i
            set .x = x
            set .y = y
            set .h = h
            call SetTextTagPermanent(.t,false)
            call SetTextTagVisibility(.t,true)
            call SetTextTagPos(.t,x,y,h)
            call SetTextTagText(.t,"*",0.04)
            call .start()
            call .i.add()
            return this
        endmethod
       
        static method explosion takes nothing returns boolean
            local thistype this = .This
            local unit u = GetFilterUnit()
            local real x
            local real y
            local real z
            local real z2
            if FILTER(.i.u,u,.i.lv) then
                set x = GetUnitX(u) - .x
                set y = GetUnitY(u) - .y
                set z2 = GetZ(.x,.y) + .h
                set z = GetUnitZ(u) - z2
                if x*x+y*y+z*z <= .i.a*.i.a then
                    call UnitDamageTarget(.i.u,u,.i.d,false,false,ATTACK_TYPE,DAMAGE_TYPE,WEAPON_TYPE)
                    call EFFECTS(.i.u,u,.x,.y,z2,.i.lv)
                endif
            endif
            set u = null
            return false
        endmethod
       
        method destroy takes nothing returns nothing
            call DestroyTextTag(.t)
            call DestroyEffect(AddSpecialEffect(EXPLOSION_EFFECT,.x,.y))
            set .This = this
            call GroupEnumUnitsInRange(.g,.x,.y,.i.a,Filter(function thistype.explosion))
            call .end()
            call .i.sub()
            call .deallocate()
        endmethod
       
    endstruct
   
    private function Cast takes nothing returns nothing
        call instance.create(GetTriggerUnit(),GetSpellTargetX(),GetSpellTargetY())
    endfunction
   
    private function Init takes nothing returns nothing
        call RegisterSpellEffectEvent(SPELL_RAW, function Cast)
    endfunction

endlibrary

How to import
-Copy the triggers from Roflcopter trigger category or the whole category itself
-Copy the spell from object editor
-Configure the spell to your needs with Roflcopter trigger's constants

Note: the roflcopter text gets messed up if you test the spell with JNGP, but it does display properly if you test it by normally starting the game even if the spell is saved under JNGP. It also displays properly if you test it from vanilla WE.

Keywords:
Roflcopter, gyrocopter, flying, machine, copter, bombs, explosion, lmao, rofl, lol, lolz, lulz, funny, derp, obvious, win, awesome, Bob Marley
Contents

Summon Roflcopter (Map)

Reviews
Moderator
15 Oct 2015 08:41 Bribe: No longer a director's cut resource as this is literally a joke. Bribe: Leakless Very MUI Absolutely no lag Highly entertaining Very creative Looks just about flawless Highly Recommended, I'll ask...
  1. maddeem

    maddeem

    Joined:
    Jan 1, 2011
    Messages:
    1,268
    Resources:
    5
    Maps:
    2
    Spells:
    3
    Resources:
    5
    Maybe you could add some sort of >(ROFL) bomb... Instead of the * :D
     
  2. Geries

    Geries

    Joined:
    Sep 13, 2010
    Messages:
    497
    Resources:
    7
    Models:
    6
    Packs:
    1
    Resources:
    7
    Bomb example:


    [​IMG]
    Code (vJASS):
    function Bomb_Loop takes nothing returns nothing
    globals
    string A = "|CFFAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII|r |n|CFFAAAAAA  II|CFF000000IIIIIIIIIIIIIII|CFFAAAAAAII|CFF000000IIIIIIIIIIIIIII|cFFAAAAAAII|r |n|CFFAAAAAA    II|CFF000000IIIIIIIIIIIII|CFFAAAAAAII|CFF000000IIIIIIIIIIIII|cFFAAAAAAII|r |n|CFFAAAAAA      II|CFF000000IIIIIIIIIII|CFFAAAAAAII|CFF000000IIIIIIIIIII|cFFAAAAAAII|r |n|CFFAAAAAA        II|CFF000000IIIIIIIII|CFFAAAAAAII|CFF000000IIIIIIIII|cFFAAAAAAII|r |n|CFFAAAAAA          II|CFF000000IIIIIII|CFFAAAAAAII|CFF000000IIIIIII|cFFAAAAAAII|r |n|CFFAAAAAA            II|CFF000000IIIII|CFFAAAAAAII|CFF000000IIIII|cFFAAAAAAII|r |n|CFFAAAAAA              II|CFF000000III|CFFAAAAAAII|CFF000000III|cFFAAAAAAII|r |n|CFFAAAAAA                II|CFF000000I|CFFAAAAAAII|CFF000000I|cFFAAAAAAII|r |n          |CFFAAAAAAIIIIIIIIIIIIIIIIIIII|r |n"
    string B = "          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAAII|CFF000000IIIIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAA II|CFF000000IIIIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAA  II|CFF000000IIIIIIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAA    II|CFF000000IIIIIIII|CFFAAAAAAII|r |n          |CFFAAAAAA      II|CFF000000IIII|CFFAAAAAAII|r |n          |CFFAAAAAA        IIII|r |n"
    endglobals
        local unit u = GetEnumUnit()
        if LoadBoolean(udg_RoflHash,GetHandleId(u),6) == false then
            set bj_lastCreatedTextTag = CreateTextTag()
            call SetTextTagPermanent(bj_lastCreatedTextTag,false)
            call SetTextTagPos(bj_lastCreatedTextTag,GetUnitX(u),GetUnitY(u),350.0)
            call SetTextTagVisibility(bj_lastCreatedTextTag,true)
            call SetTextTagText(bj_lastCreatedTextTag, A + B ,0.005)
            call SaveInteger(udg_RoflHash,GetHandleId(u),7,LoadInteger(udg_RoflHash,GetHandleId(u),7) + 1)
            call SaveTextTagHandle(udg_RoflHash,GetHandleId(u),4 + LoadInteger(udg_RoflHash,GetHandleId(u),7) * 4,bj_lastCreatedTextTag)
            call SaveReal(udg_RoflHash,GetHandleId(u),5 + LoadInteger(udg_RoflHash,GetHandleId(u),7) * 4,GetUnitX(u))
            call SaveReal(udg_RoflHash,GetHandleId(u),6 + LoadInteger(udg_RoflHash,GetHandleId(u),7) * 4,GetUnitY(u))
            call SaveReal(udg_RoflHash,GetHandleId(u),7 + LoadInteger(udg_RoflHash,GetHandleId(u),7) * 4,350.0)
        endif
        set u = null
    endfunction
     



    But it's awesome anyway.
     

    Attached Files:

  3. Garfield1337

    Garfield1337

    Joined:
    Jul 6, 2009
    Messages:
    1,806
    Resources:
    4
    Maps:
    1
    Spells:
    3
    Resources:
    4
    @geries
    Woah! That looks amazing,i'll probably add it.
     
    Last edited: Jan 9, 2011
  4. peachypenguin

    peachypenguin

    Joined:
    Feb 4, 2010
    Messages:
    36
    Resources:
    0
    Resources:
    0
    Make a roflknife? :D
     
  5. xorkatoss

    xorkatoss

    Joined:
    Jul 12, 2010
    Messages:
    1,515
    Resources:
    7
    Models:
    5
    Maps:
    1
    Spells:
    1
    Resources:
    7
    IDEA!! create a new spell and use the idea of the rofl bomb as a NUKE BOMB!! ;D
     
  6. Nillere

    Nillere

    Joined:
    Aug 9, 2009
    Messages:
    219
    Resources:
    0
    Resources:
    0
    awesomesauce

    soi soi soi soi
     
  7. gtsimos

    gtsimos

    Joined:
    Jan 6, 2010
    Messages:
    67
    Resources:
    0
    Resources:
    0
    omg its a model by garf :DDDDDD
    5/5 :pp
     
  8. osama-binliden

    osama-binliden

    Joined:
    Aug 4, 2008
    Messages:
    74
    Resources:
    0
    Resources:
    0
    funny but i dont see how its usefull still 5/5
     
  9. Marc Mamales

    Marc Mamales

    Joined:
    Dec 26, 2010
    Messages:
    450
    Resources:
    1
    Spells:
    1
    Resources:
    1
    Cool ^^ :) 4/5
     
  10. NBalfa

    NBalfa

    Joined:
    Aug 20, 2010
    Messages:
    70
    Resources:
    0
    Resources:
    0
    A text that throws bombs, prety unique and funny^^
     
  11. baassee

    baassee

    Joined:
    Nov 14, 2008
    Messages:
    3,220
    Resources:
    17
    Spells:
    14
    Tutorials:
    3
    Resources:
    17
    This is ... yeah odd.

    First when you register the spell, is it meant that the neutrals should use it even neutral passive? Just change the value 16 into bj_MAX_PLAYERS as instead of registering 16 events it registers those who are needed.

    The timer which checks the Roflcopter_Loop_Init function is on for all times, so it enums 50 times every second even if there are no roflcopter instances on? Please make the timer a variable and store in your hash the amount of instances (when cast +1 when end -1). When it reaches 0, pause the timer, and start it when it's on.

    The filter, change the getunitstate into getwidgetlife as it's faster. Probably change the value to > 0.405 too but yeah Blizz used 0 so ... also might add another death check?
    IsUnitType(u, UNIT_TYPE_DEAD) == false


    This spell damages structures? (bombs but whatever)

    The attacktype and damagetype should be stored into variables.

    The special effect should also be stored into a string variable

    In the bombs movement you can add a few local reals to get rid of the calculations, just calculate them once instead of approx ~2-4 times per calculations and I think it's 4 calculations. (example 7 + i * 4 could be stored after i has been set to +1)

    in the clear function you could set GetTriggerUnit() into a local
     
  12. Garfield1337

    Garfield1337

    Joined:
    Jul 6, 2009
    Messages:
    1,806
    Resources:
    4
    Maps:
    1
    Spells:
    3
    Resources:
    4
    Yay criticism
    For neutral players,why does it matter? I thought it should be avaliable for all players...just in case. Maybe someone wants an NPC to cast it.

    Roflcopter_Loop_Init enumerates a unit group and since the actions apply to each unit in group,when the group is empty it should do nothing...
    An example would be
    • Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
      • Loop - Actions
        • Set Counter = (Counter + 1)

    The counter would be 0 if the unit group was empty,so no actions were executed. Is it worth it to disable the timer?

    For GetWidgetLife(),what should be the comparison? < 0.405 or == 0?
    I don't know about 0.405 because of this and this

    I'll add a configurable boolean wheter structures should be damaged or not.

    Ok. 4x
     
  13. baassee

    baassee

    Joined:
    Nov 14, 2008
    Messages:
    3,220
    Resources:
    17
    Spells:
    14
    Tutorials:
    3
    Resources:
    17
    Never seen a npc using a custom spell :O

    Yes probably but it calls ForGroup() 50 times per second for no reason, better just pause the timer to get rid of those calls and have one less timer running

    pp is great but > 0.405 is standards, usually every single vjass spell has it except for the check for the unittype (most spells has it)
     
  14. Tleno

    Tleno

    Joined:
    Jul 6, 2008
    Messages:
    4,783
    Resources:
    2
    StarCraft II Resources:
    2
    Resources:
    2
    Man this is a masterpiece. The idea of making a unit out of text and using it to bomb stuff is just awesome!
     
  15. Spoontoobig

    Spoontoobig

    Joined:
    Nov 3, 2009
    Messages:
    685
    Resources:
    1
    Maps:
    1
    Resources:
    1
    6/5 awesome idea! :D

    http://www.youtube.com/watch?v=boh92DrYEWs
     
  16. biffzs

    biffzs

    Joined:
    Feb 27, 2008
    Messages:
    12
    Resources:
    0
    Resources:
    0
    :D one of the most creative spells i have ever seen
    5/5 good work
     
  17. Orcnet

    Orcnet

    Joined:
    Jul 31, 2010
    Messages:
    3,864
    Resources:
    4
    Maps:
    3
    Tutorials:
    1
    Resources:
    4
    nice spell you made there dude! it fits the Gyrocopter unit's ability :cgrin:
     
  18. 88WaRCraFT3

    88WaRCraFT3

    Joined:
    Jun 9, 2009
    Messages:
    1,139
    Resources:
    1
    Spells:
    1
    Resources:
    1
  19. Dromlexer

    Dromlexer

    Joined:
    Feb 3, 2010
    Messages:
    365
    Resources:
    1
    StarCraft II Resources:
    1
    Resources:
    1
    This is greatest custom Jazz spell masterpiece which I had ever seen. =D
     
  20. 88WaRCraFT3

    88WaRCraFT3

    Joined:
    Jun 9, 2009
    Messages:
    1,139
    Resources:
    1
    Spells:
    1
    Resources:
    1
    SRSLY, Why DC? It's ok and it deserves highly recommended but DC no! Anachrons inventory system hasn't got dc and this have -.-