|
|
|
|
@@ -104,7 +104,7 @@ PLAYERRECCE = {
|
|
|
|
|
ClassName = "PLAYERRECCE",
|
|
|
|
|
verbose = true,
|
|
|
|
|
lid = nil,
|
|
|
|
|
version = "0.0.19",
|
|
|
|
|
version = "0.0.21",
|
|
|
|
|
ViewZone = {},
|
|
|
|
|
ViewZoneVisual = {},
|
|
|
|
|
ViewZoneLaser = {},
|
|
|
|
|
@@ -268,6 +268,146 @@ function PLAYERRECCE:New(Name, Coalition, PlayerSet)
|
|
|
|
|
|
|
|
|
|
self:I(self.lid.." Started.")
|
|
|
|
|
|
|
|
|
|
------------------------
|
|
|
|
|
--- Pseudo Functions ---
|
|
|
|
|
------------------------
|
|
|
|
|
|
|
|
|
|
--- Triggers the FSM event "Start". Starts the PLAYERRECCE. Note: Start() is called automatically after New().
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] Start
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- Triggers the FSM event "Start" after a delay. Starts the PLAYERRECCE. Note: Start() is called automatically after New().
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] __Start
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #number delay Delay in seconds.
|
|
|
|
|
|
|
|
|
|
--- Triggers the FSM event "Stop". Stops the PLAYERRECCE and all its event handlers.
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- Triggers the FSM event "Stop" after a delay. Stops the PLAYERRECCE and all its event handlers.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] __Stop
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #number delay Delay in seconds.
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterRecceOnStation. Recce came on station.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterRecceOnStation
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterRecceOffStation. Recce went off duty.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterRecceOffStation
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetDetected. Targets detected.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetDetected
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param #table Targetsbyclock #table with index 1..12 containing a #table of Wrapper.Unit#UNIT objects each.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetsSmoked. Smoke grenade shot.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetsSmoked
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetsFlared. Flares shot.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetsFlared
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterIllumination. Illumination rocket shot.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterIllumination
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetLasing. Lasing a new target.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetLasing
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target
|
|
|
|
|
-- @param #number Lasercode
|
|
|
|
|
-- @param #number Lasingtime
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetLOSLost. Lost LOS on lased target.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetLOSLost
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetReport. Laser target report sent.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetReport
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target Target currently lased
|
|
|
|
|
-- @param #string Text
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterTargetReportSent. All targets report sent.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterTargetReportSent
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client Client sending the report
|
|
|
|
|
-- @param #string Playername Player name
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet Set of targets
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
--- FSM Function OnAfterShack. Lased target has been destroyed.
|
|
|
|
|
-- @function [parent=#PLAYERRECCE] OnAfterShack
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #string From State.
|
|
|
|
|
-- @param #string Event Trigger.
|
|
|
|
|
-- @param #string To State.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target The destroyed target (if obtainable)
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
|
|
|
|
|
return self
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@@ -346,7 +486,7 @@ function PLAYERRECCE:_GetClockDirection(unit, target)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- [User] Set a table of possible laser codes.
|
|
|
|
|
-- Each new RECCE can select a code from this table, default is 1688.
|
|
|
|
|
-- Each new RECCE can select a code from this table, default is { 1688, 1130, 4785, 6547, 1465, 4578 }.
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param #list<#number> LaserCodes
|
|
|
|
|
-- @return #PLAYERRECCE
|
|
|
|
|
@@ -399,7 +539,7 @@ end
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param Wrapper.Client#CLIENT client
|
|
|
|
|
-- @param #string playername
|
|
|
|
|
-- @return #boolen OnOff
|
|
|
|
|
-- @return #boolean OnOff
|
|
|
|
|
function PLAYERRECCE:_CameraOn(client,playername)
|
|
|
|
|
local camera = true
|
|
|
|
|
local unit = client -- Wrapper.Unit#UNIT
|
|
|
|
|
@@ -430,26 +570,31 @@ function PLAYERRECCE:_GetGazelleVivianneSight(Gazelle)
|
|
|
|
|
local unit = Gazelle -- Wrapper.Unit#UNIT
|
|
|
|
|
if unit and unit:IsAlive() then
|
|
|
|
|
local dcsunit = Unit.getByName(Gazelle:GetName())
|
|
|
|
|
local vivihorizontal = dcsunit:getDrawArgumentValue(215) or 0 -- (not in MiniGun) 1 to -1 -- zero is straight ahead, 1/-1 = 180 deg
|
|
|
|
|
local vivihorizontal = dcsunit:getDrawArgumentValue(215) or 0 -- (not in MiniGun) 1 to -1 -- zero is straight ahead, 1/-1 = 180 deg,
|
|
|
|
|
local vivivertical = dcsunit:getDrawArgumentValue(216) or 0 -- L/Mistral/Minigun model has no 216, ca 10deg up (=1) and down (=-1)
|
|
|
|
|
-- vertical model limits 1.53846, -1.10731
|
|
|
|
|
local vivioff = false
|
|
|
|
|
-- -1 = -180, 1 = 180
|
|
|
|
|
-- Actual view -0,66 to 0,66
|
|
|
|
|
-- Nick view -0,98 to 0,98 for +/- 30°
|
|
|
|
|
if vivihorizontal < -0.7 then
|
|
|
|
|
vivihorizontal = -0.7
|
|
|
|
|
vivioff = true
|
|
|
|
|
return 0,0,0,false
|
|
|
|
|
elseif vivihorizontal > 0.7 then
|
|
|
|
|
vivihorizontal = 0.7
|
|
|
|
|
-- Actual model view -0,66 to 0,66
|
|
|
|
|
-- Nick view 1.53846, -1.10731 for - 30° to +45°
|
|
|
|
|
if vivihorizontal < -0.67 then -- model end
|
|
|
|
|
vivihorizontal = -0.67
|
|
|
|
|
vivioff = false
|
|
|
|
|
--return 0,0,0,false
|
|
|
|
|
elseif vivihorizontal > 0.67 then -- vivi off
|
|
|
|
|
vivihorizontal = 0.67
|
|
|
|
|
vivioff = true
|
|
|
|
|
return 0,0,0,false
|
|
|
|
|
end
|
|
|
|
|
vivivertical = vivivertical / 1.10731 -- normalize
|
|
|
|
|
local horizontalview = vivihorizontal * -180
|
|
|
|
|
local verticalview = vivivertical * -30 -- ca +/- 30°
|
|
|
|
|
local verticalview = vivivertical * 30 -- ca +/- 30°
|
|
|
|
|
--self:I(string.format("vivihorizontal=%.5f | vivivertical=%.5f",vivihorizontal,vivivertical))
|
|
|
|
|
--self:I(string.format("horizontal=%.5f | vertical=%.5f",horizontalview,verticalview))
|
|
|
|
|
local heading = unit:GetHeading()
|
|
|
|
|
local viviheading = (heading+horizontalview)%360
|
|
|
|
|
local maxview = self:_GetActualMaxLOSight(unit,viviheading, verticalview,vivioff)
|
|
|
|
|
--self:I(string.format("maxview=%.5f",maxview))
|
|
|
|
|
-- visual skew
|
|
|
|
|
local factor = 3.15
|
|
|
|
|
self.GazelleViewFactors = {
|
|
|
|
|
@@ -469,16 +614,18 @@ function PLAYERRECCE:_GetGazelleVivianneSight(Gazelle)
|
|
|
|
|
}
|
|
|
|
|
local lfac = UTILS.Round(maxview,-2)
|
|
|
|
|
if lfac <= 1300 then
|
|
|
|
|
factor = self.GazelleViewFactors[lfac/100]
|
|
|
|
|
--factor = self.GazelleViewFactors[lfac/100]
|
|
|
|
|
factor = 3.15
|
|
|
|
|
maxview = math.ceil((maxview*factor)/100)*100
|
|
|
|
|
end
|
|
|
|
|
if maxview > 8000 then maxview = 8000 end
|
|
|
|
|
--self:I(string.format("corrected maxview=%.5f",maxview))
|
|
|
|
|
return viviheading, verticalview,maxview, not vivioff
|
|
|
|
|
end
|
|
|
|
|
return 0,0,0,false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- [Internal] Get the max line of sight based on unit head and camera nod via trigonometrie. Returns 0 if camera is off.
|
|
|
|
|
--- [Internal] Get the max line of sight based on unit head and camera nod via trigonometry. Returns 0 if camera is off.
|
|
|
|
|
-- @param #PLAYERRECCE self
|
|
|
|
|
-- @param Wrapper.Unit#UNIT unit The unit which LOS we want
|
|
|
|
|
-- @param #number vheading Heading where the unit or camera is looking
|
|
|
|
|
@@ -488,12 +635,13 @@ end
|
|
|
|
|
function PLAYERRECCE:_GetActualMaxLOSight(unit,vheading, vnod, vivoff)
|
|
|
|
|
self:T(self.lid.."_GetActualMaxLOSight")
|
|
|
|
|
if vivoff then return 0 end
|
|
|
|
|
--if vnod < -0.03 then vnod = -0.03 end
|
|
|
|
|
local maxview = 0
|
|
|
|
|
if unit and unit:IsAlive() then
|
|
|
|
|
local typename = unit:GetTypeName()
|
|
|
|
|
maxview = self.MaxViewDistance[typename] or 8000
|
|
|
|
|
maxview = self.MaxViewDistance[typename] or 8000
|
|
|
|
|
local CamHeight = self.Cameraheight[typename] or 0
|
|
|
|
|
if vnod > 0 then
|
|
|
|
|
if vnod < 0 then
|
|
|
|
|
-- Looking down
|
|
|
|
|
-- determine max distance we're looking at
|
|
|
|
|
local beta = 90
|
|
|
|
|
@@ -505,7 +653,7 @@ function PLAYERRECCE:_GetActualMaxLOSight(unit,vheading, vnod, vivoff)
|
|
|
|
|
maxview = c*1.2 -- +20%
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return maxview
|
|
|
|
|
return math.abs(maxview)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- [User] Set callsign options for TTS output. See @{Wrapper.Group#GROUP.GetCustomCallSign}() on how to set customized callsigns.
|
|
|
|
|
@@ -768,7 +916,8 @@ function PLAYERRECCE:_LaseTarget(client,targetset)
|
|
|
|
|
-- still looking at target?
|
|
|
|
|
local target=self.LaserTarget[playername] -- Ops.Target#TARGET
|
|
|
|
|
local oldtarget = target:GetObject() --or laser.Target
|
|
|
|
|
self:T("Targetstate: "..target:GetState())
|
|
|
|
|
--self:I("Targetstate: "..target:GetState())
|
|
|
|
|
--self:I("Laser State: "..tostring(laser:IsLasing()))
|
|
|
|
|
if not oldtarget or targetset:IsNotInSet(oldtarget) or target:IsDead() or target:IsDestroyed() then
|
|
|
|
|
-- lost LOS or dead
|
|
|
|
|
laser:LaseOff()
|
|
|
|
|
@@ -780,12 +929,20 @@ function PLAYERRECCE:_LaseTarget(client,targetset)
|
|
|
|
|
self.LaserTarget[playername] = nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if oldtarget and (not laser:IsLasing()) then
|
|
|
|
|
--self:I("Switching laser back on ..")
|
|
|
|
|
local lasercode = self.UnitLaserCodes[playername] or laser.LaserCode or 1688
|
|
|
|
|
local lasingtime = self.lasingtime or 60
|
|
|
|
|
--local targettype = target:GetTypeName()
|
|
|
|
|
laser:LaseOn(oldtarget,lasercode,lasingtime)
|
|
|
|
|
--self:__TargetLasing(-1,client,oldtarget,lasercode,lasingtime)
|
|
|
|
|
end
|
|
|
|
|
elseif not laser:IsLasing() and target then
|
|
|
|
|
local relativecam = self.LaserRelativePos[client:GetTypeName()]
|
|
|
|
|
laser:SetRelativeStartPosition(relativecam)
|
|
|
|
|
local lasercode = self.UnitLaserCodes[playername] or laser.LaserCode or 1688
|
|
|
|
|
local lasingtime = self.lasingtime or 60
|
|
|
|
|
local targettype = target:GetTypeName()
|
|
|
|
|
--local targettype = target:GetTypeName()
|
|
|
|
|
laser:LaseOn(target,lasercode,lasingtime)
|
|
|
|
|
self.LaserTarget[playername] = TARGET:New(target)
|
|
|
|
|
self.LaserTarget[playername].TStatus = 9
|
|
|
|
|
@@ -953,9 +1110,13 @@ function PLAYERRECCE:_SmokeTargets(client,group,playername)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local coordinate = nil
|
|
|
|
|
local setthreat = 0
|
|
|
|
|
-- smoke everything else
|
|
|
|
|
local coordinate = cameraset:GetCoordinate()
|
|
|
|
|
local setthreat = cameraset:CalculateThreatLevelA2G()
|
|
|
|
|
if cameraset:CountAlive() > 1 then
|
|
|
|
|
local coordinate = cameraset:GetCoordinate()
|
|
|
|
|
local setthreat = cameraset:CalculateThreatLevelA2G()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if coordinate then
|
|
|
|
|
local color = lowsmoke
|
|
|
|
|
@@ -1582,7 +1743,7 @@ end
|
|
|
|
|
-- @param #string From
|
|
|
|
|
-- @param #string Event
|
|
|
|
|
-- @param #string To
|
|
|
|
|
-- @param #table Targetsbyclock
|
|
|
|
|
-- @param #table Targetsbyclock. #table with index 1..12 containing a #table of Wrapper.Unit#UNIT objects each.
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param #string Playername
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
@@ -1835,7 +1996,7 @@ function PLAYERRECCE:onafterTargetLasing(From, Event, To, Client, Target, Laserc
|
|
|
|
|
coordtext = coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings)
|
|
|
|
|
end
|
|
|
|
|
local coordtext = coord:ToStringA2G(client,Settings)
|
|
|
|
|
local text = string.format("All stations, %s lasing %s\nat %s!\nCode %d, Duration %d seconds!",callsign, targettype, coordtext, Lasercode, Lasingtime)
|
|
|
|
|
local text = string.format("All stations, %s lasing %s\nat %s!\nCode %d, Duration %d plus seconds!",callsign, targettype, coordtext, Lasercode, Lasingtime)
|
|
|
|
|
MESSAGE:New(text,15,self.Name or "FACA"):ToClient(client)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
@@ -1862,9 +2023,8 @@ end
|
|
|
|
|
-- @param #string To
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target
|
|
|
|
|
-- @param #string Targettype
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
function PLAYERRECCE:onafterShack(From, Event, To, Client, Target, Targettype)
|
|
|
|
|
function PLAYERRECCE:onafterShack(From, Event, To, Client, Target)
|
|
|
|
|
self:T({From, Event, To})
|
|
|
|
|
local callsign = Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations)
|
|
|
|
|
local Settings = ( Client and _DATABASE:GetPlayerSettings( Client:GetPlayerName() ) ) or _SETTINGS
|
|
|
|
|
@@ -1972,7 +2132,6 @@ function PLAYERRECCE:onafterTargetReport(From, Event, To, Client, TargetSet, Tar
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--self:__TargetReportSent(-2,Client, TargetSet, Target, Text)
|
|
|
|
|
return self
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@@ -1981,12 +2140,11 @@ end
|
|
|
|
|
-- @param #string From
|
|
|
|
|
-- @param #string Event
|
|
|
|
|
-- @param #string To
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet
|
|
|
|
|
-- @param Wrapper.Unit#UNIT Target
|
|
|
|
|
-- @param #string Text
|
|
|
|
|
-- @param Wrapper.Client#CLIENT Client Client sending the report
|
|
|
|
|
-- @param #string Playername Player name
|
|
|
|
|
-- @param Core.Set#SET_UNIT TargetSet Set of targets
|
|
|
|
|
-- @return #PLAYERRECCE self
|
|
|
|
|
function PLAYERRECCE:onafterTargetReportSent(From, Event, To, Client, TargetSet)
|
|
|
|
|
function PLAYERRECCE:onafterTargetReportSent(From, Event, To, Client, Playername, TargetSet)
|
|
|
|
|
self:T({From, Event, To})
|
|
|
|
|
local text = "Upload completed!"
|
|
|
|
|
if self.UseSRS then
|
|
|
|
|
|