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

    Let me tell you how to fix RK-s-Explosions Mod on the latest FAF game

    Scheduled Pinned Locked Moved Modding & Tools
    5 Posts 2 Posters 253 Views 2 Watching
    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.
    • Z Offline
      ZBC
      last edited by ZBC

      As we all know, RK-s-Explosions Mod is the coolest explosion effects mod for FA, but it doesn't work on the latest version of faf now. Since I can't contact with the author (I'm a Chinese player so I can't use any common social programs like x, telegram or gmail).
      Without the author's permission, I won't post the moded files, but I will tell you how to make it work on the latest 3812 version of the game by simply modifying a lua file.

      1 Reply Last reply Reply Quote 2
      • Z Offline
        ZBC
        last edited by ZBC

        First, you should get the newest mod from github(Not FAF, the newest version hasn't be uploaded) : https://github.com/RK4000/RK-s-Explosions/releases
        And then, you must rename the mod folder name from ''RK-s-Explosions-13'' to ''rks_explosions'', to make most of effects work.(Because the path of most effects in lua is still "rks_explosions", not "RK-s-Explosions-13")

        1 Reply Last reply Reply Quote 1
        • Z Offline
          ZBC
          last edited by

          Then, let's go to the FAF github repository to find a key file:
          https://github.com/FAForever/fa/blob/develop/lua/defaultexplosions.lua
          Download it and compare it to rks_explosions\hook\lua\defaultexplosions.lua;
          We can see that the contents of the function “CreateScalableUnitExplosion” have changed considerably. That is why the mod doesn't work properly.
          A simple solution is to overwrite the defaultexplosions.lua file in the mod with the same file in FAF, and then using your text editor, modify"function CreateScalableUnitExplosion "to the following form:
          function CreateScalableUnitExplosion(unit, debrisMultiplier, circularDebris)

          debrisMultiplier = debrisMultiplier or 1
          circularDebris = circularDebris or false
          
          if unit and (not IsDestroyed(unit)) then
              if IsUnit(unit) then
          
                  -- cache blueprint values
                  local blueprint = EntityGetBlueprint(unit)
                  local sx = blueprint.SizeX or 1 
                  local sy = blueprint.SizeY or 1 
                  local sz = blueprint.SizeZ or 1 
          
                  -- cache stats 
                  local army = unit.Army
                  local boundingXZRadius = 0.25 * (sx + sz)
                  local boundingXYZRadius = 0.166 * (sx + sy + sz)
                  local volume = sx * sy * sz
                  local layer = unit.Layer
          
                  -- data for emitters / shaking
                  local baseEffects = false
                  local environmentEffects = false 
                  local shakeTimeModifier = 0
                  local shakeMaxMul = 1
          
                  if layer == 'Land' then
                      -- determine land effects
                      if boundingXZRadius < 1.1 then
                          baseEffects =  NEffectTemplate.ExplosionSmallest
                      elseif boundingXZRadius > 3.75 then
                          -- large units cause camera to shake
                          baseEffects = NEffectTemplate.ExplosionSmall
                          ShakeTimeModifier = 1.0
                          ShakeMaxMul = 0.25
                      else
                          baseEffects = NEffectTemplate.ExplosionSmaller
                      end
          
                      -- environment effects (splat / decal creation)
                      local position = EntityGetPosition(unit)
                      local scorchRotation = 6.28 * Random()
                      local scorchDuration = 200 + 150 * Random()
                      local scorchLOD = 300 + 300 * Random()
                      if boundingXZRadius > 1.2 then
                          CreateDecal(
                              position, 
                              scorchRotation, 
                              UpvaluedScorchDecalTextures[Random(1, ScorchDecalTexturesN)], 
                              '', 
                              'Albedo', 
                              boundingXZRadius, 
                              boundingXZRadius, 
                              scorchLOD, 
                              scorchDuration, 
                              army
                          )
                      else
                          CreateSplat(
                              position, 
                              scorchRotation, 
                              UpvaluedScorchSplatTextures[Random(1, ScorchSplatTexturesN)], 
                              boundingXZRadius, 
                              boundingXZRadius, 
                              scorchLOD,
                              scorchDuration, 
                              army
                          )
                      end
          
                  elseif layer == 'Air' then
                      -- determine air effects
                      if boundingXZRadius < 1.1 then
                          baseEffects = ExplosionSmallAir
                      elseif boundingXZRadius > 7 then
                          -- large units cause camera to shake
                          baseEffects = ExplosionLarge
                          ShakeTimeModifier = 1.0
                          ShakeMaxMul = 0.25
                      else
                          baseEffects = ExplosionMedium
                      end
                  elseif layer == 'Water' then
                      -- determine water effects
                      if boundingXZRadius < 2 then
                          baseEffects = ExplosionSmallWater
                      elseif boundingXZRadius > 3.6 then
                          -- large units cause camera to shake
                          baseEffects = ExplosionMediumWater
                          ShakeTimeModifier = 1.0
                          ShakeMaxMul = 0.25
                      else
                          baseEffects = ExplosionMediumWater
                      end
          
                      -- environment effects
                      if boundingXZRadius < 1.0 then
                          environmentEffects = Splashy
                      end
                  end
          
                  -- create the emitters  
                  if baseEffects then 
                      CreateEffectsOpti(unit, army, baseEffects)
                  end
          
                  if environmentEffects then 
                      CreateEffectsOpti(unit, army, environmentEffects)       
                  end    
          
                  -- create the flash
                  CreateLightParticle(
                      unit, 
                      -1, 
                      army, 
                      boundingXZRadius * (2 + 1 * Random()),  -- (2, 3)
                      10.5 + 4 * Random(), -- (10.5, 14.5)
                      'glow_03', 
                      'ramp_flare_02'
                  )
          
                  -- determine debris amount
                  local amount = debrisMultiplier * MathMin(Random(1 + (boundingXYZRadius * 6), (boundingXYZRadius * 15)) , 100)
          
                  -- determine debris velocity range
                  local velocity = 2 * boundingXYZRadius
                  local hVelocity = 0.5 * velocity
          
                  -- determine heading adjustments for debris origin
                  local heading = -1 * unit:GetHeading() -- inverse heading because Supreme Commander :)
                  local mch = MathCos(heading)
                  local msh = MathSin(heading)
          
                  -- make it slightly smaller so that debris originates from mesh and not from the air
                  sx = 0.8 * sx 
                  sy = 0.8 * sy 
                  sz = 0.8 * sz
          
                  -- create debris
                  for i = 1, amount do
          
                      -- get some random numbers
                      local r1, r2, r3 = Random(), Random(), Random() 
          
                      -- position somewhere in the size of the unit
                      local xpos = r1 * sx - (sx * 0.5)
                      local ypos = 0.1 * sy + 0.5 * r2 * sy
                      local zpos = r3 * sz - (sz * 0.5)
          
                      -- launch them into space
                      local xdir, ydir, zdir 
                      if circularDebris then 
                          xdir = velocity * r1 - (hVelocity)
                          ydir = velocity * r2 - (hVelocity)
                          zdir = velocity * r3 - (hVelocity)
                      else 
                          xdir = velocity * r1 - (hVelocity)
                          ydir = boundingXYZRadius + velocity * r2
                          zdir = velocity * r3 - (hVelocity)
                      end
          
                      -- choose a random blueprint
                      local bp = ProjectileDebrisBps[MathMin(ProjectileDebrisBpsN, Random(1, i))]
          
                      EntityCreateProjectile(
                          unit, 
                          bp, 
                          xpos * mch - zpos * msh, -- adjust for orientation of unit
                          ypos, 
                          xpos * msh + zpos * mch, -- adjust for orientation of unit
                          xdir * mch - zdir * msh, -- adjust for orientation of unit 
                          ydir, 
                          xdir * msh + zdir * mch  -- adjust for orientation of unit
                      )
                  end
          
                  -- do camera shake
                  EntityShakeCamera(unit, 30 * boundingXZRadius, boundingXZRadius * shakeMaxMul, 0, 0.5 + shakeTimeModifier)
              end
          end
          

          end

          1 Reply Last reply Reply Quote 1
          • Z Offline
            ZBC
            last edited by

            And, you need to add the following definition to the beginning of the moded defaultexplosions.lua file:
            "local SDEffectTemplate = import('/mods/rks_explosions/lua/SDEffectTemplates.lua')
            local NEffectTemplate = import('/mods/rks_explosions/lua/NEffectTemplates.lua')"
            Then you'll see that the mod will almost work (but there are still some units with incorrect fire effects, such as the Experimental Bomber, which will require some more detailed modifications, which I'm still working on)

            1 Reply Last reply Reply Quote 1
            • BlackrobeB Offline
              Blackrobe
              last edited by

              Nice!

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