mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
WEAPON v0.0.1
- New class
This commit is contained in:
parent
6e6bb1e88d
commit
c5deb09c2c
@ -46,6 +46,7 @@ __Moose.Include( 'Scripts/Moose/Wrapper/Positionable.lua' )
|
||||
__Moose.Include( 'Scripts/Moose/Wrapper/Scenery.lua' )
|
||||
__Moose.Include( 'Scripts/Moose/Wrapper/Static.lua' )
|
||||
__Moose.Include( 'Scripts/Moose/Wrapper/Unit.lua' )
|
||||
__Moose.Include( 'Scripts/Moose/Wrapper/Weapon.lua' )
|
||||
|
||||
__Moose.Include( 'Scripts/Moose/Cargo/Cargo.lua' )
|
||||
__Moose.Include( 'Scripts/Moose/Cargo/CargoUnit.lua' )
|
||||
|
||||
286
Moose Development/Moose/Wrapper/Weapon.lua
Normal file
286
Moose Development/Moose/Wrapper/Weapon.lua
Normal file
@ -0,0 +1,286 @@
|
||||
--- **Wrapper** - Weapon.
|
||||
--
|
||||
-- ## Main Features:
|
||||
--
|
||||
-- * Define operation phases
|
||||
-- * Define conditions when phases are over
|
||||
-- * Option to have branches in the phase tree
|
||||
-- * Dedicate resources to operations
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- ## Example Missions:
|
||||
--
|
||||
-- Demo missions can be found on [github](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/develop/OPS%20-%20Operation).
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- ### Author: **funkyfranky**
|
||||
--
|
||||
-- ===
|
||||
-- @module Wrapper.Weapon
|
||||
-- @image Wrapper_Weapon.png
|
||||
|
||||
|
||||
--- WEAPON class.
|
||||
-- @type WEAPON
|
||||
-- @field #string ClassName Name of the class.
|
||||
-- @field #number verbose Verbosity level.
|
||||
-- @field #string lid Class id string for output to DCS log file.
|
||||
-- @field DCS#Weapon weapon The DCS weapon object.
|
||||
-- @extends Wrapper.Positionable#POSITIONABLE
|
||||
|
||||
--- *Before this time tomorrow I shall have gained a peerage, or Westminster Abbey.* -- Horatio Nelson
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- # The WEAPON Concept
|
||||
--
|
||||
-- The wrapper class is different from most others as weapon objects cannot be found with a DCS API function like `getByName()`.
|
||||
-- They can only be found in DCS events like "Shot"
|
||||
--
|
||||
--
|
||||
--
|
||||
-- @field #WEAPON
|
||||
WEAPON = {
|
||||
ClassName = "WEAPON",
|
||||
verbose = 0,
|
||||
}
|
||||
|
||||
--- Operation phase.
|
||||
-- @type WEAPON.Phase
|
||||
-- @field #number uid Unique ID of the phase.
|
||||
-- @field #string name Name of the phase.
|
||||
-- @field Core.Condition#CONDITION conditionOver Conditions when the phase is over.
|
||||
-- @field #string status Phase status.
|
||||
-- @field #number Tstart Abs. mission time when the phase was started.
|
||||
-- @field #number nActive Number of times the phase was active.
|
||||
-- @field #number duration Duration in seconds how long the phase should be active after it started.
|
||||
-- @field #WEAPON.Branch branch The branch this phase belongs to.
|
||||
|
||||
--- Operation branch.
|
||||
-- @type WEAPON.Branch
|
||||
-- @field #number uid Unique ID of the branch.
|
||||
-- @field #string name Name of the branch.
|
||||
-- @field #table phases Phases of this branch.
|
||||
-- @field #table edges Edges of this branch.
|
||||
|
||||
--- Operation edge.
|
||||
-- @type WEAPON.Edge
|
||||
-- @field #number uid Unique ID of the edge.
|
||||
-- @field #WEAPON.Branch branchFrom The from branch.
|
||||
-- @field #WEAPON.Phase phaseFrom The from phase after which to switch.
|
||||
-- @field #WEAPON.Branch branchTo The branch to switch to.
|
||||
-- @field #WEAPON.Phase phaseTo The phase to switch to.
|
||||
-- @field Core.Condition#CONDITION conditionSwitch Conditions when to switch the branch.
|
||||
|
||||
--- Operation phase.
|
||||
-- @type WEAPON.PhaseStatus
|
||||
-- @field #string PLANNED Planned.
|
||||
-- @field #string ACTIVE Active phase.
|
||||
-- @field #string OVER Phase is over.
|
||||
WEAPON.PhaseStatus={
|
||||
PLANNED="Planned",
|
||||
ACTIVE="Active",
|
||||
OVER="Over",
|
||||
}
|
||||
|
||||
--- WEAPON class version.
|
||||
-- @field #string version
|
||||
WEAPON.version="0.0.1"
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- TODO list
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- TODO: A lot...
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Constructor
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
--- Create a new WEAPON object.
|
||||
-- @param #WEAPON self
|
||||
-- @param DCS#Weapon WeaponObject The DCS weapon object.
|
||||
-- @return #WEAPON self
|
||||
function WEAPON:New(WeaponObject)
|
||||
|
||||
-- Inherit everything from FSM class.
|
||||
local self=BASE:Inherit(self, POSITIONABLE:New("Weapon")) -- #WEAPON
|
||||
|
||||
self.weapon=WeaponObject
|
||||
|
||||
self.desc=WeaponObject:getDesc()
|
||||
|
||||
self.category=WeaponObject:getCategory()
|
||||
|
||||
self.typeName=WeaponObject:getTypeName()
|
||||
|
||||
self.name=WeaponObject:getName()
|
||||
|
||||
self.coalition=WeaponObject:getCoalition()
|
||||
|
||||
self.country=WeaponObject:getCountry()
|
||||
|
||||
|
||||
local text=string.format("FF Weapon: Name=%s, TypeName=%s, Category=%s, Coalition=%d, Country=%d", self.name, self.typeName, self.category, self.coalition, self.country)
|
||||
env.info(text)
|
||||
|
||||
self:I(self.desc)
|
||||
|
||||
|
||||
-- Set log ID.
|
||||
self.lid=string.format("%s | ", self.name)
|
||||
|
||||
self:Track()
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- User API Functions
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
--- Set verbosity level.
|
||||
-- @param #WEAPON self
|
||||
-- @param #number VerbosityLevel Level of output (higher=more). Default 0.
|
||||
-- @return #WEAPON self
|
||||
function WEAPON:SetVerbosity(VerbosityLevel)
|
||||
self.verbose=VerbosityLevel or 0
|
||||
return self
|
||||
end
|
||||
|
||||
--- Check if weapon object (still) exists.
|
||||
-- @param #WEAPON self
|
||||
-- @return #boolean If `true`, the weapon object still exists.
|
||||
function WEAPON:IsExist()
|
||||
local isExist=false
|
||||
if self.weapon then
|
||||
isExist=self.weapon:isExist()
|
||||
end
|
||||
return isExist
|
||||
end
|
||||
|
||||
--- Destroy the weapon object.
|
||||
-- @param #WEAPON self
|
||||
-- @param #number Delay Delay before destroy in seconds.
|
||||
-- @return #WEAPON self
|
||||
function WEAPON:Destroy(Delay)
|
||||
|
||||
if Delay and Delay>0 then
|
||||
self:ScheduleOnce(Delay, WEAPON.Destroy, self, 0)
|
||||
else
|
||||
if self.weapon then
|
||||
self.weapon:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Get velocity vector of weapon.
|
||||
-- @param #WEAPON self
|
||||
-- @return DCS#Vec3 Velocity vector with x, y and z components in meters/second.
|
||||
function WEAPON:GetVelocity()
|
||||
self.weapon:getVelocity()
|
||||
return self
|
||||
end
|
||||
|
||||
--- Get speed of weapon.
|
||||
-- @param #WEAPON self
|
||||
-- @return #number Speed in meters per second.
|
||||
function WEAPON:GetSpeed()
|
||||
|
||||
local speed=nil
|
||||
|
||||
if self.weapon then
|
||||
|
||||
local v=self:GetVelocity()
|
||||
|
||||
speed=UTILS.VecNorm(v)
|
||||
|
||||
end
|
||||
|
||||
return speed
|
||||
end
|
||||
|
||||
--- Check if weapon is in the air. Obviously not really useful for torpedos. Well, then again, this is DCS...
|
||||
-- @param #WEAPON self
|
||||
-- @return #boolean If `true`, weapon is in the air.
|
||||
function WEAPON:InAir()
|
||||
local inAir=self.weapon:inAir()
|
||||
return inAir
|
||||
end
|
||||
|
||||
--- Get the current 3D position vector.
|
||||
-- @param #WEAPON self
|
||||
-- @return DCS#Vec3
|
||||
function WEAPON:GetVec3()
|
||||
|
||||
local vec3=nil
|
||||
if self.weapon then
|
||||
vec3=self.weapon:getPoint()
|
||||
end
|
||||
|
||||
return vec3
|
||||
end
|
||||
|
||||
--- Start tracking the position of the weapon.
|
||||
-- @param #WEAPON self
|
||||
function WEAPON:Track()
|
||||
|
||||
-- Weapon is not yet "alife" just yet. Start timer in one second.
|
||||
self:T( self.lid .. string.format( "Tracking weapon") )
|
||||
timer.scheduleFunction(WEAPON._Track, self, timer.getTime() + 0.001 )
|
||||
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-- Private Functions
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
--- Track weapon until impact.
|
||||
-- @param #WEAPON self
|
||||
-- @param DCS#Time time Time in seconds.
|
||||
function WEAPON:_Track(time)
|
||||
|
||||
-- Debug info.
|
||||
self:I(string.format("Tracking at T=%.5f", time))
|
||||
|
||||
-- When the pcall returns a failure the weapon has hit.
|
||||
local status, vec3= pcall(
|
||||
function()
|
||||
local point=self.weapon:getPoint()
|
||||
return point
|
||||
end
|
||||
)
|
||||
|
||||
self.dtTrack=0.01
|
||||
|
||||
if status then
|
||||
|
||||
-------------------------------
|
||||
-- Weapon is still in exists --
|
||||
-------------------------------
|
||||
|
||||
-- Remember this position.
|
||||
self.vec3 = vec3
|
||||
|
||||
-- Check again in ~0.005 seconds ==> 200 checks per second.
|
||||
return time+self.dtTrack
|
||||
else
|
||||
|
||||
self.impactVec3=self.vec3
|
||||
|
||||
local coord=COORDINATE:NewFromVec3(self.vec3)
|
||||
|
||||
coord:MarkToAll("Impact point")
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
Loading…
x
Reference in New Issue
Block a user