void CRadioactiveZone::Affect(SZoneObjectInfo* O) { // вермя срабатывания не чаще, чем заданный период if(m_dwDeltaTime < m_dwPeriod) return; //. m_dwDeltaTime = 0; CGameObject *GO = O->object; if(GO) { Fvector pos; XFORM().transform_tiny(pos,CFORM()->getSphere().P); #ifdef DEBUG char pow[255]; sprintf(pow, "zone hit. %.3f", Power(GO->Position().distance_to(pos))); if(bDebug) Msg("%s %s", *GO->cName(), pow); #endif Fvector dir; dir.set(0,0,0); Fvector position_in_bone_space; float power = (GameID() == GAME_SINGLE) ? Power(GO->Position().distance_to(pos)) : 0.0f; float impulse = 0.f; if(power > EPS) { //. m_dwDeltaTime = 0; position_in_bone_space.set(0.f,0.f,0.f); CreateHit(GO->ID(),ID(),dir,power,BI_NONE,position_in_bone_space,impulse,ALife::eHitTypeRadiation); } } }
u32 CLevel::Objects_net_Save (NET_Packet* _Packet, u32 start, u32 max_object_size) { NET_Packet& Packet = *_Packet; u32 position; for (; start<Objects.o_count(); start++) { CObject *_P = Objects.o_get_by_iterator(start); CGameObject *P = smart_cast<CGameObject*>(_P); // Msg ("save:iterating:%d:%s",P->ID(),*P->cName()); if (P && !P->getDestroy() && P->net_SaveRelevant()) { Packet.w_u16 (u16(P->ID()) ); Packet.w_chunk_open16 (position); // Msg ("save:saving:%d:%s",P->ID(),*P->cName()); P->net_Save (Packet); #ifdef DEBUG u32 size = u32 (Packet.w_tell()-position)-sizeof(u16); // Msg ("save:saved:%d bytes:%d:%s",size,P->ID(),*P->cName()); if (size>=65536) { Debug.fatal (DEBUG_INFO,"Object [%s][%d] exceed network-data limit\n size=%d, Pend=%d, Pstart=%d", *P->cName(), P->ID(), size, Packet.w_tell(), position); } #endif Packet.w_chunk_close16 (position); // if (0==(--count)) // break; if (max_object_size > (NET_PacketSizeLimit - Packet.w_tell())) break; } } return ++start; }
//call this after CGameObject::net_Spawn BOOL CInventoryOwner::net_Spawn (CSE_Abstract* DC) { if (!m_pTrade) m_pTrade = xr_new<CTrade>(this); if (m_trade_parameters) xr_delete (m_trade_parameters); m_trade_parameters = xr_new<CTradeParameters>(trade_section()); //получить указатель на объект, InventoryOwner //m_inventory->setSlotsBlocked(false); CGameObject *pThis = smart_cast<CGameObject*>(this); if(!pThis) return FALSE; CSE_Abstract* E = (CSE_Abstract*)(DC); if ( IsGameTypeSingle() ) { CSE_ALifeTraderAbstract* pTrader = NULL; if(E) pTrader = smart_cast<CSE_ALifeTraderAbstract*>(E); if(!pTrader) return FALSE; R_ASSERT( pTrader->character_profile().size() ); //синхронизируем параметры персонажа с серверным объектом CharacterInfo().Init(pTrader); //------------------------------------- m_known_info_registry->registry().init(E->ID); //------------------------------------- CAI_PhraseDialogManager* dialog_manager = smart_cast<CAI_PhraseDialogManager*>(this); if( dialog_manager && !dialog_manager->GetStartDialog().size() ) { dialog_manager->SetStartDialog(CharacterInfo().StartDialog()); dialog_manager->SetDefaultStartDialog(CharacterInfo().StartDialog()); } m_game_name = pTrader->m_character_name; } else { CharacterInfo().m_SpecificCharacter.Load ("mp_actor"); CharacterInfo().InitSpecificCharacter ("mp_actor"); CharacterInfo().m_SpecificCharacter.data()->m_sGameName = (E->name_replace()[0]) ? E->name_replace() : *pThis->cName(); m_game_name = (E->name_replace()[0]) ? E->name_replace() : *pThis->cName(); } if(!pThis->Local()) return TRUE; return TRUE; }