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

[Solved] What's InitTrig_<name>? - Imported JASS Code has tons of errors

Status
Not open for further replies.
Here it is:

JASS:
//TESH.scrollpos=0
//TESH.alwaysfold=0
//==============================================================================
//  Custom Race System by Archmage Owenalacaster
//==============================================================================
//
//  Purpose:
//      - Creates the starting units for custom races and replaces the standard
//        Melee Initialization trigger. Custom races are selected by race and
//        handicap.
//
//  Usage:
//      - Register a new custom race with CustomRace.create(name, RACE, handicap)
//          Handicaps: Valid handicap values are 1.0, 0.9, 0.8, 0.7, 0.6 and 0.5.
//      - Register a new custom race for all handicaps of a single race with
//        CustomRace.createAll(name, RACE)
//      - Extend the registration of a race with c.register(RACE, handicap)
//      - Set the townhall type with c.setTownHall(unitid)
//      - Add a new worker type with c.addWorkerType(unitid, priority, qty)
//          Priorities: c.NEAR_MINE spawns workers near the mine, where workers
//                        typically spawn.
//                      c.NEAR_HALL spawns workers near the town hall, where
//                        Ghouls spawn.
//      - Add a random hero type with c.addHeroType(unitid)
//      - Set the ai script used by computer players with c.setAIScript(stringpath)
//      - Set a callback function with c.setCallback(CustomRaceCall.function)
//          Callbacks: The callback is executed after all the starting units for a
//                     player are created, and its purpose is to provide enhanced
//                     initial behaviour for a race. A good example of this with the
//                     standard races would be the Undead Goldmine Haunting and
//                     Night Elves Goldmine Entangling.
//                     The callback function passes as arguments all the units
//                     generated in addition to the nearest goldmine detected.
//                     Please note that if a random hero is not created, the last
//                     argument will have a null value, so always do a check.
//       - Get a player's custom race name string with GetPlayerCustomRaceName(player)
//
//  Notes:
//      - Supports a maximum of 24 custom races.
//      - Maximum for worker and hero types are configurable.
//
//  Requirements:
//      - JassHelper version 0.9.E.0 or newer (older versions may still work).
//
//  Installation:
//      - Create a new trigger called CustomRaceSystem.
//      - Convert it to custom text and replace all the code with this code.
//
//  Special Thanks:
//      - Alevice:  He practically co-wrote the code.
//      - cosmicat: His formula for circular unit formation.
//                  Co-developing the single-array registry.
//
//==============================================================================

library CustomRaceSystem initializer Init
    
//===========================================================================
//                                CONFIGURATION SECTION
//===========================================================================
    globals
        // Unit Type Constants
        private constant integer MAX_WORKERTYPES = 4
        private constant integer MAX_HEROTYPES = 4
    endglobals
//===========================================================================
//                                END CONFIGURATION SECTION
//===========================================================================

    function interface CustomRaceCall takes player play, group workers, unit goldmine, unit townhall, unit randhero returns nothing
    
    private function r2S takes race r returns string
        if r == RACE_HUMAN then
            return "Human"
        elseif r == RACE_ORC then
            return "Orc"
        elseif r == RACE_UNDEAD then
            return "Undead"
        elseif r == RACE_NIGHTELF then
            return "Night Elf"
        endif
        return "Unknown"
    endfunction
    
    private function r2I takes race r returns integer
        if r == RACE_HUMAN then
            return 1
        elseif r == RACE_ORC then
            return 2
        elseif r == RACE_UNDEAD then
            return 3
        elseif r == RACE_NIGHTELF then
            return 4
        endif
        return 5
    endfunction
    
    globals
        // Victory Defeat Variables
        private string array KEY_STRUCTURE
        private integer KEY_STRUCTURE_COUNT = 0
    endglobals
    
