@jtff/miztemplate-lib 3.8.6 → 3.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- env.info('*** MOOSE GITHUB Commit Hash ID: 2025-05-30T18:37:50+02:00-c1997d9f70e44639b3d2fc055804026e961c1c6c ***')
1
+ env.info('*** MOOSE GITHUB Commit Hash ID: 2025-07-03T16:39:24+02:00-727cb3276cb69412b50ae7f277b0d6228b410359 ***')
2
2
  if not MOOSE_DEVELOPMENT_FOLDER then
3
3
  MOOSE_DEVELOPMENT_FOLDER='Scripts'
4
4
  end
@@ -2378,6 +2378,11 @@ end
2378
2378
  end
2379
2379
  function UTILS.GetReportingName(Typename)
2380
2380
  local typename=string.lower(Typename)
2381
+ if string.find(typename,"ka-50",1,true)then
2382
+ return"Shark"
2383
+ elseif string.find(typename,"a-50",1,true)then
2384
+ return"Mainstay"
2385
+ end
2381
2386
  for name,value in pairs(ENUMS.ReportingName.NATO)do
2382
2387
  local svalue=string.lower(value)
2383
2388
  if string.find(typename,svalue,1,true)then
@@ -4044,6 +4049,34 @@ end
4044
4049
  function UTILS.Weather.StopFogAnimation()
4045
4050
  return world.weather.setFogAnimation({})
4046
4051
  end
