Forged Alliance Forever Forged Alliance Forever Forums 2018-01-24T23:49:04+02:00 /feed.php?f=41&t=13616 2018-01-24T23:49:04+02:00 2018-01-24T23:49:04+02:00 /viewtopic.php?t=13616&p=159837#p159837 <![CDATA[Re: Nuke "Fire Beetle"]]> /viewtopic.php?f=53&t=15788

Could you be so kind to link or paste the code in which you got the beetles to go nuclear?

Statistics: Posted by EntropyWins — 24 Jan 2018, 23:49


]]>
2016-12-07T21:42:06+02:00 2016-12-07T21:42:06+02:00 /viewtopic.php?t=13616&p=140108#p140108 <![CDATA[Re: Nuke "Fire Beetle"]]> Statistics: Posted by Dudekahedron — 07 Dec 2016, 21:42


]]>
2016-12-06T23:20:01+02:00 2016-12-06T23:20:01+02:00 /viewtopic.php?t=13616&p=140076#p140076 <![CDATA[Re: Nuke "Fire Beetle"]]>
Code:
    OnFire = function(self)
    self:Fire()
    KamikazeWeapon.OnFire()
    end,


i meant something like this.

atm it wont fire ofc since nothing is calling it xD
Onfire is a callback that is called.... on fire xD
Fire is just a function that is SOMETIMES called if a script asks for it. only place i know of that happening is the death thread, which has to do it like this since weapons are cleared by that point.

you should also rename the Fire function to something else, or just put the function inside Onfire instead.

Statistics: Posted by Exotic_Retard — 06 Dec 2016, 23:20


]]>
2016-12-06T22:25:49+02:00 2016-12-06T22:25:49+02:00 /viewtopic.php?t=13616&p=140075#p140075 <![CDATA[Re: Nuke "Fire Beetle"]]>
Code:
local DeathNukeWeapon = import('/lua/sim/defaultweapons.lua').DeathNukeWeapon


@Exotic; So spoilers for my mod thread lol
Do you mean like this? This is in my hooked terranweapons.lua file;
Code:
local KamikazeWeapon = WeaponFile.KamikazeWeapon
DeployableNuke = Class(KamikazeWeapon){
    OnFire = function(self)
    end,

    Fire = function(self)
        local bp = self:GetBlueprint()
        local proj = self.unit:CreateProjectile(bp.ProjectileId, 0, 0, 0, nil, nil, nil):SetCollision(false)
        proj:ForkThread(proj.EffectThread)
       
        -- Play the explosion sound
        local projBp = proj:GetBlueprint()
        if projBp.Audio.NukeExplosion then
            self:PlaySound(projBp.Audio.NukeExplosion)
        end
       
        proj.InnerRing = NukeDamage()
        proj.InnerRing:OnCreate(bp.NukeInnerRingDamage, bp.NukeInnerRingRadius, bp.NukeInnerRingTicks, bp.NukeInnerRingTotalTime)
        proj.OuterRing = NukeDamage()
        proj.OuterRing:OnCreate(bp.NukeOuterRingDamage, bp.NukeOuterRingRadius, bp.NukeOuterRingTicks, bp.NukeOuterRingTotalTime)

        local launcher = self.unit
        local pos = proj:GetPosition()
        local army = launcher:GetArmy()
        local brain = launcher:GetAIBrain()
        local damageType = bp.DamageType
        proj.InnerRing:DoNukeDamage(launcher, pos, brain, army, damageType)
        proj.OuterRing:DoNukeDamage(launcher, pos, brain, army, damageType)
       
        -- Stop it calling DoDamage any time in the future.
        proj.DoDamage = function(self, instigator, DamageData, targetEntity) end
    end,
}