//===========================================================================
//                                STRUCT DATA
//===========================================================================
    private keyword createStartingUnits
    
    struct CustomRace
        string name
        
        // Town Hall Variable
        integer townhallType = 0
      //string  townhallName
        // Town Hall name is not currently supported.
        
        // Worker Variables
        integer totalWorkerTypes = 0
        integer array workerType[MAX_WORKERTYPES]
        integer array workerPriority[MAX_WORKERTYPES]
        integer array workerQty[MAX_WORKERTYPES]
        
        // Random Hero Variables
        integer totalHeroTypes = 0
        integer array heroType[MAX_HEROTYPES]
        
        // AI Script Directory String Variable
        string aiscript = ""
        
        // Callback Variable
        private CustomRaceCall c
        
        // Registry Variable
        static integer array REGISTRY
        
        // Spawn Priority Variables
        static integer NEAR_MINE     = 0
        static integer NEAR_HALL     = 1
        
        static method get takes race r, real h returns CustomRace
            return CustomRace(.REGISTRY[((r2I(r)-1)*6)+(10-R2I(h*10.))])
        endmethod
        
        method register takes race r, real h returns boolean
            local CustomRace c = CustomRace.get(r,h)
            if c != 0 then
                debug call BJDebugMsg("|cffff0000Registration of "+.name+" failed due to conflict with "+c.name+" registered for "+r2S(r)+" race Handicap "+R2S(h))
                return false
            endif
            set .REGISTRY[((r2I(r)-1)*6)+(10-R2I(h*10.))] = integer(this)
            return true
        endmethod
        
        static method create takes string name, race r, real h returns CustomRace
            local CustomRace c = CustomRace.allocate()
            set c.name = name
            if not c.register(r,h) then
                call c.destroy()
                return 0
            endif
            return c
        endmethod
        
        static method createAll takes string name, race r returns CustomRace
            local CustomRace c = CustomRace.allocate()
            set c.name = name
            if not c.register(r,1.0) and not c.register(r,0.9) and not c.register(r,0.8) and not c.register(r,0.7) and not c.register(r,0.6) and not c.register(r,0.5) then
                call c.destroy()
                return 0
            endif
            return c
        endmethod
        
        method setTownHall takes integer hallid returns nothing
            set .townhallType = hallid
            set KEY_STRUCTURE[KEY_STRUCTURE_COUNT] = UnitId2String(hallid)
            set KEY_STRUCTURE_COUNT = KEY_STRUCTURE_COUNT+1
        endmethod
        
        method addWorkerType takes integer workerid, integer priority, integer quantity returns nothing
            set .workerType[.totalWorkerTypes] = workerid
            set .workerPriority[.totalWorkerTypes] = priority
            set .workerQty[.totalWorkerTypes] = quantity
            set .totalWorkerTypes = .totalWorkerTypes+1
        endmethod
        
        method addHeroType takes integer heroid returns nothing
            local integer i = 0
            set .heroType[.totalHeroTypes] = heroid
            set .totalHeroTypes = .totalHeroTypes+1
            loop
                call SetPlayerTechMaxAllowed(Player(i),heroid,1)
                set i = i+1
                exitwhen i == bj_MAX_PLAYERS
            endloop
        endmethod
        
        private method getRandomHeroType takes nothing returns integer
            local integer randomindex = GetRandomInt(0,.totalHeroTypes-1)
            return .heroType[randomindex]
        endmethod
        
        method setAIScript takes string s returns nothing
            set .aiscript = s
        endmethod
        
        method setCallback takes CustomRaceCall callb returns nothing
            set .c = callb
        endmethod
        
        private method createRandomHero takes player p, location loc returns unit
            local unit h = CreateUnitAtLoc(p, .getRandomHeroType(), loc, bj_UNIT_FACING)
            if bj_meleeGrantHeroItems then
                call MeleeGrantItemsToHero(h)
            endif
            return h
        endmethod
        
        method createStartingUnits takes player p returns nothing
            local location   startLoc        = GetPlayerStartLocationLoc(p)
            local location   nearMineLoc     = startLoc
            local location   nearTownLoc     = startLoc
            local location   spawnLoc        = startLoc
            local location   heroLoc         = startLoc
            local unit       nearestMine     = MeleeFindNearestMine(startLoc, bj_MELEE_MINE_SEARCH_RADIUS)
            local unit       myTownhall      = null
            local unit       myRandHero      = null
            local group      workerGroup     = CreateGroup()
            local integer    workertypeindex = 0
            local integer    workerqty       = 0
            local integer    spawnPriority   = 0
            if nearestMine != null then
                set nearMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine),startLoc,320,0)
                set nearTownLoc = MeleeGetProjectedLoc(startLoc,GetUnitLoc(nearestMine),288,0)
                set heroLoc     = MeleeGetProjectedLoc(GetUnitLoc(nearestMine),startLoc,384,45)
            endif
            set myTownhall = CreateUnitAtLoc(p,.townhallType,startLoc,bj_UNIT_FACING)
            loop
                exitwhen workertypeindex == .totalWorkerTypes
                    set spawnPriority = .workerPriority[workertypeindex]
                    if (spawnPriority==.NEAR_HALL) then
                        set spawnLoc = nearTownLoc
                    elseif(spawnPriority==.NEAR_MINE) then
                        set spawnLoc = nearMineLoc
                    endif
                    loop
                        call GroupAddUnit(workerGroup, CreateUnitAtLoc(p,.workerType[workertypeindex],PolarProjectionBJ(spawnLoc,65,(I2R(workerqty)*(360.00 / I2R(.workerQty[workertypeindex]))) + 90),bj_UNIT_FACING))
                        set workerqty = workerqty + 1
                        exitwhen workerqty >= .workerQty[workertypeindex]
                    endloop
                    call RemoveLocation(spawnLoc)
                    set workerqty = 0
                set workertypeindex = workertypeindex+1
            endloop
            if (IsMapFlagSet(MAP_RANDOM_HERO) and .totalHeroTypes>0 ) then
                set myRandHero = .createRandomHero(p,heroLoc)
            else
                call SetPlayerState(p,PLAYER_STATE_RESOURCE_HERO_TOKENS,bj_MELEE_STARTING_HERO_TOKENS)
            endif
            if(.c!=0) then
                call .c.evaluate(p,workerGroup,nearestMine,myTownhall,myRandHero)
            else
                call DestroyGroup(workerGroup)
            endif
            if nearMineLoc != startLoc then
                call RemoveLocation(nearMineLoc)
                call RemoveLocation(nearTownLoc)
                call RemoveLocation(heroLoc)
            endif
            call RemoveLocation(startLoc)
            set startLoc    = null
            set nearMineLoc = null
            set nearTownLoc = null
            set spawnLoc    = null
            set heroLoc     = null
            set nearestMine = null
            set myTownhall  = null
            set myRandHero  = null
            set workerGroup = null
        endmethod
     endstruct
     
     globals
        private string array PLAYER_RACE
     endglobals
     
     function GetPlayerCustomRaceName takes player p returns string
        return PLAYER_RACE[GetPlayerId(p)]
     endfunction
    
