FAForever Forums
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Login

    Need some help on modding functions

    Scheduled Pinned Locked Moved I need help
    35 Posts 6 Posters 1.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • speed2S Offline
      speed2
      last edited by

      Here's a list of categories https://wiki.faforever.com/index.php?title=Mission_Scripting#Categories

      S 1 Reply Last reply Reply Quote 0
      • UvesoU Offline
        Uveso
        last edited by

        hello SupCom_16-12-20 ,

        i guess you already figured out how to use table in tables ?
        If not, let me know.

        You will maybe find custom LUA commands inside the game.

        Here is a list of all commands you can use in SIM-STATE of the game:
        https://github.com/FAForever/fa/blob/deploy/fafdevelop/engine/Sim.lua

        And here a List of all commands you can use in the UI-STATE of the game:
        https://github.com/FAForever/fa/blob/deploy/fafdevelop/engine/User.lua

        You can't use SIM-STATE commands in UI-STATE of the game and vise versa.
        SIM-STATE commands are for the gamesimulation like moving units etc.
        UI-STATE commands are for the user Interface

        S 1 Reply Last reply Reply Quote 0
        • S Offline
          SupCom_16-12-20 @speed2
          last edited by

          @speed2 said in Need some help on modding functions:

          Here's a list of categories https://wiki.faforever.com/index.php?title=Mission_Scripting#Categories

          Thanks. I will use this if I am doing a mission scripting. Now I am trying to work on skirmish game play.

          Actually I am looking for these 2 things.
          (1) category list for unit that is moving around (mobile type) and an attacking unit.

          (2) Blueprint for Tech 3 Transport unit.

          Thanks.

          speed2S 1 Reply Last reply Reply Quote 0
          • S Offline
            SupCom_16-12-20 @Uveso
            last edited by SupCom_16-12-20

            @Uveso

            To your question - Table in tables. After spending some time reading "Cobrand" code ... I think I roughly know how tables work. I know saying it, is easier than doing it ie. to actually write codes out that actually works without a bug.
            I think I will know that when I reach that point.

            But right now actually I am stuck in this code here.

            local NameTable = import("/mods/Veterename/tables.lua").GetTable()
            local allUnits = {} ;
            local username = nil ;
            
            function UpdateAllUnits()
                -- Add unit being built by others
                for _, unit in allUnits do
            	if not unit:IsDead() and unit:GetFocus() and not unit:GetFocus():IsDead() then
            		allUnits[unit:GetFocus():GetEntityId()] = unit:GetFocus()
            		end
            	end
            	
            	-- Remove dead
            	for entityid, unit in allUnits do
            		if unit:IsDead() then
            			allUnits[entityid] = nil
            		end
            	end
            end
              
            function RenameVet()
                    for index, unit in allUnits do
                        local Ukills = unit:GetStat('KILLS', 0).Value
                        if Ukills >= unit:GetBlueprint().Veteran.Level1 and Ukills != 0 and unit:GetCustomName(unit) == nil then
                            local unitname = unit:GetBlueprint().General.UnitName
                            local newName ;
                            -- commander upgraded name
                            if unit:IsInCategory('COMMAND') == true then
                                if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                    newName = "[~[Top Rank: Chief Commander]~]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                    newName = "[=[2nd Rank: General]=]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                    newName = "<+>3rd Rank: Colonel<+>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                    newName = "<<4th Rank: Major>>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                    newName = "<5th Rank: First Lieutenant>"
                                else
                                    newName = username
                                end
                            end
                            else
                            -- ONLY Tech 3 Transport Air units upgraded name
                            if unit:IsInCategory('TRANSPORT') and unit:IsInCategory('TECH3') then
                                if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                    newName = "[~[Top Rank: Whitehorse]~]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                    newName = "[=[2nd Rank: Hawk]=]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                    newName = "<+>3rd Rank: Pegasus<+>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                    newName = "<<4th Rank: Wolfhound>>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                    newName = "<5th Rank: Puma>"
                                -- else
                                    -- newName = username
                                end
                            else
                            -- others mobile units that moves around such as land, air and naval units upgraded name
                            if unit:IsInCategory('DIRECTFIRE') and ( unit:IsInCategory('NAVAL') or unit:IsInCategory('LAND') or unit:IsInCategory('AIR') ) then
                                if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                    newName = "[~[Top Rank: Chief General]~]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                    newName = "[=[2nd Rank: General]=]"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                    newName = "<+>3rd Rank: Captain<+>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                    newName = "<<4th Rank: Lieutenant>>"
                                elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                    newName = "<5th Rank: Sergeant>"
                                end
                           end
                       end
                            --	
                            if newName != nil then
                                unit:SetCustomName(newName)
                            else
                                unit:SetCustomName("test")
                            end
                        end
                    end
                end
            
            -- ForkThread
            function Repeat()
                -- this piece of code will actually select units at the beginning of the game
                -- every other unit is eventually created by other units at some point, hence we are adding them via that way
                local selection = GetSelectedUnits()
                UISelectionByCategory("ALLUNITS", false, false, false, false)
                for _, unit in (GetSelectedUnits() or {}) do
                    username = unit:GetCustomName(unit);
            		allUnits[unit:GetEntityId()] = unit
            	end
                SelectUnits(selection); -- select back what was previously selected
                --     
            	while true do -- while there are units alive out there
            		WaitSeconds(1)
                    UpdateAllUnits()
            		RenameVet()
            	end 
            end
            -- Init
            
            function VetInit() -- 
            	if SessionIsReplay() == true then
            		LOG("Veterename: Disabled ; Watching replay")
            	else
            		LOG("Veterename: Enabled")
            		local newSelectionsMap = {
                        ['shift-Backspace']        = {action =  'UI_Lua import("/mods/Veterename/autorename.lua").RenameVet()'},
            		} -- shortcut
            		IN_AddKeyMapTable(newSelectionsMap)
            		ForkThread(Repeat)
            	end
            end
            

            The complete code above. Last night I ran the code using this and game still runs okay but I still cannot find out if this thing works or not as I cannot get a unit to stay on battle field long enough to see it's effect.

            The last 2 blocks of code, I know for sure it won't work because I have no info as how to trap a unit that is a mobile type ie. moving type of unit and also an attacking type. And also how to trap a Transport Tech 3 unit.

                            -- others mobile units that moves around such as land, air and naval units upgraded name
                            if unit:IsInCategory('DIRECTFIRE') and ( unit:IsInCategory('NAVAL') or unit:IsInCategory('LAND') or unit:IsInCategory('AIR') ) then
                                if Ukills >= unit:GetBlueprint().Veteran.Level5 then
            

            I don't know how to check if a unit is a mobile type and an attacking type of unit.

                            -- ONLY Tech 3 Transport Air units upgraded name
                            if unit:IsInCategory('TRANSPORT') and unit:IsInCategory('TECH3') then
                                if Ukills >= unit:GetBlueprint().Veteran.Level5 then
            

            And also don't know how to check if a unit is a Tech 3 Transport unit.

            Thanks.

            1 Reply Last reply Reply Quote 0
            • S Offline
              SupCom_16-12-20
              last edited by

              This post is deleted!
              1 Reply Last reply Reply Quote 0
              • UvesoU Offline
                Uveso
                last edited by Uveso

                Use LOG commands to print debug text to the game.log.
                Like:

                if unit:IsInCategory('TRANSPORT') and unit:IsInCategory('TECH3') then
                	LOG('Found Unit with category TRANSPORT*TECH3')
                        if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                

                To Check For mobil units, you can use
                unit:IsInCategory('MOBILE')

                units have layer category, so you can ask for land air or naval units:
                unit:IsInCategory('LAND')
                unit:IsInCategory('AIR')
                unit:IsInCategory('NAVAL')

                random Examples:

                MOBILE * LAND * INDIRECTFIRE * DIRECTFIRE for land units that can attack other land units
                MOBILE * LAND * ANTIAIR for mobile Anti Air
                MOBILE * AIR * HIGHALTAIR for ASF
                MOBILE * AIR * TRANSPORTFOCUS for Air Transporter
                (if unit:IsInCategory('MOBILE') and unit:IsInCategory('AIR') and unit:IsInCategory('TRANSPORTFOCUS') then)

                S 2 Replies Last reply Reply Quote 0
                • S Offline
                  SupCom_16-12-20 @Uveso
                  last edited by

                  @Uveso said in Need some help on modding functions:

                  Use LOG commands to print debug text to the game.log.
                  Like:

                  if unit:IsInCategory('TRANSPORT') and unit:IsInCategory('TECH3') then
                  	LOG('Found Unit with category TRANSPORT*TECH3')
                          if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                  

                  Is there any way we could use LOG to extract the blueprint of a specific unit ?

                  1 Reply Last reply Reply Quote 0
                  • S Offline
                    SupCom_16-12-20 @Uveso
                    last edited by

                    @Uveso said in Need some help on modding functions:

                    To Check For mobil units, you can use
                    unit:IsInCategory('MOBILE')

                    units have layer category, so you can ask for land air or naval units:
                    unit:IsInCategory('LAND')
                    unit:IsInCategory('AIR')
                    unit:IsInCategory('NAVAL')

                    random Examples:

                    MOBILE * LAND * INDIRECTFIRE * DIRECTFIRE for land units that can attack other land units
                    MOBILE * LAND * ANTIAIR for mobile Anti Air
                    MOBILE * AIR * HIGHALTAIR for ASF
                    MOBILE * AIR * TRANSPORTFOCUS for Air Transporter
                    (if unit:IsInCategory('MOBILE') and unit:IsInCategory('AIR') and unit:IsInCategory('TRANSPORTFOCUS') then)

                    This might help me complete the coding. I will get back to you. Thanks a lot for these.

                    1 Reply Last reply Reply Quote 0
                    • UvesoU Offline
                      Uveso
                      last edited by

                      LOG( repr(BluePrint) )
                      

                      repr() will print tables.

                      Don't use this on units or other user/c-objects.

                      S 1 Reply Last reply Reply Quote 0
                      • speed2S Offline
                        speed2 @SupCom_16-12-20
                        last edited by

                        @SupCom_16-12-20 said in Need some help on modding functions:

                        @speed2 said in Need some help on modding functions:

                        Here's a list of categories https://wiki.faforever.com/index.php?title=Mission_Scripting#Categories

                        Thanks. I will use this if I am doing a mission scripting. Now I am trying to work on skirmish game play.

                        Actually I am looking for these 2 things.
                        (1) category list for unit that is moving around (mobile type) and an attacking unit.

                        (2) Blueprint for Tech 3 Transport unit.

                        Thanks.

                        Just bcause its in a mission scripting guide doesnt mean its not valid for the rest of the game.

                        S 1 Reply Last reply Reply Quote 0
                        • S Offline
                          SupCom_16-12-20 @speed2
                          last edited by

                          @speed2 said in Need some help on modding functions:

                          @SupCom_16-12-20 said in Need some help on modding functions:

                          @speed2 said in Need some help on modding functions:

                          Here's a list of categories https://wiki.faforever.com/index.php?title=Mission_Scripting#Categories

                          Thanks. I will use this if I am doing a mission scripting. Now I am trying to work on skirmish game play.

                          Actually I am looking for these 2 things.
                          (1) category list for unit that is moving around (mobile type) and an attacking unit.

                          (2) Blueprint for Tech 3 Transport unit.

                          Thanks.

                          Just bcause its in a mission scripting guide doesnt mean its not valid for the rest of the game.

                          Ok, I keep that in mind.

                          1 Reply Last reply Reply Quote 0
                          • S Offline
                            SupCom_16-12-20
                            last edited by SupCom_16-12-20

                            unit:GetBlueprint().Veteran.Level1
                            

                            Am I right to say Veteran.Level1 means, it is 1 star as shown below ?

                            17a572a9-c7aa-48c3-aba4-d0fc85f82c55-image.png

                            and

                            unit:GetBlueprint().Veteran.Level2
                            

                            means 2 stars ?

                            S 1 Reply Last reply Reply Quote 0
                            • S Offline
                              SupCom_16-12-20 @Uveso
                              last edited by

                              @Uveso said in Need some help on modding functions:

                              LOG( repr(BluePrint) )
                              

                              repr() will print tables.

                              Don't use this on units or other user/c-objects.

                              Ok thanks

                              1 Reply Last reply Reply Quote 0
                              • UvesoU Offline
                                Uveso
                                last edited by

                                unit:GetBlueprint().Veteran.Level2

                                unit:GetBlueprint() will get the blueprint from a unit.

                                local TableFromBlueprint = unit:GetBlueprint()
                                LOG(TableFromBlueprint)  -- this will print the whole blueprint into the game.log
                                

                                You can do it directly without storing it in TableFromBlueprint :

                                LOG(unit:GetBlueprint())  -- this will print the whole blueprint into the game.log
                                

                                unit:GetBlueprint().Veteran

                                local TableFromBlueprint = unit:GetBlueprint()
                                LOG(TableFromBlueprint.Veteran)  -- this will only print the Veteran table from the blueprint
                                

                                same as before:

                                LOG(unit:GetBlueprint().Veteran)  -- this will only print the Veteran table from the blueprint
                                

                                output:

                                    Veteran = {
                                        Level1 = 6,
                                        Level2 = 12,
                                        Level3 = 18,
                                        Level4 = 24,
                                        Level5 = 30,
                                    },
                                

                                unit:GetBlueprint().Veteran.Level2

                                local TableFromBlueprint = unit:GetBlueprint()
                                LOG(TableFromBlueprint.Veteran.Level2)  -- this will print the value stored in Veteran/Level2
                                

                                same as before:

                                LOG(unit:GetBlueprint().Veteran.Level2)  -- this will print the value stored in Veteran/Level2
                                

                                output:

                                12
                                
                                1 Reply Last reply Reply Quote 0
                                • S Offline
                                  SupCom_16-12-20 @SupCom_16-12-20
                                  last edited by SupCom_16-12-20

                                  @SupCom_16-12-20 said in Need some help on modding functions:

                                  unit:GetBlueprint().Veteran.Level1
                                  

                                  Am I right to say Veteran.Level1 means, it is 1 star as shown below ?

                                  17a572a9-c7aa-48c3-aba4-d0fc85f82c55-image.png

                                  and

                                  unit:GetBlueprint().Veteran.Level2
                                  

                                  means 2 stars ?

                                  if it is, then something is wrong with my modified codes. I don't know where the bug is. The Star increased from 1 to 3 stars but the Ranking don't increase ?

                                  The code for Tech 3 Air Transport unit

                                   -- ONLY Tech 3 Transport Air units upgraded name
                                             if unit:IsInCategory('TRANSPORTFOCUS') and unit:IsInCategory('AIR') and unit:IsInCategory('TECH3') then
                                                 if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                                     newName = "[~[Top Rank: Whitehorse]~]"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                                     newName = "[=[2nd Rank: Hawk]=]"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                                     newName = "<+>3rd Rank: Pegasus<+>"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                                     newName = "<<4th Rank: Wolfhound>>"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                                     newName = "<5th Rank: Puma>"
                                                 end
                                             end
                                  

                                  e4a51295-b6a0-4596-b873-8cd77612e2f5-image.png

                                  Below is the complete codes.

                                  local NameTable = import("/mods/Veterename/tables.lua").GetTable()
                                  local allUnits = {} ;
                                  local username = nil ;
                                  
                                  function UpdateAllUnits()
                                      -- Add unit being built by others
                                      for _, unit in allUnits do
                                         if not unit:IsDead() and unit:GetFocus() and not unit:GetFocus():IsDead() then
                                            allUnits[unit:GetFocus():GetEntityId()] = unit:GetFocus()
                                         end
                                       end
                                  	
                                     -- Remove dead
                                      for entityid, unit in allUnits do
                                         if unit:IsDead() then
                                            allUnits[entityid] = nil
                                        end
                                     end
                                  end
                                    
                                  function RenameVet()
                                          for index, unit in allUnits do
                                              local Ukills = unit:GetStat('KILLS', 0).Value
                                              if Ukills >= unit:GetBlueprint().Veteran.Level1 and Ukills != 0 and unit:GetCustomName(unit) == nil then
                                                  local unitname = unit:GetBlueprint().General.UnitName
                                                  local newName ;
                                                  -- commander upgraded name
                                                  if unit:IsInCategory('COMMAND') == true then
                                                      if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                                          newName = "[~[Top Rank: Chief Commander]~]"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                                          newName = "[=[2nd Rank: General]=]"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                                          newName = "<+>3rd Rank: Colonel<+>"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                                          newName = "<<4th Rank: Major>>"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                                          newName = "<5th Rank: First Lieutenant>"
                                                      else
                                                          newName = username
                                                      end
                                                  else
                                                  -- others mobile units that moves around such as land, air and naval units upgraded name
                                                  if ( unit:IsInCategory('NAVAL') or unit:IsInCategory('LAND') or unit:IsInCategory('AIR') ) and ( unit:IsInCategory('TECH2') or unit:IsInCategory('TECH3') 	                                     or unit:IsInCategory('EXPERIMENTAL') )  then
                                                    if unit:IsInCategory('DIRECTFIRE') or unit:IsInCategory('INDIRECTFIRE') then                                  
                                                      if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                                          newName = "[~[Top Rank: Commander]~]"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                                          newName = "[=[2nd Rank: Genaral]=]"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                                          newName = "<<3rd Rank: Colonel>>"
                                                      elseif Ukills >= unit:GetBlueprint().Veteran.Level2 or Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                                          newName = "3 stars for promotion"
                                                      end
                                                  end
                                               end
                                             end
                                             -- ONLY Tech 3 Transport Air units upgraded name
                                             if unit:IsInCategory('TRANSPORTFOCUS') and unit:IsInCategory('AIR') and unit:IsInCategory('TECH3') then
                                                 if Ukills >= unit:GetBlueprint().Veteran.Level5 then
                                                     newName = "[~[Top Rank: Whitehorse]~]"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level4 then
                                                     newName = "[=[2nd Rank: Hawk]=]"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level3 then
                                                     newName = "<+>3rd Rank: Pegasus<+>"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level2 then
                                                     newName = "<<4th Rank: Wolfhound>>"
                                                 elseif Ukills >= unit:GetBlueprint().Veteran.Level1 then
                                                     newName = "<5th Rank: Puma>"
                                                 end
                                             end
                                             --	
                                             if newName != nil then
                                                  unit:SetCustomName(newName)
                                             else
                                                  unit:SetCustomName("test")
                                             end
                                         end
                                     end
                                  end
                                  
                                  -- ForkThread
                                  function Repeat()
                                      -- this piece of code will actually select units at the beginning of the game
                                      -- every other unit is eventually created by other units at some point, hence we are adding them via that way
                                      local selection = GetSelectedUnits()
                                      UISelectionByCategory("ALLUNITS", false, false, false, false)
                                      for _, unit in (GetSelectedUnits() or {}) do
                                          username = unit:GetCustomName(unit);
                                  	allUnits[unit:GetEntityId()] = unit
                                  	end
                                      SelectUnits(selection); -- select back what was previously selected
                                      --     
                                       while true do -- while there are units alive out there
                                          WaitSeconds(1)
                                          UpdateAllUnits()
                                          RenameVet()
                                      end 
                                  end
                                  -- Init
                                  
                                  function VetInit() -- 
                                  	if SessionIsReplay() == true then
                                  	    LOG("Veterename: Disabled ; Watching replay")
                                  	else
                                  	    LOG("Veterename: Enabled")
                                  	    local newSelectionsMap = {
                                                           ['shift-Backspace']        = {action =  'UI_Lua import("/mods/Veterename/autorename.lua").RenameVet()'},
                                  	     } -- shortcut
                                  	    IN_AddKeyMapTable(newSelectionsMap)
                                  	    ForkThread(Repeat)
                                  	end
                                  end
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • speed2S Offline
                                    speed2
                                    last edited by

                                    Veterancy isnt based on the number of kills but on a killed mass.

                                    Dragun101D 1 Reply Last reply Reply Quote 0
                                    • speed2S Offline
                                      speed2
                                      last edited by

                                      Just check the code that adds the starts or the veterancy progress bar and you'll understand how it works. You can even hook that to rename your units so you dont have to do the same check again in your code.

                                      S 1 Reply Last reply Reply Quote 0
                                      • S Offline
                                        SupCom_16-12-20 @speed2
                                        last edited by SupCom_16-12-20

                                        @speed2 said in Need some help on modding functions:

                                        Just check the code that adds the starts or the veterancy progress bar and you'll understand how it works. You can even hook that to rename your units so you dont have to do the same check again in your code.

                                        I am hungry and just want to buy a loaf of bread, that is all. But in a foreign country it is that hard to do when people speak in language (Lua programming) I don't understand. I did try to clear this hurdle myself by checking the codes and testing the gameplay well into the night but without any good result.

                                        I just need to know how to determine how many stars I have earned (stars shown in image below)

                                        fa8a8d65-1b01-4f5d-b5d8-d54c787e3534-image.png

                                        1 Reply Last reply Reply Quote 0
                                        • speed2S Offline
                                          speed2
                                          last edited by

                                          https://github.com/FAForever/fa/blob/deploy/fafdevelop/lua/ui/game/unitview.lua#L176-L191
                                          and then lines 404-411

                                          1 Reply Last reply Reply Quote 0
                                          • S Offline
                                            SupCom_16-12-20
                                            last edited by

                                            Thank you guys for helping guess I will have to give this up, not getting any result.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post