Shield Drone frustration
-
Been working on the shield drone in tandem with other units from 4DC and its really close to working. AKA. it flies around and sacrifices itself to place a personal shield on units that dont already have one.
So far the little drone will move up to a target unit, shoot out its enhancement beam and collect the information to pass the model and LOD to "CreateShield" in Unit.lua.
My code to collect the model spec and pass it to Unit.lua "CreateShield".
-- Define the shield spec self.DroneShieldSpec = { ImpactEffects = impactFx, ImpactMesh = nil, Mesh = nil, MeshZ = nil, Owner = self, OwnerShieldMesh = bpDisplay[1], PassOverkillDamage = false, PersonalShield = true, RegenAssistMult = 60, ShieldEnergyDrainRechargeTime = 5, ShieldMaxHealth = sldHealth, ShieldRechargeTime = rChgTime, ShieldRegenRate = sldHealth * 0.01, ShieldRegenStartTime = 1, ShieldVerticalOffset = 0, ShieldSize = 2.5, CollisionCenterX = bp.CollisionOffsetX or 0, CollisionCenterY = bp.CollisionOffsetY or 0, CollisionCenterZ = bp.CollisionOffsetZ or 0, CollisionSizeX = bp.SizeX * 25.0 or 1, CollisionSizeY = bp.SizeY * 25.0 or 1, CollisionSizeZ = bp.SizeZ * 25.0 or 1, MaintenanceConsumptionPerSecondEnergy = eCost, } if myDebug then WARN(' Completed shield spec: '..repr(self.DroneShieldSpec)) end --Create the personal shield if myDebug then WARN(' Passing spec to CreateShield in Shield.lua') end self.CreateShield(self.DroneShieldSpec)
CreateShield (Unit.lua 4405), please notice its here that it calls DestroyShield.
CreateShield = function(self, bpShield) -- Copy the shield template so we don't alter the blueprint table. local bpShield = table.deepcopy(bpShield) self:DestroyShield() if bpShield.PersonalShield then self.MyShield = PersonalShield(bpShield, self) elseif bpShield.AntiArtilleryShield then self.MyShield = AntiArtilleryShield(bpShield, self) elseif bpShield.PersonalBubble then self.MyShield = PersonalBubble(bpShield, self) elseif bpShield.TransportShield then self.MyShield = TransportShield(bpShield, self) else self.MyShield = Shield(bpShield, self) end self:SetFocusEntity(self.MyShield) self.Trash:Add(self.MyShield) end,
Below is my F9 log with WARNING indicating that the spec created exists. Along with the destroy error near the end.
WARNING: *** /mods/4DC/hook/lua/sim/Unit.lua SpawnPersonalShield *** WARNING: Completed shield spec: WARNING: - CollisionCenterX: 0 WARNING: - CollisionCenterY: 0 WARNING: - CollisionCenterZ: -0.050000000745058 WARNING: - CollisionSizeX: 27.5 WARNING: - CollisionSizeY: 30.000001907349 WARNING: - CollisionSizeZ: 27.5 WARNING: - ImpactEffects: SeraphimShieldHit01 WARNING: - MaintenanceConsumptionPerSecondEnergy: 10 WARNING: - Owner: table: 1EB7A7D0 (skipped) WARNING: - OwnerShieldMesh: table: 1C825820 WARNING: - AlbedoName: /units/xsl0202/xsl0202_albedo.dds WARNING: - LODCutoff: 215 WARNING: - LookupName: /effects/entities/PhaseShield/PhaseShieldLookup.dds WARNING: - MeshName: /units/xsl0202/xsl0202_lod0.scm WARNING: - NormalsName: /units/xsl0202/xsl0202_normalsTS.dds WARNING: - Occlude: false WARNING: - Scrolling: true WARNING: - SecondaryName: WARNING: - ShaderName: PhaseShield WARNING: - Silhouette: false WARNING: - SpecularName: /units/xsl0202/xsl0202_SpecTeam.dds WARNING: - PassOverkillDamage: false WARNING: - PersonalShield: true WARNING: - RegenAssistMult: 60 WARNING: - ShieldEnergyDrainRechargeTime: 5 WARNING: - ShieldMaxHealth: 1250 WARNING: - ShieldRechargeTime: 60 WARNING: - ShieldRegenRate: 12.5 WARNING: - ShieldRegenStartTime: 1 WARNING: - ShieldSize: 2.5 WARNING: - ShieldVerticalOffset: 0 WARNING: Passing spec to CreateShield in Shield.lua WARNING: ***Unit.lua CreatShield*** WARNING: Error running lua script: ...gramdata\faforever\gamedata\lua.nx2\lua\sim\unit.lua(4409): attempt to call method `DestroyShield' (a nil value) stack traceback: ...gramdata\faforever\gamedata\lua.nx2\lua\sim\unit.lua(4409): in function `CreateShield' ...gramdata\faforever\gamedata\lua.nx2\lua\sim\unit.lua(5852): in function `SpawnDroneShield' ...d_shielddronesuperclass\4d_shielddronesuperclass.lua(157): in function <...d_shielddronesuperclass\4d_shielddronesuperclass.lua:122>
Notice the part near the bottom where it is referring to DestroyShield (Unit.lua line 4443). Please notice that the line number in the error code shown are different from the snippet above. This is because I have a slightly modified version of unit.lua so i can log this to be able to trace back events and such. (I dont change what Unit.lua does and yes i have the original backed up) However I'm referring to the standard FAF unit.lua lines that you have available.
DestroyShield = function(self) if self.MyShield then self:ClearFocusEntity() self.MyShield:Destroy() self.MyShield = nil end end,
I know for a fact that self.Shield doesn't exist as the unit being enhanced with a Drone-Shield never had one, nor was capable of having one on its own. What I'm thinking is taking place is that somehow "self" isn't being passed in some way. For what, I'm at a loss as I've come at this from every possible angle I can think of for the last day. Anyone have a suggestion or spot something I've outright missed?
Thanks in advance!
Resin
-
You made a typo here:
self.CreateShield(self.DroneShieldSpec)
It should be
self:CreateShield(self.DroneShieldSpec)
self is passed in when a colon is used.
-
YES !!!! I got the shield drone to work !
Video link (If it first doesn't work, then YouTube may still be processing it): https://youtu.be/IV39URap11s
-
Fixed the eCost not being done when then shield is active.