//===========================================================================
//                         UNIT CREATION SECTION
//===========================================================================
    private function CreateStartingUnitsForAllPlayers takes nothing returns nothing
        local integer    index = 0
        local player     indexPlayer
        local race       playerRace
        local CustomRace c
        loop
            set indexPlayer = Player(index)
            if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
                set playerRace = GetPlayerRace(indexPlayer)
                set c = CustomRace.get(playerRace,GetPlayerHandicap(indexPlayer)+0.01)
                if (GetPlayerController(indexPlayer) == MAP_CONTROL_USER or (GetPlayerController(indexPlayer) == MAP_CONTROL_COMPUTER and c.aiscript != "" )) and c != 0 then
                    set PLAYER_RACE[index] = c.name
                    call c.createStartingUnits(indexPlayer)
                elseif playerRace == RACE_HUMAN then
                    call MeleeStartingUnitsHuman(indexPlayer,GetStartLocationLoc(GetPlayerStartLocation(indexPlayer)),true,true,true)
                elseif playerRace == RACE_ORC then
                    call MeleeStartingUnitsOrc(indexPlayer,GetStartLocationLoc(GetPlayerStartLocation(indexPlayer)),true,true,true)
                elseif playerRace == RACE_NIGHTELF then
                    call MeleeStartingUnitsNightElf(indexPlayer,GetStartLocationLoc(GetPlayerStartLocation(indexPlayer)),true,true,true)
                elseif playerRace == RACE_UNDEAD then
                    call MeleeStartingUnitsUndead(indexPlayer,GetStartLocationLoc(GetPlayerStartLocation(indexPlayer)),true,true,true)
                else
                    call MeleeStartingUnitsUnknownRace(indexPlayer,GetStartLocationLoc(GetPlayerStartLocation(indexPlayer)),true,true,true)
                endif
            endif
            set index = index + 1
            exitwhen index == bj_MAX_PLAYERS
        endloop
    endfunction
    
//===========================================================================
//                         CUSTOM MELEE AI SECTION
//===========================================================================
    private function CustomMeleeStartingAI takes nothing returns nothing
        local integer index = 0
        local player  indexPlayer
        local race    indexRace
        local CustomRace c
        loop
            set indexPlayer = Player(index)
            if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
                set indexRace = GetPlayerRace(indexPlayer)
                set c = CustomRace.get(indexRace,GetPlayerHandicap(indexPlayer)+0.01)
                call SetPlayerHandicap(indexPlayer,1.0)
                if (GetPlayerController(indexPlayer) == MAP_CONTROL_COMPUTER) then
                    // Run a race-specific melee AI script.
                    if c != 0 and c.aiscript != "" then
                        call StartMeleeAI(indexPlayer, c.aiscript)
                    elseif (indexRace == RACE_HUMAN) then
                        call PickMeleeAI(indexPlayer, "human.ai", null, null)
                    elseif (indexRace == RACE_ORC) then
                        call PickMeleeAI(indexPlayer, "orc.ai", null, null)
                    elseif (indexRace == RACE_UNDEAD) then
                        call PickMeleeAI(indexPlayer, "undead.ai", null, null)
                        call RecycleGuardPosition(bj_ghoul[index])
                    elseif (indexRace == RACE_NIGHTELF) then
                        call PickMeleeAI(indexPlayer, "elf.ai", null, null)
                    else
                        // Unrecognized race.
                    endif
                    call ShareEverythingWithTeamAI(indexPlayer)
                endif
            endif

            set index = index + 1
            exitwhen index == bj_MAX_PLAYERS
        endloop
    endfunction    

