int CScriptBind_Boids::CreateFlock( IFunctionHandler *pH, SmartScriptTable entity,int nType,SmartScriptTable paramTable ) { IEntity *pEntity = GetEntity(entity); if (!pEntity) { GameWarning( "Boids.CreateFlock called with an invalid entity" ); return pH->EndFunction(); } pEntity->SetFlags( pEntity->GetFlags() | ENTITY_FLAG_CLIENT_ONLY ); CFlock *pFlock = 0; switch (nType) { case EFLOCK_BIRDS: pFlock = new CBirdsFlock(pEntity); break; case EFLOCK_CHICKENS: pFlock = new CChickenFlock(pEntity); break; case EFLOCK_FISH: pFlock = new CFishFlock(pEntity); break; case EFLOCK_FROGS: pFlock = new CFrogFlock(pEntity); break; case EFLOCK_TURTLES: pFlock = new CTurtleFlock(pEntity); break; case EFLOCK_BUGS: pFlock = new CBugsFlock(pEntity); break; } if (pFlock==NULL) { GameWarning( "Boids.CreateFlock wrong flock type %d specified",nType ); return pH->EndFunction(); } ////////////////////////////////////////////////////////////////////////// // Creates a boids proxy for this entity, and attach flock to it. CBoidsProxy *pBoidsProxy = new CBoidsProxy(pEntity); pEntity->SetProxy( ENTITY_PROXY_BOIDS,pBoidsProxy ); SBoidContext bc; pFlock->GetBoidSettings( bc ); SBoidsCreateContext ctx; if (ReadParamsTable( paramTable,bc,ctx )) { bc.entity = pEntity; pFlock->SetBoidSettings( bc ); pFlock->CreateBoids( ctx ); } // Assign flock to boids proxy and update some settings. pBoidsProxy->SetFlock(pFlock); return pH->EndFunction(); }
CFlock* CScriptBind_Boids::GetFlock( IScriptTable *pEntityTable ) { IEntity *pEntity = GetEntity(pEntityTable); if (!pEntity) { GameWarning( "Boids: called with an invalid entity" ); return 0; } CBoidsProxy *pProxy = (CBoidsProxy*)pEntity->GetProxy(ENTITY_PROXY_BOIDS); if (!pProxy) { GameWarning( "Boids: specified entity is not a flock" ); return 0; } return pProxy->GetFlock(); }
int CScriptBind_Boids::SetFlockParams(IFunctionHandler *pH,SmartScriptTable entity,SmartScriptTable paramTable) { CFlock *flock = GetFlock(entity); if (!flock) return pH->EndFunction(); string currModel = flock->GetModelName(); int currCount = flock->GetBoidsCount(); SBoidContext bc; flock->GetBoidSettings(bc); SBoidsCreateContext ctx; if (ReadParamsTable( paramTable,bc,ctx )) { flock->SetBoidSettings( bc ); string model = ""; if (!ctx.models.empty()) model = ctx.models[0]; if ((!model.empty() && stricmp(model.c_str(),currModel.c_str()) == 0) || (ctx.boidsCount > 0 && ctx.boidsCount != currCount)) { flock->CreateBoids( ctx ); } } IEntity *pEntity = GetEntity(entity); if (pEntity) { CBoidsProxy *pBoidsProxy = (CBoidsProxy*)pEntity->GetProxy(ENTITY_PROXY_BOIDS); if (pBoidsProxy) { // Update pBoidsProxy->SetFlock(flock); } } return pH->EndFunction(); }