(Accidentally hit submit): The detonation command doesn't do anything but no errors are produced, except when i Control-K and I get:
WARNING: Error running lua script: ...ata\faforever\gamedata\lua.nx2\lua\terranweapons.lua(274): attempt to call method `GetBlueprint' (a nil value)

Statistics: Posted by Dudekahedron — 06 Dec 2016, 22:25


]]>
2016-12-06T22:04:17+02:00 2016-12-06T22:04:17+02:00 /viewtopic.php?t=13616&p=140073#p140073 <![CDATA[Re: Nuke "Fire Beetle"]]> or you copy it from the deathnuke and also put it into onfire

then you just get the beetle to fire its weapon. which should be default.
what we are doing here is simply transferring the code from the projectile to the units weapon, so here it will go off as soon as its fired and not when it hits sth

probably easier to copy from the deathnuke since its more related to the unit and would need to be tweaked less.

Statistics: Posted by Exotic_Retard — 06 Dec 2016, 22:04


]]>
2016-12-06T22:01:25+02:00 2016-12-06T22:01:25+02:00 /viewtopic.php?t=13616&p=140071#p140071 <![CDATA[Re: Nuke "Fire Beetle"]]>
local CIFCommanderDeathWeapon = CWeapons.CIFCommanderDeathWeapon

Statistics: Posted by Tokyto — 06 Dec 2016, 22:01


]]>
2016-12-06T21:53:19+02:00 2016-12-06T21:53:19+02:00 /viewtopic.php?t=13616&p=140069#p140069 <![CDATA[Re: Nuke "Fire Beetle"]]>
@Exotic; the code I pasted is from defaultweapons.lua
If I follow say UEB2305 (uef sml):
UEB2305_unit.bp
Code:
            ProjectileId = '/projectiles/TIFMissileNuke01/TIFMissileNuke01_proj.bp',

TIFMissileNuke01_script.lua
Code:
#
# Terran Nuke Missile
#
local TIFMissileNuke = import('/lua/terranprojectiles.lua').TIFMissileNuke

TIFMissileNuke01 = Class(TIFMissileNuke) {

    InitialEffects = {'/effects/emitters/nuke_munition_launch_trail_02_emit.bp',},
    LaunchEffects = {
        '/effects/emitters/nuke_munition_launch_trail_03_emit.bp',
        '/effects/emitters/nuke_munition_launch_trail_05_emit.bp',
        '/effects/emitters/nuke_munition_launch_trail_07_emit.bp',
    },
    ThrustEffects = {'/effects/emitters/nuke_munition_launch_trail_04_emit.bp',
                     '/effects/emitters/nuke_munition_launch_trail_06_emit.bp',
    },
   
    OnImpact = function(self, TargetType, TargetEntity)
        if not TargetEntity or not EntityCategoryContains(categories.PROJECTILE, TargetEntity) then
            # Play the explosion sound
            local myBlueprint = self:GetBlueprint()
            if myBlueprint.Audio.Explosion then
                self:PlaySound(myBlueprint.Audio.Explosion)
            end
           
         nukeProjectile = self:CreateProjectile('/effects/Entities/UEFNukeEffectController01/UEFNukeEffectController01_proj.bp', 0, 0, 0, nil, nil, nil):SetCollision(false)
            nukeProjectile:PassDamageData(self.DamageData)
            nukeProjectile:PassData(self.Data)
        end
        TIFMissileNuke.OnImpact(self, TargetType, TargetEntity)
    end,

    DoTakeDamage = function(self, instigator, amount, vector, damageType)
        if self.ProjectileDamaged then
            for k,v in self.ProjectileDamaged do
                v(self)
            end
        end
        TIFMissileNuke.DoTakeDamage(self, instigator, amount, vector, damageType)
    end,

    OnCreate = function(self)
        TIFMissileNuke.OnCreate(self)
        local launcher = self:GetLauncher()
        if launcher and not launcher:IsDead() and launcher.EventCallbacks.ProjectileDamaged then
            self.ProjectileDamaged = {}
            for k,v in launcher.EventCallbacks.ProjectileDamaged do
                table.insert( self.ProjectileDamaged, v )
            end
        end
        self:SetCollisionShape('Sphere', 0, 0, 0, 2.0)
        self:ForkThread( self.MovementThread )
    end,

    CreateEffects = function( self, EffectTable, army, scale)
        for k, v in EffectTable do
            self.Trash:Add(CreateAttachedEmitter(self, -1, army, v):ScaleEmitter(scale))
        end
    end,

    MovementThread = function(self)
        local army = self:GetArmy()
        local launcher = self:GetLauncher()
        self.CreateEffects( self, self.InitialEffects, army, 1 )
        self:TrackTarget(false)
        WaitSeconds(2.5)      # Height
        self:SetCollision(true)
        self.CreateEffects( self, self.LaunchEffects, army, 1 )
        WaitSeconds(2.5)
        self.CreateEffects( self, self.ThrustEffects, army, 3 )
        WaitSeconds(2.5)
        self:TrackTarget(true) # Turn ~90 degrees towards target
        self:SetDestroyOnWater(true)
        self:SetTurnRate(47.36)
        WaitSeconds(2)                # Now set turn rate to zero so nuke flies straight
        self:SetTurnRate(0)
        self:SetAcceleration(0.001)
        self.WaitTime = 0.5
        while not self:BeenDestroyed() do
            self:SetTurnRateByDist()
            WaitSeconds(self.WaitTime)
        end
    end,

    SetTurnRateByDist = function(self)
        local dist = self:GetDistanceToTarget()
        #Get the nuke as close to 90 deg as possible
        if dist > 150 then       
            #Freeze the turn rate as to prevent steep angles at long distance targets
            self:SetTurnRate(0)
        elseif dist > 75 and dist <= 150 then
                  # Increase check intervals
            self.WaitTime = 0.3
        elseif dist > 32 and dist <= 75 then
                  # Further increase check intervals
            self.WaitTime = 0.1
        elseif dist < 32 then
                  # Turn the missile down
            self:SetTurnRate(50)
        end
    end,
   
    CheckMinimumSpeed = function(self, minSpeed)
        if self:GetCurrentSpeed() < minSpeed then
            return false
        end
        return true
    end,
   
    SetMinimumSpeed = function(self, minSpeed, resetAcceleration)
        if self:GetCurrentSpeed() < minSpeed then
            self:SetVelocity(minSpeed)
            if resetAcceleration then
                self:SetAcceleration(0)
            end
        end
    end,

    GetDistanceToTarget = function(self)
        local tpos = self:GetCurrentTargetPosition()
        local mpos = self:GetPosition()
        local dist = VDist2(mpos[1], mpos[3], tpos[1], tpos[3])
        return dist
    end,
}

TypeClass = TIFMissileNuke01

From that, I believe the lines that are useful are in the OnImpact function, but I have no idea how to transfer it into a kamikaze weapon, or just any sort of onfire command.

Statistics: Posted by Dudekahedron — 06 Dec 2016, 21:53


]]>
2016-12-06T21:12:47+02:00 2016-12-06T21:12:47+02:00 /viewtopic.php?t=13616&p=140067#p140067 <![CDATA[Re: Nuke "Fire Beetle"]]>
in the death thread the script in unit.lua checks for any weapons with the DeathNuke label and fires then by calling weapon:Fire() which is what you are seeing defined here.

or something like that anyway.

is this from the acu script or something?

why dont you look at the nuke weapon and its projectile script instead?
but yes nukes do work differently, they just end up calling that fire function one way or another since they have complex stuff going on especially with the effects and damage rings.
it could be placed in the OnImpact callback of a projectile for example, but you could call it on beetle death or OnFired, then set up the weapon to be a dummy and deal damage with just the script.

Statistics: Posted by Exotic_Retard — 06 Dec 2016, 21:12


]]>
2016-12-06T20:58:47+02:00 2016-12-06T20:58:47+02:00 /viewtopic.php?t=13616&p=140066#p140066 <![CDATA[Re: Nuke "Fire Beetle"]]>
Maybe you can check it out, might or might not help.

Statistics: Posted by Tokyto — 06 Dec 2016, 20:58


]]>
2016-12-06T19:50:25+02:00 2016-12-06T19:50:25+02:00 /viewtopic.php?t=13616&p=140064#p140064 <![CDATA[Nuke "Fire Beetle"]]> I've been trying to understand how nuke weapons work with considerable difficulty.

The kamikaze weapon seems easy enough to understand, in cybranweapons.lua it sets up the effects, in defaultweapons.lua it does the damage... But nukes don't appear to work the same way?

Why is the code under a Fire function, and not an OnFire? How would I sub in these details into the Fire Beetle?
Sorry that my question isn't very pointed, I really have no idea how to get this going!
Code:
local NukeDamage = import('/lua/sim/NukeDamage.lua').NukeAOE
DeathNukeWeapon = Class(BareBonesWeapon) {
    OnFire = function(self)
    end,

    Fire = function(self)
        local bp = self:GetBlueprint()
        local proj = self.unit:CreateProjectile(bp.ProjectileId, 0, 0, 0, nil, nil, nil):SetCollision(false)
        proj:ForkThread(proj.EffectThread)
       
        -- Play the explosion sound
        local projBp = proj:GetBlueprint()
        if projBp.Audio.NukeExplosion then
            self:PlaySound(projBp.Audio.NukeExplosion)
        end
       
        proj.InnerRing = NukeDamage()
        proj.InnerRing:OnCreate(bp.NukeInnerRingDamage, bp.NukeInnerRingRadius, bp.NukeInnerRingTicks, bp.NukeInnerRingTotalTime)
        proj.OuterRing = NukeDamage()
        proj.OuterRing:OnCreate(bp.NukeOuterRingDamage, bp.NukeOuterRingRadius, bp.NukeOuterRingTicks, bp.NukeOuterRingTotalTime)

        local launcher = self.unit
        local pos = proj:GetPosition()
        local army = launcher:GetArmy()
        local brain = launcher:GetAIBrain()
        local damageType = bp.DamageType
        proj.InnerRing:DoNukeDamage(launcher, pos, brain, army, damageType)
        proj.OuterRing:DoNukeDamage(launcher, pos, brain, army, damageType)
       
        -- Stop it calling DoDamage any time in the future.
        proj.DoDamage = function(self, instigator, DamageData, targetEntity) end
    end,
}

Statistics: Posted by Dudekahedron — 06 Dec 2016, 19:50


]]>