VOID CSkillMgr::AddBuff(CBattleAttrObj* poSkillOwner, CBattleAttrObj* poTargetObj, UINT16 wSkillID, const SSkillOnceBuffProp& stBuffProp) { //判断添加BUFF概率 static UINT32 dwSeed = 0; dwSeed = (GetCycleCount() + (dwSeed++)) << 7; SDSetSeed(dwSeed); if(SDRandom(100) > stBuffProp.byBuffRate) { return; } CBuff* poBuff = CBuffMgr::Instance()->CreateBuff(); if(NULL == poBuff) { return ; } if(!poBuff->Init(wSkillID, stBuffProp.byBuffKindID, poSkillOwner, poTargetObj, stBuffProp.wBuffParam, stBuffProp.byBuffRound)) { CBuffMgr::Instance()->RemoveBuff(poBuff->GetMemID()); return ; } if(!poTargetObj->AddBuff(poBuff)) { CBuffMgr::Instance()->RemoveBuff(poBuff->GetMemID()); return ; } CPet* poPet = dynamic_cast<CPet*>(poSkillOwner); if ( NULL != poPet) { poBuff->SetExtValue(poPet->GetLastHurt()); } }
/** * SDRender * Initialises a scene (ie a new view). * * @return 0 if OK, -1 if something failed */ void SDRender::Init(tTrack *track) { SDTrack = track; std::string datapath = GetDataDir(); //datapath +="/"; thesky = new SDSky; GfOut("SDSky class\n"); // Sky dome / background. SDSkyDomeDistance = 20000; if (SDSkyDomeDistance > 0 && SDSkyDomeDistance < SDSkyDomeDistThresh) SDSkyDomeDistance = SDSkyDomeDistThresh; // If user enabled it (>0), must be at least the threshold. SDDynamicSkyDome = strcmp(GfParmGetStr(grHandle, GR_SCT_GRAPHIC, GR_ATT_DYNAMICSKYDOME, GR_ATT_DYNAMICSKYDOME_DISABLED), GR_ATT_DYNAMICSKYDOME_ENABLED) == 0; GfLogInfo("Graphic options : Sky dome : distance = %u m, dynamic = %s\n", SDSkyDomeDistance, SDDynamicSkyDome ? "true" : "false"); // Dynamic weather. //grDynamicWeather = GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_grDynamicWeather, (char*)NULL, grDynamicWeather); // Cloud layers. SDNbCloudLayers = (unsigned)(GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_CLOUDLAYER, 0, 0) + 0.5); GfLogInfo("Graphic options : Number of cloud layers : %u\n", SDNbCloudLayers); SDMax_Visibility = (unsigned)(GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_VISIBILITY, 0, 0)); ShadowIndex = 0; // Default value index, in case file value not found in list. const char* pszShadow = GfParmGetStr(grHandle, GR_SCT_GRAPHIC, GR_ATT_SHADOW_TYPE, GR_ATT_SHADOW_NONE); for (int i = 0; i < NbShadowValues; i++) { if (!strcmp(pszShadow, ShadowValues[i])) { ShadowIndex = i; break; } } TexSizeIndex = 0; // Default value index, in case file value not found in list. const char* pszTexSize = GfParmGetStr(grHandle, GR_SCT_GRAPHIC, GR_ATT_SHADOW_SIZE, GR_ATT_SHADOW_1024); for (int i = 0; i < NbTexSizeValues; i++) { if (!strcmp(pszTexSize, TexSizeValues[i])) { TexSizeIndex = i; break; } } switch (TexSizeIndex) { case 0: ShadowTexSize = 512; break; case 1: ShadowTexSize = 1024; break; case 2: ShadowTexSize = 2048; break; case 3: ShadowTexSize = 4096; break; case 4: ShadowTexSize = 8192; break; default: ShadowTexSize = 1024; break; } QualityIndex = 0; // Default value index, in case file value not found in list. const char* pszQuality = GfParmGetStr(grHandle, GR_SCT_GRAPHIC, GR_ATT_AGR_QUALITY, GR_ATT_AGR_LITTLE); for (int i = 0; i < NbQualityValues; i++) { if (!strcmp(pszQuality, QualityValues[i])) { QualityIndex = i; break; } } carsShader = 0; // Default value index, in case file value not found in list. const char* pszShaders = GfParmGetStr(grHandle, GR_SCT_GRAPHIC, GR_ATT_SHADERS, GR_ATT_AGR_NULL); for (int i = 0; i < NbShadersValues; i++) { if (!strcmp(pszShaders, ShadersValues[i])) { carsShader = i; break; } } GfLogInfo("Graphic options : Shadow Type : %u\n", ShadowIndex); GfLogInfo("Graphic options : Shadow Texture Size : %u\n", ShadowTexSize); GfLogInfo("Graphic options : Shadow Quality : %u\n", QualityIndex); NStars = NMaxStars; if (AStarsData) delete [] AStarsData; AStarsData = new osg::Vec3d[NStars]; for(int i= 0; i < NStars; i++) { AStarsData[i][0] = SDRandom() * PI; AStarsData[i][1] = SDRandom() * PI; AStarsData[i][2] = SDRandom() * 7.0; } GfLogInfo(" Stars (random) : %d\n", NStars); NPlanets = 0; APlanetsData = NULL; GfLogInfo(" Planets : %d\n", NPlanets); const int timeOfDay = (int)SDTrack->local.timeofday; const double domeSizeRatio = SDSkyDomeDistance / 80000.0; GfLogInfo(" domeSizeRation : %d\n", domeSizeRatio); thesky->build(datapath, SDSkyDomeDistance, SDSkyDomeDistance, 800, 40000, 800, 30000, NPlanets, APlanetsData, NStars, AStarsData ); GfOut("Build SKY\n"); GLfloat sunAscension = SDTrack->local.sunascension; SDSunDeclination = (float)(15 * (double)timeOfDay / 3600 - 90.0); thesky->setSD( DEG2RAD(SDSunDeclination)); thesky->setSRA( sunAscension ); GfLogInfo(" Sun : time of day = %02d:%02d:%02d (declination = %.1f deg), " "ascension = %.1f deg\n", timeOfDay / 3600, (timeOfDay % 3600) / 60, timeOfDay % 60, SDSunDeclination, RAD2DEG(sunAscension)); if ( SDSunDeclination > 180 ) SDMoonDeclination = 3.0 + (rand() % 40); else SDMoonDeclination = (rand() % 270); //SDMoonDeclination = grUpdateMoonPos(timeOfDay); //SDMoonDeclination = 22.0; /*(rand() % 270);*/ const float moonAscension = SDTrack->local.sunascension; thesky->setMD( DEG2RAD(SDMoonDeclination) ); thesky->setMRA( DEG2RAD(moonAscension) ); GfLogInfo(" Moon : declination = %.1f deg, ascension = %.1f deg\n", SDMoonDeclination, moonAscension); /* SDCloudLayer *layer = new SDCloudLayer(datapath); layer->setCoverage(layer->SD_CLOUD_CIRRUS); layer->setSpeed(30); layer->setDirection(20); layer->setElevation_m(3000); layer->setThickness_m(400 / domeSizeRatio); layer->setTransition_m(400 / domeSizeRatio); layer->setSpan_m(SDSkyDomeDistance / 2); thesky->add_cloud_layer(layer); SDCloudLayer *layer2 = new SDCloudLayer(datapath); layer2->setCoverage(layer2->SD_CLOUD_CIRRUS2); layer2->setSpeed(60); layer2->setDirection(20); layer2->setElevation_m(1500); layer2->setThickness_m(400 / domeSizeRatio); layer2->setTransition_m(400 / domeSizeRatio); layer2->setSpan_m(SDSkyDomeDistance / 2); thesky->add_cloud_layer(layer2);*/ // Initialize the whole sky dome. SDScenery * scenery = (SDScenery *)getScenery(); double r_WrldX = scenery->getWorldX(); double r_WrldY = scenery->getWorldY(); //double r_WrldZ = SDScenery::getWorldZ(); osg::Vec3 viewPos(r_WrldX / 2, r_WrldY/ 2, 0.0 ); weather(); thesky->set_visibility( SDVisibility ); // Visibility in meters thesky->reposition( viewPos, 0, 0); sol_angle = (float)thesky->getSA(); moon_angle = (float)thesky->getMA(); thesky->repaint(SkyColor, FogColor, CloudsColor, sol_angle, moon_angle, NPlanets, APlanetsData, NStars, AStarsData); UpdateLight(); osg::ref_ptr<osg::Group> sceneGroup = new osg::Group; osg::ref_ptr<osg::Group> mRoot = new osg::Group; osg::ref_ptr<osgShadow::ShadowMap> vdsm = new osgShadow::ShadowMap; m_scene = new osg::Group; m_CarRoot = new osg::Group; m_RealRoot = new osg::Group; shadowRoot = new osgShadow::ShadowedScene; osg::ref_ptr<osgParticle::PrecipitationEffect> precipitationEffect = new osgParticle::PrecipitationEffect; if (SDVisibility < 2000) { sceneGroup->addChild(precipitationEffect.get()); } osg::ref_ptr<osg::Group> scene = new osg::Group; osg::ref_ptr<osg::Group> background = new osg::Group; osg::ref_ptr<osg::Group> cargroup = new osg::Group; scene->addChild(scenery->getScene()); cargroup->addChild(m_CarRoot.get()); background->addChild(scenery->getBackground()); if(ShadowIndex > 0) { switch (QualityIndex+1) { case 0: break; case 1: scene->setNodeMask( rcvShadowMask ); background->setNodeMask(~(rcvShadowMask | castShadowMask)); cargroup->setNodeMask(castShadowMask); break; case 2: scene->setNodeMask( rcvShadowMask ); background->setNodeMask(~(rcvShadowMask | castShadowMask)); cargroup->setNodeMask(rcvShadowMask | castShadowMask); break; case 3: scene->setNodeMask( rcvShadowMask | castShadowMask); background->setNodeMask(~(rcvShadowMask | castShadowMask)); cargroup->setNodeMask(rcvShadowMask | castShadowMask); break; default: break; } } m_scene->addChild(scene.get()); m_scene->addChild(cargroup.get()); m_scene->addChild(background.get()); sceneGroup->addChild(m_scene.get()); stateSet = new osg::StateSet; stateSet = m_scene->getOrCreateStateSet(); stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); if (SDVisibility < 2000) stateSet->setAttributeAndModes(precipitationEffect->getFog()); float emis = 0.5f * sky_brightness; float ambian = 0.8f * sky_brightness; osg::ref_ptr<osg::Material> material = new osg::Material; material->setColorMode(osg::Material::OFF); // switch glColor usage off Scene_ambiant = osg::Vec4f( ambian, ambian, ambian, 1.0f); ; material->setEmission(osg::Material::FRONT_AND_BACK, osg::Vec4(emis, emis, emis, 1.0f)); material->setAmbient(osg::Material::FRONT_AND_BACK, Scene_ambiant); stateSet->setAttributeAndModes(material, osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON); stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON); lightSource = new osg::LightSource; lightSource->getLight()->setDataVariance(osg::Object::DYNAMIC); lightSource->getLight()->setLightNum(0); // relative because of CameraView being just a clever transform node lightSource->setReferenceFrame(osg::LightSource::RELATIVE_RF); lightSource->setLocalStateSetModes(osg::StateAttribute::ON); lightSource->getLight()->setAmbient(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f)); lightSource->getLight()->setDiffuse(osg::Vec4( 0.2f, 0.2f, 0.2f, 1.0f)); lightSource->getLight()->setSpecular(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f)); sceneGroup->addChild(lightSource); // we need a white diffuse light for the phase of the moon sunLight = new osg::LightSource; sunLight->getLight()->setDataVariance(osg::Object::DYNAMIC); sunLight->getLight()->setLightNum(1); sunLight->setReferenceFrame(osg::LightSource::RELATIVE_RF); sunLight->setLocalStateSetModes(osg::StateAttribute::ON); sunLight->getLight()->setAmbient(SceneAmbiant); sunLight->getLight()->setDiffuse(SceneDiffuse); sunLight->getLight()->setSpecular(SceneSpecular); sunLight->setStateSetModes(*stateSet,osg::StateAttribute::ON); osg::Vec3f sun_position = thesky->sunposition(); osg::Vec3f sun_direction = -sun_position; osg::Vec4f position(sun_position, 1.0f); sunLight->getLight()->setPosition(position); sunLight->getLight()->setDirection(sun_direction); skyGroup = new osg::Group; skyGroup->setName("skyCloudsGroup"); skyGroup->setNodeMask(thesky->BACKGROUND_BIT); skyGroup->addChild(thesky->getPreRoot()); skyGroup->addChild((thesky->getCloudRoot())); skySS = new osg::StateSet; skySS = skyGroup->getOrCreateStateSet(); skySS->setMode(GL_LIGHT0, osg::StateAttribute::OFF); skySS->setAttributeAndModes( new osg::ColorMask( true, true, true, false ), osg::StateAttribute::ON ); skyGroup->setNodeMask(~(rcvShadowMask | castShadowMask)); sunLight->addChild(skyGroup.get()); mRoot->addChild(sceneGroup.get()); mRoot->setStateSet(setFogState().get()); mRoot->addChild(sunLight.get()); // Clouds are added to the scene graph later osg::ref_ptr<osg::StateSet> stateSet2 = new osg::StateSet; stateSet2 = mRoot->getOrCreateStateSet(); stateSet2->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON); stateSet2->setMode(GL_LIGHTING, osg::StateAttribute::ON); stateSet2->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); m_RealRoot->addChild(mRoot.get()); GfOut("LE POINTEUR %d\n", mRoot.get()); }//SDRender::Init
UINT16 CGoods::Melt(UINT8 byGoldFlag)//熔练 { if(NULL == m_poOwner) { RETURN_OTHER_ERR; } UINT32 dwDisScience = 0; UINT32 dwMinScience = 0; UINT32 dwMaxScience = 0; GetRecoverScience(dwMinScience, dwMaxScience); if (dwMaxScience > dwMinScience) { dwDisScience = dwMaxScience - dwMinScience; } else { dwDisScience = 0; } UINT32 dwScience = 0; if(byGoldFlag) { dwScience = dwMaxScience; } else { //对数值放大100倍,防止大小被舍掉 dwDisScience = dwDisScience * 100; //共分成五档 dwDisScience = dwDisScience / 10; //计算随机值 CRandomVec vecRandom; vecRandom.push_back(10); vecRandom.push_back(20); vecRandom.push_back(40); vecRandom.push_back(20); vecRandom.push_back(10); //随机 INT32 nRandomHitIdx = GetRandomIdxMustHit(vecRandom); if(RANDOM_UNHIT == nRandomHitIdx) { RETURN_OTHER_ERR; } //随机的值 UINT32 dwHitScience = 0; switch(nRandomHitIdx) { case 0: dwHitScience = SDRandom(dwDisScience); break; case 1: dwHitScience = dwDisScience + SDRandom(dwDisScience * 2); break; case 2: dwHitScience = 3 * dwDisScience + SDRandom(dwDisScience * 4); break; case 3: dwHitScience = 7 * dwDisScience + SDRandom(dwDisScience * 2); break; case 4: dwHitScience = 9 * dwDisScience + SDRandom(dwDisScience); break; default: break; } dwScience = dwHitScience / 100; dwScience += dwMinScience; } m_poOwner->AddScience(dwScience, CRecordMgr::EAST_MELT, m_stDT_GOODS_DATA.wKindID, 0, 0); m_poOwner->AddGuideRecord(EGF_MELTING); CTaskMgr::Instance()->OnMelt(m_poOwner); //记录熔炼装备日志 CRecordMgr::Instance()->RecordInfo(m_poOwner->GetID(), ERM_DECITEM, CRecordMgr::EDIT_MELT, GetItemKindID(), 0, m_poOwner->GetLevel(), m_poOwner->GetDT_PLAYER_BASE_DATA().byVipLevel, 1, dwScience); m_stDT_GOODS_DATA.wPileCount--; if(0 == m_stDT_GOODS_DATA.wPileCount) { //清除 m_poOwner->OnDeleteItem(this); } return ERR_MELT_EQUIP::ID_SUCCESS; }