You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/PhysicsEntities/Assets/Scripts/Entities/Physics/Wind.lua

189 lines
4.4 KiB
Lua

----------------------------------------------------------------------------------------------------
--
-- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-- its licensors.
--
-- For complete copyright and license terms please see the LICENSE at the root of this
-- distribution (the "License"). All use of this software is governed by the License,
-- or, if provided, by the license below or the license accompanying this file. Do not
-- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--
--
----------------------------------------------------------------------------------------------------
Wind = {
type = "WindController",
Properties = {
vVelocity={x=1.0,y=0.0,z=0.0},
fFadeTime = 1,--used only when the fog is triggered manually, with activate/deactivate events.
},
Editor={
Icon="Tornado.bmp",
},
}
function Wind:OnInit()
self.oldVelocity = {x=0.0,y=0.0,z=0.0};
self.occupied = 0;
self.lasttime = 0;
self:OnReset();
self:RegisterForAreaEvents(1);
end
function Wind:OnPropertyChange()
self:OnReset();
end
function Wind:OnReset()
self:RegisterForAreaEvents(1);
end
function Wind:OnSave(tbl)
tbl.bTriggered = self.bTriggered
tbl.oldVelocity = self.oldVelocity
tbl.fadeamt = self.fadeamt
tbl.Who = self.Who
end
function Wind:OnLoad(tbl)
self.bTriggered = tbl.bTriggered
self.oldVelocity = tbl.oldVelocity
self.fadamt = tbl.fadeamt
self.Who = tbl.Who
end
-----------------------------------------------------------------------------
-- fade: 0-out 1-in
function Wind:OnProceedFadeArea( player,areaId,fadeCoeff )
self:Fade(fadeCoeff);
end
function Wind:ResetValues()
System.SetWind(self.oldVelocity);
end
-----------------------------------------------------------------------------
function Wind:OnEnterArea( player,areaId )
if((player and (not player.actor:IsPlayer())) or self.occupied == 1) then
return
end
self.oldVelocity = System.GetWind();
self.occupied = 1;
end
-----------------------------------------------------------------------------
function Wind:OnLeaveArea( player,areaId )
if(player and (not player.actor:IsPlayer())) then
return
end
self:ResetValues();
self.occupied = 0;
end
-----------------------------------------------------------------------------
function Wind:OnShutDown()
self:RegisterForAreaEvents(0);
end
function Wind:Event_Enable( sender )
if(self.occupied == 0 ) then
if (self.fadeamt and self.fadeamt<1) then
self:ResetValues();
end
self:OnEnterArea( );
self.fadeamt = 0;
self.lasttime = _time;
self.exitfrom = nil;
end
self:SetTimer(0, 1);
BroadcastEvent( self,"Enable" );
end
function Wind:Event_Disable( sender )
if(self.occupied == 1 ) then
--self:OnLeaveArea( );
self.occupied = 0;
self.fadeamt = 0;
self.lasttime = _time;
self.exitfrom = 1;
end
self:SetTimer(0, 1);
BroadcastEvent( self,"Disable" );
end
function Wind:OnTimer()
--System.Log("Ontimer ");
self:SetTimer(0, 1);
if (self.fadeamt) then
local delta = _time - self.lasttime;
self.lasttime = _time;
self.fadeamt = self.fadeamt + (delta / self.Properties.fFadeTime);
if (self.fadeamt>=1) then
self.fadeamt = 1;
self:KillTimer(0);
end
----------------------------------------------
--fade
local fadeCoeff = self.fadeamt;
if (self.exitfrom) then
fadeCoeff = 1 - fadeCoeff;
end
fadeCoeff = math.sqrt( fadeCoeff );
fadeCoeff = math.sqrt( fadeCoeff );
self:Fade(fadeCoeff);
--self:OnProceedFadeArea( nil,0,self.fadeamt );
else
self:KillTimer(0);
end
end
function Wind:Fade(fadeCoeff)
System.SetWind(LerpColors(self.oldVelocity, self.Properties.vVelocity, fadeCoeff));
end
Wind.FlowEvents =
{
Inputs =
{
Disable = { Wind.Event_Disable, "bool" },
Enable = { Wind.Event_Enable, "bool" },
},
Outputs =
{
Disable = "bool",
Enable = "bool",
},
}