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.
290 lines
9.0 KiB
Lua
290 lines
9.0 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.
|
|
--
|
|
--
|
|
----------------------------------------------------------------------------------------------------
|
|
-- #Script.ReloadScript("scripts/default/entities/player/basicplayer.lua")
|
|
|
|
DeadBody =
|
|
{
|
|
type = "DeadBody",
|
|
temp_ModelName = "",
|
|
|
|
DeadBodyParams =
|
|
{
|
|
max_time_step = 0.025,
|
|
sleep_speed = 0.025,
|
|
damping = 0.3,
|
|
freefall_damping = 0.1,
|
|
|
|
lying_mode_ncolls = 4,
|
|
lying_sleep_speed = 0.065,
|
|
lying_damping = 1.5,
|
|
},
|
|
|
|
PhysParams =
|
|
{
|
|
mass = 80,
|
|
height = 1.8,
|
|
eyeheight = 1.7,
|
|
sphereheight = 1.2,
|
|
radius = 0.45,
|
|
stiffness_scale = 0,
|
|
lod = 1,
|
|
retain_joint_vel = 0,
|
|
},
|
|
|
|
Properties =
|
|
{
|
|
soclasses_SmartObjectClass = "",
|
|
bResting = 1,
|
|
object_Model = "objects/characters/human/sdk_player/sdk_player.cdf",
|
|
lying_damping = 1.5,
|
|
bCollidesWithPlayers = 0,
|
|
bPushableByPlayers = 0,
|
|
Mass = 80,
|
|
Stiffness = 0,
|
|
MaxTimeStep = 0.025,
|
|
bExtraStiff = 0,
|
|
bNoFriendlyFire = 0,
|
|
PoseAnim = "",
|
|
|
|
Buoyancy=
|
|
{
|
|
water_density = 1000,
|
|
water_damping = 0,
|
|
water_resistance = 1000,
|
|
},
|
|
|
|
TacticalInfo =
|
|
{
|
|
bScannable = 0,
|
|
LookupName = "",
|
|
},
|
|
},
|
|
|
|
Editor =
|
|
{
|
|
Icon = "DeadBody.bmp",
|
|
IconOnTop = 1,
|
|
},
|
|
}
|
|
|
|
-------------------------------------------------------
|
|
function DeadBody:OnLoad(table)
|
|
self.temp_ModelName = table.temp_ModelName
|
|
self.PhysParams = table.PhysParams
|
|
self.DeadBodyParams = table.DeadBodyParams
|
|
end
|
|
|
|
-------------------------------------------------------
|
|
function DeadBody:OnSave(table)
|
|
table.temp_ModelName = self.temp_ModelName
|
|
table.PhysParams = self.PhysParams
|
|
table.DeadBodyParams = self.DeadBodyParams
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
function DeadBody:OnReset()
|
|
--self.temp_ModelName ="";
|
|
--self:OnPropertyChange();
|
|
|
|
self.bScannable = self.Properties.TacticalInfo.bScannable;
|
|
|
|
-- no problem in repeatedly registering or unregistering
|
|
if (self.bScannable==1) then
|
|
Game.AddTacticalEntity(self.id, eTacticalEntity_Story);
|
|
else
|
|
Game.RemoveTacticalEntity(self.id, eTacticalEntity_Story);
|
|
end
|
|
|
|
self:LoadCharacter(0,self.Properties.object_Model);
|
|
--self:StartAnimation( 0,"cidle" );
|
|
self:PhysicalizeThis();
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Server_OnInit()
|
|
if (not CryAction.IsServer()) then
|
|
DeadBody.OnPropertyChange( self );
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Client_OnInit()
|
|
DeadBody.OnPropertyChange( self );
|
|
|
|
self:SetUpdatePolicy( ENTITY_UPDATE_PHYSICS_VISIBLE );
|
|
--self:Activate(1);
|
|
|
|
-- self:RenderShadow( 1 ); -- enable rendering of player shadow
|
|
-- self:SetShaderFloat("HeatIntensity",0,0,0);
|
|
end
|
|
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Server_OnDamageDead( hit )
|
|
--printf("server on Damage DEAD %.2f %.2f",hit.impact_force_mul_final,hit.impact_force_mul);
|
|
--System.Log("DeadBody hit part "..hit.ipart);
|
|
if( hit.ipart ) then
|
|
self:AddImpulse( hit.ipart, hit.pos, hit.dir, hit.impact_force_mul );
|
|
else
|
|
self:AddImpulse( -1, hit.pos, hit.dir, hit.impact_force_mul );
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
|
|
function DeadBody:OnHit()
|
|
BroadcastEvent( self,"Hit" );
|
|
end
|
|
|
|
-----------------------------------------------------------------------------------------------------------
|
|
|
|
function DeadBody:OnPropertyChange()
|
|
--System.LogToConsole("prev:"..self.temp_ModelName.." new:"..self.Properties.object_Model);
|
|
|
|
self.PhysParams.mass = self.Properties.Mass;
|
|
|
|
if (self.Properties.object_Model ~= self.temp_ModelName) then
|
|
self.temp_ModelName = self.Properties.object_Model;
|
|
self:LoadCharacter(0,self.Properties.object_Model);
|
|
end
|
|
self:PhysicalizeThis();
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------
|
|
function DeadBody:PhysicalizeThis()
|
|
local Properties = self.Properties;
|
|
local status = 1;
|
|
|
|
self.PhysParams.retain_joint_vel = 0;
|
|
if (Properties.PoseAnim ~= "") then
|
|
self:StartAnimation( 0, Properties.PoseAnim, 0,0,1,1,1,0,1 );
|
|
self.PhysParams.retain_joint_vel = 1; --this is just to retain the positions of non-physical bones
|
|
end
|
|
|
|
local bPushableByPlayers = Properties.bPushableByPlayers;
|
|
local bCollidesWithPlayers = Properties.bCollidesWithPlayers;
|
|
|
|
if (status == 1) then
|
|
bPushableByPlayers = 0;
|
|
bCollidesWithPlayers = 0;
|
|
end
|
|
|
|
self.PhysParams.mass = Properties.Mass;
|
|
self.PhysParams.stiffness_scale = Properties.Stiffness*(1-Properties.bExtraStiff*2);
|
|
|
|
self:Physicalize( 0, PE_ARTICULATED, self.PhysParams );
|
|
|
|
self:SetPhysicParams(PHYSICPARAM_SIMULATION, self.Properties );
|
|
self:SetPhysicParams(PHYSICPARAM_BUOYANCY, self.Properties.Buoyancy );
|
|
|
|
if (Properties.lying_damping) then
|
|
self.DeadBodyParams.lying_damping = Properties.lying_damping;
|
|
end
|
|
self.DeadBodyParams.max_time_step = Properties.MaxTimeStep;
|
|
self:SetPhysicParams(PHYSICPARAM_SIMULATION, self.DeadBodyParams);
|
|
self:SetPhysicParams(PHYSICPARAM_ARTICULATED, self.DeadBodyParams);
|
|
|
|
local flagstab = { flags_mask=geom_colltype_player, flags=geom_colltype_player*bCollidesWithPlayers };
|
|
if (status == 1) then
|
|
flagstab.flags_mask = geom_colltype_explosion + geom_colltype_ray + geom_colltype_foliage_proxy + geom_colltype_player;
|
|
end
|
|
self:SetPhysicParams(PHYSICPARAM_PART_FLAGS, flagstab);
|
|
flagstab.flags_mask = pef_pushable_by_players;
|
|
flagstab.flags = pef_pushable_by_players*bPushableByPlayers;
|
|
self:SetPhysicParams(PHYSICPARAM_FLAGS, flagstab);
|
|
if (Properties.bResting == 1) then
|
|
self:AwakePhysics(0);
|
|
else
|
|
self:AwakePhysics(1);
|
|
end
|
|
self:EnableProceduralFacialAnimation(false);
|
|
self:PlayFacialAnimation("death_pose_0"..random(1,5), true);
|
|
-- small hack: we need one update to sync physics and animation, so here it is after physicalization
|
|
-- (our OnUpdate function should just deactivate immediately.)
|
|
--self:Activate(1);
|
|
end
|
|
|
|
--function DeadBody:OnUpdate()
|
|
--self:Activate(0);
|
|
--end
|
|
|
|
function DeadBody:Event_Hide()
|
|
self:Hide(1);
|
|
end;
|
|
|
|
------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Event_UnHide()
|
|
self:Hide(0);
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Event_Awake()
|
|
self:AwakePhysics(1);
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------
|
|
function DeadBody:Event_Hit(sender)
|
|
BroadcastEvent(self, "Hit");
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------
|
|
DeadBody.Server =
|
|
{
|
|
OnInit = DeadBody.Server_OnInit,
|
|
-- OnShutDown = function( self ) end,
|
|
OnDamage = DeadBody.Server_OnDamageDead,
|
|
OnHit = DeadBody.OnHit,
|
|
OnUpdate=DeadBody.OnUpdate,
|
|
}
|
|
|
|
--------------------------------------------------------------------------------------------------------
|
|
DeadBody.Client =
|
|
{
|
|
OnInit = DeadBody.Client_OnInit,
|
|
-- OnShutDown = DeadBody.Client_OnShutDown,
|
|
OnDamage=DeadBody.Client_OnDamage,
|
|
OnUpdate=DeadBody.OnUpdate,
|
|
}
|
|
|
|
----------------------------------------------------------------------------------------------------
|
|
function DeadBody:HasBeenScanned()
|
|
self:ActivateOutput("Scanned", true);
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------
|
|
|
|
DeadBody.FlowEvents =
|
|
{
|
|
Inputs =
|
|
{
|
|
Awake = { DeadBody.Event_Awake, "bool" },
|
|
Hide = { DeadBody.Event_Hide, "bool" },
|
|
UnHide = { DeadBody.Event_UnHide, "bool" },
|
|
},
|
|
Outputs =
|
|
{
|
|
Awake = "bool",
|
|
Hit = "bool",
|
|
Scanned = "bool",
|
|
},
|
|
}
|