//===========================================================================
//                         VICTORY DEFEAT SECTION
//===========================================================================
    private function CustomGetAllyKeyStructureCount takes player whichPlayer returns integer
        local integer    i           = 0
        local integer    keyStructs  = 0
        local integer    playerIndex = 0
        local player     indexPlayer
        loop
            set indexPlayer = Player(playerIndex)
            if (PlayersAreCoAllied(whichPlayer, indexPlayer)) then
                set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "townhall", true, true)
                set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "greathall", true, true)
                set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "necropolis", true, true)
                set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, "treeoflife", true, true)
                loop
                    set keyStructs = keyStructs + GetPlayerTypedUnitCount(indexPlayer, KEY_STRUCTURE[i], true, true)
                    set i = i+1
                    exitwhen i == KEY_STRUCTURE_COUNT
                endloop
            endif
            set playerIndex = playerIndex + 1
            exitwhen playerIndex == bj_MAX_PLAYERS
        endloop
        return keyStructs
    endfunction

    private function CustomPlayerIsCrippled takes player whichPlayer returns boolean
        local integer allyStructures    = MeleeGetAllyStructureCount(whichPlayer)
        local integer allyKeyStructures = CustomGetAllyKeyStructureCount(whichPlayer)
        return (allyStructures > 0) and (allyKeyStructures <= 0)
    endfunction

    private function CustomCheckForCrippledPlayers takes nothing returns nothing
        local integer    playerIndex
        local player     indexPlayer
        local boolean    isNowCrippled
        call MeleeCheckForLosersAndVictors()
        if bj_finishSoonAllExposed then
            return
        endif
        set playerIndex = 0
        loop
            set indexPlayer = Player(playerIndex)
            set isNowCrippled = CustomPlayerIsCrippled(indexPlayer)
            if (not bj_playerIsCrippled[playerIndex] and isNowCrippled) then
                set bj_playerIsCrippled[playerIndex] = true
                call TimerStart(bj_crippledTimer[playerIndex], bj_MELEE_CRIPPLE_TIMEOUT, false, function MeleeCrippledPlayerTimeout)
                if (GetLocalPlayer() == indexPlayer) then
                    call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], true)
                    call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_WARNING_HUMAN"))
                endif
            elseif (bj_playerIsCrippled[playerIndex] and not isNowCrippled) then
                set bj_playerIsCrippled[playerIndex] = false
                call PauseTimer(bj_crippledTimer[playerIndex])
                if (GetLocalPlayer() == indexPlayer) then
                    call TimerDialogDisplay(bj_crippledTimerWindows[playerIndex], false)
                    if (MeleeGetAllyStructureCount(indexPlayer) > 0) then
                        if (bj_playerIsExposed[playerIndex]) then
                            call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNREVEALED"))
                        else
                            call DisplayTimedTextToPlayer(indexPlayer, 0, 0, bj_MELEE_CRIPPLE_MSG_DURATION, GetLocalizedString("CRIPPLE_UNCRIPPLED"))
                        endif
                    endif
                endif
                call MeleeExposePlayer(indexPlayer, false)
            endif
            set playerIndex = playerIndex + 1
            exitwhen playerIndex == bj_MAX_PLAYERS
        endloop
    endfunction

    private function CustomInitVictoryDefeat takes nothing returns nothing
        local trigger    checker = CreateTrigger()
        local trigger    trig
        local integer    index
        local player     indexPlayer
        set bj_finishSoonTimerDialog = CreateTimerDialog(null)
        call TriggerAddAction(checker, function CustomCheckForCrippledPlayers)
        set trig = CreateTrigger()
        call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_SOON)
        call TriggerAddAction(trig, function MeleeTriggerTournamentFinishSoon)
        set trig = CreateTrigger()
        call TriggerRegisterGameEvent(trig, EVENT_GAME_TOURNAMENT_FINISH_NOW)
        call TriggerAddAction(trig, function MeleeTriggerTournamentFinishNow)
        set index = 0
        loop
            set indexPlayer = Player(index)
            if (GetPlayerSlotState(indexPlayer) == PLAYER_SLOT_STATE_PLAYING) then
                set bj_meleeDefeated[index] = false
                set bj_meleeVictoried[index] = false
                set bj_playerIsCrippled[index] = false
                set bj_playerIsExposed[index] = false
                set bj_crippledTimer[index] = CreateTimer()
                set bj_crippledTimerWindows[index] = CreateTimerDialog(bj_crippledTimer[index])
                call TimerDialogSetTitle(bj_crippledTimerWindows[index], MeleeGetCrippledTimerMessage(indexPlayer))
                call TriggerRegisterPlayerUnitEvent(checker, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_CANCEL, null)
                call TriggerRegisterPlayerUnitEvent(checker, indexPlayer, EVENT_PLAYER_UNIT_DEATH, null)
                call TriggerRegisterPlayerUnitEvent(checker, indexPlayer, EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
                call TriggerRegisterPlayerAllianceChange(checker, indexPlayer, ALLIANCE_PASSIVE)
                call TriggerRegisterPlayerStateEvent(checker, indexPlayer, PLAYER_STATE_ALLIED_VICTORY, EQUAL, 1)
                set trig = CreateTrigger()
                call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_DEFEAT)
                call TriggerAddAction(trig, function MeleeTriggerActionPlayerDefeated)
                set trig = CreateTrigger()
                call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
                call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
             else
                set bj_meleeDefeated[index] = true
                set bj_meleeVictoried[index] = false
                if (IsPlayerObserver(indexPlayer)) then
                    set trig = CreateTrigger()
                    call TriggerRegisterPlayerEvent(trig, indexPlayer, EVENT_PLAYER_LEAVE)
                    call TriggerAddAction(trig, function MeleeTriggerActionPlayerLeft)
                endif
            endif
            set index = index + 1
            exitwhen index == bj_MAX_PLAYERS
        endloop
        call TimerStart(CreateTimer(), 2.0, false, function CustomCheckForCrippledPlayers)
    endfunction
    
    private function TimerAction takes nothing returns nothing
        call SetFloatGameState(GAME_STATE_TIME_OF_DAY, bj_MELEE_STARTING_TOD)
        call MeleeStartingHeroLimit()
        call MeleeGrantHeroItems()
        call MeleeStartingResources()
        call MeleeClearExcessUnits()
        call CreateStartingUnitsForAllPlayers()
        call CustomMeleeStartingAI()
        call CustomInitVictoryDefeat()
        call DestroyTimer(GetExpiredTimer())
    endfunction
    
    private function Init takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function TimerAction)
    endfunction
    
