5200 lines
148 KiB
C++
5200 lines
148 KiB
C++
// ScriptObjectEntity.cpp: implementation of the CScriptObjectEntity class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include <ISystem.h>
|
|
#include <ILog.h>
|
|
#include <IEntitySystem.h>
|
|
#include <IAISystem.h>
|
|
#include <IAgent.h>
|
|
#include <ICryAnimation.h>
|
|
#include <IGame.h>
|
|
#include <ISound.h>
|
|
#include <IRenderer.h>
|
|
#include <IConsole.h>
|
|
#include "ScriptObjectEntity.h"
|
|
#include <ScriptObjectVector.h>
|
|
#include <CryCharMorphParams.h>
|
|
#include <ILipSync.h>
|
|
#include <ITimer.h>
|
|
//#include "XServer.h"
|
|
//#include "XWeaponSystem.h"
|
|
//#include "XPuppetProxy.h"
|
|
//#include "XVehicleProxy.h"
|
|
//#include "XObjectProxy.h"
|
|
#include "i3dengine.h"
|
|
//#include "TeamMgr.h"
|
|
//#include "XPlayer.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#define MAX_PARTICLES_SLOTS 100
|
|
|
|
_DECLARE_SCRIPTABLEEX(CScriptObjectEntity)
|
|
|
|
#ifdef USE_MEMBER_POS
|
|
IScriptObject *CScriptObjectEntity::m_pObjectPos=NULL;
|
|
IScriptObject *CScriptObjectEntity::m_pObjectAngles=NULL;
|
|
IScriptObject *CScriptObjectEntity::m_pCameraPosition=NULL;
|
|
IScriptObject *CScriptObjectEntity::m_pGenVector=NULL;
|
|
#endif
|
|
|
|
IScriptObject* CScriptObjectEntity::m_memberSO[SOE_MEMBER_LAST];
|
|
|
|
CScriptObjectEntity::CScriptObjectEntity()
|
|
{
|
|
m_nCurrSoundId=-1;
|
|
}
|
|
|
|
CScriptObjectEntity::~CScriptObjectEntity()
|
|
{
|
|
}
|
|
|
|
bool CScriptObjectEntity::Create(IScriptSystem *pScriptSystem, ISystem *pSystem)
|
|
{
|
|
m_pEntitySystem = (IEntitySystem *)pSystem->GetIEntitySystem();
|
|
m_pISystem = pSystem;
|
|
m_pSoundSystem=m_pISystem->GetISoundSystem();
|
|
m_nCurrSoundId=-1;
|
|
Init(pScriptSystem,this);
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->RegisterParent(this);
|
|
|
|
assert(m_pScriptThis);
|
|
return true;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CScriptObjectEntity::SetMemberVector( SOE_MEMBER_LUA_TABLES member,const Vec3 &vec )
|
|
{
|
|
IScriptObject *pVec = m_memberSO[member];
|
|
pVec->BeginSetGetChain();
|
|
pVec->SetValueChain("x",vec.x);
|
|
pVec->SetValueChain("y",vec.y);
|
|
pVec->SetValueChain("z",vec.z);
|
|
pVec->EndSetGetChain();
|
|
}
|
|
|
|
void CScriptObjectEntity::SetEntity(IEntity *pEntity)
|
|
{
|
|
assert(m_pScriptThis);
|
|
m_pEntity=pEntity;
|
|
assert(m_pScriptThis);
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
assert(m_pScriptThis);
|
|
|
|
string sClassname=m_pEntity->GetEntityClassName();
|
|
assert(m_pScriptThis);
|
|
if (!m_pScriptSystem->GetGlobalValue(sClassname.c_str(),*pObj))
|
|
{
|
|
m_pISystem->GetILog()->LogToFile("[FATAL ERROR] Script table %s not found. Probably script was not loaded because of an error.",sClassname.c_str());
|
|
|
|
//return; // vlad: to be able to load level created for xbox
|
|
|
|
CryError("[FATAL ERROR] Script table %s not found. Probably script was not loaded because of an error.",sClassname.c_str());
|
|
|
|
//m_pISystem->GetIConsole()->Exit("[FATAL ERROR] Script table %s not found. Probably script was not loaded because of an error.",sClassname.c_str());
|
|
|
|
//m_pISystem->Quit();
|
|
}
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->Clone(*pObj);
|
|
assert(m_pScriptThis);
|
|
if(m_pEntity!=NULL)
|
|
{
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetValue("id",((int)m_pEntity->GetId()));
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetValue("classid",((int)m_pEntity->GetClassId()));
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetValue("classname",m_pEntity->GetEntityClassName());
|
|
assert(m_pScriptThis);
|
|
}
|
|
else
|
|
{
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetToNull("id");
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetToNull("classid");
|
|
assert(m_pScriptThis);
|
|
m_pScriptThis->SetToNull("classname");
|
|
assert(m_pScriptThis);
|
|
}
|
|
assert(m_pScriptThis);
|
|
}
|
|
|
|
void CScriptObjectEntity::ReleaseTemplate()
|
|
{
|
|
#ifdef USE_MEMBER_POS
|
|
SAFE_RELEASE( m_pObjectPos );
|
|
SAFE_RELEASE( m_pObjectAngles );
|
|
SAFE_RELEASE( m_pCameraPosition );
|
|
SAFE_RELEASE( m_pGenVector );
|
|
#endif
|
|
for (int i = 0; i < SOE_MEMBER_LAST; i++)
|
|
{
|
|
SAFE_RELEASE( m_memberSO[i] );
|
|
}
|
|
|
|
_ScriptableEx<CScriptObjectEntity>::ReleaseTemplate();
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CScriptObjectEntity::InitializeTemplate(IScriptSystem *pSS)
|
|
{
|
|
_ScriptableEx<CScriptObjectEntity>::InitializeTemplate(pSS);
|
|
#ifdef USE_MEMBER_POS
|
|
m_pObjectPos=pSS->CreateObject();
|
|
m_pObjectAngles=pSS->CreateObject();
|
|
m_pCameraPosition=pSS->CreateObject();
|
|
m_pGenVector=pSS->CreateObject();
|
|
#endif
|
|
for (int i = 0; i < SOE_MEMBER_LAST; i++)
|
|
{
|
|
m_memberSO[i] = pSS->CreateObject();
|
|
}
|
|
|
|
REG_FUNC(CScriptObjectEntity,GetPos);
|
|
REG_FUNC(CScriptObjectEntity,GetCenterOfMassPos);
|
|
REG_FUNC(CScriptObjectEntity,SetPos);
|
|
REG_FUNC(CScriptObjectEntity,SetName);
|
|
REG_FUNC(CScriptObjectEntity,GetName);
|
|
REG_FUNC(CScriptObjectEntity,SetAIName);
|
|
REG_FUNC(CScriptObjectEntity,GetAIName);
|
|
REG_FUNC(CScriptObjectEntity,LoadCharacter);
|
|
REG_FUNC(CScriptObjectEntity,PhysicalizeCharacter);
|
|
REG_FUNC(CScriptObjectEntity,KillCharacter);
|
|
REG_FUNC(CScriptObjectEntity,LoadObject);
|
|
REG_FUNC(CScriptObjectEntity,SetObjectPos);
|
|
REG_FUNC(CScriptObjectEntity,GetObjectPos);
|
|
REG_FUNC(CScriptObjectEntity,SetObjectAngles);
|
|
REG_FUNC(CScriptObjectEntity,GetObjectAngles);
|
|
REG_FUNC(CScriptObjectEntity,GetEntitiesInContact)
|
|
REG_FUNC(CScriptObjectEntity,LoadVehicle);
|
|
REG_FUNC(CScriptObjectEntity,DrawObject);
|
|
REG_FUNC(CScriptObjectEntity,CreateParticlePhys);
|
|
REG_FUNC(CScriptObjectEntity,CreateRigidBody);
|
|
REG_FUNC(CScriptObjectEntity,CreateArticulatedBody);
|
|
REG_FUNC(CScriptObjectEntity,CreateRigidBodyPiece);
|
|
REG_FUNC(CScriptObjectEntity,AwakePhysics);
|
|
REG_FUNC(CScriptObjectEntity,ResetPhysics);
|
|
REG_FUNC(CScriptObjectEntity,AwakeCharacterPhysics);
|
|
REG_FUNC(CScriptObjectEntity,CreateStaticEntity);
|
|
REG_FUNC(CScriptObjectEntity,CreateLivingEntity);
|
|
REG_FUNC(CScriptObjectEntity,CreateSoftEntity);
|
|
REG_FUNC(CScriptObjectEntity,SetAngles);
|
|
REG_FUNC(CScriptObjectEntity,GetAngles);
|
|
REG_FUNC(CScriptObjectEntity,Bind);
|
|
REG_FUNC(CScriptObjectEntity,Unbind);
|
|
REG_FUNC(CScriptObjectEntity,IsBound);
|
|
REG_FUNC(CScriptObjectEntity,NetPresent);
|
|
REG_FUNC(CScriptObjectEntity,StartAnimation);
|
|
REG_FUNC(CScriptObjectEntity,ResetAnimation);
|
|
REG_FUNC(CScriptObjectEntity,GetHelperPos);
|
|
REG_FUNC(CScriptObjectEntity,RenderShadow);
|
|
REG_FUNC(CScriptObjectEntity,DrawCharacter);
|
|
REG_FUNC(CScriptObjectEntity,SetRegisterInSectors);
|
|
REG_FUNC(CScriptObjectEntity,CreateParticleEntity);
|
|
REG_FUNC(CScriptObjectEntity,SetPhysicParams);
|
|
REG_FUNC(CScriptObjectEntity,SetCharacterPhysicParams);
|
|
REG_FUNC(CScriptObjectEntity,GetParticleCollisionStatus);
|
|
REG_FUNC(CScriptObjectEntity,GetObjectStatus);
|
|
REG_FUNC(CScriptObjectEntity,SetObjectStatus);
|
|
REG_FUNC(CScriptObjectEntity,GetDirectionVector);
|
|
REG_FUNC(CScriptObjectEntity,IsAnimationRunning);
|
|
REG_FUNC(CScriptObjectEntity,AddImpulse);
|
|
REG_FUNC(CScriptObjectEntity,AddImpulseObj);
|
|
REG_FUNC(CScriptObjectEntity,IsPointWithinRadius);
|
|
REG_FUNC(CScriptObjectEntity,GetDistanceFromPoint);
|
|
REG_FUNC(CScriptObjectEntity,DestroyPhysics);
|
|
REG_FUNC(CScriptObjectEntity,EnablePhysics);
|
|
REG_FUNC(CScriptObjectEntity,EnableSave);
|
|
REG_FUNC(CScriptObjectEntity,TriggerEvent);
|
|
REG_FUNC(CScriptObjectEntity,SetShader);
|
|
REG_FUNC(CScriptObjectEntity,SetSecondShader);
|
|
REG_FUNC(CScriptObjectEntity,GetShader);
|
|
REG_FUNC(CScriptObjectEntity,GetCameraPosition);
|
|
REG_FUNC(CScriptObjectEntity,SetBBox);
|
|
REG_FUNC(CScriptObjectEntity,GetBBox);
|
|
REG_FUNC(CScriptObjectEntity,GetLocalBBox);
|
|
REG_FUNC(CScriptObjectEntity,SetRadius);
|
|
REG_FUNC(CScriptObjectEntity,SetUpdateRadius);
|
|
REG_FUNC(CScriptObjectEntity,GetUpdateRadius);
|
|
REG_FUNC(CScriptObjectEntity,EnableUpdate);
|
|
REG_FUNC(CScriptObjectEntity,SetUpdateIfPotentiallyVisible);
|
|
REG_FUNC(CScriptObjectEntity,SetUpdateType);
|
|
REG_FUNC(CScriptObjectEntity,SetShaderFloat);
|
|
REG_FUNC(CScriptObjectEntity,SetColor);
|
|
REG_FUNC(CScriptObjectEntity,SetStatObjScale);
|
|
REG_FUNC(CScriptObjectEntity,SetAnimationEvent);
|
|
REG_FUNC(CScriptObjectEntity,SetAnimationTime);
|
|
REG_FUNC(CScriptObjectEntity,GetAnimationTime);
|
|
REG_FUNC(CScriptObjectEntity,SetAnimationKeyEvent);
|
|
REG_FUNC(CScriptObjectEntity,DisableAnimationEvent);
|
|
REG_FUNC(CScriptObjectEntity,SetAnimationSpeed);
|
|
REG_FUNC(CScriptObjectEntity,SelectPipe);
|
|
REG_FUNC(CScriptObjectEntity,InsertSubpipe);
|
|
REG_FUNC(CScriptObjectEntity,GetCurAnimation);
|
|
REG_FUNC(CScriptObjectEntity,SetTimer);
|
|
REG_FUNC(CScriptObjectEntity,KillTimer);
|
|
REG_FUNC(CScriptObjectEntity,SetScriptUpdateRate);
|
|
REG_FUNC(CScriptObjectEntity,GetAnimationLength);
|
|
REG_FUNC(CScriptObjectEntity,ReleaseLipSync);
|
|
REG_FUNC(CScriptObjectEntity,DoRandomExpressions);
|
|
REG_FUNC(CScriptObjectEntity,DoExpression);
|
|
REG_FUNC(CScriptObjectEntity,SayDialog);
|
|
REG_FUNC(CScriptObjectEntity,StopDialog);
|
|
REG_FUNC(CScriptObjectEntity,ApplyForceToEnvironment);
|
|
REG_FUNC(CScriptObjectEntity,PlaySound);
|
|
REG_FUNC(CScriptObjectEntity,GetBonePos);
|
|
REG_FUNC(CScriptObjectEntity,GetBoneDir);
|
|
REG_FUNC(CScriptObjectEntity,GetBoneNameFromTable);
|
|
REG_FUNC(CScriptObjectEntity,LoadObjectPiece);
|
|
REG_FUNC(CScriptObjectEntity,GetTouchedSurfaceID);
|
|
REG_FUNC(CScriptObjectEntity,GetTouchedPoint);
|
|
REG_FUNC(CScriptObjectEntity,AttachToBone);
|
|
REG_FUNC(CScriptObjectEntity,AttachObjectToBone);
|
|
REG_FUNC(CScriptObjectEntity,DetachObjectToBone);
|
|
REG_FUNC(CScriptObjectEntity,InitDynamicLight);
|
|
REG_FUNC(CScriptObjectEntity,AddDynamicLight);
|
|
REG_FUNC(CScriptObjectEntity,AddDynamicLight2);
|
|
REG_FUNC(CScriptObjectEntity,RemoveLight);
|
|
REG_FUNC(CScriptObjectEntity,DoHam);
|
|
REG_FUNC(CScriptObjectEntity,ResetHam);
|
|
REG_FUNC(CScriptObjectEntity,LoadBoat);
|
|
REG_FUNC(CScriptObjectEntity,GotoState);
|
|
REG_FUNC(CScriptObjectEntity,IsInState);
|
|
REG_FUNC(CScriptObjectEntity,GetState);
|
|
REG_FUNC(CScriptObjectEntity,RegisterState);
|
|
REG_FUNC(CScriptObjectEntity,IsVisible);
|
|
// REG_FUNC(CScriptObjectEntity,GetBuildingId);
|
|
// REG_FUNC(CScriptObjectEntity,GetSectorId);
|
|
REG_FUNC(CScriptObjectEntity,Damage);
|
|
// REG_FUNC(CScriptObjectEntity,UpdateInSector);
|
|
REG_FUNC(CScriptObjectEntity,GetCameraAngles);
|
|
REG_FUNC(CScriptObjectEntity,ChangeAIParameter);
|
|
// REG_FUNC(CScriptObjectEntity,TranslatePartIdToDeadBody);
|
|
REG_FUNC(CScriptObjectEntity,SetAICustomFloat);
|
|
REG_FUNC(CScriptObjectEntity,ActivatePhysics);
|
|
REG_FUNC(CScriptObjectEntity,CreateParticleEmitter);
|
|
REG_FUNC(CScriptObjectEntity,DeleteParticleEmitter);
|
|
REG_FUNC(CScriptObjectEntity,CreateParticleEmitterEffect );
|
|
REG_FUNC(CScriptObjectEntity,IsAffectedByExplosion);
|
|
REG_FUNC(CScriptObjectEntity,LoadBreakable);
|
|
REG_FUNC(CScriptObjectEntity,BreakEntity);
|
|
REG_FUNC(CScriptObjectEntity,SetMaterial);
|
|
REG_FUNC(CScriptObjectEntity,GetMaterial);
|
|
REG_FUNC(CScriptObjectEntity,SetHandsIKTarget);
|
|
REG_FUNC(CScriptObjectEntity,SetDefaultIdleAnimations);
|
|
REG_FUNC(CScriptObjectEntity,GetVelocity);
|
|
REG_FUNC(CScriptObjectEntity,ApplyImpulseToEnvironment);
|
|
REG_FUNC(CScriptObjectEntity,EnableProp);
|
|
REG_FUNC(CScriptObjectEntity,TrackColliders);
|
|
|
|
REG_FUNC(CScriptObjectEntity,GetViewDistRatio);
|
|
REG_FUNC(CScriptObjectEntity,SetViewDistRatio);
|
|
REG_FUNC(CScriptObjectEntity,SetViewDistUnlimited);
|
|
REG_FUNC(CScriptObjectEntity,RemoveDecals);
|
|
REG_FUNC(CScriptObjectEntity,SwitchLight);
|
|
REG_FUNC(CScriptObjectEntity,ForceCharacterUpdate);
|
|
REG_FUNC(CScriptObjectEntity,Hide);
|
|
REG_FUNC(CScriptObjectEntity,CheckCollisions);
|
|
REG_FUNC(CScriptObjectEntity,AwakeEnvironment);
|
|
REG_FUNC(CScriptObjectEntity,SetStateClientside);
|
|
REG_FUNC(CScriptObjectEntity,NoExplosionCollision);
|
|
|
|
pSS->SetGlobalValue("PHYSICPARAM_FLAGS", PHYSICPARAM_FLAGS);
|
|
pSS->SetGlobalValue("PHYSICPARAM_PARTICLE", PHYSICPARAM_PARTICLE);
|
|
pSS->SetGlobalValue("PHYSICPARAM_VEHICLE", PHYSICPARAM_VEHICLE);
|
|
pSS->SetGlobalValue("PHYSICPARAM_WHEEL", PHYSICPARAM_WHEEL);
|
|
pSS->SetGlobalValue("PHYSICPARAM_SIMULATION", PHYSICPARAM_SIMULATION);
|
|
pSS->SetGlobalValue("PHYSICPARAM_ARTICULATED", PHYSICPARAM_ARTICULATED);
|
|
pSS->SetGlobalValue("PHYSICPARAM_JOINT", PHYSICPARAM_JOINT);
|
|
pSS->SetGlobalValue("PHYSICPARAM_ROPE", PHYSICPARAM_ROPE);
|
|
pSS->SetGlobalValue("PHYSICPARAM_SOFTBODY", PHYSICPARAM_SOFTBODY);
|
|
pSS->SetGlobalValue("PHYSICPARAM_BUOYANCY", PHYSICPARAM_BUOYANCY);
|
|
pSS->SetGlobalValue("PHYSICPARAM_CONSTRAINT", PHYSICPARAM_CONSTRAINT);
|
|
pSS->SetGlobalValue("PHYSICPARAM_REMOVE_CONSTRAINT", PHYSICPARAM_REMOVE_CONSTRAINT);
|
|
pSS->SetGlobalValue("PHYSICPARAM_PLAYERDYN", PHYSICPARAM_PLAYERDYN);
|
|
pSS->SetGlobalValue("PHYSICPARAM_PLAYERDIM", PHYSICPARAM_PLAYERDIM);
|
|
pSS->SetGlobalValue("PHYSICPARAM_VELOCITY", PHYSICPARAM_VELOCITY);
|
|
pSS->SetGlobalValue("PHYSICPARAM_PART_FLAGS", PHYSICPARAM_PART_FLAGS);
|
|
pSS->SetGlobalValue("pef_pushable_by_players", pef_pushable_by_players);
|
|
pSS->SetGlobalValue("pef_monitor_state_changes", pef_monitor_state_changes);
|
|
pSS->SetGlobalValue("pef_monitor_collisions", pef_monitor_collisions);
|
|
pSS->SetGlobalValue("pef_never_affect_triggers", pef_never_affect_triggers);
|
|
pSS->SetGlobalValue("pef_fixed_damping", pef_fixed_damping);
|
|
pSS->SetGlobalValue("lef_push_objects", lef_push_objects);
|
|
pSS->SetGlobalValue("lef_push_players", lef_push_players);
|
|
pSS->SetGlobalValue("particle_single_contact", particle_single_contact);
|
|
pSS->SetGlobalValue("particle_constant_orientation", particle_constant_orientation);
|
|
pSS->SetGlobalValue("particle_no_roll", particle_no_roll);
|
|
pSS->SetGlobalValue("particle_no_path_alignment", particle_no_path_alignment);
|
|
pSS->SetGlobalValue("particle_no_spin", particle_no_spin);
|
|
pSS->SetGlobalValue("pef_traceable", pef_traceable);
|
|
pSS->SetGlobalValue("ref_use_simple_solver", ref_use_simple_solver);
|
|
pSS->SetGlobalValue("particle_traceable", particle_traceable);
|
|
pSS->SetGlobalValue("lef_snap_velocities", lef_snap_velocities);
|
|
pSS->SetGlobalValue("rope_collides", rope_collides);
|
|
pSS->SetGlobalValue("rope_traceable", rope_traceable);
|
|
pSS->SetGlobalValue("geom_colltype_ray", geom_colltype_ray);
|
|
pSS->SetGlobalValue("geom_colltype_vehicle", geom_colltype3);
|
|
pSS->SetGlobalValue("geom_collides", geom_collides);
|
|
pSS->SetGlobalValue("geom_floats", geom_floats);
|
|
pSS->SetGlobalValue("geom_colltype0", geom_colltype0);
|
|
pSS->SetGlobalValue("geom_colltype_player", geom_colltype_player);
|
|
pSS->SetGlobalValue("geom_colltype_explosion", geom_colltype_explosion);
|
|
pSS->SetGlobalValue("ent_static", ent_static);
|
|
pSS->SetGlobalValue("ent_sleeping_rigid", ent_sleeping_rigid);
|
|
pSS->SetGlobalValue("ent_rigid", ent_rigid);
|
|
pSS->SetGlobalValue("ent_living", ent_living);
|
|
pSS->SetGlobalValue("ent_independent", ent_independent);
|
|
pSS->SetGlobalValue("ent_terrain", ent_terrain);
|
|
|
|
pSS->SetGlobalValue( "eUT_Always",eUT_Always );
|
|
pSS->SetGlobalValue( "eUT_InViewRange",eUT_InViewRange );
|
|
pSS->SetGlobalValue( "eUT_PotVisible",eUT_PotVisible );
|
|
pSS->SetGlobalValue( "eUT_Visible",eUT_Visible );
|
|
pSS->SetGlobalValue( "eUT_Physics",eUT_Physics );
|
|
pSS->SetGlobalValue( "eUT_PhysicsVisible",eUT_PhysicsVisible );
|
|
pSS->SetGlobalValue( "eUT_PhysicsPostStep",eUT_PhysicsPostStep );
|
|
pSS->SetGlobalValue( "eUT_Never",eUT_Never );
|
|
pSS->SetGlobalValue( "eUT_Unconditional",eUT_Unconditional );
|
|
|
|
// pSS->SetGlobalValue("BITMASK_PLAYER",BITMASK_PLAYER);
|
|
// pSS->SetGlobalValue("BITMASK_WEAPON",BITMASK_WEAPON);
|
|
// pSS->SetGlobalValue("BITMASK_OBJECT",BITMASK_OBJECT);
|
|
}
|
|
|
|
void CScriptObjectEntity::SetContainer(IScriptObject *pContainer)
|
|
{
|
|
/*if(pContainer!=NULL)
|
|
{
|
|
EnablePropertiesMapping();
|
|
RegisterProperty("cnt",pContainer);
|
|
}*/
|
|
if(pContainer!=NULL)
|
|
m_pScriptThis->SetValue("cnt",pContainer);
|
|
else
|
|
m_pScriptThis->SetToNull("cnt");
|
|
// _SmartScriptObject pCntTest(m_pScriptSystem,true);
|
|
// if(!m_pScriptThis->GetValue("cnt",pCntTest))
|
|
|
|
}
|
|
|
|
/*! Get the position of the entity
|
|
@return Three component vector containing the entity position
|
|
*/
|
|
int CScriptObjectEntity::GetPos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
Vec3 vec;
|
|
#ifndef USE_MEMBER_POS
|
|
CScriptObjectVector oVec(m_pScriptSystem);
|
|
// vec=m_pEntity->GetPos(false);
|
|
vec=m_pEntity->GetPos(true);
|
|
oVec=vec;
|
|
return pH->EndFunction(*oVec);
|
|
#else
|
|
vec=m_pEntity->GetPos(true);
|
|
m_pObjectPos->BeginSetGetChain();
|
|
m_pObjectPos->SetValueChain("x",vec.x);
|
|
m_pObjectPos->SetValueChain("y",vec.y);
|
|
m_pObjectPos->SetValueChain("z",vec.z);
|
|
m_pObjectPos->EndSetGetChain();
|
|
return pH->EndFunction(m_pObjectPos);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
/*! Get the position of the entity's physical center of mass
|
|
@return Three component vector containing the entity's center of mass
|
|
*/
|
|
int CScriptObjectEntity::GetCenterOfMassPos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
pe_status_dynamics sd;
|
|
IPhysicalEntity *pent = m_pEntity->GetPhysics();
|
|
if (pent)
|
|
pent->GetStatus(&sd);
|
|
else
|
|
sd.centerOfMass = m_pEntity->GetPos(true);
|
|
|
|
#ifndef USE_MEMBER_POS
|
|
CScriptObjectVector oVec(m_pScriptSystem);
|
|
// vec=m_pEntity->GetPos(false);
|
|
oVec = sd.centerOfMass;
|
|
return pH->EndFunction(*oVec);
|
|
#else
|
|
m_pGenVector->BeginSetGetChain();
|
|
m_pGenVector->SetValueChain("x",sd.centerOfMass.x);
|
|
m_pGenVector->SetValueChain("y",sd.centerOfMass.y);
|
|
m_pGenVector->SetValueChain("z",sd.centerOfMass.z);
|
|
m_pGenVector->EndSetGetChain();
|
|
return pH->EndFunction(m_pGenVector);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! Set the position of the entity
|
|
@param vec Three component vector containing the entity position
|
|
*/
|
|
int CScriptObjectEntity::SetPos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
Vec3 vec;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
vec=oVec.Get();
|
|
m_pEntity->SetPos(vec, false);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Set the AI name of the entity. Can be different than actual entity name
|
|
@param sName String containing the new AI name
|
|
*/
|
|
int CScriptObjectEntity::SetAIName(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *sName;
|
|
pH->GetParam(1,sName);
|
|
if (m_pEntity->GetAI())
|
|
m_pEntity->GetAI()->SetName(sName);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Set the name of the entity
|
|
@param sName String containing the new entity name
|
|
*/
|
|
int CScriptObjectEntity::SetName(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *sName;
|
|
pH->GetParam(1,sName);
|
|
m_pEntity->SetName(sName);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Get the AI name of the entity. Can be different than entity name.
|
|
@return AI Name of the entity
|
|
*/
|
|
int CScriptObjectEntity::GetAIName(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
string sName;
|
|
if (m_pEntity->GetAI())
|
|
sName=m_pEntity->GetAI()->GetName();
|
|
|
|
return pH->EndFunction(sName.c_str());
|
|
}
|
|
|
|
|
|
|
|
/*! Get the name of the entity
|
|
@return Name of the entity
|
|
*/
|
|
int CScriptObjectEntity::GetName(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
string sName;
|
|
sName=m_pEntity->GetName();
|
|
return pH->EndFunction(sName.c_str());
|
|
}
|
|
|
|
/*! Load an animated character
|
|
@param sFileName File name of the .cid file
|
|
@param nPos Number of the slot for the character
|
|
@see CScriptObjectEntity::StartAnimation
|
|
*/
|
|
int CScriptObjectEntity::LoadCharacter(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
const char *sFileName;
|
|
int nPos;
|
|
pH->GetParam(1,sFileName);
|
|
pH->GetParam(2,nPos);
|
|
|
|
bool bRes=false;
|
|
|
|
if(m_pEntity)
|
|
{
|
|
bRes=m_pEntity->GetCharInterface()->LoadCharacter(nPos,sFileName);
|
|
|
|
/*
|
|
//<<FIXME>> when loading in setplayer model is uncommented, delete this code
|
|
IEntityContainer *pCont = m_pEntity->GetContainer();
|
|
if (pCont)
|
|
{
|
|
CPlayer *pPlayer;
|
|
if (pCont->QueryContainerInterface(CIT_IPLAYER,(void**)&pPlayer))
|
|
pPlayer->SetPlayerModel(sFileName);
|
|
}
|
|
*/
|
|
}
|
|
return pH->EndFunction(bRes);
|
|
}
|
|
|
|
/*!physicalize the character attached to the entity
|
|
@param mass the mass of the entity
|
|
@param surface_idx the material id
|
|
@param stiffness_scale the stiffness scale
|
|
@param nPos slot number of the geometry to physicalize
|
|
*/
|
|
int CScriptObjectEntity::PhysicalizeCharacter(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(4);
|
|
float mass,stiffness_scale;
|
|
int nPos,surface_idx;
|
|
|
|
pH->GetParam(1,mass);
|
|
pH->GetParam(2,surface_idx);
|
|
pH->GetParam(3,stiffness_scale);
|
|
pH->GetParam(4,nPos);
|
|
|
|
|
|
if(m_pEntity)
|
|
{
|
|
IEntityCharacter *pC=m_pEntity->GetCharInterface();
|
|
if(pC)
|
|
{
|
|
ICryCharInstance *pCryCharInstance=pC->GetCharacter(nPos);
|
|
|
|
if(pCryCharInstance)
|
|
{
|
|
pC->PhysicalizeCharacter(nPos, mass,surface_idx,stiffness_scale);
|
|
}
|
|
}
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::KillCharacter(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
// if(m_pGame->p_DeadBody->GetFVal()==0)
|
|
// return pH->EndFunction();
|
|
|
|
int nPos;
|
|
pH->GetParam(1,nPos);
|
|
if (m_pEntity)
|
|
m_pEntity->GetCharInterface()->KillCharacter(nPos);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Load a static object
|
|
@param sFileName File name of the .cgf file
|
|
@param nPos Number of the slot for the character (Zero for first 1st person weapons, one for 3rd person weapons)
|
|
@see CScriptObjectEntity::StartAnimation
|
|
*/
|
|
int CScriptObjectEntity::LoadObject(IFunctionHandler *pH)
|
|
{
|
|
assert((unsigned int)(pH->GetParamCount()-3)<2u);
|
|
const char *sFileName;
|
|
const char *sGeomName;
|
|
int nPos;
|
|
float fScale;
|
|
pH->GetParam(1,sFileName);
|
|
pH->GetParam(2,nPos);
|
|
pH->GetParam(3,fScale);
|
|
if (pH->GetParamCount() > 3)
|
|
pH->GetParam(4,sGeomName);
|
|
else
|
|
sGeomName = 0;
|
|
|
|
if(!sFileName)
|
|
m_pScriptSystem->RaiseError("Entity.LoadObject filename is nil");
|
|
else
|
|
{
|
|
if(m_pEntity)
|
|
m_pEntity->LoadObject(nPos,sFileName,fScale,sGeomName);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::IsAffectedByExplosion(IFunctionHandler *pH)
|
|
{
|
|
float f=0.0f;
|
|
IPhysicalEntity *pPE=m_pEntity->GetPhysics();
|
|
if(pPE)
|
|
{
|
|
IPhysicalWorld *pW=m_pISystem->GetIPhysicalWorld();
|
|
f=pW->IsAffectedByExplosion(pPE);
|
|
}
|
|
return pH->EndFunction(f);
|
|
}
|
|
|
|
int CScriptObjectEntity::LoadObjectPiece(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
const char *sFileName;
|
|
int idx;
|
|
pH->GetParam(1,sFileName);
|
|
pH->GetParam(2,idx);
|
|
if (m_pEntity)
|
|
{
|
|
int res;
|
|
if( idx==-1 )
|
|
res = m_pEntity->LoadObject(0,sFileName,0,"unbreaked");
|
|
else
|
|
{
|
|
char geomname[50];
|
|
sprintf(geomname,"piece%02d",idx);
|
|
res = m_pEntity->LoadObject(0,sFileName,0,geomname);
|
|
if(res)
|
|
{
|
|
sprintf(geomname,"piece%02d_proxy",idx);
|
|
if(m_pEntity->LoadObject(1,sFileName,0,geomname))
|
|
{
|
|
m_pEntity->DrawObject(1, ETY_DRAW_NONE);
|
|
}
|
|
}
|
|
}
|
|
return pH->EndFunction(res);
|
|
}
|
|
return pH->EndFunction(0);
|
|
}
|
|
|
|
/*!return the relative position in the entity space of a certaing geometry(object) attached to the entity
|
|
@param nSlot slot of the geometry
|
|
@return a table with the x,y,z fields that contain the position of the object
|
|
*/
|
|
int CScriptObjectEntity::GetObjectPos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int nSlot;
|
|
Vec3 vPos;
|
|
pH->GetParam(1,nSlot);
|
|
if(m_pEntity->GetObjectPos(nSlot,vPos))
|
|
{
|
|
m_pObjectPos->BeginSetGetChain();
|
|
m_pObjectPos->SetValueChain("x",vPos.x);
|
|
m_pObjectPos->SetValueChain("y",vPos.y);
|
|
m_pObjectPos->SetValueChain("z",vPos.z);
|
|
m_pObjectPos->EndSetGetChain();
|
|
return pH->EndFunction(m_pObjectPos);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!set the relative position in the entity space of a certaing geometry(object) attached to the entity
|
|
@param nSlot slot of the geometry
|
|
@param pPos table with the x,y,z fields that contain the position of the object
|
|
*/
|
|
int CScriptObjectEntity::SetObjectPos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
CScriptObjectVector pPos(m_pScriptSystem,true);
|
|
int nSlot;
|
|
Vec3 vPos;
|
|
pH->GetParam(1,nSlot);
|
|
pH->GetParam(2,pPos);
|
|
vPos=pPos.Get();
|
|
m_pEntity->SetObjectPos(nSlot,vPos);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!return the relative orientation in the entity space of a certaing geometry(object) attached to the entity
|
|
@param nSlot slot of the geometry
|
|
@return a table with the x,y,z fields that contain the orientation of the object(in degrees)
|
|
*/
|
|
int CScriptObjectEntity::GetObjectAngles(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int nSlot;
|
|
Vec3 vAng;
|
|
pH->GetParam(1,nSlot);
|
|
if(m_pEntity->GetObjectAngles(nSlot,vAng))
|
|
{
|
|
m_pObjectAngles->BeginSetGetChain();
|
|
m_pObjectAngles->SetValueChain("x",vAng.x);
|
|
m_pObjectAngles->SetValueChain("y",vAng.y);
|
|
m_pObjectAngles->SetValueChain("z",vAng.z);
|
|
m_pObjectAngles->EndSetGetChain();
|
|
return pH->EndFunction(m_pObjectAngles);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!set the relative orientation in the entity space of a certaing geometry(object) attached to the entity
|
|
@param nSlot slot of the geometry
|
|
@param pPos table with the x,y,z fields that contain the orientation of the object(in degrees)
|
|
*/
|
|
int CScriptObjectEntity::SetObjectAngles(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
CScriptObjectVector pAng(m_pScriptSystem,true);
|
|
int nSlot;
|
|
Vec3 vAng;
|
|
pH->GetParam(1,nSlot);
|
|
pH->GetParam(2,pAng);
|
|
vAng=pAng.Get();
|
|
m_pEntity->SetObjectAngles(nSlot,vAng);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
|
|
/*! Control drawing of static objects
|
|
@param nPos Number of the slot for the character - if negativ - applay to ol objects in entity
|
|
@param nMode 0 = Don't draw, 1 = Draw normally, 3 = Draw near
|
|
@see CScriptObjectEntity::LoadObject
|
|
@see CEntity::DrawObject
|
|
*/
|
|
int CScriptObjectEntity::DrawObject(IFunctionHandler *pH)
|
|
{
|
|
|
|
CHECK_PARAMETERS(2);
|
|
int nPos,nMode;
|
|
pH->GetParam(1,nPos);
|
|
pH->GetParam(2,nMode);
|
|
|
|
if(m_pEntity)
|
|
{
|
|
if( nPos<0 )
|
|
m_pEntity->DrawObject(nMode);
|
|
else
|
|
m_pEntity->DrawObject(nPos,nMode);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Destroys the physics of an entity object
|
|
@see CEntity::DestroyPhysics
|
|
*/
|
|
int CScriptObjectEntity::DestroyPhysics(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
m_pEntity->DestroyPhysics();
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Enables or disables the physics of an entity object
|
|
@param bEnable True will enable physics, false will disable
|
|
@see CEntity::EnablePhysics
|
|
*/
|
|
int CScriptObjectEntity::EnablePhysics(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
bool bEnable;
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->EnablePhysics(bEnable);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateParticlePhys(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(2);
|
|
assert(pH->GetParamCount() == 2 || pH->GetParamCount() == 3);
|
|
float fSize;
|
|
float fMass;
|
|
//int nSurfaceID=m_pGame->m_XSurfaceMgr.GetSurfaceIDByMaterialName("mat_bounce");
|
|
int nSurfaceID=-1;
|
|
int iSingleContact;
|
|
pH->GetParam(1,fSize);
|
|
pH->GetParam(2,fMass);
|
|
if (!pH->GetParam(3, iSingleContact))
|
|
iSingleContact = 1;
|
|
|
|
m_pEntity->CreateParticleEntity(fMass, fSize, Vec3(0, 1, 0), 0, 0, 0, -9.8f, nSurfaceID, iSingleContact != 0);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateRigidBody(IFunctionHandler *pH)
|
|
{
|
|
return CreateRigidOrArticulatedBody(PE_RIGID, pH);
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateArticulatedBody(IFunctionHandler *pH)
|
|
{
|
|
return CreateRigidOrArticulatedBody(PE_ARTICULATED, pH);
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateRigidOrArticulatedBody(pe_type type, IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount() == 3 || pH->GetParamCount() == 4 || pH->GetParamCount() == 5);
|
|
float fDensity;
|
|
float fMass;
|
|
int nSurfaceID=0;
|
|
|
|
if(m_pEntity)
|
|
{
|
|
// Extract the mandatory parameters
|
|
pH->GetParam(1,fDensity);
|
|
pH->GetParam(2,fMass);
|
|
pH->GetParam(3,nSurfaceID);
|
|
|
|
// Check if the optional velocity vector was passed, use the slot nomber
|
|
if(pH->GetParamCount() == 5)
|
|
{
|
|
// Get the direction angles, convert to a direction vector
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(4,*oVec);
|
|
Vec3 vInitialVelocity = oVec.Get();
|
|
int slot = 0;
|
|
pH->GetParam(5,slot);
|
|
m_pEntity->CreateRigidBody(type, fDensity,fMass,nSurfaceID,&vInitialVelocity, slot);
|
|
}
|
|
else if(pH->GetParamCount() == 4)
|
|
{
|
|
// Get the direction angles, convert to a direction vector
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(4,*oVec);
|
|
Vec3 vInitialVelocity = oVec.Get();
|
|
m_pEntity->CreateRigidBody(type, fDensity,fMass,nSurfaceID,&vInitialVelocity);
|
|
}
|
|
else
|
|
{
|
|
m_pEntity->CreateRigidBody(type, fDensity,fMass,nSurfaceID);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateRigidBodyPiece(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount() == 3 || pH->GetParamCount() == 4);
|
|
float fDensity;
|
|
float fMass;
|
|
int nSurfaceID=0;
|
|
|
|
if(m_pEntity)
|
|
{
|
|
// Extract the mandatory parameters
|
|
pH->GetParam(1,fDensity);
|
|
pH->GetParam(2,fMass);
|
|
pH->GetParam(3,nSurfaceID);
|
|
|
|
Vec3 vInitialVelocity(0,0,0);
|
|
CEntityObject obj;
|
|
if(m_pEntity->GetEntityObject(1, obj)) // there is object in slot 1 - it is proxy
|
|
m_pEntity->CreateRigidBody(PE_RIGID, fDensity,fMass,nSurfaceID,&vInitialVelocity, 1);
|
|
else
|
|
m_pEntity->CreateRigidBody(PE_RIGID, fDensity,fMass,nSurfaceID,&vInitialVelocity, 0);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::CreateStaticEntity(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(2);
|
|
assert((unsigned int)pH->GetParamCount()-1u<3u);
|
|
|
|
float fMass;
|
|
int nSurfaceID=-1;
|
|
int nSlotToUse=-1;
|
|
pH->GetParam(1,fMass);
|
|
pH->GetParam(2,nSurfaceID);
|
|
if(pH->GetParamCount() == 3)
|
|
pH->GetParam(3,nSlotToUse);
|
|
|
|
if(m_pEntity)
|
|
m_pEntity->CreateStaticEntity(fMass,nSurfaceID,nSlotToUse);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::CreateSoftEntity(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount()>=2);
|
|
float fMass,fDensity;
|
|
int bCloth=1;
|
|
IEntity *pEnt;
|
|
IPhysicalEntity *pPhysEnt = WORLD_ENTITY;
|
|
int idEnt,iPart=-1;
|
|
pH->GetParam(1,fMass);
|
|
pH->GetParam(2,fDensity);
|
|
pH->GetParam(3, bCloth);
|
|
if (pH->GetParam(4, idEnt) && idEnt>=0 && (pEnt = m_pEntitySystem->GetEntity(idEnt)))
|
|
if (!(pPhysEnt = pEnt->GetPhysics()))
|
|
pPhysEnt = WORLD_ENTITY;
|
|
pH->GetParam(5, iPart);
|
|
|
|
m_pEntity->CreateSoftEntity(fMass,fDensity, bCloth!=0, pPhysEnt,iPart);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!set the orientation of the entity in world space
|
|
@param a table containing the x,y,z fields that specify the orientation of the entity(in degrees)
|
|
@param notify physics flag
|
|
|
|
*/
|
|
int CScriptObjectEntity::SetAngles(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(1);
|
|
int parCount = pH->GetParamCount();
|
|
assert(parCount>0 && parCount<3);
|
|
Vec3 vec;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
vec=oVec.Get();
|
|
if(parCount == 1)
|
|
m_pEntity->SetAngles(vec);
|
|
else
|
|
m_pEntity->SetAngles(vec,true,false);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!set the scale of the geometry objects attached to the entity
|
|
@param fScale the scale of the objects
|
|
*/
|
|
int CScriptObjectEntity::SetStatObjScale(IFunctionHandler *pH)
|
|
{
|
|
float fScale;
|
|
CHECK_PARAMETERS(1);
|
|
pH->GetParam(1, fScale);
|
|
m_pEntity->SetScale(fScale);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*!get the orientation of the entity in world space
|
|
@param [optional] if the parameter is present return the real angles if not the entity angles
|
|
NOTE: if the entity is bound to another parent entity the real angles are the absolute angles
|
|
if is not bound there is no difference
|
|
@return a table containing the x,y,z fields that specify the orientation of the entity(in degrees)
|
|
*/
|
|
int CScriptObjectEntity::GetAngles(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(0);
|
|
assert(pH->GetParamCount() == 0 || pH->GetParamCount() == 1);
|
|
|
|
Ang3 vec;
|
|
if(pH->GetParamCount() == 0)
|
|
vec=m_pEntity->GetAngles(0);
|
|
else
|
|
vec=m_pEntity->GetAngles(1);
|
|
vec.Snap360();
|
|
|
|
|
|
m_pObjectAngles->BeginSetGetChain();
|
|
m_pObjectAngles->SetValueChain("x",vec.x);
|
|
m_pObjectAngles->SetValueChain("y",vec.y);
|
|
m_pObjectAngles->SetValueChain("z",vec.z);
|
|
m_pObjectAngles->EndSetGetChain();
|
|
return pH->EndFunction(m_pObjectAngles);
|
|
}
|
|
|
|
// Get Forward direction if no parameters
|
|
// if parameter is passed - get Up direction
|
|
// [filippo]: now more complete, if the param is specified we can get the axis we want.
|
|
int CScriptObjectEntity::GetDirectionVector(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(0);
|
|
assert(pH->GetParamCount() == 0 || pH->GetParamCount() == 1);
|
|
|
|
//forward default
|
|
Vec3 vec(0,-1,0);
|
|
|
|
//if there is a parameter we want to get something different by the forward vector, 0=x, 1=y, 2=z
|
|
if( pH->GetParamCount()==1 )
|
|
{
|
|
int dir;
|
|
pH->GetParam(1,dir);
|
|
|
|
switch(dir)
|
|
{
|
|
default:
|
|
case 0:
|
|
vec.Set(0,-1,0);//forward
|
|
break;
|
|
case 1:
|
|
vec.Set(-1,0,0);//right
|
|
break;
|
|
case 2:vec.Set(0,0,1);//up
|
|
break;
|
|
}
|
|
}
|
|
|
|
//CScriptObjectVector oVec(m_pScriptSystem);
|
|
|
|
//vec = m_pEntity->GetAngles();
|
|
|
|
Matrix44 tm;
|
|
tm.SetIdentity();
|
|
//tm.RotateMatrix_fix( m_pEntity->GetAngles() );
|
|
tm=Matrix44::CreateRotationZYX(-m_pEntity->GetAngles()*gf_DEGTORAD)*tm; //NOTE: angles in radians and negated
|
|
|
|
//CHANGED_BY_IVO
|
|
//vec = tm.TransformVector(vec);
|
|
vec = GetTransposed44(tm)*vec;
|
|
|
|
m_pObjectAngles->BeginSetGetChain();
|
|
m_pObjectAngles->SetValue("x",vec.x);
|
|
m_pObjectAngles->SetValue("y",vec.y);
|
|
m_pObjectAngles->SetValue("z",vec.z);
|
|
m_pObjectAngles->EndSetGetChain();
|
|
//vec.ConvertToRadAngles();
|
|
//oVec=vec;
|
|
return pH->EndFunction(m_pObjectAngles);
|
|
}
|
|
|
|
int CScriptObjectEntity::AttachObjectToBone(IFunctionHandler *pH)
|
|
{
|
|
//CHECK_PARAMETERS(2); can be 2 or 3 or 4 params.
|
|
|
|
char *boneName;
|
|
int slot;
|
|
bool bMultipleAttachments = false;
|
|
bool bUseZOffset = false;
|
|
pH->GetParam(1,slot);
|
|
pH->GetParam(2,boneName);
|
|
|
|
if (!pH->GetParam(3,bMultipleAttachments))
|
|
bMultipleAttachments = false;
|
|
|
|
if (pH->GetParamCount()>=4 && !pH->GetParam(4,bUseZOffset))
|
|
bUseZOffset = false;
|
|
|
|
BoneBindHandle boneHandler = m_pEntity->AttachObjectToBone(slot, boneName,bMultipleAttachments, bUseZOffset);
|
|
|
|
if (boneHandler == -1)
|
|
{
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
if (bMultipleAttachments)
|
|
{
|
|
// Make user data for bone handler.
|
|
USER_DATA ud = m_pScriptSystem->CreateUserData( boneHandler,USER_DATA_BONEHANDLER );
|
|
return pH->EndFunction(ud);
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::DetachObjectToBone(IFunctionHandler *pH)
|
|
{
|
|
//CHECK_PARAMETERS(1); Can be 1 or 2 params.
|
|
|
|
char *boneName;
|
|
pH->GetParam(1,boneName);
|
|
|
|
int BAD_HANDLER = -1;
|
|
int nCookie;
|
|
INT_PTR boneHandler = BAD_HANDLER;
|
|
|
|
if (!pH->GetParamUDVal(2,boneHandler,nCookie))
|
|
{
|
|
boneHandler = BAD_HANDLER;
|
|
}
|
|
if (nCookie != USER_DATA_BONEHANDLER)
|
|
{
|
|
boneHandler = BAD_HANDLER;
|
|
}
|
|
|
|
m_pEntity->DetachObjectToBone(boneName,boneHandler );
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
|
|
int CScriptObjectEntity::AttachToBone(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
|
|
char *boneName;
|
|
int nID;
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
pH->GetParam(1,*pObj);
|
|
pH->GetParam(2,boneName);
|
|
pObj->GetValue("id",nID);
|
|
|
|
m_pEntity->AttachToBone(nID, boneName);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::Bind(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount() == 1 || pH->GetParamCount() == 2);
|
|
// CHECK_PARAMETERS(1);
|
|
int nID;
|
|
int cParam=0;
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
pH->GetParam(1,*pObj);
|
|
//optional
|
|
pH->GetParam(2,cParam);
|
|
pObj->GetValue("id",nID);
|
|
|
|
//m_pEntity->Bind(nID);
|
|
//CXServer *pSrv=m_pGame->GetServer();
|
|
//if(pSrv)
|
|
//{
|
|
m_pEntity->Bind(nID,cParam);
|
|
//pSrv->BindEntity(m_pEntity->GetId(),nID,(unsigned char)cParam);
|
|
//}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::Unbind(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount() == 1 || pH->GetParamCount() == 2);
|
|
// CHECK_PARAMETERS(1);
|
|
int nID;
|
|
int cParam=0;
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
pH->GetParam(1,*pObj);
|
|
//optional
|
|
pH->GetParam(2,cParam);
|
|
pObj->GetValue("id",nID);
|
|
//m_pEntity->Unbind(nID);
|
|
//CXServer *pSrv=m_pGame->GetServer();
|
|
//if(pSrv)
|
|
//{
|
|
m_pEntity->Unbind(nID,cParam);
|
|
//pSrv->UnbindEntity(m_pEntity->GetId(),nID,(unsigned char)cParam);
|
|
//}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::IsBound(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
bool bRes;
|
|
bRes=m_pEntity->IsBound();
|
|
if(bRes)
|
|
return pH->EndFunction(1);
|
|
else
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateParticleEntity(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
_SmartScriptObject pTable(m_pScriptSystem, true);
|
|
pH->GetParam(1, *pTable);
|
|
float Size, Mass;
|
|
Vec3 Heading;
|
|
float Thrust, Resistance, Lift, Gravity;
|
|
int Surface;
|
|
bool b;
|
|
pTable->GetValue("size", Size);
|
|
pTable->GetValue("mass", Mass);
|
|
CScriptObjectVector oVecHeading(m_pScriptSystem, true);
|
|
pTable->GetValue("heading", *oVecHeading);
|
|
Heading = oVecHeading.Get();
|
|
pTable->GetValue("acc_thrust", Thrust);
|
|
pTable->GetValue("k_air_resistance", Resistance);
|
|
pTable->GetValue("acc_lift", Lift);
|
|
pTable->GetValue("gravity", Gravity);
|
|
pTable->GetValue("surface_idx", Surface);
|
|
pTable->GetValue("constant_orientation",b);
|
|
|
|
m_pEntity->CreateParticleEntity(Size, Mass, Heading, Thrust, Resistance, Lift, Gravity, (b?particle_constant_orientation:0));
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
//<<<FIXME>>> pass the correct surface id from script
|
|
int CScriptObjectEntity::CreateLivingEntity(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
_SmartScriptObject pTable(m_pScriptSystem,true);
|
|
int nSurfaceID=0;
|
|
pH->GetParam(1,*pTable);
|
|
float mass,height,eyeh,sph,rad,grav,aircontrol;
|
|
int collide = 0;
|
|
|
|
pTable->GetValue("mass",mass);
|
|
pTable->GetValue("height",height);
|
|
pTable->GetValue("eyeheight",eyeh);
|
|
pTable->GetValue("sphereheight",sph);
|
|
pTable->GetValue("radius",rad);
|
|
if (!pTable->GetValue("gravity",grav))
|
|
grav = 9.81f;
|
|
if (!pTable->GetValue("aircontrol",aircontrol))
|
|
aircontrol = 0.f;
|
|
if (!pTable->GetValue("collide",collide))
|
|
collide = 0;
|
|
|
|
pH->GetParam(2,nSurfaceID);
|
|
|
|
//<<FIXME>> give the entity system access to the material enumrator
|
|
// nSurfaceID=m_pGame->m_XSurfaceMgr.GetSurfaceIDByMaterialName("mat_meat");
|
|
|
|
m_pEntity->CreateLivingEntity(mass,height,eyeh,sph,rad,nSurfaceID,grav,aircontrol, collide!=0);
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::LoadVehicle(IFunctionHandler *pH)
|
|
{
|
|
//CHECK_PARAMETERS(1);
|
|
_SmartScriptObject pTable(m_pScriptSystem,true);
|
|
pH->GetParam(1,*pTable);
|
|
bool bDestroy=false;
|
|
if (pH->GetParamCount()>1)
|
|
pH->GetParam(2,bDestroy);
|
|
|
|
const char *filename;
|
|
std::vector<pe_cargeomparams> pparts;
|
|
|
|
pe_params_car params;
|
|
|
|
pTable->GetValue("file",filename);
|
|
pTable->GetValue("engine_power",params.enginePower);
|
|
//pTable->GetValue("engine_power_back",params.enginePowerBack);
|
|
pTable->GetValue("engine_maxrpm",params.engineMaxRPM);
|
|
pTable->GetValue("axle_friction",params.axleFriction);
|
|
pTable->GetValue("max_steer",params.maxSteer);
|
|
pTable->GetValue("integration_type",params.iIntegrationType);
|
|
pTable->GetValue("max_time_step_vehicle",params.maxTimeStep);
|
|
float velSleep;
|
|
if (pTable->GetValue("sleep_speed_vehicle",velSleep))
|
|
params.minEnergy = velSleep*velSleep;
|
|
pTable->GetValue("damping_vehicle",params.damping);
|
|
|
|
int i=2;
|
|
char str[255];
|
|
sprintf(str,"hull1");
|
|
_SmartScriptObject pHull(m_pScriptSystem,true);
|
|
while (pTable->GetValue(str,*pHull))
|
|
{
|
|
pe_cargeomparams pone;
|
|
pHull->GetValue("mass",pone.mass);
|
|
pHull->GetValue("flags",(int&)pone.flags);
|
|
pHull->GetValue("yoffset",pone.pos.y);
|
|
pHull->GetValue("zoffset",pone.pos.z);
|
|
pone.flagsCollider = geom_colltype3;
|
|
sprintf(str,"hull%d",i++);
|
|
pparts.push_back(pone);
|
|
//if (i==5) break;
|
|
}
|
|
|
|
i=2;
|
|
sprintf(str,"wheel1");
|
|
while (pTable->GetValue(str,*pHull))
|
|
{
|
|
pe_cargeomparams pone;
|
|
pone.density = 5000;
|
|
pone.flagsCollider = geom_colltype3;
|
|
pHull->GetValue("driving",pone.bDriving);
|
|
pHull->GetValue("axle",pone.iAxle);
|
|
pHull->GetValue("can_brake",pone.bCanBrake);
|
|
|
|
pHull->GetValue("len_max",pone.lenMax);
|
|
pHull->GetValue("stiffness",pone.kStiffness);
|
|
pHull->GetValue("damping",pone.kDamping);
|
|
|
|
pHull->GetValue("surface_id", pone.surface_idx);
|
|
pHull->GetValue("min_friction", pone.minFriction);
|
|
pHull->GetValue("max_friction", pone.maxFriction);
|
|
sprintf(str,"wheel%d",i++);
|
|
pparts.push_back(pone);
|
|
//if (i==5) break;
|
|
}
|
|
|
|
|
|
if (m_pEntity->LoadVehicle(filename,&pparts[0],¶ms,bDestroy))
|
|
{
|
|
// get the steering wheel (if any)
|
|
int nSlot=m_pEntity->GetSteeringWheelSlot();
|
|
if (nSlot>=0)
|
|
{
|
|
// set the correct position the first time
|
|
// since the steering wheel is at pos. 0,0,0
|
|
Vec3 vCurrAngles;
|
|
m_pEntity->GetObjectAngles(nSlot,vCurrAngles);
|
|
vCurrAngles.y=0; //reset
|
|
|
|
Vec3 vRotPointObjSpace;
|
|
m_pEntity->GetHelperPosition("steering_pivot",vRotPointObjSpace,true);
|
|
m_pEntity->SetObjectPos(nSlot,vRotPointObjSpace);
|
|
m_pEntity->SetObjectAngles(nSlot,vCurrAngles);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::NetPresent(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
bool bPresence;
|
|
|
|
pH->GetParam(1,bPresence);
|
|
m_pEntity->SetNetPresence(bPresence);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
// true=prevents error when state changes on the client and does not sync state changes to the client
|
|
int CScriptObjectEntity::SetStateClientside(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
bool bEnable;
|
|
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->SetStateClientside(bEnable);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
/*! Starts an animation of a character
|
|
@param pos Number of the character slot
|
|
@param animname Name of the aniamtion from the .cal file
|
|
@see CScriptObjectEntity::LoadCharacter
|
|
@see CEntity::StartAnimation
|
|
*/
|
|
int CScriptObjectEntity::StartAnimation(IFunctionHandler *pH)
|
|
{
|
|
|
|
//CHECK_PARAMETERS(2);
|
|
const char *animname;
|
|
int pos, layer=0;
|
|
bool bLooping = false;
|
|
bool bLoopSpecified = false;
|
|
float fBlendTime = 0.15f;
|
|
float fAniSpeed = 1.0f;
|
|
pH->GetParam(1,pos);
|
|
if (!pH->GetParam(2,animname))
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"CScriptObjectEntity::StartAnimation, animation name not specified, in Entity %s",m_pEntity->GetName() );
|
|
return pH->EndFunction(false);
|
|
}
|
|
|
|
if (pH->GetParamCount() > 2)
|
|
{
|
|
pH->GetParam(3,layer);
|
|
if (pH->GetParamCount() > 3)
|
|
{
|
|
pH->GetParam(4,fBlendTime);
|
|
if (pH->GetParamCount() > 4)
|
|
{
|
|
pH->GetParam(5,fAniSpeed);
|
|
m_pEntity->SetAnimationSpeed( fAniSpeed );
|
|
if (pH->GetParamCount() > 5)
|
|
{
|
|
bLoopSpecified = true;
|
|
pH->GetParam(6,bLooping);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// no character no animation
|
|
if (!m_pEntity->GetCharInterface() || !m_pEntity->GetCharInterface()->GetCharacter(pos))
|
|
return pH->EndFunction(false);
|
|
|
|
|
|
if (bLoopSpecified)
|
|
{
|
|
ICryCharInstance *pCharacter = m_pEntity->GetCharInterface()->GetCharacter(pos);
|
|
if (pCharacter)
|
|
{
|
|
ICryAnimationSet *animSet = pCharacter->GetModel()->GetAnimationSet();
|
|
if (animSet)
|
|
{
|
|
int animId = animSet->Find(animname);
|
|
if (animId >= 0)
|
|
animSet->SetLoop( animId,bLooping );
|
|
}
|
|
}
|
|
}
|
|
|
|
if (string(animname) == string("NULL"))
|
|
{
|
|
ICryCharInstance *pCharacter = m_pEntity->GetCharInterface()->GetCharacter(pos);
|
|
bool result = pCharacter->StopAnimation(layer);
|
|
return pH->EndFunction(result);
|
|
}
|
|
|
|
|
|
bool result = m_pEntity->StartAnimation(pos, animname, layer, fBlendTime);
|
|
return pH->EndFunction(result);
|
|
|
|
// return pH->EndFunction(m_pEntity->StartAnimation(pos, animname, layer, fBlendTime));
|
|
|
|
// m_pEntity->StartAnimation(pos, animname, layer, fBlendTime);
|
|
// return pH->EndFunction();
|
|
}
|
|
|
|
/*! Resets the animation of a character
|
|
@param pos Number of the character slot
|
|
@see CScriptObjectEntity::LoadCharacter
|
|
@see CEntity::StartAnimation
|
|
*/
|
|
int CScriptObjectEntity::ResetAnimation(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
// char *animname;
|
|
int pos;
|
|
pH->GetParam(1,pos);
|
|
|
|
m_pEntity->ResetAnimations(pos);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*int CScriptObjectEntity::GetID(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
|
|
|
|
int id = m_pEntity->GetId();
|
|
|
|
return pH->EndFunction(id);
|
|
}*/
|
|
|
|
|
|
/*! Retrieves the position of a helper (placeholder) object
|
|
@param helper Name of the helper object in the model
|
|
@return Three component vector cotaining the position
|
|
*/
|
|
int CScriptObjectEntity::GetHelperPos(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(1);
|
|
assert(pH->GetParamCount() == 1 || pH->GetParamCount() == 2);
|
|
|
|
const char *helper;
|
|
bool bUseObjectSpace = false;
|
|
|
|
pH->GetParam(1, helper);
|
|
|
|
if(pH->GetParamCount() == 2)
|
|
{
|
|
pH->GetParam(2, bUseObjectSpace);
|
|
}
|
|
|
|
Vec3 pos;
|
|
pos(0,0,0);
|
|
|
|
m_pEntity->GetHelperPosition(helper, pos, bUseObjectSpace);
|
|
|
|
// CScriptObjectVector oVec(m_pScriptSystem);
|
|
// oVec.Set(pos);
|
|
// return pH->EndFunction(*oVec);
|
|
|
|
SetMemberVector( SOE_MEMBER_HELPER_POS,pos );
|
|
return pH->EndFunction( m_memberSO[SOE_MEMBER_HELPER_POS] );
|
|
}
|
|
|
|
int CScriptObjectEntity::RenderShadow(IFunctionHandler *pH)
|
|
{
|
|
|
|
if(pH->GetParamCount()<1)
|
|
{
|
|
m_pScriptSystem->RaiseError("CScriptObjectEntity::RenderShadow wrong number of arguments");
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
bool bRender;
|
|
pH->GetParam(1,bRender);
|
|
|
|
int iEntityRender=-1;
|
|
if(pH->GetParamCount()>1)
|
|
{
|
|
pH->GetParam(2, iEntityRender);
|
|
}
|
|
|
|
// tiago: ok, hacked this, since i don't know if fixing this will break stuff, so correct way of using RenderShadow is to pass second parameter
|
|
// with on/off, and keep first parameter just in case..
|
|
|
|
// m_pEntity->SetRndFlags(ERF_CASTSHADOWVOLUME|ERF_SELFSHADOW|ERF_CASTSHADOWMAPS|ERF_RECVSHADOWMAPS, true);
|
|
|
|
if(iEntityRender==-1)
|
|
{
|
|
m_pEntity->SetRndFlags(ERF_CASTSHADOWVOLUME|ERF_SELFSHADOW|ERF_CASTSHADOWMAPS|ERF_RECVSHADOWMAPS, true);
|
|
}
|
|
else
|
|
{
|
|
m_pEntity->SetRndFlags(ERF_CASTSHADOWVOLUME|ERF_SELFSHADOW|ERF_CASTSHADOWMAPS|ERF_RECVSHADOWMAPS, (iEntityRender==1)? true:false);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
|
|
}
|
|
/*! Controls the visibility and drawing of characters
|
|
@param nPos Number of the character slot
|
|
@param nMode 0 = Don't draw, 1 = Draw normally, 3 = Draw near
|
|
@see CScriptObjectEntity::LoadCharacter
|
|
*/
|
|
int CScriptObjectEntity::DrawCharacter(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
|
|
int nPos,nMode;
|
|
pH->GetParam(1,nPos);
|
|
pH->GetParam(2,nMode);
|
|
|
|
if(m_pEntity)
|
|
{
|
|
//((IEntityCharacter *)m_pEntity)->DrawCharacter(nPos, nMode == 1);
|
|
m_pEntity->GetCharInterface()->DrawCharacter(nPos, nMode );
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetRegisterInSectors(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
bool bFlag;
|
|
pH->GetParam(1,bFlag);
|
|
|
|
if(m_pEntity)
|
|
{
|
|
(m_pEntity)->SetRegisterInSectors(bFlag);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::AwakePhysics(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
IPhysicalEntity *pe=m_pEntity->GetPhysics();
|
|
if (!pe)
|
|
return pH->EndFunction();
|
|
|
|
int nAwake = 1;
|
|
pH->GetParam(1,nAwake);
|
|
|
|
if(m_pEntity)
|
|
{
|
|
pe_action_awake aa;
|
|
aa.bAwake = nAwake;
|
|
pe->Action(&aa);
|
|
|
|
//pe_params_pos p;
|
|
//p.iSimClass = nAwake+1;
|
|
//pe->SetParams( &p );
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::ResetPhysics(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
IPhysicalEntity *pe=m_pEntity->GetPhysics();
|
|
if (!pe)
|
|
return pH->EndFunction();
|
|
|
|
pe_action_reset ra;
|
|
pe->Action(&ra);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::AwakeCharacterPhysics(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount()==2 || pH->GetParamCount()==3);
|
|
int iSlot,nAwake=1;
|
|
pe_action_awake aa;
|
|
const char *pRootBoneName;
|
|
pH->GetParam(1, iSlot);
|
|
pH->GetParam(2, pRootBoneName);
|
|
pH->GetParam(3, aa.bAwake);
|
|
|
|
IPhysicalEntity *pe;
|
|
if (m_pEntity && m_pEntity->GetCharInterface() && m_pEntity->GetCharInterface()->GetCharacter(iSlot) &&
|
|
(pe = m_pEntity->GetCharInterface()->GetCharacter(iSlot)->GetCharacterPhysics(pRootBoneName)))
|
|
pe->Action(&aa);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetCharacterPhysicParams(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(4);
|
|
int iSlot;
|
|
const char *pRootBoneName;
|
|
pH->GetParam(1, iSlot);
|
|
pH->GetParam(2, pRootBoneName);
|
|
|
|
IPhysicalEntity *pe;
|
|
if (!m_pEntity || !m_pEntity->GetCharInterface() || !m_pEntity->GetCharInterface()->GetCharacter(iSlot) ||
|
|
!(pe = m_pEntity->GetCharInterface()->GetCharacter(iSlot)->GetCharacterPhysics(pRootBoneName)))
|
|
return pH->EndFunction();
|
|
|
|
return SetEntityPhysicParams(pe, pH,2, m_pEntity->GetCharInterface()->GetCharacter(iSlot));
|
|
}
|
|
|
|
int CScriptObjectEntity::SetPhysicParams(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
IPhysicalEntity *pe=m_pEntity->GetPhysics();
|
|
if (!pe)
|
|
return pH->EndFunction();
|
|
|
|
return SetEntityPhysicParams(pe, pH);
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::SetEntityPhysicParams(IPhysicalEntity *pe, IFunctionHandler *pH,int iOffs, ICryCharInstance *pIChar)
|
|
{
|
|
int nType;
|
|
pH->GetParam(1+iOffs, nType);
|
|
CScriptObjectVector vec(m_pScriptSystem,true);
|
|
_SmartScriptObject pTable(m_pScriptSystem,true);
|
|
_SmartScriptObject pTempObj(m_pScriptSystem,true);
|
|
pH->GetParam(2+iOffs, *pTable);
|
|
int nId;
|
|
pe_params_particle particle_params;
|
|
pe_simulation_params sim_params;
|
|
pe_params_car vehicle_params;
|
|
pe_params_wheel wheel_params;
|
|
pe_player_dynamics playerdyn_params;
|
|
pe_player_dimensions playerdim_params;
|
|
pe_params_articulated_body artic_params;
|
|
pe_params_joint joint_params;
|
|
pe_params_rope rope_params,rope_params1;
|
|
pe_params_softbody soft_params;
|
|
pe_params_buoyancy buoy_params;
|
|
pe_action_add_constraint constr_params;
|
|
pe_action_remove_constraint remove_constr_params;
|
|
pe_params_flags flags_params;
|
|
pe_action_set_velocity asv;
|
|
pe_params_part pp;
|
|
const char *strName;
|
|
int idEnt;
|
|
IEntity *pEnt;
|
|
ICryBone *pBone;
|
|
float gears[8];
|
|
//float fDummy;
|
|
vectorf gravity(zero); float fSpeed;
|
|
|
|
switch (nType)
|
|
{
|
|
case PHYSICPARAM_FLAGS:
|
|
if (pTable->GetValue("flags_mask", (int&)flags_params.flagsAND))
|
|
{
|
|
flags_params.flagsAND = ~flags_params.flagsAND;
|
|
pTable->GetValue("flags", (int&)flags_params.flagsOR);
|
|
}
|
|
else
|
|
pTable->GetValue("flags", (int&)flags_params.flags);
|
|
pe->SetParams(&flags_params);
|
|
break;
|
|
case PHYSICPARAM_PART_FLAGS:
|
|
if (pTable->GetValue("flags_mask", (int&)pp.flagsAND))
|
|
pp.flagsAND = ~pp.flagsAND;
|
|
pTable->GetValue("flags", (int&)pp.flagsOR);
|
|
if (pTable->GetValue("flags_collider_mask", (int&)pp.flagsColliderAND))
|
|
pp.flagsColliderAND = ~pp.flagsColliderAND;
|
|
pTable->GetValue("flags_collider", (int&)pp.flagsColliderOR);
|
|
if (!pTable->GetValue("partid",pp.partid))
|
|
pp.ipart = 0;
|
|
do {
|
|
if (!pe->SetParams(&pp))
|
|
break;
|
|
pp.ipart++;
|
|
} while(is_unused(pp.partid));
|
|
break;
|
|
case PHYSICPARAM_PARTICLE:
|
|
pTable->GetValue("flags", (int&)particle_params.flags);
|
|
pTable->GetValue("mass", particle_params.mass);
|
|
pTable->GetValue("size", particle_params.size);
|
|
if (pTable->GetValue("heading", *vec) && fabsf(vec.Get().GetLengthSquared()-1.0f)<0.01f)
|
|
particle_params.heading=(vectorf)vec.Get();
|
|
pTable->GetValue("initial_velocity", particle_params.velocity);
|
|
pTable->GetValue("k_air_resistance", particle_params.kAirResistance);
|
|
pTable->GetValue("k_water_resistance",particle_params.kWaterResistance);
|
|
pTable->GetValue("acc_thrust", particle_params.accThrust);
|
|
pTable->GetValue("acc_lift", particle_params.accLift);
|
|
pTable->GetValue("min_bounce_vel", particle_params.minBounceVel);
|
|
pTable->GetValue("surface_idx", particle_params.surface_idx);
|
|
pTable->GetValue("pierceability", particle_params.iPierceability);
|
|
if (pTable->GetValue("w", *vec))
|
|
particle_params.wspin=(vectorf)vec.Get();
|
|
if (pTable->GetValue("gravity", *vec))
|
|
particle_params.gravity=(vectorf)vec.Get();
|
|
if (pTable->GetValue("water_gravity", *vec))
|
|
particle_params.waterGravity=(vectorf)vec.Get();
|
|
if (pTable->GetValue("collider_to_ignore", *pTempObj))
|
|
{
|
|
if (pTempObj->GetValue("id",nId))
|
|
{
|
|
IEntity *pEntity=m_pEntitySystem->GetEntity((EntityId)nId);
|
|
if (pEntity)
|
|
particle_params.pColliderToIgnore=pEntity->GetPhysics();
|
|
}
|
|
}
|
|
{
|
|
bool bconstant_orientation=false;
|
|
pTable->GetValue("constant_orientation", bconstant_orientation);
|
|
if(bconstant_orientation){
|
|
particle_params.flags=particle_constant_orientation|particle_no_path_alignment|particle_no_roll|particle_traceable|particle_single_contact;
|
|
}
|
|
}
|
|
pe->SetParams(&particle_params);
|
|
// m_RocketParticlePar = particle_params;
|
|
break;
|
|
case PHYSICPARAM_VEHICLE:
|
|
pTable->GetValue("axle_friction", vehicle_params.axleFriction);
|
|
pTable->GetValue("engine_power", vehicle_params.enginePower);
|
|
pTable->GetValue("max_steer", vehicle_params.maxSteer);
|
|
pTable->GetValue("engine_maxrpm", vehicle_params.engineMaxRPM);
|
|
pTable->GetValue("engine_maxRPM", vehicle_params.engineMaxRPM);
|
|
pTable->GetValue("intergration_type", vehicle_params.iIntegrationType);
|
|
pTable->GetValue("max_time_step_vehicle", vehicle_params.maxTimeStep);
|
|
if (pTable->GetValue("sleep_speed_vehicle", fSpeed))
|
|
vehicle_params.minEnergy = fSpeed*fSpeed;
|
|
pTable->GetValue("damping_vehicle",vehicle_params.damping);
|
|
pTable->GetValue("max_braking_friction",vehicle_params.maxBrakingFriction);
|
|
pTable->GetValue("engine_minRPM",vehicle_params.engineMinRPM);
|
|
pTable->GetValue("engine_idleRPM",vehicle_params.engineIdleRPM);
|
|
pTable->GetValue("engine_shiftupRPM",vehicle_params.engineShiftUpRPM);
|
|
pTable->GetValue("engine_shiftdownRPM",vehicle_params.engineShiftDownRPM);
|
|
pTable->GetValue("stabilizer",vehicle_params.kStabilizer);
|
|
pTable->GetValue("clutch_speed",vehicle_params.clutchSpeed);
|
|
if (pTable->GetValue("gears",pTempObj))
|
|
{
|
|
for(vehicle_params.nGears=0; vehicle_params.nGears<sizeof(gears)/sizeof(gears[0]); vehicle_params.nGears++)
|
|
if (!pTempObj->GetAt(vehicle_params.nGears+1, gears[vehicle_params.nGears]))
|
|
break;
|
|
vehicle_params.gearRatios = gears;
|
|
}
|
|
pTable->GetValue("brake_torque",vehicle_params.brakeTorque);
|
|
pTable->GetValue("dyn_friction_ratio",vehicle_params.kDynFriction);
|
|
pTable->GetValue("gear_dir_switch_RPM",vehicle_params.gearDirSwitchRPM);
|
|
pTable->GetValue("slip_threshold",vehicle_params.slipThreshold);
|
|
pTable->GetValue("engine_startRPM",vehicle_params.engineStartRPM);
|
|
pe->SetParams(&vehicle_params);
|
|
break;
|
|
case PHYSICPARAM_WHEEL:
|
|
pTable->GetValue("wheel", wheel_params.iWheel);
|
|
pTable->GetValue("is_driving", wheel_params.bDriving);
|
|
pTable->GetValue("susp_len", wheel_params.suspLenMax);
|
|
pTable->GetValue("min_friction", wheel_params.minFriction);
|
|
pTable->GetValue("max_friction", wheel_params.maxFriction);
|
|
pTable->GetValue("surface_idx", wheel_params.surface_idx);
|
|
pe->SetParams(&wheel_params);
|
|
break;
|
|
case PHYSICPARAM_SIMULATION:
|
|
pTable->GetValue("max_time_step", sim_params.maxTimeStep);
|
|
if (pTable->GetValue("sleep_speed", fSpeed))
|
|
sim_params.minEnergy = fSpeed*fSpeed;
|
|
if (pTable->GetValue("gravity", *vec))
|
|
sim_params.gravity = (vectorf)vec.Get();
|
|
if (pTable->GetValue("gravityx",gravity.x) | pTable->GetValue("gravityy",gravity.y) | pTable->GetValue("gravityz",gravity.z))
|
|
sim_params.gravity = gravity;
|
|
if (pTable->GetValue("freefall_gravity", *vec))
|
|
sim_params.gravityFreefall = (vectorf)vec.Get();
|
|
gravity.Set(0,0,0);
|
|
if (pTable->GetValue("freefall_gravityx",gravity.x) | pTable->GetValue("freefall_gravityy",gravity.y) |
|
|
pTable->GetValue("freefall_gravityz",gravity.z))
|
|
sim_params.gravityFreefall = gravity;
|
|
pTable->GetValue("damping", sim_params.damping);
|
|
pTable->GetValue("freefall_damping", sim_params.dampingFreefall);
|
|
pTable->GetValue("softness", sim_params.softness);
|
|
pTable->GetValue("angular_softness", sim_params.softnessAngular);
|
|
pTable->GetValue("softness_group", sim_params.softnessGroup);
|
|
pTable->GetValue("angular_softness_group", sim_params.softnessAngularGroup);
|
|
pTable->GetValue("mass", sim_params.mass);
|
|
pTable->GetValue("density", sim_params.density);
|
|
//if (pTable->GetValue("water_density",fDummy))
|
|
// m_pEntity->SetWaterDensity(fDummy);
|
|
|
|
pe->SetParams(&sim_params);
|
|
break;
|
|
case PHYSICPARAM_VELOCITY:
|
|
if (pTable->GetValue("v",*vec))
|
|
asv.v = vec.Get();
|
|
if (pTable->GetValue("w",*vec))
|
|
asv.w = vec.Get();
|
|
pe->Action(&asv);
|
|
break;
|
|
case PHYSICPARAM_BUOYANCY:
|
|
pTable->GetValue("water_density", buoy_params.waterDensity);
|
|
pTable->GetValue("water_damping", buoy_params.waterDamping);
|
|
pTable->GetValue("water_resistance", buoy_params.waterResistance);
|
|
if (pTable->GetValue("water_sleep_speed", fSpeed))
|
|
buoy_params.waterEmin = fSpeed*fSpeed;
|
|
if (pTable->GetValue("water_normal", *vec))
|
|
buoy_params.waterPlane.n = (vectorf)vec.Get();
|
|
if (pTable->GetValue("water_origin", *vec))
|
|
buoy_params.waterPlane.origin = (vectorf)vec.Get();
|
|
pe->SetParams(&buoy_params);
|
|
break;
|
|
case PHYSICPARAM_ARTICULATED:
|
|
pTable->GetValue("lying_mode_ncolls", artic_params.nCollLyingMode);
|
|
if (pTable->GetValue("lying_gravity", *vec))
|
|
artic_params.gravityLyingMode = (vectorf)vec.Get();
|
|
if (pTable->GetValue("lying_gravityx",gravity.x) | pTable->GetValue("lying_gravityy",gravity.y) |
|
|
pTable->GetValue("lying_gravityz",gravity.z))
|
|
artic_params.gravityLyingMode = gravity;
|
|
pTable->GetValue("lying_damping", artic_params.dampingLyingMode);
|
|
if (pTable->GetValue("lying_sleep_speed", fSpeed))
|
|
artic_params.minEnergyLyingMode = fSpeed*fSpeed;
|
|
pTable->GetValue("is_grounded", artic_params.bGrounded);
|
|
if (pTable->GetValue("check_collisions", artic_params.bCheckCollisions))
|
|
artic_params.bCollisionResp = artic_params.bCheckCollisions;
|
|
pTable->GetValue("sim_type", artic_params.iSimType);
|
|
pTable->GetValue("lying_sim_type", artic_params.iSimTypeLyingMode);
|
|
pTable->GetValue("expand_hinges", artic_params.bExpandHinges);
|
|
pe->SetParams(&artic_params);
|
|
break;
|
|
case PHYSICPARAM_JOINT:
|
|
pTable->GetValue("bone_name", strName);
|
|
if (pIChar && (pBone=pIChar->GetBoneByName(strName)))
|
|
{
|
|
pTable->GetValue("flags", (int&)joint_params.flags);
|
|
if (pTable->GetValue("min", *vec))
|
|
joint_params.limits[0] = (vectorf)vec.Get();
|
|
if (pTable->GetValue("max", *vec))
|
|
joint_params.limits[1] = (vectorf)vec.Get();
|
|
if (pTable->GetValue("stiffness", *vec))
|
|
joint_params.ks = (vectorf)vec.Get();
|
|
if (pTable->GetValue("damping", *vec))
|
|
joint_params.kd = (vectorf)vec.Get();
|
|
if (pTable->GetValue("dashpot", *vec))
|
|
joint_params.qdashpot = (vectorf)vec.Get();
|
|
if (pTable->GetValue("kdashpot", *vec))
|
|
joint_params.kdashpot = (vectorf)vec.Get();
|
|
pe->SetParams(&joint_params);
|
|
}
|
|
break;
|
|
case PHYSICPARAM_ROPE:
|
|
pTable->GetValue("length", rope_params.length);
|
|
pTable->GetValue("mass", rope_params.mass);
|
|
pTable->GetValue("coll_dist", rope_params.collDist);
|
|
pTable->GetValue("surface_idx", rope_params.surface_idx);
|
|
pTable->GetValue("friction", rope_params.friction);
|
|
|
|
pe->GetParams(&rope_params1);
|
|
if (rope_params1.pEntTiedTo[0]==0 || rope_params1.pEntTiedTo[1]==0)
|
|
{
|
|
int iEnd = rope_params1.pEntTiedTo[1]==0;
|
|
if (pTable->GetValue("entity_id", idEnt))
|
|
{
|
|
if (idEnt<-1)
|
|
rope_params.pEntTiedTo[iEnd] = 0;
|
|
else if (idEnt!=-1 && (pEnt=m_pEntitySystem->GetEntity(idEnt)) && pEnt->GetPhysics())
|
|
rope_params.pEntTiedTo[iEnd] = pEnt->GetPhysics();
|
|
else
|
|
rope_params.pEntTiedTo[iEnd] = WORLD_ENTITY;
|
|
}
|
|
pTable->GetValue("entity_part_id", rope_params.idPartTiedTo[iEnd]);
|
|
if (pTable->GetValue("end", *vec))
|
|
rope_params.ptTiedTo[iEnd] = (vectorf)vec.Get();
|
|
}
|
|
|
|
if (pTable->GetValue("entity_id_2", idEnt))
|
|
{
|
|
if (idEnt<-1)
|
|
rope_params.pEntTiedTo[1] = 0;
|
|
else if (idEnt!=-1 && (pEnt=m_pEntitySystem->GetEntity(idEnt)) && pEnt->GetPhysics())
|
|
rope_params.pEntTiedTo[1] = pEnt->GetPhysics();
|
|
else
|
|
rope_params.pEntTiedTo[1] = WORLD_ENTITY;
|
|
}
|
|
pTable->GetValue("entity_part_id_2", rope_params.idPartTiedTo[1]);
|
|
if (pTable->GetValue("end2", *vec))
|
|
rope_params.ptTiedTo[1] = (vectorf)vec.Get();
|
|
|
|
if (pTable->GetValue("entity_id_1", idEnt))
|
|
{
|
|
if (idEnt<-1)
|
|
rope_params.pEntTiedTo[0] = 0;
|
|
else if (idEnt!=-1 && (pEnt=m_pEntitySystem->GetEntity(idEnt)) && pEnt->GetPhysics())
|
|
rope_params.pEntTiedTo[0] = pEnt->GetPhysics();
|
|
else
|
|
rope_params.pEntTiedTo[0] = WORLD_ENTITY;
|
|
}
|
|
pTable->GetValue("entity_part_id_1", rope_params.idPartTiedTo[0]);
|
|
if (pTable->GetValue("end1", *vec))
|
|
rope_params.ptTiedTo[0] = (vectorf)vec.Get();
|
|
|
|
pe->SetParams(&rope_params);
|
|
|
|
flags_params.flagsOR = 0;
|
|
flags_params.flagsAND = -1;
|
|
if (pTable->GetValue("check_collisions", idEnt))
|
|
if (idEnt)
|
|
flags_params.flagsOR = rope_collides;
|
|
else
|
|
flags_params.flagsAND = ~rope_collides;
|
|
if (pTable->GetValue("bCheckCollisions", idEnt))
|
|
if (idEnt)
|
|
flags_params.flagsOR = rope_collides;
|
|
else
|
|
flags_params.flagsAND = ~rope_collides;
|
|
if (pTable->GetValue("bCheckTerrainCollisions", idEnt))
|
|
if (idEnt)
|
|
flags_params.flagsOR |= rope_collides_with_terrain;
|
|
else
|
|
flags_params.flagsAND &= ~rope_collides_with_terrain;
|
|
if (pTable->GetValue("shootable", idEnt))
|
|
if (idEnt)
|
|
flags_params.flagsOR |= rope_traceable;
|
|
else
|
|
flags_params.flagsAND &= ~rope_traceable;
|
|
if (pTable->GetValue("bShootable", idEnt))
|
|
if (idEnt)
|
|
flags_params.flagsOR |= rope_traceable;
|
|
else
|
|
flags_params.flagsAND &= ~rope_traceable;
|
|
pe->SetParams(&flags_params);
|
|
|
|
break;
|
|
case PHYSICPARAM_SOFTBODY:
|
|
pTable->GetValue("thickness", soft_params.thickness);
|
|
pTable->GetValue("max_safe_step", soft_params.maxSafeStep);
|
|
pTable->GetValue("stiffness", soft_params.ks);
|
|
pTable->GetValue("damping_ratio", soft_params.kdRatio);
|
|
pTable->GetValue("air_resistance", soft_params.airResistance);
|
|
if (pTable->GetValue("wind", *vec))
|
|
soft_params.wind = (vectorf)vec.Get();
|
|
pTable->GetValue("max_iters", soft_params.nMaxIters);
|
|
pTable->GetValue("accuracy", soft_params.accuracy);
|
|
pTable->GetValue("friction", soft_params.friction);
|
|
pTable->GetValue("impulse_scale", soft_params.impulseScale);
|
|
pTable->GetValue("explosion_scale", soft_params.explosionScale);
|
|
pTable->GetValue("collision_impulse_scale", soft_params.collisionImpulseScale);
|
|
pTable->GetValue("max_collision_impulse", soft_params.maxCollisionImpulse);
|
|
pTable->GetValue("collision_mask", soft_params.collTypes);
|
|
pe->SetParams(&soft_params);
|
|
break;
|
|
case PHYSICPARAM_CONSTRAINT:
|
|
if (!(pTable->GetValue("entity_id",idEnt) && idEnt!=-1 && (pEnt=m_pEntitySystem->GetEntity(idEnt)) && (constr_params.pBuddy=pEnt->GetPhysics())))
|
|
constr_params.pBuddy = WORLD_ENTITY;
|
|
pTable->GetValue("entity_part_id_1", constr_params.partid[0]);
|
|
pTable->GetValue("entity_part_id_2", constr_params.partid[2]);
|
|
constr_params.flags = local_frames;
|
|
pTable->GetValue("xmin", constr_params.xlimits[0]);
|
|
pTable->GetValue("xmax", constr_params.xlimits[1]);
|
|
pTable->GetValue("yzmin", constr_params.yzlimits[0]);
|
|
pTable->GetValue("yzmax", constr_params.yzlimits[1]);
|
|
return pH->EndFunction(pe->Action(&constr_params));
|
|
case PHYSICPARAM_REMOVE_CONSTRAINT:
|
|
pTable->GetValue("id", remove_constr_params.idConstraint);
|
|
pe->Action(&remove_constr_params);
|
|
break;
|
|
case PHYSICPARAM_PLAYERDYN:
|
|
pTable->GetValue("k_inertia", playerdyn_params.kInertia);
|
|
pTable->GetValue("k_air_control", playerdyn_params.kAirControl);
|
|
pTable->GetValue("gravity", playerdyn_params.gravity);
|
|
pTable->GetValue("bSwimming", playerdyn_params.bSwimming);
|
|
pTable->GetValue("mass", playerdyn_params.mass);
|
|
pTable->GetValue("surface_idx", playerdyn_params.surface_idx);
|
|
pTable->GetValue("is_active", playerdyn_params.bActive);
|
|
pe->SetParams(&playerdyn_params);
|
|
break;
|
|
case PHYSICPARAM_PLAYERDIM:
|
|
pTable->GetValue("pivot_height", playerdim_params.heightPivot);
|
|
pTable->GetValue("eye_height", playerdim_params.heightEye);
|
|
pTable->GetValue("cyl_r", playerdim_params.sizeCollider.x);
|
|
if (!pTable->GetValue("cyl_height", playerdim_params.sizeCollider.z))
|
|
playerdim_params.sizeCollider.z = playerdim_params.sizeCollider.x;
|
|
playerdim_params.sizeCollider.y = playerdim_params.sizeCollider.x;
|
|
pTable->GetValue("cyl_pos", playerdim_params.heightCollider);
|
|
pe->SetParams(&playerdim_params);
|
|
break;
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::GetParticleCollisionStatus(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
IPhysicalEntity *pe=m_pEntity->GetPhysics();
|
|
if (pe)
|
|
{
|
|
pe_status_collisions sc;
|
|
coll_history_item hit;
|
|
sc.pHistory = &hit;
|
|
|
|
if (pe->GetStatus(&sc))
|
|
{
|
|
IEntity *collider =NULL;
|
|
//if (hit.pCollider)
|
|
//{ collider = (IEntity*)hit.pCollider->GetForeignData();
|
|
IPhysicalEntity *pCollider = m_pISystem->GetIPhysicalWorld()->GetPhysicalEntityById(hit.idCollider);
|
|
if (pCollider)
|
|
collider = (IEntity*)pCollider->GetForeignData();
|
|
|
|
// int type=collider->GetType();
|
|
//string pszName=collider->GetEntityClassName();
|
|
//}
|
|
int nType;
|
|
if ( collider )
|
|
nType = 0;
|
|
//else if ( status.pLastCollider )
|
|
// nType = 1;
|
|
else
|
|
nType = 2; //terrain
|
|
//<<FIXME>> remove this table ceration every frame
|
|
_SmartScriptObject pObj(m_pScriptSystem);
|
|
_SmartScriptObject oPos(m_pScriptSystem),oNormal(m_pScriptSystem),oDir(m_pScriptSystem);
|
|
|
|
pObj->SetValue("IsPlayer", 0);
|
|
if (collider)
|
|
{
|
|
void *pInterface = NULL;
|
|
IEntityContainer *pICnt = collider->GetContainer();
|
|
if (pICnt)
|
|
if (pICnt->QueryContainerInterface(CIT_IPLAYER, &pInterface))
|
|
{
|
|
// We have a player
|
|
pObj->SetValue("IsPlayer", 1);
|
|
}
|
|
}
|
|
|
|
// IScriptObject *pTargetMaterial;
|
|
|
|
/*if(pTargetMaterial=m_pGame->m_XSurfaceMgr.GetMaterialBySurfaceID(hit.idmat[1]))
|
|
{
|
|
pObj->SetValue("target_material",pTargetMaterial);
|
|
}
|
|
else
|
|
{*/
|
|
pObj->SetValue("target_material",hit.idmat[1]);
|
|
//}
|
|
|
|
oPos->SetValue("x",hit.pt.x);
|
|
oPos->SetValue("y",hit.pt.y);
|
|
oPos->SetValue("z",hit.pt.z);
|
|
oNormal->SetValue("x",hit.n.x);
|
|
oNormal->SetValue("y",hit.n.y);
|
|
oNormal->SetValue("z",hit.n.z);
|
|
Vec3 vrel = (hit.v[0]-hit.v[1]).normalized();
|
|
oDir->SetValue("x",vrel.x);
|
|
oDir->SetValue("y",vrel.y);
|
|
oDir->SetValue("z",vrel.z);
|
|
pObj->SetValue("objtype",nType);
|
|
pObj->SetValue("pos",*oPos);
|
|
pObj->SetValue("normal",*oNormal);
|
|
pObj->SetValue("dir",*oDir);
|
|
if (collider && collider->GetScriptObject())
|
|
pObj->SetValue("target",collider->GetScriptObject());
|
|
return pH->EndFunction(*pObj);
|
|
}
|
|
}
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::GetObjectStatus(IFunctionHandler *pH)
|
|
{
|
|
// Given the slot number this routine returns a table containing all
|
|
// useful information about a script object
|
|
|
|
CHECK_PARAMETERS(1);
|
|
_SmartScriptObject pTable(m_pScriptSystem);
|
|
CScriptObjectVector oVecPos(m_pScriptSystem);
|
|
CScriptObjectVector oVecAngles(m_pScriptSystem);
|
|
CScriptObjectVector oVecScale(m_pScriptSystem);
|
|
CScriptObjectVector oVecOffset(m_pScriptSystem);
|
|
|
|
int nSlot;
|
|
CEntityObject theEntityObject;
|
|
|
|
pH->GetParam(1,nSlot);
|
|
|
|
if (m_pEntity && m_pEntity->GetEntityObject(nSlot, theEntityObject))
|
|
{
|
|
oVecPos = theEntityObject.pos;
|
|
oVecAngles = theEntityObject.angles;
|
|
oVecScale = theEntityObject.scale;
|
|
|
|
// Calculate the mispoint of the bounding box
|
|
oVecOffset = (theEntityObject.object->GetBoxMax() + theEntityObject.object->GetBoxMin()) / 2.0;
|
|
|
|
pTable->SetValue("flags", theEntityObject.flags);
|
|
pTable->SetValue("pos", *oVecPos);
|
|
pTable->SetValue("angles", *oVecAngles);
|
|
pTable->SetValue("scale", *oVecScale);
|
|
pTable->SetValue("offset", *oVecOffset);
|
|
|
|
return pH->EndFunction(*pTable);
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetObjectStatus(IFunctionHandler *pH)
|
|
{
|
|
// Given a slot number and a table this routine finds the indicated
|
|
// script object and updates it with the information contained in the table
|
|
|
|
CHECK_PARAMETERS(2);
|
|
_SmartScriptObject pTable(m_pScriptSystem, true);
|
|
CScriptObjectVector oVecPos(m_pScriptSystem);
|
|
CScriptObjectVector oVecAngles(m_pScriptSystem);
|
|
CScriptObjectVector oVecScale(m_pScriptSystem);
|
|
CScriptObjectVector oVecOffset(m_pScriptSystem);
|
|
CEntityObject theEntityObject;
|
|
int nSlot;
|
|
|
|
pH->GetParam(1,nSlot);
|
|
pH->GetParam(2,*pTable);
|
|
|
|
if (m_pEntity && m_pEntity->GetEntityObject(nSlot, theEntityObject))
|
|
{
|
|
pTable->GetValue("flags", theEntityObject.flags);
|
|
pTable->GetValue("pos", *oVecPos);
|
|
pTable->GetValue("angles", *oVecAngles);
|
|
pTable->GetValue("scale", *oVecScale);
|
|
pTable->GetValue("offset", *oVecOffset);
|
|
|
|
theEntityObject.pos = oVecPos.Get();
|
|
theEntityObject.angles = oVecAngles.Get();
|
|
theEntityObject.scale = oVecScale.Get();
|
|
|
|
m_pEntity->SetEntityObject(nSlot, theEntityObject);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
/*! Retrieves if a characters currently plays an animation
|
|
@param iAnimationPos Number of the character slot
|
|
@return nil or not nil
|
|
@see CScriptObjectEntity::StartAnimation
|
|
*/
|
|
int CScriptObjectEntity::IsAnimationRunning(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
int iAnimationPos;
|
|
ICryCharInstance *pCharacter = NULL;
|
|
|
|
pH->GetParam(1, iAnimationPos);
|
|
|
|
pCharacter = m_pEntity->GetCharInterface()->GetCharacter(iAnimationPos);
|
|
|
|
bool bResult=false;
|
|
if (pCharacter)
|
|
if (pCharacter->GetCurAnimation())
|
|
bResult=true;
|
|
|
|
return pH->EndFunction(bResult);
|
|
}
|
|
|
|
int CScriptObjectEntity::AddImpulse(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount()==4 || pH->GetParamCount()==5);
|
|
|
|
|
|
// float hitImpulse = m_pGame->p_HitImpulse->GetFVal();
|
|
// if(hitImpulse == 0)
|
|
// return pH->EndFunctionNull();
|
|
|
|
int ipart;
|
|
bool bPos;
|
|
Vec3 pos,dir;
|
|
float impulse,impulseScale=1.0f;
|
|
|
|
pH->GetParam(1, ipart);
|
|
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
if(pH->GetParam(2,*oVec))
|
|
{
|
|
pos=oVec.Get();
|
|
bPos=true;
|
|
}
|
|
else
|
|
{
|
|
bPos=false;
|
|
}
|
|
pH->GetParam(3,*oVec); dir=oVec.Get();
|
|
pH->GetParam(4, impulse);
|
|
pH->GetParam(5, impulseScale);
|
|
bPos = bPos && GetLengthSquared(pos)>0;
|
|
|
|
if (GetLengthSquared(dir)>0)
|
|
{
|
|
m_pEntity->AddImpulse(ipart,pos,GetNormalized(dir)*impulse,bPos,impulseScale );
|
|
// m_pEntity->AddImpulse(ipart,pos,dir.Normalized()*impulse*hitImpulse,bPos );
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
int CScriptObjectEntity::AddImpulseObj(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
|
|
Vec3 dir;
|
|
float impulse;
|
|
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
dir=oVec.Get();
|
|
pH->GetParam(2, impulse);
|
|
if (GetLengthSquared(dir)*impulse>0)
|
|
{
|
|
m_pEntity->AddImpulse(0,m_pEntity->GetPos(),GetNormalized(dir)*impulse,true);
|
|
m_pEntity->AddImpulse(0,m_pEntity->GetPos(),GetNormalized(dir)*impulse*2,false);
|
|
}
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
/*! Determines whether a given point is within an entities radius
|
|
@param Vector 3d representing a point in world space
|
|
@return true or false
|
|
@see CEntity::GetRadius
|
|
*/
|
|
int CScriptObjectEntity::IsPointWithinRadius(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
Vec3 vPosition;
|
|
|
|
// Get the passed position vector
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
vPosition = oVec.Get();
|
|
|
|
// Sean, Nov 23
|
|
// The players radius is far too large, like 5+ meters
|
|
// So I am scaling it by 50% for now.
|
|
// Talk to Petar about fixing player radius
|
|
// TRACE("Fix hack in CScriptObjectEntity::IsPointWithinRadius");
|
|
float HackedValue = m_pEntity->GetRadius()*.5f;// / 2.0f;
|
|
// float HackedValue = m_pEntity->GetRadiusPhys()*.5f;// / 2.0f;
|
|
|
|
// Calculate the distance of this position from the player
|
|
// If the distance is within the player's radius, return true
|
|
// otherwise return false
|
|
|
|
//Vec3 epos = m_pEntity->GetPos(false);
|
|
//float dst = vPosition.Distance(m_pEntity->GetPos(false));
|
|
return pH->EndFunction( GetDistance(vPosition,m_pEntity->GetPos(false)) <= HackedValue);
|
|
|
|
}
|
|
|
|
/*! Determines distance between the entity and a given 3d point
|
|
@param Vector 3d representing a point in world space
|
|
@return distance as float
|
|
@see CEntity::GetPos
|
|
*/
|
|
int CScriptObjectEntity::GetDistanceFromPoint(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
Vec3 vPosition;
|
|
|
|
// Get the passed position vector
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
vPosition = oVec.Get();
|
|
|
|
// Calculate the distance of this position from the player
|
|
return pH->EndFunction( GetDistance(vPosition,m_pEntity->GetPos(false)) );
|
|
}
|
|
|
|
|
|
|
|
|
|
int CScriptObjectEntity::EnableSave(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
bool bEnable;
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->EnableSave(bEnable);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::PlaySound(IFunctionHandler *pH)
|
|
{
|
|
int nCookie=0;
|
|
float fVolumeScale=1.0f;
|
|
ISound *pSound=NULL;
|
|
|
|
pH->GetParamUDVal(1,(INT_PTR&)pSound,nCookie);
|
|
|
|
if(pSound && (nCookie==USER_DATA_SOUND))
|
|
{
|
|
if (pH->GetParamCount()>1)
|
|
{
|
|
if (!pH->GetParam(2,fVolumeScale))
|
|
{
|
|
fVolumeScale=1.0f;
|
|
}
|
|
}
|
|
Vec3 Offset;
|
|
if(pH->GetParamCount()>=3)
|
|
{
|
|
CScriptObjectVector oVec(m_pScriptSystem, true);
|
|
pH->GetParam(3, *oVec);
|
|
Offset=oVec.Get();
|
|
}else
|
|
{
|
|
Offset=Vec3(0.0f, 0.0f, 0.0f);
|
|
}
|
|
m_pEntity->PlaySound(pSound, fVolumeScale, Offset);
|
|
//pSound->SetPosition(m_pEntity->GetPos());
|
|
//pSound->Play(fVolumeScale);
|
|
}
|
|
/*
|
|
else
|
|
{
|
|
m_pScriptSystem->RaiseError("PlaySound NULL SOUND!!");
|
|
}
|
|
*/
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
|
|
int CScriptObjectEntity::TriggerEvent(IFunctionHandler *pH)
|
|
{
|
|
|
|
int eventType;
|
|
|
|
pH->GetParam(1,eventType);
|
|
SAIEVENT eventParams;
|
|
|
|
switch (eventType)
|
|
{
|
|
case AIEVENT_ONBODYSENSOR:
|
|
{
|
|
float fSuspendFireTimeout;
|
|
pH->GetParam(2,fSuspendFireTimeout);
|
|
eventParams.fInterest = fSuspendFireTimeout; // interest used just for convinience
|
|
}
|
|
break;
|
|
case AIEVENT_AGENTDIED:
|
|
{
|
|
if (pH->GetParamCount()>1)
|
|
pH->GetParam(2,eventParams.nDeltaHealth);
|
|
else
|
|
eventParams.nDeltaHealth = 0;
|
|
}
|
|
break;
|
|
case AIEVENT_SLEEP:
|
|
case AIEVENT_WAKEUP:
|
|
case AIEVENT_ENABLE:
|
|
case AIEVENT_DISABLE:
|
|
case AIEVENT_REJECT:
|
|
case AIEVENT_PATHFINDON:
|
|
case AIEVENT_PATHFINDOFF:
|
|
case AIEVENT_CLEAR:
|
|
case AIEVENT_DROPBEACON:
|
|
break;
|
|
default:
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
if (m_pEntity->GetAI())
|
|
m_pEntity->GetAI()->Event(eventType,&eventParams);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetSecondShader(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
const char *pszName;
|
|
int iMask=0;
|
|
pH->GetParam(1,pszName); // shader name
|
|
pH->GetParam(2,iMask); // where to apply shader ? (0= char only, 1=char + attached, 2=char + hands only, 3=char + hands + attached, 4=all)
|
|
|
|
if(!m_pEntity)
|
|
{
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
IEntityCharacter *pEntChar=m_pEntity->GetCharInterface();
|
|
|
|
// where to use ?
|
|
bool bOnCharAttached=0, bOnArmsAttached=0, bUseOnArms=0;
|
|
switch(iMask) {
|
|
case 1:
|
|
bUseOnArms=0;
|
|
bOnCharAttached=1;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
case 2:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
case 3:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=1;
|
|
break;
|
|
case 4:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=1;
|
|
bOnArmsAttached=1;
|
|
break;
|
|
|
|
default:
|
|
bUseOnArms=0;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
}
|
|
|
|
// set third person shader
|
|
if(pEntChar->GetCharacter(0))
|
|
{
|
|
pEntChar->GetCharacter(0)->SetShaderTemplateName(pszName, 1, 0, m_pEntity->GetMaterial(),(bOnCharAttached)?1:0);
|
|
}
|
|
|
|
if(m_pEntity->GetIStatObj(0))
|
|
{
|
|
m_pEntity->GetIStatObj(0)->SetShaderTemplate(-1, pszName, 0);
|
|
}
|
|
|
|
// set first person shader
|
|
if(bUseOnArms)
|
|
{
|
|
if(pEntChar && pEntChar->GetCharacter(1))
|
|
{
|
|
// hack: mask out player hands if flag for useOnAttached not set, else use normal rendering (arms/weapon with same shader)
|
|
if(!bOnArmsAttached)
|
|
{
|
|
// this can only be in setSecondShader, since it disables second pass rendering of attached objects
|
|
pEntChar->GetCharacter(1)->SetShaderTemplateName("TemplNull", 1, 0, m_pEntity->GetMaterial(), 0);
|
|
pEntChar->GetCharacter(1)->SetShaderTemplateName(pszName, 1, "s_hands", m_pEntity->GetMaterial(), 0);
|
|
|
|
}
|
|
else
|
|
{
|
|
pEntChar->GetCharacter(1)->SetShaderTemplateName(pszName, 1, 0, m_pEntity->GetMaterial(), 0);
|
|
}
|
|
}
|
|
|
|
if(m_pEntity->GetIStatObj(1))
|
|
{
|
|
m_pEntity->GetIStatObj(1)->SetShaderTemplate(-1, pszName, 0);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
// note: this should be something more generic/abstract, something like SetShader(iShaderLayer, szShaderName, pUseList(list of items in entity, to use this shader))
|
|
int CScriptObjectEntity::SetShader(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
const char *pszName;
|
|
int iMask=0;
|
|
pH->GetParam(1,pszName); // shader name
|
|
pH->GetParam(2,iMask); // where to apply shader ? (0= char only, 1=char + attached, 2=char + hands only, 3=char + hands + attached, 4=all)
|
|
|
|
if(!m_pEntity)
|
|
{
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
IEntityCharacter *pEntChar=m_pEntity->GetCharInterface();
|
|
|
|
// where to use ?
|
|
bool bOnCharAttached=0, bOnArmsAttached=0, bUseOnArms=0;
|
|
switch(iMask) {
|
|
case 1:
|
|
bUseOnArms=0;
|
|
bOnCharAttached=1;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
case 2:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
case 3:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=1;
|
|
break;
|
|
case 4:
|
|
bUseOnArms=1;
|
|
bOnCharAttached=1;
|
|
bOnArmsAttached=1;
|
|
break;
|
|
|
|
default:
|
|
bUseOnArms=0;
|
|
bOnCharAttached=0;
|
|
bOnArmsAttached=0;
|
|
break;
|
|
}
|
|
|
|
// set third person shader
|
|
if(pEntChar->GetCharacter(0))
|
|
{
|
|
pEntChar->GetCharacter(0)->SetShaderTemplateName(pszName, 0, 0, m_pEntity->GetMaterial(),(bOnCharAttached)?1:0);
|
|
}
|
|
|
|
if(m_pEntity->GetIStatObj(0))
|
|
{
|
|
m_pEntity->GetIStatObj(0)->SetShaderTemplate(-1, pszName, 0);
|
|
}
|
|
|
|
// set first person shader
|
|
if(bUseOnArms)
|
|
{
|
|
if(pEntChar && pEntChar->GetCharacter(1))
|
|
{
|
|
// hack: mask out player hands if flag for useOnAttached not set, else use normal rendering (arms/weapon with same shader)
|
|
if(!bOnArmsAttached)
|
|
{
|
|
// this can only be in setSecondShader, since it disables second pass rendering of attached objects
|
|
// pEntChar->GetCharacter(1)->SetShaderTemplateName("TemplNull", 1, 0, m_pEntity->GetMaterial(), 0);
|
|
pEntChar->GetCharacter(1)->SetShaderTemplateName(pszName, 0, "s_hands", m_pEntity->GetMaterial(), 0);
|
|
}
|
|
else
|
|
{
|
|
pEntChar->GetCharacter(1)->SetShaderTemplateName(pszName, 0, 0, m_pEntity->GetMaterial(), 0);
|
|
}
|
|
}
|
|
|
|
if(m_pEntity->GetIStatObj(1))
|
|
{
|
|
m_pEntity->GetIStatObj(1)->SetShaderTemplate(-1, pszName, 0);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::GetShader(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
|
|
// TODO
|
|
// if(m_pPlayer->GetEntity() && m_pPlayer->GetEntity()->GetCharInterface() && m_pPlayer->GetEntity()->GetCharInterface()->GetCharacter(0))
|
|
// return pH->EndFunction(m_pPlayer->GetEntity()->GetCharInterface()->GetCharacter(0)->GetShaderTemplateId());
|
|
|
|
return pH->EndFunction(0);
|
|
}
|
|
|
|
int CScriptObjectEntity::GetCameraPosition(IFunctionHandler *pH)
|
|
{
|
|
Vec3 vPos;
|
|
IEntityCamera *pICam = NULL;
|
|
|
|
CHECK_PARAMETERS(0);
|
|
|
|
pICam = m_pEntity->GetCamera();
|
|
|
|
if (!pICam)
|
|
return pH->EndFunction();
|
|
|
|
vPos = pICam->GetPos();
|
|
|
|
m_pCameraPosition->SetValue("x", vPos.x);
|
|
m_pCameraPosition->SetValue("y", vPos.y);
|
|
m_pCameraPosition->SetValue("z", vPos.z);
|
|
return pH->EndFunction(m_pCameraPosition);
|
|
|
|
|
|
}
|
|
|
|
int CScriptObjectEntity::GetCameraAngles(IFunctionHandler *pH)
|
|
{
|
|
Vec3 vAng;
|
|
IEntityCamera *pICam = NULL;
|
|
|
|
CHECK_PARAMETERS(0);
|
|
|
|
pICam = m_pEntity->GetCamera();
|
|
|
|
if (!pICam)
|
|
return pH->EndFunction();
|
|
|
|
vAng = pICam->GetAngles();
|
|
|
|
m_pCameraPosition->SetValue("x", vAng.x);
|
|
m_pCameraPosition->SetValue("y", vAng.y);
|
|
m_pCameraPosition->SetValue("z", vAng.z);
|
|
return pH->EndFunction(m_pCameraPosition);
|
|
|
|
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::LoadBreakable(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *sFileName;
|
|
|
|
pH->GetParam(1,sFileName);
|
|
|
|
if (m_pEntity)
|
|
m_pEntity->LoadBreakableObject(sFileName);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::BreakEntity(IFunctionHandler *pH)
|
|
{
|
|
//CHECK_PARAMETERS(2);
|
|
|
|
Vec3 vDir(0,0,1);
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
if (pH->GetParam(1,*oVec))
|
|
{
|
|
vDir = oVec.Get();
|
|
}
|
|
float explosionForce = 0.01f; // small small force.
|
|
pH->GetParam(2,explosionForce);
|
|
|
|
float fDensity = 10;
|
|
float fLifeTime = 20;
|
|
bool bRigidBody = false;
|
|
pH->GetParam(3,bRigidBody);
|
|
pH->GetParam(4,fLifeTime);
|
|
pH->GetParam(5,fDensity);
|
|
|
|
if (m_pEntity)
|
|
for(int n=2; n<m_pEntity->GetNumObjects(); n++)
|
|
{
|
|
CEntityObject obj;
|
|
if(!m_pEntity->GetEntityObject(n,obj))
|
|
continue;
|
|
|
|
Vec3 vOffSet = (obj.object->GetBoxMin()+obj.object->GetBoxMax())*0.5f;
|
|
Vec3 vSize = obj.object->GetBoxMax()-obj.object->GetBoxMin();
|
|
|
|
// get entity matrix
|
|
//Matrix44 EntityMatrix;
|
|
//EntityMatrix.Identity();
|
|
//EntityMatrix = GetTranslationMat(m_pEntity->GetPos())*EntityMatrix;
|
|
//EntityMatrix = GetRotationZYX44(-gf_DEGTORAD*m_pEntity->GetAngles())*EntityMatrix;
|
|
//EntityMatrix = GetScale33( Vec3(m_pEntity->GetScale(),m_pEntity->GetScale(),m_pEntity->GetScale()) )*EntityMatrix;
|
|
|
|
//OPTIMISED_BY_IVO
|
|
Matrix33diag diag = Vec3(m_pEntity->GetScale(),m_pEntity->GetScale(),m_pEntity->GetScale()); //use diag-matrix for scaling
|
|
Matrix34 rt34 = Matrix34::CreateRotationXYZ( Deg2Rad(m_pEntity->GetAngles()), m_pEntity->GetPos() ); //set rotation and translation in one function call
|
|
Matrix44 EntityMatrix = rt34*diag; //optimised concatenation: m34*diag
|
|
|
|
EntityMatrix = GetTransposed44(EntityMatrix); //TODO: remove this after E3 and use Matrix34 instead of Matrix44
|
|
|
|
|
|
|
|
vOffSet = EntityMatrix.TransformVectorOLD(vOffSet);
|
|
|
|
ParticleParams SpawnParticleParams;
|
|
SpawnParticleParams.vPosition = m_pEntity->GetPos()+vOffSet;
|
|
SpawnParticleParams.vDirection = vDir + vOffSet;//Vec3 (0,0,0);
|
|
SpawnParticleParams.fFocus = 30.f;
|
|
SpawnParticleParams.vColorStart = Vec3 (0,1,1);
|
|
SpawnParticleParams.vColorEnd = Vec3 (1,1,0);
|
|
// SpawnParticleParams.fSpeed = 1.0f;
|
|
SpawnParticleParams.fSpeed = explosionForce*0.7f;//0.25f;
|
|
SpawnParticleParams.fSpeed.variation = 0.25f;
|
|
SpawnParticleParams.nCount = 1;
|
|
//SpawnParticleParams.fSize = max(max(vSize.x,vSize.y),vSize.z);
|
|
SpawnParticleParams.fSize = m_pEntity->GetScale();
|
|
SpawnParticleParams.fThickness = max(0.02f,min(min(vSize.x,vSize.y),vSize.z));
|
|
SpawnParticleParams.vNormal.Set(0,0,0);
|
|
SpawnParticleParams.vNormal[idxmin3((float*)&vSize)] = 1.0f;
|
|
SpawnParticleParams.iPhysMat = m_pISystem->GetI3DEngine()->GetPhysMaterialEnumerator()->EnumPhysMaterial(obj.object->GetScriptMaterialName());
|
|
SpawnParticleParams.fSizeSpeed = 0;
|
|
// SpawnParticleParams.vGravity = Vec3 (0,0,-0.5);
|
|
SpawnParticleParams.vGravity = Vec3 (0,0,-9.81f);//-4.5);
|
|
// SpawnParticleParams.fLifeTime = 4;
|
|
SpawnParticleParams.fLifeTime = fLifeTime;
|
|
SpawnParticleParams.nTexId = 0;
|
|
SpawnParticleParams.nTexAnimFramesCount = 0;
|
|
SpawnParticleParams.eBlendType = ParticleBlendType_AlphaBased;
|
|
SpawnParticleParams.nParticleFlags = 0;
|
|
SpawnParticleParams.fTailLenght = 0;
|
|
SpawnParticleParams.bRealPhysics = true;
|
|
SpawnParticleParams.vRotation = explosionForce*Vec3(float(3.f*(rnd()-0.5)),float(3.f*(rnd()-0.5)),float(3.f*(rnd()-0.5)));
|
|
SpawnParticleParams.pStatObj = obj.object;
|
|
SpawnParticleParams.vInitAngles = m_pEntity->GetAngles();
|
|
SpawnParticleParams.fBouncenes = 0.5f;
|
|
|
|
if (bRigidBody)
|
|
{
|
|
SpawnParticleParams.vPosition = m_pEntity->GetPos();
|
|
SpawnParticleParams.vDirection = vDir;
|
|
|
|
SpawnParticleParams.fThickness = fDensity;
|
|
SpawnParticleParams.fSize = m_pEntity->GetScale();
|
|
SpawnParticleParams.nParticleFlags |= PART_FLAG_RIGIDBODY;
|
|
}
|
|
|
|
m_pISystem->GetI3DEngine()->SpawnParticles(SpawnParticleParams);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetBBox(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(2);
|
|
|
|
Vec3 mins,maxs;
|
|
int phys=0;
|
|
|
|
CScriptObjectVector minVec(m_pScriptSystem,true);
|
|
CScriptObjectVector maxVec(m_pScriptSystem,true);
|
|
|
|
pH->GetParam(1,*minVec);
|
|
pH->GetParam(2,*maxVec);
|
|
if(pH->GetParamCount()>2)
|
|
pH->GetParam(3,phys);
|
|
|
|
|
|
|
|
if (m_pEntity)
|
|
{
|
|
Vec3 min = minVec.Get();
|
|
Vec3 max = maxVec.Get();
|
|
|
|
if(phys)
|
|
{
|
|
IPhysicalEntity *pPhysEnt = m_pEntity->GetPhysics();
|
|
if(m_pEntity->GetPhysics())
|
|
{
|
|
|
|
pe_status_pos spos;
|
|
pPhysEnt->GetStatus( &spos );
|
|
pe_params_bbox pbbox;
|
|
pbbox.BBox[0] = spos.pos + min;
|
|
pbbox.BBox[1] = spos.pos + max;
|
|
pPhysEnt->SetParams( &pbbox );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pEntity->SetBBox(min,max);
|
|
}
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::GetBBox(IFunctionHandler *pH)
|
|
{
|
|
int phys=0;
|
|
pH->GetParam(1,phys);
|
|
Vec3 mins,maxs;
|
|
|
|
CScriptObjectVector minVec(m_pScriptSystem,false);
|
|
CScriptObjectVector maxVec(m_pScriptSystem,false);
|
|
_SmartScriptObject res(m_pScriptSystem,false);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
Vec3 min,max;
|
|
if(phys)
|
|
{
|
|
IPhysicalEntity *pPhysEnt = m_pEntity->GetPhysics();
|
|
if(m_pEntity->GetPhysics())
|
|
{
|
|
pe_status_pos spos;
|
|
pPhysEnt->GetStatus( &spos );
|
|
min=spos.BBox[0];
|
|
max=spos.BBox[1];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pEntity->GetBBox(min,max);
|
|
}
|
|
minVec=min;
|
|
maxVec=max;
|
|
res->SetValue("min",minVec);
|
|
res->SetValue("max",maxVec);
|
|
}
|
|
|
|
return pH->EndFunction(res);
|
|
}
|
|
|
|
int CScriptObjectEntity::GetLocalBBox(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
Vec3 mins,maxs;
|
|
|
|
CScriptObjectVector minVec(m_pScriptSystem,false);
|
|
CScriptObjectVector maxVec(m_pScriptSystem,false);
|
|
_SmartScriptObject res(m_pScriptSystem,false);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
Vec3 min,max;
|
|
m_pEntity->GetLocalBBox(min,max);
|
|
minVec=min;
|
|
maxVec=max;
|
|
res->SetValue("min",minVec);
|
|
res->SetValue("max",maxVec);
|
|
}
|
|
return pH->EndFunction(res);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetRadius(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
float radius;
|
|
|
|
pH->GetParam(1,radius);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
m_pEntity->SetRadius(radius);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetUpdateRadius(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
float radius = 0;
|
|
pH->GetParam(1,radius);
|
|
if (m_pEntity)
|
|
{
|
|
m_pEntity->SetUpdateRadius(radius);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetUpdateRadius(IFunctionHandler *pH)
|
|
{
|
|
float radius = 0;
|
|
if (m_pEntity)
|
|
{
|
|
radius = m_pEntity->GetUpdateRadius();
|
|
}
|
|
return pH->EndFunction(radius);
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::SetShaderFloat(IFunctionHandler *pH)
|
|
{
|
|
float fFloat,fFadeValue;
|
|
const char *sName;
|
|
int dwMask;
|
|
|
|
CHECK_PARAMETERS(4);
|
|
|
|
pH->GetParam(1, sName);
|
|
pH->GetParam(2, fFloat);
|
|
pH->GetParam(3, dwMask);
|
|
pH->GetParam(4, fFadeValue);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
if ((dwMask) && m_pEntity->GetIStatObj(0))
|
|
m_pEntity->SetShaderFloat(sName, fFloat);
|
|
//// if ((dwMask & BITMASK_OBJECT) && m_pEntity->GetIStatObj(0))
|
|
// m_pEntity->GetIStatObj(0)->SetShaderFloat(sName, fFloat);
|
|
|
|
// set it for character
|
|
if ((dwMask == 0) && m_pEntity->GetCharInterface() && m_pEntity->GetCharInterface()->GetCharacter(0))
|
|
m_pEntity->GetCharInterface()->GetCharacter(0)->SetShaderFloat(sName, fFloat);
|
|
|
|
// if ((dwMask == 0) && m_pEntity->GetCharInterface() && m_pEntity->GetCharInterface()->GetCharacter(1))
|
|
// m_pEntity->GetCharInterface()->GetCharacter(1)->SetShaderFloat(sName, fFloat);
|
|
|
|
/*
|
|
IEntityContainer *pCont = m_pEntity->GetContainer();
|
|
if (pCont && (dwMask & (BITMASK_WEAPON | BITMASK_PLAYER)))
|
|
{
|
|
CPlayer *pPlayer;
|
|
if (pCont->QueryContainerInterface(CIT_IPLAYER,(void**)&pPlayer))
|
|
{
|
|
pPlayer->SetHeatVisionValues(dwMask,sName,fFloat,fFadeValue);
|
|
//&& m_pEntity->GetCharInterface() && m_pEntity->GetCharInterface()->GetCharacter(0))
|
|
//m_pEntity->GetCharInterface()->GetCharacter(0)->SetShaderFloat(sName, fFloat,fFadeValue);
|
|
} //query play
|
|
} //pcont
|
|
*/
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetColor(IFunctionHandler *pH)
|
|
{
|
|
float fR, fG, fB, fA;
|
|
const char *sName;
|
|
int dwMask;
|
|
|
|
CHECK_PARAMETERS(6);
|
|
|
|
pH->GetParam(1, sName);
|
|
pH->GetParam(2, fR);
|
|
pH->GetParam(3, fG);
|
|
pH->GetParam(4, fB);
|
|
pH->GetParam(5, fA);
|
|
pH->GetParam(6, dwMask);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
if ((dwMask) && m_pEntity->GetIStatObj(0))
|
|
// if ((dwMask & BITMASK_OBJECT) && m_pEntity->GetIStatObj(0))
|
|
m_pEntity->GetIStatObj(0)->SetColor(sName, fR, fG, fB, fA);
|
|
|
|
// set it for character
|
|
if ((dwMask == 0) && m_pEntity->GetCharInterface() && m_pEntity->GetCharInterface()->GetCharacter(0))
|
|
m_pEntity->GetCharInterface()->GetCharacter(0)->SetColor(fR, fG, fB, fA);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::EnableUpdate(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
bool bEnable;
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->SetNeedUpdate( bEnable );
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetUpdateIfPotentiallyVisible(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
bool bEnable;
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->SetUpdateVisLevel(bEnable ? eUT_PotVisible : eUT_Always);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetUpdateType(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int updateType = eUT_Always;
|
|
if (pH->GetParam(1,updateType))
|
|
m_pEntity->SetUpdateVisLevel( (EEntityUpdateVisLevel)updateType );
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetAnimationEvent(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
int idSource;
|
|
const char *sAnimation;
|
|
pH->GetParam(1,idSource);
|
|
pH->GetParam(2,sAnimation);
|
|
IEntity *pSource=m_pEntitySystem->GetEntity(idSource);
|
|
if(!pSource)
|
|
pH->EndFunction();
|
|
IEntityCharacter *pCharacter=pSource->GetCharInterface();
|
|
ICryCharInstance* pCryCharacter=pCharacter->GetCharacter(0);
|
|
pCryCharacter->AddAnimationEventSink(sAnimation,m_pEntity);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetAnimationKeyEvent(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(3);
|
|
|
|
if (pH->GetParamCount()<2 || pH->GetParamCount()>3)
|
|
{
|
|
m_pScriptSystem->RaiseError("CScriptObjectEntity::SetAnimationKeyEvent wrong number of arguments");
|
|
return pH->EndFunctionNull();
|
|
};
|
|
|
|
|
|
const char *szAnimation;
|
|
int nFrameID;
|
|
INT_PTR nActionType = -1;
|
|
USER_DATA udUserData = USER_DATA(-1);
|
|
AnimSinkEventData ased;
|
|
|
|
pH->GetParam(1,szAnimation);
|
|
pH->GetParam(2,nFrameID);
|
|
if(pH->GetParamCount()>2)
|
|
{
|
|
ased.n = pH->GetParamType(3);
|
|
//pH->GetParam(3,udUserData);
|
|
if (pH->GetParamType(3)==svtUserData)
|
|
{
|
|
pH->GetParam(3,udUserData);
|
|
ased.p = (void*) udUserData;
|
|
}
|
|
else if (pH->GetParamType(3)==svtNumber)
|
|
{
|
|
pH->GetParam(3,nActionType);
|
|
ased.p = (void*) nActionType;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
IEntityCharacter *pCharacter=m_pEntity->GetCharInterface();
|
|
ICryCharInstance* pCryCharacter=pCharacter->GetCharacter(0);
|
|
|
|
if(pCryCharacter)
|
|
{
|
|
pCryCharacter->AddAnimationEventSink(szAnimation,m_pEntity);
|
|
//pCryCharacter->AddAnimationEvent(szAnimation, nFrameID, (void*)udUserData);
|
|
pCryCharacter->AddAnimationEvent(szAnimation, nFrameID, ased);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::DisableAnimationEvent(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
int idSource;
|
|
const char *sAnimation;
|
|
pH->GetParam(1,idSource);
|
|
pH->GetParam(2,sAnimation);
|
|
IEntity *pSource=m_pEntitySystem->GetEntity(idSource);
|
|
if(!pSource)
|
|
pH->EndFunction();
|
|
IEntityCharacter *pCharacter=pSource->GetCharInterface();
|
|
ICryCharInstance* pCryCharacter=pCharacter->GetCharacter(0);
|
|
if (pCryCharacter)
|
|
pCryCharacter->RemoveAnimationEventSink (sAnimation, m_pEntity);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetAnimationSpeed(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
float fSpeed;
|
|
pH->GetParam(1,fSpeed);
|
|
m_pEntity->SetAnimationSpeed( fSpeed );
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SetAnimationTime(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(3)
|
|
int nSlot = 0;
|
|
int nLayer = 0;
|
|
float fTime = 0;
|
|
pH->GetParam(1,nSlot);
|
|
pH->GetParam(2,nLayer);
|
|
pH->GetParam(3,fTime);
|
|
|
|
ICryCharInstance* pCryCharacter = m_pEntity->GetCharInterface()->GetCharacter(nSlot);
|
|
if (pCryCharacter)
|
|
{
|
|
pCryCharacter->SetLayerTime(nLayer,fTime);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetAnimationTime(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2)
|
|
int nSlot = 0;
|
|
int nLayer = 0;
|
|
float fTime = 0;
|
|
pH->GetParam(1,nSlot);
|
|
pH->GetParam(2,nLayer);
|
|
|
|
ICryCharInstance* pCryCharacter = m_pEntity->GetCharInterface()->GetCharacter(nSlot);
|
|
if (pCryCharacter)
|
|
{
|
|
fTime = pCryCharacter->GetLayerTime(nLayer);
|
|
}
|
|
return pH->EndFunction(fTime);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SelectPipe(IFunctionHandler *pH)
|
|
{
|
|
// CHECK_PARAMETERS(2);
|
|
|
|
int iIdentifier;
|
|
int nID=0;
|
|
const char *pName;
|
|
const char *pTargetName=0;
|
|
|
|
pH->GetParam(1,iIdentifier);
|
|
pH->GetParam(2,pName);
|
|
|
|
if (pH->GetParamCount() > 2)
|
|
{
|
|
if (pH->GetParamType(3) == svtNumber)
|
|
pH->GetParam(3,nID);
|
|
else
|
|
pH->GetParam(3,pTargetName);
|
|
}
|
|
|
|
IAIObject *pTargetAI=0;
|
|
if (nID)
|
|
{
|
|
IEntity *pTarget = m_pEntitySystem->GetEntity(nID);
|
|
if (pTarget)
|
|
pTargetAI = pTarget->GetAI();
|
|
}
|
|
else if (pTargetName)
|
|
{
|
|
pTargetAI = m_pISystem->GetAISystem()->GetAIObjectByName(0,pTargetName);
|
|
}
|
|
|
|
IAIObject *pObject = m_pEntity->GetAI();
|
|
|
|
IPipeUser *pPipeUser;
|
|
bool res = false;
|
|
if (pObject)
|
|
if (pObject->CanBeConvertedTo(AIOBJECT_PIPEUSER,(void**) &pPipeUser))
|
|
{
|
|
if (pTargetAI)
|
|
res = pPipeUser->SelectPipe(iIdentifier,pName,pTargetAI);
|
|
else
|
|
res = pPipeUser->SelectPipe(iIdentifier,pName);
|
|
}
|
|
|
|
|
|
if (!res)
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,VALIDATOR_FLAG_AI,0,"[AIWARNING] Entity %s failed to select goal pipe %s",m_pEntity->GetName(),pName);
|
|
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::InsertSubpipe(IFunctionHandler * pH)
|
|
{
|
|
int iIdentifier;
|
|
int nID=0;
|
|
const char *pName;
|
|
const char *pTargetName=0;
|
|
pH->GetParam(1,iIdentifier);
|
|
pH->GetParam(2,pName);
|
|
|
|
if (pH->GetParamCount() > 2)
|
|
{
|
|
if (pH->GetParamType(3) == svtNumber)
|
|
pH->GetParam(3,nID);
|
|
else
|
|
pH->GetParam(3,pTargetName);
|
|
}
|
|
|
|
IAIObject *pTargetAI=0;
|
|
if (nID)
|
|
{
|
|
IEntity *pTarget = m_pEntitySystem->GetEntity(nID);
|
|
if (pTarget)
|
|
pTargetAI = pTarget->GetAI();
|
|
}
|
|
else if (pTargetName)
|
|
{
|
|
pTargetAI = m_pISystem->GetAISystem()->GetAIObjectByName(0,pTargetName);
|
|
}
|
|
|
|
IAIObject *pObject = m_pEntity->GetAI();
|
|
|
|
IPipeUser *pPipeUser;
|
|
bool res = false;
|
|
if (pObject)
|
|
if (pObject->CanBeConvertedTo(AIOBJECT_PIPEUSER,(void**) &pPipeUser))
|
|
{
|
|
if (pTargetAI)
|
|
res = pPipeUser->InsertSubPipe(iIdentifier,pName,pTargetAI);
|
|
else
|
|
res = pPipeUser->InsertSubPipe(iIdentifier,pName);
|
|
}
|
|
|
|
/*
|
|
m_pISystem->GetILog()->SetFileName("AILOG.txt");
|
|
if (res)
|
|
m_pISystem->GetILog()->LogToFile("[%d] %s SELECT_PIPE %s",m_pISystem->GetAISystem()->GetAITickCount(),pObject->GetName(),pName);
|
|
else
|
|
m_pISystem->GetILog()->LogToFile("[%d] %s PIPE_SELECTION_FAILED %s",m_pISystem->GetAISystem()->GetAITickCount(),pObject->GetName(),pName);
|
|
m_pISystem->GetILog()->SetFileName("Log.txt");
|
|
*/
|
|
|
|
return pH->EndFunction(res);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GotoState(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
const char *sState;
|
|
pH->GetParam(1,sState);
|
|
|
|
bool res = false;
|
|
if (sState)
|
|
{
|
|
if(!m_pEntity->IsStateClientside() && !GetISystem()->GetIGame()->GetModuleState( EGameServer ))
|
|
{
|
|
// GotoState should only be called on the client when StateClientSide is on for this entity
|
|
CryLog("\001ERROR: ScriptObjectEntity:GotoState on the client! (EntityClass:'%s' Name:'%s', State:'%s')",
|
|
m_pEntity->GetEntityClassName(), m_pEntity->GetName(), sState);
|
|
}
|
|
res = m_pEntity->GotoState(sState);
|
|
}
|
|
return pH->EndFunction(res);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::IsInState(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
|
|
const char *sState;
|
|
pH->GetParam(1,sState);
|
|
|
|
bool res = false;
|
|
if (sState)
|
|
{
|
|
res = m_pEntity->IsInState(sState);
|
|
}
|
|
return pH->EndFunction(res);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetState(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
|
|
return pH->EndFunction( m_pEntity->GetState() );
|
|
}
|
|
|
|
int CScriptObjectEntity::GetCurAnimation(IFunctionHandler *pH)
|
|
{
|
|
int iPos;
|
|
ICryCharInstance *pCharacter = NULL;
|
|
|
|
CHECK_PARAMETERS(1);
|
|
|
|
pH->GetParam(1, iPos);
|
|
|
|
pCharacter = m_pEntity->GetCharInterface()->GetCharacter(iPos);
|
|
if (pCharacter)
|
|
{
|
|
if (pCharacter->GetCurAnimation() && pCharacter->GetCurAnimation()[0] != '\0')
|
|
|
|
return pH->EndFunction(pCharacter->GetCurAnimation());
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
/*int CScriptObjectEntity::SetDamage(IFunctionHandler *pH)
|
|
{
|
|
int dmg;
|
|
CHECK_PARAMETERS(1);
|
|
|
|
pH->GetParam(1, dmg);
|
|
|
|
m_pEntity->SetDamage(dmg);
|
|
|
|
return pH->EndFunction();
|
|
}*/
|
|
|
|
|
|
int CScriptObjectEntity::SetTimer(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int msec;
|
|
pH->GetParam(1, msec);
|
|
m_pEntity->SetTimer(msec);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::KillTimer(IFunctionHandler *pH)
|
|
{
|
|
m_pEntity->KillTimer();
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::SetScriptUpdateRate(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int msec;
|
|
pH->GetParam(1, msec);
|
|
m_pEntity->SetScriptUpdateRate( ((float)msec)/1000.0f );
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::RegisterState(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *sState;
|
|
pH->GetParam(1,sState);
|
|
m_pEntity->RegisterState(sState);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::ApplyForceToEnvironment(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
float force;
|
|
float radius;
|
|
pH->GetParam(1, radius);
|
|
pH->GetParam(2, force);
|
|
m_pEntity->ApplyForceToEnvironment(radius, force);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::IsVisible(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
|
|
// const char * pName = m_pEntity->GetName();
|
|
// int bRend = m_pISystem->GetIRenderer()->GetFrameID();
|
|
// int bVis = bRend;//m_pEntity->GetDrawFrame(0);
|
|
|
|
bool bVis = true;
|
|
//m_pISystem->GetI3DEngine()->
|
|
//IsSphereVisibleOnTheScreen(m_pEntity->GetPos(), m_pEntity->GetRadius()+16.f);
|
|
|
|
// this will force entity to be rendered and to get valid entity frame id
|
|
// m_pEntity->InitEntityRenderState();
|
|
|
|
return pH->EndFunction( int(bVis) );
|
|
}
|
|
|
|
|
|
/*! Retrieves the position of a bone
|
|
@param bone Name of the helper object in the model
|
|
@return Three component vector cotaining the position
|
|
*/
|
|
int CScriptObjectEntity::GetBonePos(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char * sBoneName = "wt";
|
|
pH->GetParam(1,sBoneName);
|
|
|
|
IEntityCharacter *pIChar = m_pEntity->GetCharInterface();
|
|
ICryCharInstance * cmodel = pIChar->GetCharacter(0);
|
|
|
|
if (!cmodel)
|
|
return pH->EndFunctionNull();
|
|
|
|
ICryBone * pBone = cmodel->GetBoneByName(sBoneName);
|
|
if(!pBone)
|
|
{
|
|
m_pISystem->GetILog()->Log("ERROR: CScriptObjectWeapon::GetBonePos: Bone not found: %s", sBoneName);
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
Vec3 vBonePos = pBone->GetBonePosition();
|
|
Vec3 angles = m_pEntity->GetAngles();
|
|
|
|
// transform into entity space
|
|
//Matrix44 m;
|
|
//m.Identity();
|
|
//m = GetTranslationMat(m_pEntity->GetPos())*m;
|
|
//m = GetRotationZYX44(-angles*gf_DEGTORAD)*m; //NOTE: angles in radians and negated
|
|
|
|
//OPTIMISED_BY_IVO
|
|
Matrix44 m=Matrix34::CreateRotationXYZ( Deg2Rad(angles),m_pEntity->GetPos());
|
|
m=GetTransposed44(m); //TODO: remove this after E3 and use Matrix34 instead of Matrix44
|
|
|
|
SetMemberVector( SOE_MEMBER_BONE_POS,m.TransformPointOLD(vBonePos) );
|
|
//Vec3 tmp = m.TransformPoint(vBonePos);
|
|
return pH->EndFunction( m_memberSO[SOE_MEMBER_BONE_POS] );
|
|
}
|
|
|
|
|
|
/*! Retrieves the world direction of a bone - direction of Y axis of the bone
|
|
@param bone Name of the helper object in the model
|
|
@return Three component vector cotaining the direction in degrees
|
|
*/
|
|
int CScriptObjectEntity::GetBoneDir(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char * sBoneName = "wt";
|
|
pH->GetParam(1,sBoneName);
|
|
|
|
IEntityCharacter *pIChar = m_pEntity->GetCharInterface();
|
|
ICryCharInstance * cmodel = pIChar->GetCharacter(0);
|
|
|
|
if (!cmodel)
|
|
return pH->EndFunctionNull();
|
|
|
|
ICryBone * pBone = cmodel->GetBoneByName(sBoneName);
|
|
if(!pBone)
|
|
{
|
|
m_pISystem->GetILog()->Log("ERROR: CScriptObjectWeapon::GetBonePos: Bone not found: %s", sBoneName);
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
Vec3 vBoneDir = pBone->GetBoneAxis('z');
|
|
// vBoneDir = vBoneDir*(-1.0f);
|
|
Vec3 angles = m_pEntity->GetAngles();
|
|
Vec3 worldAngles;
|
|
Matrix44 m;
|
|
|
|
// transform into entity space
|
|
m.SetIdentity();
|
|
//m.RotateMatrix_fix(angles);
|
|
m=Matrix44::CreateRotationZYX(-angles*gf_DEGTORAD)*m; //NOTE: angles in radians and negated
|
|
|
|
// get result
|
|
//CHANGED_BY_IVO
|
|
//worldAngles = m.TransformVector(vBoneDir);
|
|
worldAngles = GetTransposed44(m)*vBoneDir;
|
|
|
|
|
|
worldAngles=ConvertVectorToCameraAngles(worldAngles);
|
|
SetMemberVector( SOE_MEMBER_BONE_DIR,worldAngles );
|
|
return pH->EndFunction( m_memberSO[SOE_MEMBER_BONE_DIR] );
|
|
}
|
|
|
|
|
|
|
|
int CScriptObjectEntity::GetBoneNameFromTable(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int idx;
|
|
pH->GetParam(1,idx);
|
|
|
|
IEntityCharacter *pIChar = m_pEntity->GetCharInterface();
|
|
ICryCharInstance * pCharacter = pIChar->GetCharacter(0);
|
|
if (!pCharacter)
|
|
return pH->EndFunctionNull();
|
|
|
|
const char *pName = pCharacter->GetModel()->GetBoneName(idx);
|
|
return pH->EndFunction(pName);
|
|
}
|
|
|
|
/*!retrieve the material id(surfaceid) of the object in contact with the entity
|
|
@return the material id of the colliding entity
|
|
*/
|
|
int CScriptObjectEntity::GetTouchedSurfaceID(IFunctionHandler *pH)
|
|
{
|
|
IPhysicalEntity *pe;
|
|
|
|
|
|
//pEntity=m_pPlayer->GetEntity();
|
|
pe=m_pEntity->GetPhysics();
|
|
if(pe)
|
|
{
|
|
coll_history_item hItem;
|
|
pe_status_collisions status;
|
|
status.pHistory = &hItem;
|
|
status.age = .2f;
|
|
if(pe->GetStatus(&status))// && (!status.bFlying))
|
|
{
|
|
//int tmpIdx = hItem.idmat[1];
|
|
return pH->EndFunction(hItem.idmat[1]);
|
|
}
|
|
}
|
|
return pH->EndFunction(-1);
|
|
}
|
|
|
|
//
|
|
//!retrieves point of collision for rigid body
|
|
int CScriptObjectEntity::GetTouchedPoint(IFunctionHandler *pH)
|
|
{
|
|
IPhysicalEntity *pe;
|
|
|
|
//pEntity=m_pPlayer->GetEntity();
|
|
pe=m_pEntity->GetPhysics();
|
|
if(pe)
|
|
{
|
|
coll_history_item hItem;
|
|
pe_status_collisions status;
|
|
status.pHistory = &hItem;
|
|
status.age = .2f;
|
|
if(pe->GetStatus(&status))// && (!status.bFlying))
|
|
{
|
|
CScriptObjectVector oVec(m_pScriptSystem);
|
|
// vec=m_pEntity->GetPos(false);
|
|
Vec3 vec=hItem.pt;
|
|
oVec=vec;
|
|
return pH->EndFunction(*oVec);
|
|
}
|
|
}
|
|
return pH->EndFunction(-1);
|
|
}
|
|
|
|
|
|
// projTexName shaderName flags
|
|
int CScriptObjectEntity::InitDynamicLight(IFunctionHandler *pH)
|
|
{
|
|
const char *sTexName=NULL;
|
|
const char *sShaderName=NULL;
|
|
|
|
int nAsCubemap = 0;
|
|
float fAnimSpeed = 0;
|
|
float fCoronaSize = 0;
|
|
int nLightStyle = 0;
|
|
if (pH->GetParamCount()>0)
|
|
{
|
|
pH->GetParam(1,sTexName);
|
|
}
|
|
if (pH->GetParamCount()>1)
|
|
{
|
|
pH->GetParam(2,sShaderName);
|
|
}
|
|
if (pH->GetParamCount()>2)
|
|
{
|
|
pH->GetParam(3,nAsCubemap);
|
|
}
|
|
if (pH->GetParamCount()>3)
|
|
{
|
|
pH->GetParam(4,fAnimSpeed);
|
|
}
|
|
if (pH->GetParamCount()>4)
|
|
{
|
|
pH->GetParam(5,nLightStyle);
|
|
}
|
|
if (pH->GetParamCount()>5)
|
|
{
|
|
pH->GetParam(6,fCoronaSize);
|
|
}
|
|
|
|
|
|
bool bAsCubemap = (nAsCubemap >= 1);
|
|
m_pEntity->InitLight( sTexName, sShaderName, bAsCubemap, fAnimSpeed, nLightStyle, fCoronaSize );
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::RemoveLight(IFunctionHandler *pH)
|
|
{
|
|
if (pH->GetParamCount()<1)
|
|
return pH->EndFunction();
|
|
|
|
USER_DATA nLightId;
|
|
int nCookie=0;
|
|
|
|
if (pH->GetParamUDVal(1,nLightId,nCookie) && nLightId && (nCookie==USER_DATA_LIGHT))
|
|
{
|
|
m_pISystem->GetI3DEngine()->DeleteStaticLightSource(nLightId);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::AddDynamicLight2(IFunctionHandler *pH)
|
|
{
|
|
|
|
//if(pH->GetParamCount()<11)
|
|
// return pH->EndFunction();
|
|
|
|
CDLight DynLight;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
|
|
if (!pH->GetParam(1,*pObj))
|
|
return pH->EndFunction(-1);
|
|
|
|
IScriptObject *pITable=*pObj;
|
|
|
|
if (!pITable->BeginSetGetChain())
|
|
return pH->EndFunction(-1);
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
bool bAttachToBone;
|
|
|
|
if (!pITable->GetValueChain( "useModel",bAttachToBone))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> use of model not specified" );
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
const char *sTexName=NULL;
|
|
const char *sShaderName=NULL;
|
|
|
|
if (!pITable->GetValueChain( "ProjTexture",sTexName))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> ProjTexture not specified" );
|
|
|
|
if (!pITable->GetValueChain( "lightShader",sShaderName))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> sShaderName not specified" );
|
|
|
|
if (sTexName && sTexName[0])
|
|
{
|
|
//m_pDynLight->m_fAnimSpeed = fAnimSpeed;
|
|
int nFlags2 = FT2_FORCECUBEMAP;
|
|
// [marco] ??? If it is supposed to be used as cubemap or whatever
|
|
// must be specified by the texture name or in the shader
|
|
//if (bUseAsCube)
|
|
//nFlags2 |= FT2_REPLICATETOALLSIDES;
|
|
//if (fAnimSpeed)
|
|
//nFlags2 |= FT2_CHECKFORALLSEQUENCES;
|
|
DynLight.m_pLightImage = m_pISystem->GetIRenderer()->EF_LoadTexture(sTexName, 0, nFlags2, eTT_Cubemap);
|
|
DynLight.m_Flags = DLF_PROJECT;
|
|
}
|
|
else
|
|
DynLight.m_Flags = DLF_POINT;
|
|
|
|
if (sShaderName && sShaderName[0])
|
|
DynLight.m_pShader = m_pISystem->GetIRenderer()->EF_LoadShader(sShaderName, eSH_World);
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
if (!pITable->GetValueChain("Pos",*oVec))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> Pos not specified" );
|
|
else
|
|
DynLight.m_Origin=oVec.Get();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
if (!pITable->GetValueChain( "orad",DynLight.m_fRadius))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> use of model not specified" );
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
float fR,fG,fB,fA;
|
|
|
|
if (!pITable->GetValueChain( "diffR",fR))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "diffG",fG))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "diffB",fB))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "diffA",fA))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
|
|
DynLight.m_Color = CFColor (fR,fG,fB,fA);
|
|
//DynLight.m_Color.Clamp();
|
|
|
|
if (!pITable->GetValueChain( "specR",fR))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "specG",fG))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "specB",fB))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
if (!pITable->GetValueChain( "specA",fA))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> diffuse not specified" );
|
|
|
|
DynLight.m_SpecColor = CFColor (fR, fG, fB, fA);
|
|
//DynLight.m_SpecColor.Clamp();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
if (!pITable->GetValueChain("Dir",*oVec))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> Dir not specified" );
|
|
else
|
|
DynLight.m_ProjAngles=oVec.Get();
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
if (!pITable->GetValueChain("projectorFov",DynLight.m_fLightFrustumAngle))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> frustum angle not specified" );
|
|
else
|
|
DynLight.m_fLightFrustumAngle/=2;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// cast shadows
|
|
int nThisAreaOnly = 0;
|
|
if (!pITable->GetValueChain("areaonly",nThisAreaOnly))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> thisareaonly not specified" );
|
|
else
|
|
{
|
|
if (nThisAreaOnly==1)
|
|
DynLight.m_Flags |= DLF_THIS_AREA_ONLY;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// shaders stuff
|
|
bool bDummy=false;
|
|
if (!pITable->GetValueChain("bHeatSource",bDummy))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> bHeatSource not specified" );
|
|
|
|
if (bDummy)
|
|
DynLight.m_Flags|=DLF_HEATSOURCE;
|
|
|
|
bDummy=false;
|
|
if (!pITable->GetValueChain("bFakeLight",bDummy))
|
|
m_pScriptSystem->RaiseError( "<AddDynamicLight2> bFakeLight not specified" );
|
|
|
|
pITable->EndSetGetChain();
|
|
|
|
if (!bDummy)
|
|
DynLight.m_Flags |= DLF_LIGHTSOURCE;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// more shaders stuff
|
|
|
|
if (m_pEntity && m_pEntity->GetRndFlags()&ERF_CASTSHADOWVOLUME && !m_pEntity->GetContainer())
|
|
DynLight.m_Flags |= DLF_CASTSHADOW_VOLUME;
|
|
|
|
if (m_pEntity && m_pEntity->GetRndFlags()&ERF_CASTSHADOWMAPS && !m_pEntity->GetContainer())
|
|
DynLight.m_Flags |= DLF_CASTSHADOW_MAPS;
|
|
|
|
DynLight.m_pOwner = m_pEntity;
|
|
|
|
if (DynLight.m_fLightFrustumAngle && DynLight.m_pLightImage!=NULL && DynLight.m_pLightImage->IsTextureLoaded())
|
|
DynLight.m_Flags |= DLF_PROJECT;
|
|
else
|
|
{
|
|
DynLight.m_pLightImage = NULL;
|
|
DynLight.m_Flags |= DLF_POINT;
|
|
}
|
|
|
|
if(m_pEntity->GetRndFlags()&ERF_CASTSHADOWINTOLIGHTMAP)
|
|
DynLight.m_Flags |= DLF_LM;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// finally add it to the engine
|
|
|
|
m_pISystem->GetIRenderer()->EF_UpdateDLight(&DynLight);
|
|
|
|
int nLightId;
|
|
ICryCharInstance *pChar=m_pEntity->GetCharInterface()->GetCharacter(0);
|
|
if (bAttachToBone && pChar)
|
|
nLightId=m_pISystem->GetI3DEngine()->AddStaticLightSource(DynLight, m_pEntity,pChar,"LightBone");
|
|
else
|
|
nLightId=m_pISystem->GetI3DEngine()->AddStaticLightSource(DynLight, m_pEntity);
|
|
|
|
USER_DATA ud=m_pScriptSystem->CreateUserData(nLightId,USER_DATA_LIGHT);
|
|
return pH->EndFunction(ud);
|
|
}
|
|
|
|
|
|
// vPos, fRadius, DiffR, DiffG, DiffB, DiffA, SpecR, SpecG, SpecB, SpecA, fLifeTime
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::AddDynamicLight(IFunctionHandler *pH)
|
|
{
|
|
//CryError("DATA ERROR: Obsolete version of dynamiclight.lua - update and re-export the map.");
|
|
_SmartScriptObject pOptimizationTable(m_pScriptSystem,true);
|
|
|
|
if(pH->GetParamCount()<11)
|
|
return pH->EndFunction();
|
|
|
|
// use entity lsource
|
|
if(!m_pEntity->GetLight())
|
|
m_pEntity->InitLight();
|
|
|
|
CDLight * pDynLight = m_pEntity->GetLight();
|
|
IShader *pShader=pDynLight->m_pShader;
|
|
|
|
{ // reset light source
|
|
//memset(pDynLight, 0, sizeof(CDLight));
|
|
pDynLight->m_fLightFrustumAngle = 45.0f;
|
|
pDynLight->m_fRadius = 4.0f;
|
|
pDynLight->m_fDirectFactor = 1.0f;
|
|
pDynLight->m_Flags = DLF_LIGHTSOURCE;
|
|
pDynLight->m_Orientation.m_vForward = Vec3(1,0,0);
|
|
pDynLight->m_Orientation.m_vUp = Vec3(0,1,0);
|
|
pDynLight->m_Orientation.m_vRight = Vec3(0,0,1);
|
|
pDynLight->m_NumCM = -1;
|
|
pDynLight->m_nEntityLightId = -1;
|
|
}
|
|
|
|
pDynLight->m_pShader = pShader;
|
|
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
|
|
// get basic parameters
|
|
if (pH->GetParam(1,*oVec))
|
|
pDynLight->m_Origin=oVec.Get();
|
|
pH->GetParam(2,pDynLight->m_fRadius);
|
|
float r, g, b, a;
|
|
pH->GetParam(3,r);
|
|
pH->GetParam(4,g);
|
|
pH->GetParam(5,b);
|
|
pH->GetParam(6,a);
|
|
pDynLight->m_Color = CFColor (r, g, b, a);
|
|
// pDynLight->m_Color.Clamp();
|
|
pH->GetParam(7,r);
|
|
pH->GetParam(8,g);
|
|
pH->GetParam(9,b);
|
|
pH->GetParam(10,a);
|
|
pDynLight->m_SpecColor = CFColor (r, g, b, a);
|
|
//pDynLight->m_SpecColor.Clamp();
|
|
pH->GetParam(11,pDynLight->m_fLifeTime);
|
|
|
|
// get direction of projection
|
|
if (pH->GetParamCount()>=13)
|
|
{
|
|
if (pH->GetParam(13,*oVec))
|
|
{
|
|
pDynLight->m_ProjAngles = oVec.Get();
|
|
}
|
|
}
|
|
|
|
// get fov
|
|
if (pH->GetParamCount()>=14)
|
|
{
|
|
float fAngl=0;
|
|
pH->GetParam(14,fAngl);
|
|
pDynLight->m_fLightFrustumAngle = fAngl/2;
|
|
}
|
|
|
|
// get cubemap
|
|
if (pDynLight->m_fLightFrustumAngle && pH->GetParamCount()>=15)
|
|
{
|
|
int nTid=0;
|
|
pH->GetParam(15,nTid);
|
|
//pDynLight->m_pLightImage = m_pISystem->GetIRenderer()->EF_GetTextureByID(nTid);
|
|
}
|
|
|
|
// cast shadows
|
|
if (pH->GetParamCount()>=16)
|
|
{
|
|
int nThisAreaOnly = 0;
|
|
pH->GetParam(16,nThisAreaOnly);
|
|
if(nThisAreaOnly)
|
|
pDynLight->m_Flags |= DLF_THIS_AREA_ONLY;
|
|
}
|
|
|
|
// used in realtime
|
|
int nUsedInRealTime = 1;
|
|
if (pH->GetParamCount()>=17)
|
|
{
|
|
pH->GetParam(17,nUsedInRealTime);
|
|
}
|
|
|
|
if(m_pEntity && m_pEntity->GetRndFlags()&ERF_CASTSHADOWVOLUME && !m_pEntity->GetContainer())
|
|
pDynLight->m_Flags |= DLF_CASTSHADOW_VOLUME;
|
|
|
|
if (m_pEntity && m_pEntity->GetRndFlags()&ERF_CASTSHADOWMAPS && !m_pEntity->GetContainer())
|
|
pDynLight->m_Flags |= DLF_CASTSHADOW_MAPS;
|
|
|
|
pDynLight->m_pOwner = m_pEntity;
|
|
|
|
if (pDynLight->m_fLightFrustumAngle && pDynLight->m_pLightImage!=NULL && pDynLight->m_pLightImage->IsTextureLoaded())
|
|
pDynLight->m_Flags |= DLF_PROJECT;
|
|
else
|
|
{
|
|
pDynLight->m_pLightImage = NULL;
|
|
pDynLight->m_Flags |= DLF_POINT;
|
|
}
|
|
|
|
int bHeatSource=0;
|
|
if (pH->GetParamCount()>=18)
|
|
pH->GetParam(18,bHeatSource);
|
|
if (bHeatSource)
|
|
pDynLight->m_Flags|=DLF_HEATSOURCE;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_HEATSOURCE;
|
|
|
|
int bFake=0;
|
|
if (pH->GetParamCount()>=19)
|
|
pH->GetParam(19,bFake);
|
|
if (bFake)
|
|
pDynLight->m_Flags|=DLF_FAKE;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_FAKE;
|
|
|
|
if(m_pEntity->GetRndFlags()&ERF_CASTSHADOWINTOLIGHTMAP)
|
|
pDynLight->m_Flags |= DLF_LM;
|
|
|
|
int bIgnoreTerrain=0;
|
|
if (pH->GetParamCount()>=20)
|
|
pH->GetParam(20,bIgnoreTerrain);
|
|
if (bIgnoreTerrain)
|
|
pDynLight->m_Flags|=DLF_IGNORE_TERRAIN;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_IGNORE_TERRAIN;
|
|
|
|
bool bOnlyForHighSpec = false;
|
|
bool bSpecularOnlyForHighSpec = false;
|
|
if (pH->GetParamCount()>=21)
|
|
{
|
|
if (pH->GetParam(21,pOptimizationTable))
|
|
{
|
|
// Read optimization table.
|
|
pOptimizationTable->BeginSetGetChain();
|
|
pOptimizationTable->GetValue( "bOnlyForHighSpec",bOnlyForHighSpec );
|
|
pOptimizationTable->GetValue( "bSpecularOnlyForHighSpec",bSpecularOnlyForHighSpec );
|
|
pOptimizationTable->EndSetGetChain();
|
|
if (bOnlyForHighSpec)
|
|
pDynLight->m_Flags |= DLF_ONLY_FOR_HIGHSPEC;
|
|
else
|
|
pDynLight->m_Flags &= ~DLF_ONLY_FOR_HIGHSPEC;
|
|
if (bSpecularOnlyForHighSpec)
|
|
pDynLight->m_Flags |= DLF_SPECULAR_ONLY_FOR_HIGHSPEC;
|
|
else
|
|
pDynLight->m_Flags &= ~DLF_SPECULAR_ONLY_FOR_HIGHSPEC;
|
|
}
|
|
}
|
|
int bDot3Type=0;
|
|
if (pH->GetParamCount()>=22)
|
|
pH->GetParam(22,bDot3Type);
|
|
if (bDot3Type)
|
|
pDynLight->m_Flags|=DLF_LMDOT3;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_LMDOT3;
|
|
int bFakeRadiosity=0;
|
|
if (pH->GetParamCount()>=23)
|
|
pH->GetParam(23,bFakeRadiosity);
|
|
if (bFakeRadiosity)
|
|
pDynLight->m_Flags|=DLF_FAKE_RADIOSITY;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_FAKE_RADIOSITY;
|
|
|
|
//- Get LightDir --------------------------------------------------------------------------------------------
|
|
|
|
// get custom angles
|
|
Vec3d vProjAnglesPlus(0,0,0);
|
|
if (pH->GetParamCount()>=24 && pH->GetParam(24,*oVec))
|
|
vProjAnglesPlus = oVec.Get();
|
|
|
|
int bFixedLightDir=0;
|
|
if (pH->GetParamCount()>=25)
|
|
pH->GetParam(25,bFixedLightDir);
|
|
|
|
if (bFixedLightDir)
|
|
{
|
|
Matrix33 mat=Matrix33::CreateRotationXYZ(Ang3(DEG2RAD(pDynLight->m_ProjAngles.x),DEG2RAD(pDynLight->m_ProjAngles.y),DEG2RAD(pDynLight->m_ProjAngles.z)));
|
|
Matrix33 matRotate = Matrix33::CreateRotationXYZ(Ang3(DEG2RAD(vProjAnglesPlus.x),DEG2RAD(vProjAnglesPlus.y),DEG2RAD(vProjAnglesPlus.z)));
|
|
mat = mat * matRotate;
|
|
Ang3 angles;
|
|
angles = angles.GetAnglesXYZ(mat);
|
|
pDynLight->m_ProjAngles.x = RAD2DEG(angles.x);
|
|
pDynLight->m_ProjAngles.y = RAD2DEG(angles.y);
|
|
pDynLight->m_ProjAngles.z = RAD2DEG(angles.z);
|
|
}
|
|
else
|
|
pDynLight->m_ProjAngles += vProjAnglesPlus;
|
|
//---------------------------------------------------------------------------------------------
|
|
int bOcclType=0;
|
|
if (pH->GetParamCount()>=26)
|
|
pH->GetParam(26,bOcclType);
|
|
if (bOcclType)
|
|
pDynLight->m_Flags|=DLF_LMOCCL;
|
|
else
|
|
pDynLight->m_Flags&=~DLF_LMOCCL;
|
|
|
|
pDynLight->MakeBaseParams();
|
|
|
|
if(nUsedInRealTime)
|
|
{
|
|
pDynLight->m_Flags &= ~DLF_TEMP;
|
|
m_pISystem->GetIRenderer()->EF_UpdateDLight(pDynLight);
|
|
m_pISystem->GetI3DEngine()->AddDynamicLightSource(*pDynLight, m_pEntity);
|
|
}
|
|
else
|
|
pDynLight->m_Flags |= DLF_TEMP; // light should be totaly ignored for realtime lighting
|
|
|
|
m_pEntity->InvalidateBBox();
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//
|
|
//updates huming rockets
|
|
int CScriptObjectEntity::DoHam(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
pe_params_particle rpp;
|
|
|
|
Vec3 target;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
target=oVec.Get();
|
|
|
|
IPhysicalEntity *pe;
|
|
pe=m_pEntity->GetPhysics();
|
|
if(pe)
|
|
{
|
|
pe->GetParams(&rpp);
|
|
|
|
Vec3 pos = m_pEntity->GetPos();
|
|
target = target - pos;
|
|
Vec3 dir = rpp.heading;
|
|
|
|
Vec3 diff = target-dir;
|
|
dir+=diff*m_pISystem->GetITimer()->GetFrameTime()*0.5f;
|
|
|
|
// float dist = target.Length();
|
|
// target.Normalize();
|
|
// Vec3 delta = target - (Vec3)rpp.heading;
|
|
|
|
|
|
rpp.heading = dir;
|
|
rpp.heading.normalize();
|
|
|
|
pe->SetParams(&rpp);
|
|
}
|
|
return pH->EndFunction(-1);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
//resets huming rockets
|
|
int CScriptObjectEntity::ResetHam(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
//m_ControlTime = 0;
|
|
//m_Control = Vec3(0,0,0);
|
|
//m_ControlTimeLimit = 0.05f;
|
|
return pH->EndFunction(-1);
|
|
}
|
|
|
|
int CScriptObjectEntity::LoadBoat(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(3);
|
|
const char *sFileName;
|
|
float fMass;
|
|
int nSurfaceID=0;
|
|
|
|
pH->GetParam(1,sFileName);
|
|
pH->GetParam(2,fMass);
|
|
pH->GetParam(3,nSurfaceID);
|
|
|
|
if (m_pEntity)
|
|
{
|
|
/*
|
|
m_pEntity->LoadObject(0,sFileName,0,"boat_hull");
|
|
m_pEntity->CreateRigidBody(PE_RIGID,0,fMass,nSurfaceID,NULL,0);
|
|
return pH->EndFunction(1);
|
|
/*/
|
|
//*
|
|
if( m_pEntity->LoadBoat(sFileName, fMass, nSurfaceID) )
|
|
return pH->EndFunction(1);
|
|
/*/
|
|
int res;
|
|
|
|
res = m_pEntity->LoadObject(0,sFileName,0,"boat");
|
|
if(res)
|
|
{
|
|
if(m_pEntity->LoadObject(1,sFileName,0,"boat_hull"))
|
|
{
|
|
m_pEntity->CreateRigidBody(PE_RIGID,0,fMass,nSurfaceID,NULL,1);
|
|
m_pEntity->DrawObject(1, ETY_DRAW_NONE);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunction(res);
|
|
//*/
|
|
}
|
|
// m_pISystem->GetILog()->LogToFile("[FATAL ERROR] Script table %s not found. Probably script was not loaded because of an error.",sClassname.c_str());
|
|
// CryWarning("ERROR - Can not load boat %s ", sFileName);
|
|
return pH->EndFunction(0);
|
|
}
|
|
|
|
|
|
// Enable/ disable various entity features
|
|
int CScriptObjectEntity::EnableProp(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
int propertyID;
|
|
bool enable;
|
|
|
|
pH->GetParam(1,propertyID);
|
|
pH->GetParam(2,enable);
|
|
|
|
switch (propertyID)
|
|
{
|
|
case ENTITYPROP_CASTSHADOWS:
|
|
m_pEntity->SetRndFlags(ERF_CASTSHADOWVOLUME|ERF_SELFSHADOW|ERF_CASTSHADOWMAPS|ERF_RECVSHADOWMAPS,enable);
|
|
break;
|
|
case ENTITYPROP_DONOTCHECKVIS:
|
|
m_pEntity->SetRndFlags(ERF_DONOTCHECKVIS,enable);
|
|
break;
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
/*
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetBuildingId(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
int nBuildingId = -1;
|
|
int nSectorId = -1;
|
|
Vec3 pos = m_pEntity->GetPos();
|
|
IIndoorBase *pBase=m_pISystem->GetI3DEngine()->GetBuildingManager();
|
|
if (!pBase || !pBase->CheckInside(pos,nBuildingId,nSectorId))
|
|
{
|
|
nBuildingId = nSectorId = -1;
|
|
}
|
|
return pH->EndFunction(nBuildingId);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetSectorId(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
int nBuildingId = -1;
|
|
int nSectorId = -1;
|
|
Vec3 pos = m_pEntity->GetPos();
|
|
IIndoorBase *pBase=m_pISystem->GetI3DEngine()->GetBuildingManager();
|
|
if (!pBase || !pBase->CheckInside(pos,nBuildingId,nSectorId))
|
|
{
|
|
nBuildingId = nSectorId = -1;
|
|
}
|
|
return pH->EndFunction(nSectorId);
|
|
}
|
|
*/
|
|
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
int CScriptObjectEntity::Damage(IFunctionHandler *pH)
|
|
{
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
if(pH->GetParam(1,pObj))
|
|
{
|
|
m_pEntity->OnDamage(pObj);
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
int CScriptObjectEntity::UpdateInSector(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
|
|
int curBuildingId,curSectorId;
|
|
int nBuildingId,nSectorId;
|
|
|
|
pH->GetParam(1, curBuildingId);
|
|
pH->GetParam(2, curSectorId);
|
|
|
|
Vec3 pos = m_pEntity->GetPos();
|
|
if (m_pISystem->GetI3DEngine()->GetBuildingManager()->CheckInside(pos,nBuildingId,nSectorId))
|
|
{
|
|
if(curBuildingId == -1) // it's first time - add area
|
|
{
|
|
m_pGame->m_XAreaMgr.AddArea( nBuildingId, nSectorId, m_pEntity->GetId() );
|
|
}
|
|
if( (curBuildingId != nBuildingId) || (curSectorId != nSectorId) ) // area already added - now moved to other sector
|
|
{
|
|
CXArea *curArea = m_pGame->m_XAreaMgr.GetArea( curBuildingId, curSectorId, m_pEntity->GetId() );
|
|
if(curArea)
|
|
{
|
|
curArea->SetBuilding( nBuildingId);
|
|
curArea->SetSector( nSectorId );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(curBuildingId != -1) // was in some sector - now out. remove from areaMgr
|
|
{
|
|
CXArea *curArea = m_pGame->m_XAreaMgr.GetArea( curBuildingId, curSectorId, m_pEntity->GetId() );
|
|
if(curArea)
|
|
m_pGame->m_XAreaMgr.DeleteArea( curArea );
|
|
}
|
|
nBuildingId = nSectorId = -1;
|
|
}
|
|
|
|
CScriptObjectVector oVec(m_pScriptSystem);
|
|
oVec.Set(Vec3((float)nBuildingId, (float)nSectorId, 0.0f));
|
|
return pH->EndFunction(*oVec);
|
|
|
|
// return pH->EndFunction();
|
|
}
|
|
*/
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
|
|
int CScriptObjectEntity::ChangeAIParameter(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
|
|
int nParameter;
|
|
float fValue;
|
|
pH->GetParam(1,nParameter);
|
|
pH->GetParam(2,fValue);
|
|
|
|
AgentParameters ap;
|
|
IAIObject *pObject = m_pEntity->GetAI();
|
|
if (pObject)
|
|
{
|
|
IPuppet *pPuppet = 0;
|
|
if (pObject->CanBeConvertedTo(AIOBJECT_PUPPET, (void**) &pPuppet))
|
|
{
|
|
ap = pPuppet->GetPuppetParameters();
|
|
switch (nParameter)
|
|
{
|
|
case AIPARAM_SIGHTRANGE:
|
|
ap.m_fSightRange = fValue;
|
|
break;
|
|
case AIPARAM_ATTACKRANGE:
|
|
ap.m_fAttackRange = fValue;
|
|
break;
|
|
case AIPARAM_ACCURACY:
|
|
ap.m_fAccuracy = fValue;
|
|
break;
|
|
case AIPARAM_AGGRESION:
|
|
ap.m_fAggression = 1.0f - fValue;
|
|
break;
|
|
case AIPARAM_GROUPID:
|
|
ap.m_nGroup = (int) fValue;
|
|
break;
|
|
case AIPARAM_SOUNDRANGE:
|
|
ap.m_fSoundRange = fValue;
|
|
break;
|
|
case AIPARAM_FOV:
|
|
ap.m_fHorizontalFov = fValue;
|
|
break;
|
|
case AIPARAM_COMMRANGE:
|
|
ap.m_fCommRange = fValue;
|
|
break;
|
|
case AIPARAM_RESPONSIVENESS:
|
|
ap.m_fResponsiveness = fValue;
|
|
break;
|
|
case AIPARAM_SPECIES:
|
|
ap.m_nSpecies = (int) fValue;
|
|
break;
|
|
|
|
// more to come as needed
|
|
}
|
|
pPuppet->SetPuppetParameters(ap);
|
|
}
|
|
else if( pObject->CanBeConvertedTo(AIOBJECT_VEHICLE, (void**) &pPuppet))
|
|
{
|
|
switch (nParameter)
|
|
{
|
|
case AIPARAM_FWDSPEED:
|
|
IVehicleProxy *proxy=NULL;
|
|
if(pObject->GetProxy()->QueryProxy(AIPROXY_VEHICLE, (void**)&proxy))
|
|
{
|
|
proxy->SetSpeeds( fValue, -1 );
|
|
}
|
|
return pH->EndFunction();
|
|
// more to come as needed
|
|
}
|
|
}
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
/*
|
|
int CScriptObjectEntity::TranslatePartIdToDeadBody(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int partid = -1;
|
|
pH->GetParam(1,partid);
|
|
|
|
IEntityCharacter *pIChar = m_pEntity->GetCharInterface();
|
|
if (pIChar) {
|
|
ICryCharInstance * cmodel = pIChar->GetCharacter(0);
|
|
if (cmodel)
|
|
pH->EndFunction(cmodel->TranslatePartIdToDeadBody(partid));
|
|
}
|
|
|
|
return pH->EndFunction(-1);
|
|
}
|
|
*/
|
|
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
int CScriptObjectEntity::SetAICustomFloat(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
float radius = 0.0f;
|
|
pH->GetParam(1,radius);
|
|
|
|
if( !m_pEntity->GetAI() )
|
|
return pH->EndFunction(-1);
|
|
|
|
m_pEntity->GetAI()->SetEyeHeight( radius );
|
|
|
|
return pH->EndFunction(-1);
|
|
}
|
|
|
|
//
|
|
//----------------------------------------------------------------------------------------------------n
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
int CScriptObjectEntity::ActivatePhysics(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
if (!m_pEntity)
|
|
return pH->EndFunction(0);
|
|
|
|
int active;
|
|
pH->GetParam(1, active);
|
|
m_pEntity->ActivatePhysics( active!=0 );
|
|
return pH->EndFunction(0);
|
|
}
|
|
|
|
|
|
//
|
|
//----------------------------------------------------------------------------------------------------
|
|
|
|
int CScriptObjectEntity::DeleteParticleEmitter(IFunctionHandler *pH)
|
|
{
|
|
int nSlotId = 0;
|
|
if(!pH->GetParam(1,nSlotId))
|
|
{
|
|
nSlotId = 0;
|
|
}
|
|
m_pEntity->DeleteParticleEmitter(nSlotId);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::CreateParticleEmitter(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(2);
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
_SmartScriptObject pChildObj(m_pScriptSystem,true);
|
|
static ParticleParams sParam;
|
|
float fTimeDelay=0;
|
|
|
|
if(!pH->GetParam(1,*pObj))
|
|
{
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> parameter 1 not specified or nil(perticle struct)" );
|
|
return pH->EndFunction();
|
|
}
|
|
if(!pH->GetParam(2,fTimeDelay))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> parameter 2 not specified or nil(fTimeDelay)" );
|
|
|
|
ReadParticleTable(*pObj, sParam);
|
|
sParam.vPosition = Vec3(0,0,0);
|
|
sParam.vDirection = Vec3(0,0,0);
|
|
pObj->BeginSetGetChain();
|
|
if ((sParam).fChildSpawnPeriod && pObj->GetValueChain("ChildProcess", *pChildObj))
|
|
{
|
|
ParticleParams sChildParams;
|
|
ReadParticleTable(*pChildObj, sChildParams);
|
|
sParam.pChild = &sChildParams;
|
|
}
|
|
else
|
|
sParam.pChild = NULL;
|
|
|
|
//STATIC OBJECT BASED PARTICLES
|
|
sParam.pStatObj = NULL;
|
|
INT_PTR nValue=0;
|
|
int nCookie=0;
|
|
if(pObj->GetUDValueChain("geometry",nValue,nCookie) && (nCookie==USER_DATA_OBJECT))
|
|
sParam.pStatObj=(IStatObj *)nValue;
|
|
|
|
sParam.vPosition = Vec3(0,0,0);
|
|
|
|
// Default direction is Positive Y.
|
|
m_pEntity->CreateEntityParticleEmitter(0,sParam,fTimeDelay,Vec3(0,0,0),Vec3(0,1,0));
|
|
|
|
pObj->EndSetGetChain();
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::CreateParticleEmitterEffect(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(6);
|
|
float fTimeDelay = 0;
|
|
Vec3 vOffset;
|
|
Vec3 vDir;
|
|
const char *sEffectName = 0;
|
|
int nSlotId = 0;
|
|
float fScale = 1.0f;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
|
|
if(!pH->GetParam(1,nSlotId))
|
|
{
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 1 not specified or nil(Slot Id)" );
|
|
return pH->EndFunction();
|
|
}
|
|
if(!pH->GetParam(2,sEffectName))
|
|
{
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 2 not specified or nil(Effect Name)" );
|
|
return pH->EndFunction();
|
|
}
|
|
if(!pH->GetParam(3,fTimeDelay))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 3 not specified or nil(fTimeDelay)" );
|
|
|
|
if(!pH->GetParam(4,oVec))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 4 not specified or nil(Offset)" );
|
|
vOffset = oVec.Get();
|
|
|
|
if(!pH->GetParam(5,oVec))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 5 not specified or nil(Direction)" );
|
|
vDir = oVec.Get();
|
|
|
|
if(!pH->GetParam(6,fScale))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitterEffect> parameter 6 not specified or nil(Scale)" );
|
|
|
|
if (nSlotId < 0)
|
|
nSlotId = 0;
|
|
if (nSlotId >= MAX_PARTICLES_SLOTS)
|
|
{
|
|
nSlotId = MAX_PARTICLES_SLOTS-1;
|
|
}
|
|
|
|
if (sEffectName)
|
|
{
|
|
IParticleEffect *pEffect = m_pISystem->GetI3DEngine()->FindParticleEffect( sEffectName );
|
|
if (pEffect)
|
|
{
|
|
ParticleParams params;
|
|
m_pEntity->CreateEntityParticleEmitter(nSlotId,params,fTimeDelay,vOffset,vDir,pEffect,fScale );
|
|
}
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
// copy of function from ScriptObjectParticle
|
|
bool CScriptObjectEntity::ReadParticleTable(IScriptObject *pITable, ParticleParams &sParamOut)
|
|
{
|
|
CScriptObjectColor oCol(m_pScriptSystem,true);
|
|
Vec3 v3Pos,v3Offset(0,0,0);
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
|
|
//default params
|
|
float focus = 0;
|
|
Vec3 vStartColor(1,1,1);
|
|
Vec3 vEndColor(1,1,1);
|
|
Vec3 vRotation(0,0,0);
|
|
Vec3 vGravity(0,0,0);
|
|
float speed = 0;
|
|
int count = 1;
|
|
float size = 0.05f;
|
|
float size_speed = 0;
|
|
float gravity = 0;
|
|
float lifetime = 0;
|
|
float fadeintime = 0;
|
|
INT_PTR tid = 0;
|
|
int frames = 0;
|
|
int draw_last = 0;
|
|
int blendType = ParticleBlendType_AlphaBased;
|
|
int color_based_blending = 0;
|
|
int iParticleType = 0;
|
|
float fTailLength = 0.0f;
|
|
int bRealPhys = 0;
|
|
float fDirVecScale = 1.0f;
|
|
int nEntityID=0;
|
|
IShader * pShader = 0;
|
|
Vec3d vSpaceLoopBoxSize(0,0,0);
|
|
int nBindToCamera=0;
|
|
int nNoIndoor=0;
|
|
|
|
if(!pITable->BeginSetGetChain())
|
|
return false;
|
|
//FOCUS////////////////////////////////////
|
|
if(!pITable->GetValueChain( "focus",focus ))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> focus field not specified" );
|
|
//START COLOR////////////////////////////////
|
|
if (pITable->GetValueChain( "start_color",oCol ))
|
|
vStartColor = oCol.Get();
|
|
//END COLOR////////////////////////////////
|
|
if (pITable->GetValueChain( "end_color",oCol ))
|
|
vEndColor = oCol.Get();
|
|
//SPEED////////////////////////////////
|
|
if(!pITable->GetValueChain( "speed",speed ))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> speed field not specified" );
|
|
//ROTATION////////////////////////////////
|
|
if (pITable->GetValueChain( "rotation",oVec ))
|
|
vRotation = oVec.Get();
|
|
//COUNT////////////////////////////////
|
|
if(!pITable->GetValueChain( "count",count ))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> count field not specified" );
|
|
//SIZE////////////////////////////////
|
|
if(!pITable->GetValueChain( "size" ,size ))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> size field not specified" );
|
|
//SIZE SPEED////////////////////////////////
|
|
if(!pITable->GetValueChain( "size_speed",size_speed ))
|
|
size_speed=0;
|
|
//GRAVITY////////////////////////////////
|
|
if (pITable->GetValueChain( "gravity",oVec ))
|
|
vGravity = oVec.Get();
|
|
//LIFETIME////////////////////////////////
|
|
if(!pITable->GetValueChain( "lifetime",lifetime ))
|
|
m_pScriptSystem->RaiseError( "<CreateParticleEmitter> lifetime field not specified" );
|
|
//FADEINTIME////////////////////////////////
|
|
if(!pITable->GetValueChain( "fadeintime",fadeintime ))
|
|
fadeintime=0;//m_pScriptSystem->RaiseError( "<CreateParticleEmitter> fadeintime field not specified" );
|
|
//FRAMES////////////////////////////////
|
|
if(!pITable->GetValueChain( "frames",frames ))
|
|
frames=0;
|
|
//TID////////////////////////////////
|
|
int nCookie=0;
|
|
if(!pITable->GetUDValueChain( "tid",tid,nCookie))
|
|
tid=0;
|
|
//PARTICLE TYPE////////////////////////////////
|
|
if(!pITable->GetValueChain( "particle_type", iParticleType ))
|
|
iParticleType = PART_FLAG_BILLBOARD;
|
|
//TAIL LENGHT////////////////////////////////
|
|
if(!pITable->GetValueChain( "tail_length", fTailLength))
|
|
fTailLength = 0.0f;
|
|
//PHYSICS////////////////////////////////
|
|
if(!pITable->GetValueChain( "physics", bRealPhys ))
|
|
bRealPhys = 0;
|
|
//BIND EMITTER TO CAMERA/////////////////////
|
|
if(!pITable->GetValueChain( "BindToCamera", nBindToCamera ))
|
|
nBindToCamera = 0;
|
|
//KILL PARTICLES IN VISAREAS/////////////////////
|
|
if(!pITable->GetValueChain( "NoIndoor", nNoIndoor ))
|
|
nNoIndoor = 0;
|
|
|
|
//DRAW LAST////////////////////////////////
|
|
if(!pITable->GetValueChain( "draw_last",draw_last ))
|
|
draw_last=0;
|
|
//COLOR BASED BLENDING (legacy)////////////////////////////////
|
|
if (pITable->GetValueChain( "color_based_blending",color_based_blending ))
|
|
{
|
|
// This for backward compatability.
|
|
if (color_based_blending == 3)
|
|
blendType = ParticleBlendType_ColorBased;
|
|
}
|
|
//BLEND TYPE////////////////////////////////
|
|
// Read particles blending type.
|
|
pITable->GetValueChain( "blend_type",blendType );
|
|
//BOUNCENES/////////////////////////////////
|
|
float fBouncenes;
|
|
if(!pITable->GetValueChain( "bouncyness", fBouncenes))
|
|
fBouncenes = 0.5f;
|
|
//INIT ANGLE/////////////////////////////////
|
|
Vec3 vAngles(0,0,0);
|
|
if (pITable->GetValue( "init_angles",oVec ))
|
|
vAngles = oVec.Get();
|
|
|
|
pITable->GetValueChain( "dir_vec_scale", fDirVecScale );
|
|
|
|
// turbulence
|
|
float fTurbulenceSize=0;
|
|
pITable->GetValueChain( "turbulence_size", fTurbulenceSize);
|
|
float fTurbulenceSpeed=0;
|
|
pITable->GetValueChain( "turbulence_speed", fTurbulenceSpeed);
|
|
int nLinearSizeSpeed=0;
|
|
pITable->GetValueChain( "bLinearSizeSpeed", nLinearSizeSpeed);
|
|
|
|
float fChildSpawnPeriod=0;
|
|
pITable->GetValueChain( "ChildSpawnPeriod", fChildSpawnPeriod);
|
|
|
|
sParamOut.fPosRandomOffset=0;
|
|
pITable->GetValueChain( "fPosRandomOffset", sParamOut.fPosRandomOffset);
|
|
|
|
char szShaderName[256]="";
|
|
char * pShaderName = szShaderName;
|
|
if(pITable->GetValue("ShaderName", (const char* &)pShaderName))
|
|
pShader = m_pISystem->GetIRenderer()->EF_LoadShader(pShaderName, eSH_World);
|
|
|
|
// SpaceLoopBoxSize ////////////////////////////////
|
|
if (pITable->GetValueChain( "SpaceLoopBoxSize",oVec ))
|
|
vSpaceLoopBoxSize = oVec.Get();
|
|
|
|
// after this line GetValueChain will crash
|
|
pITable->EndSetGetChain();
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
sParamOut.fFocus = focus;
|
|
sParamOut.vColorStart = vStartColor;
|
|
sParamOut.vColorEnd = vEndColor;
|
|
sParamOut.fSpeed = speed;
|
|
sParamOut.nCount = count;
|
|
sParamOut.fSize = size;
|
|
sParamOut.fSizeSpeed = size_speed;
|
|
sParamOut.vGravity = vGravity;
|
|
sParamOut.fLifeTime = lifetime;
|
|
sParamOut.fFadeInTime = fadeintime;
|
|
|
|
sParamOut.nTexId = tid;
|
|
sParamOut.nTexAnimFramesCount = frames;
|
|
sParamOut.eBlendType = (ParticleBlendType)blendType;
|
|
|
|
sParamOut.nParticleFlags = iParticleType;
|
|
|
|
if(nLinearSizeSpeed)
|
|
sParamOut.nParticleFlags |= PART_FLAG_SIZE_LINEAR;
|
|
|
|
sParamOut.bRealPhysics = bRealPhys != 0;
|
|
sParamOut.pChild = NULL;
|
|
sParamOut.fChildSpawnPeriod = fChildSpawnPeriod;
|
|
sParamOut.fTailLenght = fTailLength;
|
|
|
|
sParamOut.nDrawLast = draw_last;
|
|
|
|
sParamOut.vRotation = vRotation;
|
|
|
|
sParamOut.fBouncenes = fBouncenes;
|
|
|
|
sParamOut.vInitAngles = vAngles;
|
|
|
|
// Scale the direction vsector based on fDirVecScale
|
|
sParamOut.vDirection *= fDirVecScale;
|
|
|
|
sParamOut.fTurbulenceSize=fTurbulenceSize;
|
|
sParamOut.fTurbulenceSpeed=fTurbulenceSpeed;
|
|
sParamOut.pShader = pShader;
|
|
|
|
sParamOut.vSpaceLoopBoxSize = vSpaceLoopBoxSize;
|
|
if(vSpaceLoopBoxSize.x && vSpaceLoopBoxSize.y && vSpaceLoopBoxSize.z)
|
|
sParamOut.nParticleFlags |= PART_FLAG_SPACELOOP;
|
|
|
|
if(nBindToCamera)
|
|
sParamOut.nParticleFlags |= PART_FLAG_BIND_EMITTER_TO_CAMERA;
|
|
|
|
if(nNoIndoor)
|
|
sParamOut.nParticleFlags |= PART_FLAG_NO_INDOOR;
|
|
|
|
return true;
|
|
}
|
|
|
|
int CScriptObjectEntity::GetEntitiesInContact(IFunctionHandler *pH)
|
|
{
|
|
Vec3 mins, maxs;
|
|
m_pEntity->GetBBox(mins, maxs);
|
|
vectorf minbox, maxbox;
|
|
minbox = vectorf(mins);
|
|
maxbox = vectorf(maxs);
|
|
IPhysicalWorld *pWorld=m_pISystem->GetIPhysicalWorld();
|
|
IPhysicalEntity **ppColliders;
|
|
int cnt = 0,valid=0;
|
|
|
|
if (cnt = pWorld->GetEntitiesInBox(minbox, maxbox, ppColliders,ent_living|ent_rigid|ent_sleeping_rigid|ent_static))
|
|
{
|
|
// execute on collide for all of the entities
|
|
_SmartScriptObject pObj(m_pScriptSystem);
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
|
|
IEntity *pEntity =(IEntity *) ppColliders[i]->GetForeignData();
|
|
|
|
if (pEntity)
|
|
{
|
|
if (pEntity->IsGarbage())
|
|
continue;
|
|
|
|
if (pEntity->GetId() == m_pEntity->GetId())
|
|
continue;
|
|
|
|
if (pEntity->IsStatic())
|
|
continue;
|
|
valid++;
|
|
pObj->SetAt(pEntity->GetId(),pEntity->GetScriptObject());
|
|
}
|
|
}
|
|
if(valid)
|
|
{
|
|
return pH->EndFunction(pObj);
|
|
}
|
|
}
|
|
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::SetDefaultIdleAnimations(IFunctionHandler *pH)
|
|
{
|
|
//CHECK_PARAMETERS(1);
|
|
assert(pH->GetParamCount() == 1 || pH->GetParamCount() == 2);
|
|
|
|
const char *animname=NULL;
|
|
int pos;
|
|
pH->GetParam(1,pos);
|
|
if (pH->GetParamCount() > 1 )
|
|
pH->GetParam(2,animname);
|
|
|
|
m_pEntity->SetDefaultIdleAnimation( pos, animname );
|
|
|
|
return pH->EndFunctionNull();
|
|
|
|
}
|
|
|
|
int CScriptObjectEntity::GetAnimationLength(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *aniName;
|
|
pH->GetParam(1, aniName);
|
|
|
|
return pH->EndFunction(m_pEntity->GetAnimationLength(aniName));
|
|
|
|
/*
|
|
int iAnimationPos;
|
|
const char *pszAnimName;
|
|
float fSecLen = 0.0f;
|
|
|
|
assert(m_pEntity->GetCharInterface());
|
|
|
|
CHECK_PARAMETERS(2);
|
|
|
|
pH->GetParam(1, iAnimationPos);
|
|
pH->GetParam(2, pszAnimName);
|
|
|
|
ICryCharInstance* pCharacter = m_pEntity->GetCharInterface()->GetCharacter(iAnimationPos);
|
|
if (!pCharacter)
|
|
return pH->EndFunction(fSecLen);
|
|
|
|
IAnimationSet* pAnimations = pCharacter->GetModel()->GetAnimationSet();
|
|
assert (pAnimations);
|
|
int nAnimationId = pAnimations->Find (pszAnimName);
|
|
if (nAnimationId >= 0)
|
|
return pH->EndFunction(pAnimations->GetLength(nAnimationId));
|
|
|
|
return pH->EndFunction(fSecLen);
|
|
*/
|
|
}
|
|
|
|
/*! disables and releases all lipsync-functions
|
|
*/
|
|
int CScriptObjectEntity::ReleaseLipSync(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
if (m_pEntity && m_pEntity->GetCharInterface())
|
|
m_pEntity->GetCharInterface()->ReleaseLipSyncInterface();
|
|
return pH->EndFunction(1);
|
|
}
|
|
|
|
/*! loads (enables) expressions for a character
|
|
@param pszFilename script-filename ("" to disable)
|
|
*/
|
|
int CScriptObjectEntity::DoRandomExpressions(IFunctionHandler *pH)
|
|
{
|
|
if (pH->GetParamCount()<1)
|
|
CHECK_PARAMETERS(1);
|
|
const char *pszFilename;
|
|
bool bRaiseError=true;
|
|
pH->GetParam(1, pszFilename);
|
|
if (pH->GetParamCount()>=2)
|
|
pH->GetParam(2, bRaiseError);
|
|
if(m_pEntity && m_pEntity->GetCharInterface())
|
|
{
|
|
ILipSync *pLipSync=m_pEntity->GetCharInterface()->GetLipSyncInterface();
|
|
if (!pLipSync)
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"Could not create lip-sync interface ! Does this entity %s have a character ?",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
if (!pLipSync->LoadRandomExpressions(pszFilename, bRaiseError))
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"CLipSync::LoadDialog failed for Entity %s",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
}
|
|
return pH->EndFunction((int)1);
|
|
}
|
|
|
|
/*! plays an expression for a character
|
|
@param pszMorphTarget name of morph-target
|
|
@param fAmplitude amplitude-scale
|
|
@param fBlendIn blend-in time in seconds
|
|
@param fLength hold time in seconds
|
|
@param fBlendOut blend-out time in seconds
|
|
*/
|
|
int CScriptObjectEntity::DoExpression(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(5);
|
|
const char *pszMorphTarget;
|
|
CryCharMorphParams MorphParams;
|
|
pH->GetParam(1, pszMorphTarget);
|
|
pH->GetParam(2, MorphParams.fAmplitude);
|
|
pH->GetParam(3, MorphParams.fBlendIn);
|
|
pH->GetParam(4, MorphParams.fLength);
|
|
pH->GetParam(5, MorphParams.fBlendOut);
|
|
MorphParams.fStartTime=0.0f;
|
|
if(m_pEntity && m_pEntity->GetCharInterface())
|
|
{
|
|
ILipSync *pLipSync=m_pEntity->GetCharInterface()->GetLipSyncInterface();
|
|
if (!pLipSync)
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"Could not create lip-sync interface ! Does this entity %s have a character ?",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
if (!pLipSync->DoExpression(pszMorphTarget, MorphParams))
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"CLipSync::DoExpression failed, Entity: %s",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
}
|
|
return pH->EndFunction((int)1);
|
|
}
|
|
|
|
/*! says dialog (lip-synced); must be a character
|
|
@param pszFilename name of dialog-filename (*.lsf is expected in the same folder)
|
|
@param nVol Volume of sound
|
|
@param fMin Min sound-distance
|
|
@param fMax Max sound-distance
|
|
@param nFlags Additional sound-loading-flags
|
|
*/
|
|
int CScriptObjectEntity::SayDialog(IFunctionHandler *pH)
|
|
{
|
|
if (pH->GetParamCount()<4)
|
|
CHECK_PARAMETERS(4);
|
|
const char *pszFilename;
|
|
float fMin, fMax;
|
|
int nVol, nFlags=0;
|
|
float fClipDistance=500.0f;
|
|
pH->GetParam(1, pszFilename);
|
|
pH->GetParam(2, nVol);
|
|
pH->GetParam(3, fMin);
|
|
pH->GetParam(4, fMax);
|
|
if (pH->GetParamCount()>=5)
|
|
pH->GetParam(5, nFlags);
|
|
//if (pH->GetParamCount()>=6)
|
|
// pH->GetParam(6, fClipDistance);
|
|
|
|
IScriptObject *pAITable=NULL;
|
|
if (pH->GetParamCount()>=6)
|
|
{
|
|
pAITable=m_pScriptSystem->CreateEmptyObject();
|
|
if (!pH->GetParam(6, pAITable))
|
|
{
|
|
pAITable->Release();
|
|
pAITable=NULL;
|
|
}
|
|
}
|
|
|
|
if (fClipDistance>1000.0f)
|
|
fClipDistance=1000.0f;
|
|
if(m_pEntity && m_pEntity->GetCharInterface())
|
|
{
|
|
ILipSync *pLipSync=m_pEntity->GetCharInterface()->GetLipSyncInterface();
|
|
if (!pLipSync)
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"Could not create lip-sync interface ! Does this entity %s have a character ?",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
if (!pLipSync->LoadDialog(pszFilename, nVol, fMin, fMax, fClipDistance, nFlags,pAITable))
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"CLipSync::LoadDialog failed for Entity %s",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
/*
|
|
if (!pLipSync->PlayDialog())
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"CLipSync::PlayDialog failed for Entity %s",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
*/
|
|
}
|
|
return pH->EndFunction(1);
|
|
}
|
|
|
|
/*! stops dialog (lip-synced); must be a character
|
|
*/
|
|
int CScriptObjectEntity::StopDialog(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
if(m_pEntity && m_pEntity->GetCharInterface())
|
|
{
|
|
ILipSync *pLipSync=m_pEntity->GetCharInterface()->GetLipSyncInterface();
|
|
if (!pLipSync)
|
|
{
|
|
m_pISystem->Warning( VALIDATOR_MODULE_SYSTEM,VALIDATOR_WARNING,0,
|
|
0,"Could not create lip-sync interface ! Does this entity %s have a character ?",m_pEntity->GetName() );
|
|
return pH->EndFunctionNull();
|
|
}
|
|
if (!pLipSync->StopDialog())
|
|
{
|
|
m_pISystem->GetILog()->Log("\005CLipSync::StopDialog failed for Entity %s",m_pEntity->GetName());
|
|
return pH->EndFunctionNull();
|
|
}
|
|
}
|
|
return pH->EndFunction(1);
|
|
}
|
|
|
|
/*! Set the material of the entity
|
|
@param materialName Name of material.
|
|
*/
|
|
int CScriptObjectEntity::SetMaterial(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
const char *sMaterialName = 0;
|
|
if (pH->GetParam(1,sMaterialName))
|
|
{
|
|
IMatInfo *pMaterial = m_pISystem->GetI3DEngine()->FindMaterial( sMaterialName );
|
|
m_pEntity->SetMaterial( pMaterial );
|
|
}
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
/*! Get the name of custom entity material.
|
|
*/
|
|
int CScriptObjectEntity::GetMaterial(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
if (m_pEntity && m_pEntity->GetMaterial())
|
|
{
|
|
return pH->EndFunction( m_pEntity->GetMaterial()->GetName() );
|
|
}
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
/*! Attach character hands with IK to some position
|
|
@param vPos IK target position (world).
|
|
*/
|
|
int CScriptObjectEntity::SetHandsIKTarget(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
Vec3 vec;
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
pH->GetParam(1,*oVec);
|
|
vec=oVec.Get();
|
|
m_pEntity->SetHandsIKTarget(&vec);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
/*! Get the velosity of the entity
|
|
@return Three component vector containing the velosity position
|
|
*/
|
|
int CScriptObjectEntity::GetVelocity(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
IPhysicalEntity *phys = m_pEntity->GetPhysics();
|
|
if(phys)
|
|
{
|
|
pe_status_dynamics dyn;
|
|
phys->GetStatus(&dyn);
|
|
SetMemberVector( SOE_MEMBER_OBJ_VEL,dyn.v );
|
|
return pH->EndFunction(m_memberSO[SOE_MEMBER_OBJ_VEL]);
|
|
}
|
|
return pH->EndFunctionNull();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::ApplyImpulseToEnvironment(IFunctionHandler * pH)
|
|
{
|
|
_SmartScriptObject pObj(m_pScriptSystem,true);
|
|
_SmartScriptObject pTempObj(m_pScriptSystem,true);
|
|
CScriptObjectVector oVec(m_pScriptSystem,true);
|
|
|
|
Vec3 pos;
|
|
float rmin, rmax, impulsive_pressure;
|
|
float rmin_occ = 0.1f;
|
|
int nOccRes=0,nGrow=0;
|
|
|
|
pH->GetParam(1,*pObj);
|
|
|
|
pObj->GetValue("pos",*oVec );
|
|
pos=oVec.Get();
|
|
pObj->GetValue("rmin",rmin );
|
|
pObj->GetValue("rmax",rmax );
|
|
pObj->GetValue("impulsive_pressure",impulsive_pressure );
|
|
pObj->GetValue("rmin_occlusion", rmin_occ);
|
|
pObj->GetValue("occlusion_res", nOccRes);
|
|
pObj->GetValue("occlusion_inflate", nGrow);
|
|
|
|
Vec3d angles = m_pEntity->GetAngles();
|
|
angles = ConvertToRadAngles(angles);
|
|
pos+=angles;
|
|
m_pEntity->EnablePhysics(false);
|
|
IPhysicalEntity *pPhys = m_pEntity->GetCharInterface()->GetCharacter(0)->GetCharacterPhysics();
|
|
m_pISystem->GetIPhysicalWorld()->SimulateExplosion(pos,pos, rmin, rmax, rmin, impulsive_pressure, nOccRes,nGrow,rmin_occ,&pPhys,1);
|
|
m_pEntity->EnablePhysics(true);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::TrackColliders(IFunctionHandler * pH)
|
|
{
|
|
bool bEnable = false;
|
|
|
|
pH->GetParam(1,bEnable);
|
|
m_pEntity->TrackColliders( bEnable );
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::GetViewDistRatio(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
int value = m_pEntity->GetViewDistRatio();
|
|
return pH->EndFunction(value);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//! 0..254 (value is autmatically clamed to to this range)
|
|
int CScriptObjectEntity::SetViewDistRatio(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int value;
|
|
pH->GetParam(1, value);
|
|
m_pEntity->SetViewDistRatio(value);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//! do not fade out object - no matter how far away it is
|
|
int CScriptObjectEntity::SetViewDistUnlimited(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
m_pEntity->SetViewDistUnlimited();
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::RemoveDecals(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
m_pISystem->GetI3DEngine()->DeleteEntityDecals( m_pEntity );
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::SwitchLight(IFunctionHandler * pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int lightOn;
|
|
pH->GetParam(1, lightOn);
|
|
m_pEntity->SwitchLights(lightOn!=0);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::ForceCharacterUpdate(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int pos;
|
|
pH->GetParam(1,pos);
|
|
m_pEntity->ForceCharacterUpdate(pos);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::Hide(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(1);
|
|
int hide=0;
|
|
pH->GetParam(1,hide);
|
|
m_pEntity->Hide(hide!=0);
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CScriptObjectEntity::CheckCollisions(IFunctionHandler *pH)
|
|
{
|
|
assert(pH->GetParamCount()<=2);
|
|
int iEntTypes = ent_sleeping_rigid|ent_rigid|ent_living, iCollTypes = -1;
|
|
pH->GetParam(1,iEntTypes);
|
|
pH->GetParam(2,iCollTypes);
|
|
|
|
IPhysicalEntity **ppEnts,*pEnt = m_pEntity->GetPhysics();
|
|
if (pEnt)
|
|
{
|
|
int nEnts,i,nParts,nCont,nTotCont,nEntCont,nContactEnts;
|
|
pe_params_bbox pbb;
|
|
pe_params_foreign_data pfd;
|
|
pe_status_pos sp[2];
|
|
pe_params_part pp[2];
|
|
geom_world_data gwd[2];
|
|
intersection_params ip;
|
|
geom_contact *pContacts;
|
|
IEntity *pIEnt;
|
|
_SmartScriptObject psoRes(m_pScriptSystem),psoContactList(m_pScriptSystem),psoEntList(m_pScriptSystem);
|
|
IScriptObject *psoEnt,*psoNormals[32],*psoCenters[32],*psoContacts[32];
|
|
|
|
pEnt->GetParams(&pbb);
|
|
pEnt->GetParams(&pfd);
|
|
nParts = pEnt->GetStatus(&pe_status_nparts());
|
|
pEnt->GetStatus(sp+0);
|
|
ip.bNoAreaContacts = true;
|
|
ip.vrel_min = 1E10f;
|
|
|
|
nEnts = m_pISystem->GetIPhysicalWorld()->GetEntitiesInBox(pbb.BBox[0],pbb.BBox[1],ppEnts,iEntTypes);
|
|
nContactEnts = nTotCont = 0;
|
|
for(i=0; i<nEnts; i++)
|
|
if (ppEnts[i]!=pEnt && !(pfd.pForeignData && ppEnts[i]->GetForeignData(pfd.iForeignData)==pfd.pForeignData))
|
|
{
|
|
ppEnts[i]->GetStatus(sp+1);
|
|
psoEnt = (pIEnt = (IEntity*)ppEnts[i]->GetForeignData()) ? pIEnt->GetScriptObject() : 0;
|
|
nEntCont = 0;
|
|
|
|
for(pp[1].ipart=ppEnts[i]->GetStatus(&pe_status_nparts())-1; pp[1].ipart>=0; pp[1].ipart--)
|
|
{
|
|
MARK_UNUSED(pp[1].partid); ppEnts[i]->GetParams(pp+1);
|
|
gwd[1].offset = sp[1].pos + sp[1].q*pp[1].pos;
|
|
gwd[1].R = matrix3x3f(sp[1].q*pp[1].q);
|
|
gwd[1].scale = pp[1].scale;
|
|
for(pp[0].ipart=0; pp[0].ipart<nParts; pp[0].ipart++)
|
|
{
|
|
MARK_UNUSED(pp[0].partid); pEnt->GetParams(pp+0);
|
|
if ((iCollTypes==-1 ? pp[0].flagsColliderOR : iCollTypes) & pp[1].flagsOR)
|
|
{
|
|
gwd[0].offset = sp[0].pos + sp[0].q*pp[0].pos;
|
|
gwd[0].R = matrix3x3f(sp[0].q*pp[0].q);
|
|
gwd[0].scale = pp[0].scale;
|
|
for(nCont = pp[0].pPhysGeomProxy->pGeom->Intersect(pp[1].pPhysGeomProxy->pGeom, gwd+0,gwd+1, &ip, pContacts)-1;
|
|
nCont>=0 && nTotCont<sizeof(psoContacts)/sizeof(psoContacts[0]); nCont--)
|
|
{
|
|
psoCenters[nTotCont] = m_pScriptSystem->CreateObject();
|
|
psoCenters[nTotCont]->BeginSetGetChain();
|
|
psoCenters[nTotCont]->SetValueChain("x",pContacts[nCont].center.x);
|
|
psoCenters[nTotCont]->SetValueChain("y",pContacts[nCont].center.y);
|
|
psoCenters[nTotCont]->SetValueChain("z",pContacts[nCont].center.z);
|
|
psoCenters[nTotCont]->EndSetGetChain();
|
|
|
|
psoNormals[nTotCont] = m_pScriptSystem->CreateObject();
|
|
psoNormals[nTotCont]->BeginSetGetChain();
|
|
psoNormals[nTotCont]->SetValueChain("x",-pContacts[nCont].n.x);
|
|
psoNormals[nTotCont]->SetValueChain("y",-pContacts[nCont].n.y);
|
|
psoNormals[nTotCont]->SetValueChain("z",-pContacts[nCont].n.z);
|
|
psoNormals[nTotCont]->EndSetGetChain();
|
|
|
|
psoContacts[nTotCont] = m_pScriptSystem->CreateObject();
|
|
psoContacts[nTotCont]->BeginSetGetChain();
|
|
psoContacts[nTotCont]->SetValueChain("center",psoCenters[nTotCont]);
|
|
psoContacts[nTotCont]->SetValueChain("normal",psoNormals[nTotCont]);
|
|
psoContacts[nTotCont]->SetValueChain("partid0",pp[0].partid);
|
|
psoContacts[nTotCont]->SetValueChain("partid1",pp[1].partid);
|
|
if (psoEnt)
|
|
psoContacts[nTotCont]->SetValueChain("collider",psoEnt);
|
|
else
|
|
psoContacts[nTotCont]->SetToNullChain("collider");
|
|
psoContacts[nTotCont]->EndSetGetChain();
|
|
|
|
psoContactList->SetAt(nTotCont+1, psoContacts[nTotCont]);
|
|
nTotCont++; nEntCont++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (nEntCont && psoEnt)
|
|
psoEntList->SetAt(nContactEnts+++1, psoEnt);
|
|
}
|
|
|
|
psoRes->SetValue("contacts", psoContactList);
|
|
psoRes->SetValue("entities", psoEntList);
|
|
for(i=0;i<nTotCont;i++)
|
|
psoNormals[i]->Release(), psoCenters[i]->Release(), psoContacts[i]->Release();
|
|
|
|
return pH->EndFunction(psoRes);
|
|
}
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
|
|
int CScriptObjectEntity::AwakeEnvironment(IFunctionHandler *pH)
|
|
{
|
|
pe_params_bbox pbb;
|
|
pe_action_awake aa;
|
|
IPhysicalEntity **ppEnts;
|
|
Vec3 vMin,vMax,vDelta;
|
|
int i,nEnts;
|
|
|
|
m_pEntity->GetBBox(vMin,vMax);
|
|
vDelta.x=vDelta.y=vDelta.z = m_pISystem->GetIPhysicalWorld()->GetPhysVars()->maxContactGap*4;
|
|
nEnts = m_pISystem->GetIPhysicalWorld()->GetEntitiesInBox(vMin-vDelta,vMax+vDelta, ppEnts, ent_sleeping_rigid|ent_living|ent_independent);
|
|
for(i=0;i<nEnts;i++)
|
|
ppEnts[i]->Action(&aa);
|
|
|
|
return pH->EndFunction();
|
|
}
|
|
|
|
int CScriptObjectEntity::NoExplosionCollision(IFunctionHandler *pH)
|
|
{
|
|
CHECK_PARAMETERS(0);
|
|
if(m_pEntity->GetPhysics())
|
|
{
|
|
pe_params_part ppart;
|
|
ppart.flagsAND = ~geom_colltype_explosion;
|
|
ppart.ipart = -1;
|
|
do { ++ppart.ipart; } while(m_pEntity->GetPhysics()->SetParams(&ppart));
|
|
}
|
|
return pH->EndFunction();
|
|
}
|