bool CSE_ALifeMonsterAbstract::redundant () const { if (g_Alive()) return (false); if (m_bOnline) return (false); if (m_story_id != INVALID_STORY_ID) return (false); if (!m_game_death_time) return (false); ALife::_TIME_ID current_time = alife().time_manager().game_time(); VERIFY2 ( m_game_death_time <= current_time, make_string( "incorrect death time for monster %s[death time = %I64d][current time = %I64d]", name_replace(), m_game_death_time, current_time ) ); if ((m_game_death_time + m_stay_after_death_time_interval) > current_time) return (false); return (true); }
void CSE_Abstract::Spawn_Write (NET_Packet &tNetPacket, BOOL bLocal) { // generic tNetPacket.w_begin (M_SPAWN); tNetPacket.w_stringZ (s_name ); tNetPacket.w_stringZ (s_name_replace ? s_name_replace : ""); tNetPacket.w_u8 (0); tNetPacket.w_u8 (s_RP ); tNetPacket.w_vec3 (o_Position ); tNetPacket.w_vec3 (o_Angle ); tNetPacket.w_u16 (RespawnTime ); tNetPacket.w_u16 (ID ); tNetPacket.w_u16 (ID_Parent ); tNetPacket.w_u16 (ID_Phantom ); s_flags.set (M_SPAWN_VERSION,TRUE); if (bLocal) tNetPacket.w_u16 (u16(s_flags.flags|M_SPAWN_OBJECT_LOCAL) ); else tNetPacket.w_u16 (u16(s_flags.flags&~(M_SPAWN_OBJECT_LOCAL|M_SPAWN_OBJECT_ASPLAYER))); tNetPacket.w_u16 (SPAWN_VERSION); tNetPacket.w_u16 (m_gameType.m_GameType.get()); tNetPacket.w_u16 (script_server_object_version()); //client object custom data serialization SAVE u16 client_data_size = (u16)client_data.size(); //не может быть больше 256 байт tNetPacket.w_u16 (client_data_size); // Msg ("SERVER:saving:save:%d bytes:%d:%s",client_data_size,ID,s_name_replace ? s_name_replace : ""); if (client_data_size > 0) { tNetPacket.w (&*client_data.begin(),client_data_size); } tNetPacket.w_u16 (m_tSpawnID); // tNetPacket.w_float (m_spawn_probability); // tNetPacket.w_u32 (m_spawn_flags.get()); // tNetPacket.w_stringZ (m_spawn_control); // tNetPacket.w_u32 (m_max_spawn_count); // tNetPacket.w_u64 (m_min_spawn_interval); // tNetPacket.w_u64 (m_max_spawn_interval); #ifdef XRSE_FACTORY_EXPORTS CScriptValueContainer::assign(); #endif // write specific data u32 position = tNetPacket.w_tell(); tNetPacket.w_u16 (0); STATE_Write (tNetPacket); u16 size = u16(tNetPacket.w_tell() - position); //#ifdef XRSE_FACTORY_EXPORTS R_ASSERT3 ((m_tClassID == CLSID_SPECTATOR) || (size > sizeof(size)), "object isn't successfully saved, get your backup :(",name_replace()); //#endif tNetPacket.w_seek (position,&size,sizeof(u16)); }
void CSE_InventoryBox::add_offline (const xr_vector<ALife::_OBJECT_ID> &saved_children, const bool &update_registries) { CSE_ALifeDynamicObjectVisual *object = (this); for (u32 i=0, n=saved_children.size(); i<n; ++i) { CSE_ALifeDynamicObject *child = smart_cast<CSE_ALifeDynamicObject*>(ai().alife().objects().object(saved_children[i],true)); R_ASSERT (child); child->m_bOnline = false; CSE_ALifeInventoryItem *inventory_item = smart_cast<CSE_ALifeInventoryItem*>(child); VERIFY2 (inventory_item,"Non inventory item object has parent?!"); #ifdef DEBUG // if (psAI_Flags.test(aiALife)) // Msg ("[LSS] Destroying item [%s][%s][%d]",inventory_item->base()->name_replace(),*inventory_item->base()->s_name,inventory_item->base()->ID); Msg ( "[LSS][%d] Going offline [%d][%s][%d] with parent [%d][%s] on '%s'", Device.dwFrame, Device.dwTimeGlobal, inventory_item->base()->name_replace(), inventory_item->base()->ID, ID, name_replace(), "*SERVER*" ); #endif ALife::_OBJECT_ID item_id = inventory_item->base()->ID; inventory_item->base()->ID = object->alife().server().PerformIDgen(item_id); if (!child->can_save()) { object->alife().release (child); --i; --n; continue; } #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_InventoryBox::add_offline: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG if (!child->keep_saved_data_anyway()) child->client_data.clear (); object->alife().graph().add (child,child->m_tGraphID,false); // object->alife().graph().attach (*object,inventory_item,child->m_tGraphID,true); alife().graph().remove (child,child->m_tGraphID); children.push_back (child->ID); child->ID_Parent = ID; } CSE_ALifeDynamicObjectVisual::add_offline(saved_children, update_registries); }
void CSE_Abstract::load (NET_Packet &tNetPacket) { CPureServerObject::load (tNetPacket); u16 client_data_size = (m_wVersion > 93) ? tNetPacket.r_u16() : tNetPacket.r_u8(); //не может быть больше 256 байт if (client_data_size > 0) { #ifdef DEBUG // Msg ("SERVER:loading:load:%d bytes:%d:%s",client_data_size,ID,s_name_replace ? s_name_replace : ""); #endif // DEBUG client_data.resize (client_data_size); tNetPacket.r (&*client_data.begin(),client_data_size); } else { #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_Abstract::load: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG client_data.clear (); } }
void CSE_ALifeInventoryBox::add_online (const bool &update_registries) { CSE_ALifeDynamicObjectVisual *object = (this); NET_Packet tNetPacket; ClientID clientID; clientID.set (object->alife().server().GetServerClient() ? object->alife().server().GetServerClient()->ID.value() : 0); ALife::OBJECT_IT I = object->children.begin(); ALife::OBJECT_IT E = object->children.end(); for ( ; I != E; ++I) { CSE_ALifeDynamicObject *l_tpALifeDynamicObject = ai().alife().objects().object(*I); CSE_ALifeInventoryItem *l_tpALifeInventoryItem = smart_cast<CSE_ALifeInventoryItem*>(l_tpALifeDynamicObject); R_ASSERT2 (l_tpALifeInventoryItem,"Non inventory item object has parent?!"); l_tpALifeInventoryItem->base()->s_flags.or(M_SPAWN_UPDATE); CSE_Abstract *l_tpAbstract = smart_cast<CSE_Abstract*>(l_tpALifeInventoryItem); object->alife().server().entity_Destroy(l_tpAbstract); #ifdef DEBUG // if (psAI_Flags.test(aiALife)) // Msg ("[LSS] Spawning item [%s][%s][%d]",l_tpALifeInventoryItem->base()->name_replace(),*l_tpALifeInventoryItem->base()->s_name,l_tpALifeDynamicObject->ID); Msg ( "[LSS][%d] Going online [%d][%s][%d] with parent [%d][%s] on '%s'", Device.dwFrame, Device.dwTimeGlobal, l_tpALifeInventoryItem->base()->name_replace(), l_tpALifeInventoryItem->base()->ID, ID, name_replace(), "*SERVER*" ); #endif l_tpALifeDynamicObject->o_Position = object->o_Position; l_tpALifeDynamicObject->m_tNodeID = object->m_tNodeID; object->alife().server().Process_spawn (tNetPacket,clientID,FALSE,l_tpALifeInventoryItem->base()); l_tpALifeDynamicObject->s_flags.and (u16(-1) ^ M_SPAWN_UPDATE); l_tpALifeDynamicObject->m_bOnline = true; } CSE_ALifeDynamicObjectVisual::add_online(update_registries); }
BOOL CSE_Abstract::Spawn_Read (NET_Packet &tNetPacket) { u16 dummy16; // generic tNetPacket.r_begin (dummy16); R_ASSERT (M_SPAWN==dummy16); tNetPacket.r_stringZ (s_name ); string256 temp; tNetPacket.r_stringZ (temp); set_name_replace (temp); tNetPacket.r_u8 (s_gameid ); tNetPacket.r_u8 (s_RP ); tNetPacket.r_vec3 (o_Position ); tNetPacket.r_vec3 (o_Angle ); tNetPacket.r_u16 (RespawnTime ); tNetPacket.r_u16 (ID ); tNetPacket.r_u16 (ID_Parent ); tNetPacket.r_u16 (ID_Phantom ); tNetPacket.r_u16 (s_flags.flags ); // dangerous!!!!!!!!! if (s_flags.is(M_SPAWN_VERSION)) tNetPacket.r_u16 (m_wVersion); if (0==m_wVersion) { tNetPacket.r_pos -= sizeof(u16); m_wVersion = 0; return FALSE; } if (m_wVersion > 69) m_script_version = tNetPacket.r_u16(); // read specific data //client object custom data serialization LOAD if (m_wVersion > 70) { u16 client_data_size = (m_wVersion > 93) ? tNetPacket.r_u16() : tNetPacket.r_u8(); //не может быть больше 256 байт if (client_data_size > 0) { // Msg ("SERVER:loading:load:%d bytes:%d:%s",client_data_size,ID,s_name_replace ? s_name_replace : ""); client_data.resize (client_data_size); tNetPacket.r (&*client_data.begin(),client_data_size); } else client_data.clear (); } else client_data.clear (); if (m_wVersion > 79) tNetPacket.r (&m_tSpawnID, sizeof(m_tSpawnID)); if (m_wVersion < 112) { if (m_wVersion > 82) tNetPacket.r_float ();//m_spawn_probability); if (m_wVersion > 83) { tNetPacket.r_u32 ();//m_spawn_flags.assign(tNetPacket.r_u32()); xr_string temp; tNetPacket.r_stringZ (temp);//tNetPacket.r_stringZ(m_spawn_control); tNetPacket.r_u32 ();//m_max_spawn_count); // this stuff we do not need even in case of uncomment tNetPacket.r_u32 ();//m_spawn_count); tNetPacket.r_u64 ();//m_last_spawn_time); } if (m_wVersion > 84) { tNetPacket.r_u64 ();//m_min_spawn_interval); tNetPacket.r_u64 ();//m_max_spawn_interval); } } u16 size; tNetPacket.r_u16 (size); // size R_ASSERT3 ((m_tClassID == CLSID_SPECTATOR) || (size > sizeof(size)),"cannot read object, which is not successfully saved :(",name_replace()); STATE_Read (tNetPacket,size); return TRUE; }
void CSE_ALifeDynamicObject::clear_client_data() { #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_ALifeDynamicObject::switch_offline: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG if (!keep_saved_data_anyway()) client_data.clear (); }
void CSE_ALifeDynamicObject::switch_offline () { R_ASSERT (m_bOnline); m_bOnline = false; alife().remove_online (this); #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_ALifeDynamicObject::switch_offline: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG if (!keep_saved_data_anyway()) client_data.clear (); }
void CSE_ALifeDynamicObject::try_switch_online () { CSE_ALifeSchedulable *schedulable = smart_cast<CSE_ALifeSchedulable*>(this); // checking if the abstract monster has just died if (schedulable) { if (!schedulable->need_update(this)) { if (alife().scheduled().object(ID,true)) alife().scheduled().remove (this); } else if (!alife().scheduled().object(ID,true)) alife().scheduled().add (this); } if (!can_switch_online()) { #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_ALifeDynamicObject::try_switch_online: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG if (!keep_saved_data_anyway()) client_data.clear (); return; } if (!can_switch_offline()) { alife().switch_online (this); return; } if (alife().graph().actor()->o_Position.distance_to(o_Position) > alife().online_distance()) { #ifdef DEBUG if (!client_data.empty()) Msg ("CSE_ALifeDynamicObject::try_switch_online2: client_data is cleared for [%d][%s]",ID,name_replace()); #endif // DEBUG if (!keep_saved_data_anyway()) client_data.clear (); return; } alife().switch_online (this); }