static int entity_GetProperty(lua_State *L) { int n = lua_gettop(L); if (n != 2) { return luaL_error(L, "Entity::GetProperty(name) requires 1 parameter."); } Entity *entity = (Entity *)tolua_tousertype(L, 1, 0); const char *propName = tolua_tostring(L, 2, 0); const char *str; float f; bool b; Rect *r; Vector *v; if (entity->GetProperty(propName, str)) { lua_pushstring(L, str); return 1; } else if (entity->GetProperty(propName, f)) { lua_pushnumber(L, f); return 1; } else if (entity->GetProperty(propName, b)) { lua_pushboolean(L, b); return 1; } else if (entity->GetProperty(propName, r)) { tolua_pushusertype(L, (void*)r, "Rect"); return 1; } else if (entity->GetProperty(propName, v)) { tolua_pushusertype(L, (void*)v, "Vector"); return 1; } else { lua_pushnil(L); return 1; } }
// EntityEx提交至ECC bool CNNM2ECC::SubmitEntityExToEcc(EntityEx* pEx) { if(pEx==NULL) return false; if(m_nnmGroupid.empty()) InitNNMGroup(); OBJECT objgroup= Cache_GetGroup( m_nnmGroupid.getword() ); if(objgroup==INVALID_VALUE) { InitNNMGroup(); objgroup= Cache_GetGroup( m_nnmGroupid.getword() ); if(objgroup==INVALID_VALUE) { InitNNMGroup(); myWriteLog->WriteLog( "InitNNMGroup Error!" ); printf("InitNNMGroup Error!\n"); return false; } } Entity* pEn = NULL; //新Entity标志 bool bNewEn = false; //是否已转化过 //获取 entity, 或者创建新 entity string eccEntityID= pEx->GetEccEntityID().getword(); OBJECT objentity= Cache_GetEntity(eccEntityID); if(eccEntityID.empty() || objentity==INVALID_VALUE ) { objentity= CreateEntity(); bNewEn = true; } if(objentity==INVALID_VALUE) return false; pEn= reinterpret_cast<Entity *>(objentity); if(pEn==NULL) return false; #ifdef _DEBUG //pEx->DisplayAllData(); #endif //如果设备名为空,那么直接返回,不发送到ECC中去 if (pEx->GetProperty()["_MachineName"].empty()) return true; (pEn->GetProperty())["sv_devicetype"] = pEx->GetType(); //设备类型 (pEn->GetProperty())["_MachineName"] = pEx->GetProperty()["_MachineName"]; //IP (pEn->GetProperty())["_sysObjectID"] = pEx->GetProperty()["_sysObjectID"]; //sysObjectID (pEn->GetProperty())["_Port"] = pEx->GetProperty()["_Port"]; //SNMP Port (pEn->GetProperty())["ifNumber"] = pEx->GetProperty()["ifNumber"]; //ifNumber 接口数量 //获得组号 word groupid = ""; std::string stype = pEx->GetProperty()["type"].getword(); int index= atoi( stype.c_str() ); if( index==0 && stype.compare("0")!=0 ) stype.clear(); if( stype.empty() || index<0 || index>6 ) groupid = m_nnmGroupid; else groupid = m_nnmSubGroupid[index]; //共同体 // Luowan 2007.5.23 std::string strcomm = "public"; try { strcomm = pEx->GetProperty()["_Community"].getword(); } catch(...) { } if(strcomm.length()<=0) strcomm = "public"; char outbuf[512] = {0}; if(!strcomm.empty()) { Des des; des.Encrypt(strcomm.c_str(),outbuf); strcomm = outbuf; } (pEn->GetProperty())["_Community"] = strcomm.c_str(); char pBuf[260]; sprintf(pBuf, "community:%s",strcomm.c_str()); myWriteLog->WriteLog(pBuf); //(pEn->GetProperty())["_Community"] = pEx->GetProperty()["_Community"]; if(bNewEn) { myWriteLog->WriteLog("New Entity"); svutil::buffer buftmp; buftmp.resetsize(2048); buftmp.zerobuf(); //sprintf(buftmp.getbuffer(),"%s %s",pEx->GetProperty()["manufact"].getword(),pEx->GetProperty()["model"].getword()); //std::string svname = buftmp.getbuffer(); string svname = (pEx->GetProperty()["name"].empty()) ? pEx->GetProperty()["ip"] : pEx->GetProperty()["name"]; if(svname.length()<2) { svname = pEx->GetProperty()["ip"]; } if(svname.empty()) svname = "Hub或其他"; //设备中文名 (pEn->GetProperty())["sv_name"] = svname; myWriteLog->WriteLog("End of processing New entity."); } else { myWriteLog->WriteLog("Entity that already exists."); std::string svname1 = pEx->GetProperty()["nameCN"]; if(svname1.length()<2) { svname1 = pEx->GetProperty()["ip"]; } if(svname1.empty()) svname1 = "Hub或其他"; (pEn->GetProperty())["sv_name"] = svname1; } //保存数据,submit 等 ,以上部分为设置 entity 数据 word entityid; if(bNewEn) { entityid= AddNewEntity( objentity,groupid.getword() ); pEn->PutID(entityid); } else entityid = pEn->GetID(); cout<<"entityid: \""<<entityid.getword()<<"\""<<endl; bool ret = SubmitEntity(objentity); if( ret ) { myWriteLog->WriteLog("SubmitEntity 成功。"); pEx->PutEccEntityID(entityid); } else myWriteLog->WriteLog("SubmitEntity 失败。"); // Luowan 2007.6.26 注释掉了以下5行 if(bNewEn) { myWriteLog->WriteLog("this->AddMonitor(pEn)"); AddMonitor(pEn); } if(bNewEn) CloseEntity(objentity); myWriteLog->WriteLog("End of SubmitEntityExToEcc()"); return ret; }
/// Time passed in seconds..! void PongPlayerProperty::Process(int timeInMs) { List<Entity*> entities = MapMan.GetEntities(); Time now = Time::Now(); int secondsSinceLastInput = (now - lastUserInput).Seconds(); if (secondsSinceLastInput < 1) { StopMovement(); return; } bool moved = false; Entity * closestBall = 0; float closestDistance = 1000000.f; /// Check distance to ball. Fetch closest/most dangerous one! for (int i = 0; i < entities.Size(); ++i) { Entity * ball = entities[i]; if (!ball->physics) continue; PongBallProperty * pbp = (PongBallProperty*) ball->GetProperty("PongBallProperty"); if (!pbp) continue; if (pbp->sleeping) continue; // Check distance. Vector3f ballToPaddle = owner->position - ball->position; // Ignore balls going away. if (ball->physics->velocity.DotProduct(lookAt) > 0) continue; float distance = AbsoluteValue(ballToPaddle[0]); if (!ball->physics) continue; if (distance > 500.f) continue; if (distance < closestDistance) { closestBall = ball; closestDistance = distance; } } if (closestBall) { /// Ball on the wya here?! if (lookAt.DotProduct(closestBall->physics->velocity) < 0) { // Head towards it! Vector3f ballToPaddle = owner->position - closestBall->position; Vector3f toMove = -ballToPaddle; toMove.Normalize(); toMove *= aiSpeed; toMove[1] += closestBall->physics->velocity[1] * 0.5f; toMove[0] = toMove[2] = 0; Physics.QueueMessage(new PMSetEntity(owner, PT_VELOCITY, Vector3f(toMove))); moved = true; } } if (!moved) StopMovement(); }
RREntityState * RRGameState::GetMainPlayerState() { Entity * mainPlayerEntity = GetMainPlayerEntity(); RREntityState * rrState = (RREntityState *)mainPlayerEntity->GetProperty("RREntityState"); return rrState; }