4052
+ function UTILS.GetEnvZone(name)
4053
+ for _,v in ipairs(env.mission.triggers.zones)do
4054
+ if v.name==name then
4055
+ return v
4056
+ end
4057
+ end
4058
+ end
4059
+ function UTILS.ShowHelperGate(pos,heading)
4060
+ net.dostring_in("mission",string.format("a_show_helper_gate(%s, %s, %s, %f)",pos.x,pos.y,pos.z,math.rad(heading)))
4061
+ end
4062
+ function UTILS.ShellZone(name,power,count)
4063
+ local z=UTILS.GetEnvZone(name)
4064
+ if z then
4065
+ net.dostring_in("mission",string.format("a_shelling_zone(%d, %d, %d)",z.zoneId,power,count))
4066
+ end
4067
+ end
4068
+ function UTILS.RemoveObjects(name,type)
4069
+ local z=UTILS.GetEnvZone(name)
4070
+ if z then
4071
+ net.dostring_in("mission",string.format("a_remove_scene_objects(%d, %d)",z.zoneId,type))
4072
+ end
4073
+ end
4074
+ function UTILS.DestroyScenery(name,level)
4075
+ local z=UTILS.GetEnvZone(name)
4076
+ if z then
4077
+ net.dostring_in("mission",string.format("a_scenery_destruction_zone(%d, %d)",z.zoneId,level))
4078
+ end
4079
+ end
4047
4080
  PROFILER={
4048
4081
  ClassName="PROFILER",
4049
4082
  Counters={},
@@ -6412,7 +6445,7 @@ function SCHEDULEDISPATCHER:Stop(Scheduler,CallID)
6412
6445
  self:F2({Stop=CallID,Scheduler=Scheduler})
6413
6446
  if CallID then
6414
6447
  local Schedule=self.Schedule[Scheduler][CallID]
6415
- if Schedule.ScheduleID then
6448
+ if Schedule and Schedule.ScheduleID then
6416
6449
  self:T(string.format("SCHEDULEDISPATCHER stopping scheduler CallID=%s, ScheduleID=%s",tostring(CallID),tostring(Schedule.ScheduleID)))
6417
6450
  timer.removeFunction(Schedule.ScheduleID)
6418
6451
  Schedule.ScheduleID=nil
@@ -10189,11 +10222,7 @@ self.ScanData.Scenery={}
10189
10222
  self.ScanData.SceneryTable={}
10190
10223
  self.ScanData.Units={}
10191
10224
  local vectors=self:GetBoundingSquare()
10192
- local minVec3={x=vectors.x1,y=0,z=vectors.y1}
10193
- local maxVec3={x=vectors.x2,y=0,z=vectors.y2}
10194
- local minmarkcoord=COORDINATE:NewFromVec3(minVec3)
10195
- local maxmarkcoord=COORDINATE:NewFromVec3(maxVec3)
10196
- local ZoneRadius=minmarkcoord:Get2DDistance(maxmarkcoord)/2
10225
+ local ZoneRadius=UTILS.VecDist2D({x=vectors.x1,y=vectors.y1},{x=vectors.x2,y=vectors.y2})/2
10197
10226
  local CenterVec3=self:GetCoordinate():GetVec3()
10198
10227
  local SphereSearch={
10199
10228
  id=world.VolumeType.SPHERE,
@@ -11613,7 +11642,7 @@ if client then
11613
11642
  end
11614
11643
  local PlayerName=Event.IniUnit:GetPlayerName()
11615
11644
  if PlayerName then
11616
- self:I(string.format("Player '%s' joined unit '%s' of group '%s'",tostring(PlayerName),tostring(Event.IniDCSUnitName),tostring(Event.IniDCSGroupName)))
11645
+ self:I(string.format("Player '%s' joined unit '%s' (%s) of group '%s'",tostring(PlayerName),tostring(Event.IniDCSUnitName),tostring(Event.IniTypeName),tostring(Event.IniDCSGroupName)))
11617
11646
  if client==nil or(client and client:CountPlayers()==0)then
11618
11647
  client=self:AddClient(Event.IniDCSUnitName,true)
11619
11648
  end
@@ -12361,6 +12390,17 @@ ObjectNames=ObjectNames..ObjectName..", "
12361
12390
  end
12362
12391
  return ObjectNames
12363
12392
  end
12393
+ function SET_BASE:GetAliveSet()
12394
+ local AliveSet={}
12395
+ for ObjectName,Object in pairs(self.Set)do
12396
+ if Object then
12397
+ if Object:IsAlive()then
12398
+ AliveSet[#AliveSet+1]=Object
12399
+ end
12400
+ end
12401
+ end
12402
+ return AliveSet or{}
12403
+ end
12364
12404
  end
12365
12405
  do
12366
12406
  SET_GROUP={
@@ -12395,16 +12435,16 @@ self:FilterActive(false)
12395
12435
  return self
12396
12436
  end
12397
12437
  function SET_GROUP:GetAliveSet()
12398
- local AliveSet=SET_GROUP:New()
12438
+ local AliveSet={}
12399
12439
  for GroupName,GroupObject in pairs(self.Set)do
12400
12440
  local GroupObject=GroupObject
12401
12441
  if GroupObject then
12402
12442
  if GroupObject:IsAlive()then
12403
- AliveSet:Add(GroupName,GroupObject)
12443
+ AliveSet[GroupName]=GroupObject
12404
12444
  end
12405
12445
  end
12406
12446
  end
12407
- return AliveSet.Set or{}
12447
+ return AliveSet or{}
12408
12448
  end
12409
12449
  function SET_GROUP:GetUnitTypeNames()
12410
12450
  local MT={}
@@ -13103,9 +13143,8 @@ end
13103
13143
  function SET_UNIT:GetAliveSet()
13104
13144
  local AliveSet=SET_UNIT:New()
13105
13145
  for GroupName,GroupObject in pairs(self.Set)do
13106
- local GroupObject=GroupObject
13107
13146
  if GroupObject and GroupObject:IsAlive()then
13108
- AliveSet:Add(GroupName,GroupObject)
13147
+ AliveSet[GroupName]=GroupObject
13109
13148
  end
13110
13149
  end
13111
13150
  return AliveSet.Set or{},AliveSet
@@ -14284,14 +14323,13 @@ end
14284
14323
  return CountU
14285
14324
  end
14286
14325
  function SET_CLIENT:GetAliveSet()
14287
- local AliveSet=SET_CLIENT:New()
14326
+ local AliveSet={}
14288
14327
  for GroupName,GroupObject in pairs(self.Set)do
14289
- local GroupObject=GroupObject
14290
14328
  if GroupObject and GroupObject:IsAlive()then
14291
- AliveSet:Add(GroupName,GroupObject)
14329
+ AliveSet[GroupName]=GroupObject
14292
14330
  end
14293
14331
  end
14294
- return AliveSet.Set or{}
14332
+ return AliveSet or{}
14295
14333
  end
14296
14334
  function SET_CLIENT:IsIncludeObject(MClient)
14297
14335
  local MClientInclude=true
@@ -17415,20 +17453,68 @@ trigger.action.illuminationBomb(self:GetVec3(),Power)
17415
17453
  end
17416
17454
  return self
17417
17455
  end
17418
- function COORDINATE:Smoke(SmokeColor,Duration,Delay,Name)
17419
- self:F2({SmokeColor,Name,Duration,Delay})
17456
+ function COORDINATE:Smoke(SmokeColor,Duration,Delay,Name,Offset,Direction,Distance)
17457
+ self:F2({SmokeColor,Name,Duration,Delay,Offset})
17420
17458
  SmokeColor=SmokeColor or SMOKECOLOR.Green
17421
17459
  if Delay and Delay>0 then
17422
- self:ScheduleOnce(Delay,COORDINATE.Smoke,self,SmokeColor,Duration,0,Name)
17460
+ self:ScheduleOnce(Delay,COORDINATE.Smoke,self,SmokeColor,Duration,0,Name,Direction,Distance)
17423
17461
  else
17424
17462
  self.firename=Name or"Smoke-"..math.random(1,100000)
17463
+ if Offset or self.SmokeOffset then
17464
+ local Angle=Direction or self:GetSmokeOffsetDirection()
17465
+ local Distance=Distance or self:GetSmokeOffsetDistance()
17466
+ local newpos=self:Translate(Distance,Angle,true,false)
17467
+ local newvec3=newpos:GetVec3()
17468
+ trigger.action.smoke(newvec3,SmokeColor,self.firename)
17469
+ else
17425
17470
  trigger.action.smoke(self:GetVec3(),SmokeColor,self.firename)
17471
+ end
17426
17472
  if Duration and Duration>0 then
17427
17473
  self:ScheduleOnce(Duration,COORDINATE.StopSmoke,self,self.firename)
17428
17474
  end
17429
17475
  end
17430
17476
  return self
17431
17477
  end
17478
+ function COORDINATE:GetSmokeOffsetDirection()
17479
+ local direction=self.SmokeOffsetDirection or math.random(1,359)
17480
+ return direction
17481
+ end
17482
+ function COORDINATE:SetSmokeOffsetDirection(Direction)
17483
+ if self then
17484
+ self.SmokeOffsetDirection=Direction or math.random(1,359)
17485
+ return self
17486
+ else
17487
+ COORDINATE.SmokeOffsetDirection=Direction or math.random(1,359)
17488
+ end
17489
+ end
17490
+ function COORDINATE:GetSmokeOffsetDistance()
17491
+ local distance=self.SmokeOffsetDistance or math.random(10,20)
17492
+ return distance
17493
+ end
17494
+ function COORDINATE:SetSmokeOffsetDistance(Distance)
17495
+ if self then
17496
+ self.SmokeOffsetDistance=Distance or math.random(10,20)
17497
+ return self
17498
+ else
17499
+ COORDINATE.SmokeOffsetDistance=Distance or math.random(10,20)
17500
+ end
17501
+ end
17502
+ function COORDINATE:SwitchSmokeOffsetOn()
17503
+ if self then
17504
+ self.SmokeOffset=true
17505
+ return self
17506
+ else
17507
+ COORDINATE.SmokeOffset=true
17508
+ end
17509
+ end
17510
+ function COORDINATE:SwitchSmokeOffsetOff()
17511
+ if self then
17512
+ self.SmokeOffset=false
17513
+ return self
17514
+ else
17515
+ COORDINATE.SmokeOffset=false
17516
+ end
17517
+ end
17432
17518
  function COORDINATE:StopSmoke(name)
17433
17519
  self:StopBigSmokeAndFire(name)
17434
17520
  end
@@ -21086,7 +21172,7 @@ end
21086
21172
  return self:_SpawnStatic(self.TemplateStaticUnit,self.CountryID)
21087
21173
  end
21088
21174
  function SPAWNSTATIC:SpawnFromZone(Zone,Heading,NewName)
21089
- local Static=self:SpawnFromPointVec2(Zone:GetPointVec2(),Heading,NewName)
21175
+ local Static=self:SpawnFromCoordinate(Zone:GetCoordinate(),Heading,NewName)
21090
21176
  return Static
21091
21177
  end
21092
21178
  function SPAWNSTATIC:_SpawnStatic(Template,CountryID)
@@ -21418,7 +21504,7 @@ MARKEROPS_BASE={
21418
21504
  ClassName="MARKEROPS",
21419
21505
  Tag="mytag",
21420
21506
  Keywords={},
21421
- version="0.1.3",
21507
+ version="0.1.4",
21422
21508
  debug=false,
21423
21509
  Casesensitive=true,
21424
21510
  }
@@ -21451,19 +21537,18 @@ if Event==nil or Event.idx==nil then
21451
21537
  self:E("Skipping onEvent. Event or Event.idx unknown.")
21452
21538
  return true
21453
21539
  end
21454
- local vec3={y=Event.pos.y,x=Event.pos.x,z=Event.pos.z}
21455
- local coord=COORDINATE:NewFromVec3(vec3)
21456
- if self.debug then
21457
- local coordtext=coord:ToStringLLDDM()
21458
- local text=tostring(Event.text)
21459
- local m=MESSAGE:New(string.format("Mark added at %s with text: %s",coordtext,text),10,"Info",false):ToAll()
21460
- end
21461
21540
  local coalition=Event.MarkCoalition
21462
21541
  if Event.id==world.event.S_EVENT_MARK_ADDED then
21463
21542
  self:T({event="S_EVENT_MARK_ADDED",carrier=Event.IniGroupName,vec3=Event.pos})
21464
21543
  local Eventtext=tostring(Event.text)
21465
21544
  if Eventtext~=nil then
21466
21545
  if self:_MatchTag(Eventtext)then
21546
+ local coord=COORDINATE:NewFromVec3({y=Event.pos.y,x=Event.pos.x,z=Event.pos.z})
21547
+ if self.debug then
21548
+ local coordtext=coord:ToStringLLDDM()
21549
+ local text=tostring(Event.text)
21550
+ local m=MESSAGE:New(string.format("Mark added at %s with text: %s",coordtext,text),10,"Info",false):ToAll()
21551
+ end
21467
21552
  local matchtable=self:_MatchKeywords(Eventtext)
21468
21553
  self:MarkAdded(Eventtext,matchtable,coord,Event.idx,coalition,Event.PlayerName,Event)
21469
21554
  end
@@ -21473,6 +21558,12 @@ self:T({event="S_EVENT_MARK_CHANGE",carrier=Event.IniGroupName,vec3=Event.pos})
21473
21558
  local Eventtext=tostring(Event.text)
21474
21559
  if Eventtext~=nil then
21475
21560
  if self:_MatchTag(Eventtext)then
21561
+ local coord=COORDINATE:NewFromVec3({y=Event.pos.y,x=Event.pos.x,z=Event.pos.z})
21562
+ if self.debug then
21563
+ local coordtext=coord:ToStringLLDDM()
21564
+ local text=tostring(Event.text)
21565
+ local m=MESSAGE:New(string.format("Mark changed at %s with text: %s",coordtext,text),10,"Info",false):ToAll()
21566
+ end
21476
21567
  local matchtable=self:_MatchKeywords(Eventtext)
21477
21568
  self:MarkChanged(Eventtext,matchtable,coord,Event.idx,coalition,Event.PlayerName,Event)
21478
21569
  end
@@ -22022,6 +22113,14 @@ function POSITIONABLE:GetVec3()
22022
22113
  local DCSPositionable=self:GetDCSObject()
22023
22114
  if DCSPositionable then
22024
22115
  local vec3=DCSPositionable:getPoint()
22116
+ if not vec3 then
22117
+ local pos=DCSPositionable:getPosition()
22118
+ if pos and pos.p then
22119
+ vec3=pos.p
22120
+ else
22121
+ self:E({"Cannot get the position from DCS Object for GetVec3",Positionable=self,Alive=self:IsAlive()})
22122
+ end
22123
+ end
22025
22124
  return vec3
22026
22125
  end
22027
22126
  self:E({"Cannot get the Positionable DCS Object for GetVec3",Positionable=self,Alive=self:IsAlive()})
@@ -22081,11 +22180,13 @@ function POSITIONABLE:GetCoordinate()
22081
22180
  local DCSPositionable=self:GetDCSObject()
22082
22181
  if DCSPositionable then
22083
22182
  local PositionableVec3=self:GetVec3()
22183
+ if PositionableVec3 then
22084
22184
  local coord=COORDINATE:NewFromVec3(PositionableVec3)
22085
22185
  local heading=self:GetHeading()
22086
22186
  coord.Heading=heading
22087
22187
  return coord
22088
22188
  end
22189
+ end
22089
22190
  self:E({"Cannot GetCoordinate",Positionable=self,Alive=self:IsAlive()})
22090
22191
  return nil
22091
22192
  end
@@ -28774,6 +28875,9 @@ return true
28774
28875
  end
28775
28876
  return false
28776
28877
  end
28878
+ function UNIT:SetLife(Percent)
28879
+ net.dostring_in("mission",string.format("a_unit_set_life_percentage(%d, %f)",self:GetID(),Percent))
28880
+ end
28777
28881
  CLIENT={
28778
28882
  ClassName="CLIENT",
28779
28883
  ClientName=nil,
@@ -29401,7 +29505,6 @@ AIRBASE.Syria={
29401
29505
  ["Al_Dumayr"]="Al-Dumayr",
29402
29506
  ["Al_Qusayr"]="Al Qusayr",
29403
29507
  ["Aleppo"]="Aleppo",
29404
- ["Amman"]="Amman",
29405
29508
  ["An_Nasiriyah"]="An Nasiriyah",
29406
29509
  ["At_Tanf"]="At Tanf",
29407
29510
  ["Bassel_Al_Assad"]="Bassel Al-Assad",
@@ -29433,6 +29536,7 @@ AIRBASE.Syria={
29433
29536
  ["Kuweires"]="Kuweires",
29434
29537
  ["Lakatamia"]="Lakatamia",
29435
29538
  ["Larnaca"]="Larnaca",
29539
+ ["Marka"]="Marka",
29436
29540
  ["Marj_Ruhayyil"]="Marj Ruhayyil",
29437
29541
  ["Marj_as_Sultan_North"]="Marj as Sultan North",
29438
29542
  ["Marj_as_Sultan_South"]="Marj as Sultan South",
@@ -29463,9 +29567,8 @@ AIRBASE.Syria={
29463
29567
  ["Wujah_Al_Hajar"]="Wujah Al Hajar",
29464
29568
  ["Ben_Gurion"]="Ben Gurion",
29465
29569
  ["Hatzor"]="Hatzor",
29466
- ["Palmashim"]="Palmashim",
29570
+ ["Palmachim"]="Palmachim",
29467
29571
  ["Tel_Nof"]="Tel Nof",
29468
- ["Marka"]="Marka",
29469
29572
  }
29470
29573
  AIRBASE.MarianaIslands={
29471
29574
  ["Andersen_AFB"]="Andersen AFB",
@@ -29477,6 +29580,20 @@ AIRBASE.MarianaIslands={
29477
29580
  ["Saipan_Intl"]="Saipan Intl",
29478
29581
  ["Tinian_Intl"]="Tinian Intl",
29479
29582
  }
29583
+ AIRBASE.MarianaIslandsWWII=
29584
+ {
29585
+ ["Agana"]="Agana",
29586
+ ["Airfield_3"]="Airfield 3",
29587
+ ["Charon_Kanoa"]="Charon Kanoa",
29588
+ ["Gurguan_Point"]="Gurguan Point",
29589
+ ["Isley"]="Isley",
29590
+ ["Kagman"]="Kagman",
29591
+ ["Marpi"]="Marpi",
29592
+ ["Orote"]="Orote",
29593
+ ["Pagan"]="Pagan",
29594
+ ["Rota"]="Rota",
29595
+ ["Ushi"]="Ushi",
29596
+ }
29480
29597
  AIRBASE.SouthAtlantic={
29481
29598
  ["Almirante_Schroeders"]="Almirante Schroeders",
29482
29599
  ["Comandante_Luis_Piedrabuena"]="Comandante Luis Piedrabuena",
@@ -29522,7 +29639,7 @@ AIRBASE.Sinai={
29522
29639
  ["Bilbeis_Air_Base"]="Bilbeis Air Base",
29523
29640
  ["Bir_Hasanah"]="Bir Hasanah",
29524
29641
  ["Birma_Air_Base"]="Birma Air Base",
29525
- ["Borj_El_Arab_International_Airport"]="Borj El Arab International Airport",
29642
+ ["Borg_El_Arab_International_Airport"]="Borg El Arab International Airport",
29526
29643
  ["Cairo_International_Airport"]="Cairo International Airport",
29527
29644
  ["Cairo_West"]="Cairo West",
29528
29645
  ["Difarsuwar_Airfield"]="Difarsuwar Airfield",
@@ -29581,6 +29698,12 @@ AIRBASE.Kola={
29581
29698
  ["Enontekio"]="Enontekio",
29582
29699
  ["Evenes"]="Evenes",
29583
29700
  ["Hosio"]="Hosio",
29701
+ ["Kilpyavr"]="Kilpyavr",
29702
+ ["Afrikanda"]="Afrikanda",
29703
+ ["Kalevala"]="Kalevala",
29704
+ ["Koshka_Yavr"]="Koshka Yavr",
29705
+ ["Poduzhemye"]="Poduzhemye",
29706
+ ["Luostari_Pechenga"]="Luostari Pechenga",
29584
29707
  }
29585
29708
  AIRBASE.Afghanistan={
29586
29709
  ["Bagram"]="Bagram",
@@ -49708,7 +49831,7 @@ return _nstock
49708
49831
  end
49709
49832
  end
49710
49833
  function WAREHOUSE:GetCoordinate()
49711
- return self.warehouse:GetCoordinate()
49834
+ return self.warehouse:GetCoord()
49712
49835
  end
49713
49836
  function WAREHOUSE:GetVec3()
49714
49837
  local vec3=self.warehouse:GetVec3()
@@ -51551,7 +51674,7 @@ local CountryNeutral=nil
51551
51674
  if gotunits then
51552
51675
  for _,_unit in pairs(units)do
51553
51676
  local unit=_unit
51554
- local distance=coord:Get2DDistance(unit:GetCoordinate())
51677
+ local distance=coord:Get2DDistance(unit:GetCoord())
51555
51678
  if unit:IsGround()and unit:IsAlive()and distance<=radius then
51556
51679
  local _coalition=unit:GetCoalition()
51557
51680
  local _country=unit:GetCountry()
@@ -56015,6 +56138,8 @@ C2A="C2A_Greyhound",
56015
56138
  RHINOE="FA-18E",
56016
56139
  RHINOF="FA-18F",
56017
56140
  GROWLER="EA-18G",
56141
+ CORSAIR="F4U-1D",
56142
+ CORSAIR_CW="F4U-1D CW",
56018
56143
  }
56019
56144
  AIRBOSS.CarrierType={
56020
56145
  ROOSEVELT="CVN_71",
@@ -56024,6 +56149,7 @@ TRUMAN="CVN_75",
56024
56149
  STENNIS="Stennis",
56025
56150
  FORRESTAL="Forrestal",
56026
56151
  VINSON="VINSON",
56152
+ ESSEX="Essex",
56027
56153
  HERMES="HERMES81",
56028
56154
  INVINCIBLE="hms_invincible",
56029
56155
  TARAWA="LHA_Tarawa",
@@ -56080,7 +56206,7 @@ HARD="TOPGUN Graduate",
56080
56206
  }
56081
56207
  AIRBOSS.MenuF10={}
56082
56208
  AIRBOSS.MenuF10Root=nil
56083
- AIRBOSS.version="1.3.3"
56209
+ AIRBOSS.version="1.4.0"
56084
56210
  function AIRBOSS:New(carriername,alias)
56085
56211
  local self=BASE:Inherit(self,FSM:New())
56086
56212
  self:F2({carriername=carriername,alias=alias})
@@ -56161,6 +56287,8 @@ elseif self.carriertype==AIRBOSS.CarrierType.FORRESTAL then
56161
56287
  self:_InitForrestal()
56162
56288
  elseif self.carriertype==AIRBOSS.CarrierType.VINSON then
56163
56289
  self:_InitStennis()
56290
+ elseif self.carriertype==AIRBOSS.CarrierType.ESSEX then
56291
+ self:_InitEssex()
56164
56292
  elseif self.carriertype==AIRBOSS.CarrierType.HERMES then
56165
56293
  self:_InitHermes()
56166
56294
  elseif self.carriertype==AIRBOSS.CarrierType.INVINCIBLE then
@@ -56486,7 +56614,12 @@ self.Tmessage=Duration or 10
56486
56614
  return self
56487
56615
  end
56488
56616
  function AIRBOSS:SetGlideslopeErrorThresholds(_max,_min,High,HIGH,Low,LOW)
56489
- if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then
56617
+ if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or
56618
+ self.carriertype==AIRBOSS.CarrierType.HERMES or
56619
+ self.carriertype==AIRBOSS.CarrierType.TARAWA or
56620
+ self.carriertype==AIRBOSS.CarrierType.AMERICA or
56621
+ self.carriertype==AIRBOSS.CarrierType.JCARLOS or
56622
+ self.carriertype==AIRBOSS.CarrierType.CANBERRA then
56490
56623
  self.gle._max=_max or 0.7
56491
56624
  self.gle.High=High or 1.4
56492
56625
  self.gle.HIGH=HIGH or 1.9
@@ -57384,6 +57517,33 @@ self.carrierparam.wire3=64
57384
57517
  self.carrierparam.wire4=74
57385
57518
  self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3
57386
57519
  end
57520
+ function AIRBOSS:_InitEssex()
57521
+ self:_InitNimitz()
57522
+ self.carrierparam.sterndist=-126
57523
+ self.carrierparam.deckheight=19.27
57524
+ self.carrierparam.totlength=268
57525
+ self.carrierparam.totwidthport=23
57526
+ self.carrierparam.totwidthstarboard=23
57527
+ self.carrierparam.rwyangle=0.0
57528
+ self.carrierparam.rwylength=265
57529
+ self.carrierparam.rwywidth=20
57530
+ self.carrierparam.wire1=21.9
57531
+ self.carrierparam.wire2=28.3
57532
+ self.carrierparam.wire3=34.7
57533
+ self.carrierparam.wire4=41.1
57534
+ self.carrierparam.wire5=47.4
57535
+ self.carrierparam.wire6=53.7
57536
+ self.carrierparam.wire7=59.0
57537
+ self.carrierparam.wire8=64.1
57538
+ self.carrierparam.wire9=72.7
57539
+ self.carrierparam.wire10=78.0
57540
+ self.carrierparam.wire11=85.5
57541
+ self.carrierparam.wire12=105.9
57542
+ self.carrierparam.wire13=113.3
57543
+ self.carrierparam.wire14=121.0
57544
+ self.carrierparam.wire15=128.5
57545
+ self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3
57546
+ end
57387
57547
  function AIRBOSS:_InitHermes()
57388
57548
  self:_InitStennis()
57389
57549
  self.carrierparam.sterndist=-105
@@ -57888,6 +58048,7 @@ local goshawk=playerData.actype==AIRBOSS.AircraftCarrier.T45C
57888
58048
  local skyhawk=playerData.actype==AIRBOSS.AircraftCarrier.A4EC
57889
58049
  local harrier=playerData.actype==AIRBOSS.AircraftCarrier.AV8B
57890
58050
  local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B
58051
+ local corsair=playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR or playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW
57891
58052
  local aoa={}
57892
58053
  if hornet then
57893
58054
  aoa.SLOW=9.8
@@ -57929,6 +58090,14 @@ aoa.OnSpeed=10.0
57929
58090
  aoa.OnSpeedMin=9.5
57930
58091
  aoa.Fast=8.0
57931
58092
  aoa.FAST=7.5
58093
+ elseif corsair then
58094
+ aoa.SLOW=16.0
58095
+ aoa.Slow=13.5
58096
+ aoa.OnSpeedMax=12.5
58097
+ aoa.OnSpeed=10.0
58098
+ aoa.OnSpeedMin=9.5
58099
+ aoa.Fast=8.0
58100
+ aoa.FAST=7.5
57932
58101
  end
57933
58102
  return aoa
57934
58103
  end
@@ -57962,6 +58131,7 @@ local skyhawk=playerData.actype==AIRBOSS.AircraftCarrier.A4EC
57962
58131
  local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B
57963
58132
  local harrier=playerData.actype==AIRBOSS.AircraftCarrier.AV8B
57964
58133
  local goshawk=playerData.actype==AIRBOSS.AircraftCarrier.T45C
58134
+ local corsair=playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR or playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW
57965
58135
  local alt
57966
58136
  local aoa
57967
58137
  local dist
@@ -57998,6 +58168,9 @@ speed=UTILS.KnotsToMps(250)
57998
58168
  elseif goshawk then
57999
58169
  alt=UTILS.FeetToMeters(800)
58000
58170
  speed=UTILS.KnotsToMps(300)
58171
+ elseif corsair then
58172
+ alt=UTILS.FeetToMeters(300)
58173
+ speed=UTILS.KnotsToMps(120)
58001
58174
  end
58002
58175
  elseif step==AIRBOSS.PatternStep.BREAKENTRY then
58003
58176
  if hornet or tomcat or harrier then
@@ -58009,24 +58182,36 @@ speed=UTILS.KnotsToMps(250)
58009
58182
  elseif goshawk then
58010
58183
  alt=UTILS.FeetToMeters(800)
58011
58184
  speed=UTILS.KnotsToMps(300)
58185
+ elseif corsair then
58186
+ alt=UTILS.FeetToMeters(200)
58187
+ speed=UTILS.KnotsToMps(110)
58012
58188
  end
58013
58189
  elseif step==AIRBOSS.PatternStep.EARLYBREAK then
58014
58190
  if hornet or tomcat or harrier or goshawk then
58015
58191
  alt=UTILS.FeetToMeters(800)
58016
58192
  elseif skyhawk then
58017
58193
  alt=UTILS.FeetToMeters(600)
58194
+ elseif corsair then
58195
+ alt=UTILS.FeetToMeters(200)
58196
+ speed=UTILS.KnotsToMps(100)
58018
58197
  end
58019
58198
  elseif step==AIRBOSS.PatternStep.LATEBREAK then
58020
58199
  if hornet or tomcat or harrier or goshawk then
58021
58200
  alt=UTILS.FeetToMeters(800)
58022
58201
  elseif skyhawk then
58023
58202
  alt=UTILS.FeetToMeters(600)
58203
+ elseif corsair then
58204
+ alt=UTILS.FeetToMeters(150)
58205
+ speed=UTILS.KnotsToMps(100)
58024
58206
  end
58025
58207
  elseif step==AIRBOSS.PatternStep.ABEAM then
58026
58208
  if hornet or tomcat or harrier or goshawk then
58027
58209
  alt=UTILS.FeetToMeters(600)
58028
58210
  elseif skyhawk then
58029
58211
  alt=UTILS.FeetToMeters(500)
58212
+ elseif corsair then
58213
+ alt=UTILS.FeetToMeters(150)
58214
+ speed=UTILS.KnotsToMps(90)
58030
58215
  end
58031
58216
  aoa=aoaac.OnSpeed
58032
58217
  if goshawk then
@@ -58045,6 +58230,9 @@ elseif skyhawk then
58045
58230
  alt=UTILS.FeetToMeters(500)
58046
58231
  elseif harrier then
58047
58232
  alt=UTILS.FeetToMeters(425)
58233
+ elseif corsair then
58234
+ alt=UTILS.FeetToMeters(90)
58235
+ speed=UTILS.KnotsToMps(90)
58048
58236
  end
58049
58237
  aoa=aoaac.OnSpeed
58050
58238
  elseif step==AIRBOSS.PatternStep.WAKE then
@@ -58054,6 +58242,8 @@ elseif tomcat then
58054
58242
  alt=UTILS.FeetToMeters(430)
58055
58243
  elseif skyhawk then
58056
58244
  alt=UTILS.FeetToMeters(370)
58245
+ elseif corsair then
58246
+ alt=UTILS.FeetToMeters(80)
58057
58247
  end
58058
58248
  aoa=aoaac.OnSpeed
58059
58249
  elseif step==AIRBOSS.PatternStep.FINAL then
@@ -58065,6 +58255,8 @@ elseif skyhawk then
58065
58255
  alt=UTILS.FeetToMeters(300)
58066
58256
  elseif harrier then
58067
58257
  alt=UTILS.FeetToMeters(312)
58258
+ elseif corsair then
58259
+ alt=UTILS.FeetToMeters(80)
58068
58260
  end
58069
58261
  aoa=aoaac.OnSpeed
58070
58262
  end
@@ -58455,6 +58647,8 @@ elseif flight.actype==AIRBOSS.AircraftCarrier.F14A_AI or flight.actype==AIRBOSS.
58455
58647
  Speed=UTILS.KnotsToKmph(175)
58456
58648
  elseif flight.actype==AIRBOSS.AircraftCarrier.S3B or flight.actype==AIRBOSS.AircraftCarrier.S3BTANKER then
58457
58649
  Speed=UTILS.KnotsToKmph(140)
58650
+ elseif flight.actype==AIRBOSS.AircraftCarrier.CORSAIR or flight.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW then
58651
+ Speed=UTILS.KnotsToKmph(100)
58458
58652
  end
58459
58653
  local Carrier=self:GetCoordinate()
58460
58654
  local hdg=self:GetHeading()
@@ -59562,13 +59756,13 @@ end
59562
59756
  function AIRBOSS:OnEventRemoveUnit(EventData)
59563
59757
  self:F3({eventland=EventData})
59564
59758
  if EventData==nil then
59565
- self:E(self.lid.."ERROR: EventData=nil in event REMOVEUNIT!")
59566
- self:E(EventData)
59759
+ self:T(self.lid.."ERROR: EventData=nil in event REMOVEUNIT!")
59760
+ self:T(EventData)
59567
59761
  return
59568
59762
  end
59569
59763
  if EventData.IniUnit==nil then
59570
- self:E(self.lid.."ERROR: EventData.IniUnit=nil in event REMOVEUNIT!")
59571
- self:E(EventData)
59764
+ self:T(self.lid.."ERROR: EventData.IniUnit=nil in event REMOVEUNIT!")
59765
+ self:T(EventData)
59572
59766
  return
59573
59767
  end
59574
59768
  local _unitName=EventData.IniUnitName
@@ -60339,6 +60533,8 @@ elseif self.carriertype==AIRBOSS.CarrierType.STENNIS then
60339
60533
  self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(7,FB+90,true,true)
60340
60534
  elseif self.carriertype==AIRBOSS.CarrierType.FORRESTAL then
60341
60535
  self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(7.5,FB+90,true,true)
60536
+ elseif self.carriertype==AIRBOSS.CarrierType.ESSEX then
60537
+ self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(-1,FB+90,true,true)
60342
60538
  else
60343
60539
  self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(9.5,FB+90,true,true)
60344
60540
  end
@@ -67909,7 +68105,7 @@ CTLD.FixedWingTypes={
67909
68105
  ["Bronco"]="Bronco",
67910
68106
  ["Mosquito"]="Mosquito",
67911
68107
  }
67912
- CTLD.version="1.3.34"
68108
+ CTLD.version="1.3.35"
67913
68109
  function CTLD:New(Coalition,Prefixes,Alias)
67914
68110
  local self=BASE:Inherit(self,FSM:New())
67915
68111
  BASE:T({Coalition,Prefixes,Alias})
@@ -68149,6 +68345,9 @@ if self.CtldUnits[unitname]then
68149
68345
  local _group=event.IniGroup
68150
68346
  local _unit=event.IniUnit
68151
68347
  self:_RefreshLoadCratesMenu(_group,_unit)
68348
+ if self:IsFixedWing(_unit)and self.enableFixedWing then
68349
+ self:_RefreshDropCratesMenu(_group,_unit)
68350
+ end
68152
68351
  end
68153
68352
  elseif event.id==EVENTS.PlayerLeaveUnit or event.id==EVENTS.UnitLost then
68154
68353
  local unitname=event.IniUnitName or"none"
@@ -68719,7 +68918,11 @@ local cratealias=string.format("%s-%s-%d",cratename,cratetemplate,math.random(1,
68719
68918
  if not self.placeCratesAhead or drop==true then
68720
68919
  cratedistance=(i-1)*2.5+capabilities.length
68721
68920
  if cratedistance>self.CrateDistance then cratedistance=self.CrateDistance end
68921
+ if self:IsUnitInAir(Unit)and self:IsFixedWing(Unit)then
68922
+ rheading=math.random(20,60)
68923
+ else
68722
68924
  rheading=UTILS.RandomGaussian(0,30,-90,90,100)
68925
+ end
68723
68926
  rheading=math.fmod((heading+rheading),360)
68724
68927
  cratecoord=position:Translate(cratedistance,rheading)
68725
68928
  else
@@ -69662,7 +69865,7 @@ if self.buildtime and self.buildtime>0 then
69662
69865
  local buildtimer=TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,build,false,Group:GetCoordinate(),MultiDrop)
69663
69866
  buildtimer:Start(self.buildtime)
69664
69867
  self:_SendMessage(string.format("Build started, ready in %d seconds!",self.buildtime),15,false,Group)
69665
- self:__CratesBuildStarted(1,Group,Unit)
69868
+ self:__CratesBuildStarted(1,Group,Unit,build.Name)
69666
69869
  self:_RefreshDropTroopsMenu(Group,Unit)
69667
69870
  else
69668
69871
  self:_BuildObjectFromCrates(Group,Unit,build,false,nil,MultiDrop)
@@ -70398,6 +70601,17 @@ for _,cObj in ipairs(chunk)do
70398
70601
  cObj:SetWasDropped(true)
70399
70602
  cObj:SetHasMoved(true)
70400
70603
  end
70604
+ local cname=crateObj:GetName()or"Unknown"
70605
+ local count=#chunk
70606
+ if needed>1 then
70607
+ if count==needed then
70608
+ self:_SendMessage(string.format("Dropped %d %s.",1,cname),10,false,Group)
70609
+ else
70610
+ self:_SendMessage(string.format("Dropped %d/%d crate(s) of %s.",count,needed,cname),15,false,Group)
70611
+ end
70612
+ else
70613
+ self:_SendMessage(string.format("Dropped %d %s(s).",count,cname),10,false,Group)
70614
+ end
70401
70615
  local loadedData=self.Loaded_Cargo[unitName]
70402
70616
  if loadedData and loadedData.Cargo then
70403
70617
  local newList={}
@@ -70490,7 +70704,9 @@ end
70490
70704
  else
70491
70705
  local mAll=MENU_GROUP:New(Group,"Drop ALL crates",dropCratesMenu)
70492
70706
  MENU_GROUP_COMMAND:New(Group,"Drop",mAll,self._UnloadCrates,self,Group,Unit)
70707
+ if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then
70493
70708
  MENU_GROUP_COMMAND:New(Group,"Drop and build",mAll,self._DropAndBuild,self,Group,Unit)
70709
+ end
70494
70710
  self.CrateGroupList=self.CrateGroupList or{}
70495
70711
  self.CrateGroupList[Unit:GetName()]={}
70496
70712
  local lineIndex=1
@@ -70510,7 +70726,9 @@ table.insert(self.CrateGroupList[Unit:GetName()],chunk)
70510
70726
  local setIndex=#self.CrateGroupList[Unit:GetName()]
70511
70727
  local mSet=MENU_GROUP:New(Group,label,dropCratesMenu)
70512
70728
  MENU_GROUP_COMMAND:New(Group,"Drop",mSet,self._UnloadSingleCrateSet,self,Group,Unit,setIndex)
70729
+ if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then
70513
70730
  MENU_GROUP_COMMAND:New(Group,"Drop and build",mSet,self._DropSingleAndBuild,self,Group,Unit,setIndex)
70731
+ end
70514
70732
  i=i+needed
70515
70733
  else
70516
70734
  local chunk={}
@@ -70619,6 +70837,8 @@ end
70619
70837
  foundCargo:SetWasDropped(true)
70620
70838
  if cType==CTLD_CARGO.Enum.ENGINEERS then
70621
70839
  self.Engineers=self.Engineers+1
70840
+ local grpname=self.DroppedTroops[self.TroopCounter]:GetName()
70841
+ self.EngineersInField[self.Engineers]=CTLD_ENGINEERING:New(name,grpname)
70622
70842
  self:_SendMessage(string.format("Dropped Engineers %s into action!",name),10,false,Group)
70623
70843
  else
70624
70844
  self:_SendMessage(string.format("Dropped Troops %s into action!",name),10,false,Group)
@@ -71194,15 +71414,20 @@ for index,cargozone in pairs(zones[i])do
71194
71414
  local CZone=cargozone
71195
71415
  local zonename=CZone.name
71196
71416
  local zone=nil
71417
+ local airbasezone=false
71197
71418
  if i==4 then
71198
71419
  zone=UNIT:FindByName(zonename)
71199
71420
  else
71200
71421
  zone=ZONE:FindByName(zonename)
71201
71422
  if not zone then
71202
71423
  zone=AIRBASE:FindByName(zonename):GetZone()
71424
+ airbasezone=true
71203
71425
  end
71204
71426
  end
71205
71427
  local zonecoord=zone:GetCoordinate()
71428
+ if(i==1 or 1==3)and airbasezone==true and zone:IsInstanceOf("ZONE_BASE")then
71429
+ zonecoord=zone:GetRandomCoordinate(inner,outer,{land.SurfaceType.LAND})
71430
+ end
71206
71431
  if zonecoord then
71207
71432
  local active=CZone.active
71208
71433
  local color=CZone.color
@@ -74363,8 +74588,8 @@ else
74363
74588
  self.allheligroupset=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterCategoryHelicopter():FilterStart()
74364
74589
  end
74365
74590
  self.mash=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart()
74366
- self.staticmashes=SET_STATIC:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterOnce()
74367
- self.zonemashes=SET_ZONE:New():FilterPrefixes(self.mashprefix):FilterOnce()
74591
+ self.staticmashes=SET_STATIC:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart()
74592
+ self.zonemashes=SET_ZONE:New():FilterPrefixes(self.mashprefix):FilterStart()
74368
74593
  if not self.coordinate then
74369
74594
  local csarhq=self.mash:GetRandom()
74370
74595
  if csarhq then
@@ -85323,7 +85548,7 @@ Wavenet={
85323
85548
  ["en_GB_Wavenet_F"]='en-GB-Wavenet-N',
85324
85549
  ["en_GB_Wavenet_O"]='en-GB-Wavenet-O',
85325
85550
  ["en_GB_Wavenet_N"]='en-GB-Wavenet-N',
85326
- ["en_US_Wavenet_A"]='en-US-Wavenet-N',
85551
+ ["en_US_Wavenet_A"]='en-US-Wavenet-A',
85327
85552
  ["en_US_Wavenet_B"]='en-US-Wavenet-B',
85328
85553
  ["en_US_Wavenet_C"]='en-US-Wavenet-C',
85329
85554
  ["en_US_Wavenet_D"]='en-US-Wavenet-D',