endlibrary
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
Tell me the difference between Jass and vJass

First of all... I think you are asking for the different between WE and JNGP.
(World Editor and Jass New Gen Pack)

JNGP 2.0 doesnt only allow you to use vJASS which by itself is already a requirement for many superior systems and optimizations, but it also allows you to write code much faster, efficient and easier and debug the code in no time... and ofcourse write normal global variables... of all different types.

What JNGP also provides is small features such as larger map bounds, no limitations on preplaced stuff, more tiles in the tileset, nice tooltip options (Grimex iirc), and many many more.
 
Level 13
Joined
Jan 2, 2016
Messages
973

I checked that, but it doesn't really explain the difference between JASS and vJASS. In some other thread (or possibly it was some guide) I saw something like "vJASS gets converted to JASS, so the game can read it" (pretty much like GUI gets converted to JASS) and "everything that can be done in vJASS can be done in JASS too, but vJASS is simpler".
Are these statements true?
 
Level 24
Joined
Aug 1, 2013
Messages
4,657
The basic point of it is that vJASS is a precompiler made for JASS.
When you write in vJASS, the code gets converted to plain JASS (or vanilla JASS) so it can be ran by the game itself.
So yes, it does get converted like GUI.

In theory, yes everything that can be done in vJASS can also be done in plain JASS...
However, creating global variables has to be done by modifying the war3map.j inside the mpq itself and next to that, it is a pain to use the things that you would do in vJASS the same how you would do it without.
Easiest example? Libraries.
I use libraries to control the order of how the triggers are placed in the map script.
You may have understood that the functions that you call have to be below the declaration of those functions right?
Well, it is a pain to use functions from another trigger if you do not control how they are placed in the final script.
Libraries are automatically placed at the top of the script, but if you require to control the order of those libraries, you can tell one to use another. library L1 uses L2

Another big feature of it is structs, which are basically OOP (Object Oriented Programming).
You will understand how it is useful when you start using it.
 
Status
Not open for further replies.
Top