void xrServer::Process_save(NET_Packet& P, ClientID sender) { xrClientData* CL = ID_to_client(sender); if (CL) CL->net_Ready = TRUE; R_ASSERT(CL->flags.bLocal); // while has information while (!P.r_eof()) { // find entity u16 ID; u16 size; P.r_u16 (ID); P.r_u16 (size); s32 _pos_start = P.r_tell (); CSE_Abstract *E = ID_to_entity(ID); if (E) { E->net_Ready = TRUE; E->load (P); } else P.r_advance (size); s32 _pos_end = P.r_tell (); s32 _size = size; if (_size != (_pos_end-_pos_start)) { Msg ("! load/save mismatch, object: '%s'",E?E->name_replace():"unknown"); s32 _rollback = _pos_start+_size; P.r_seek (_rollback); } } }
BOOL CPhysicObject::net_Spawn(CSE_Abstract* DC) { CSE_Abstract *e = (CSE_Abstract*)(DC); CSE_ALifeObjectPhysic *po = smart_cast<CSE_ALifeObjectPhysic*>(e); R_ASSERT (po); m_type = EPOType(po->type); m_mass = po->mass; m_collision_hit_callback= NULL; m_anim_blend = 0; inherited::net_Spawn ( DC ); create_collision_model ( ); CPHSkeleton::Spawn(e); setVisible(TRUE); setEnabled(TRUE); if (!PPhysicsShell()->isBreakable()&&!CScriptBinder::object()&&!CPHSkeleton::IsRemoving()) SheduleUnregister(); //if (PPhysicsShell()->Animated()) //{ // processing_activate(); //} bones_snd_player = create_moving_bones_snd_player( *this ); if( bones_snd_player ) play_bones_sound(); m_just_after_spawn = true; m_activated = false; if (DC->s_flags.is(M_SPAWN_UPDATE)) { NET_Packet temp; temp.B.count = 0; DC->UPDATE_Write (temp); if (temp.B.count > 0) { temp.r_seek (0); net_Import (temp); } } //processing_activate(); #ifdef DEBUG if(dbg_draw_doors) { DBG_OpenCashedDraw( ); Fvector closed, open; get_door_vectors( closed, open ); DBG_ClosedCashedDraw( 50000000 ); } #endif return TRUE; }
void CLevel::cl_Process_Event (u16 dest, u16 type, NET_Packet& P) { // Msg ("--- event[%d] for [%d]",type,dest); CObject* O = Objects.net_Find (dest); if (0==O) { #ifdef DEBUG Msg("* WARNING: c_EVENT[%d] to [%d]: unknown dest",type,dest); #endif // DEBUG return; } CGameObject* GO = smart_cast<CGameObject*>(O); if (!GO) { Msg("! ERROR: c_EVENT[%d] : non-game-object",dest); return; } if (type != GE_DESTROY_REJECT) { if (type == GE_DESTROY) Game().OnDestroy(GO); GO->OnEvent (P,type); } else { // handle GE_DESTROY_REJECT here u32 pos = P.r_tell(); u16 id = P.r_u16(); P.r_seek (pos); bool ok = true; CObject *D = Objects.net_Find (id); if (0==D) { Msg ("! ERROR: c_EVENT[%d] : unknown dest",id); ok = false; } CGameObject *GD = smart_cast<CGameObject*>(D); if (!GD) { Msg ("! ERROR: c_EVENT[%d] : non-game-object",id); ok = false; } GO->OnEvent (P,GE_OWNERSHIP_REJECT); if (ok) { Game().OnDestroy(GD); GD->OnEvent (P,GE_DESTROY); }; } };
void message_filter::check_new_data (NET_Packet & packet) { u32 tmp_old_pos = packet.r_tell(); msg_type_subtype_t packet_mtype; packet_mtype.import (packet); if (packet_mtype.msg_type == M_EVENT_PACK) { NET_Packet tmp_packet; while (!packet.r_eof()) { tmp_packet.B.count = packet.r_u8(); packet.r (tmp_packet.B.data, tmp_packet.B.count); packet_mtype.import(tmp_packet); R_ASSERT2(packet_mtype.msg_type != M_EVENT_PACK, "M_EVENT_PACK in M_EVENT_PACK"); dbg_print_msg (tmp_packet, packet_mtype); filters_map_t::iterator tmp_iter = m_filters.find(packet_mtype); if (tmp_iter != m_filters.end()) { tmp_iter->second(packet_mtype.msg_type, packet_mtype.msg_subtype, tmp_packet); } } } else { dbg_print_msg (packet, packet_mtype); filters_map_t::iterator tmp_iter = m_filters.find(packet_mtype); if (tmp_iter != m_filters.end()) { tmp_iter->second(packet_mtype.msg_type, packet_mtype.msg_subtype, packet); } } packet.r_seek (tmp_old_pos); }
void CLevel::cl_Process_Event (u16 dest, u16 type, NET_Packet& P) { // Msg ("* event[%d] for [%d]",type,dest); CObject* O = Objects.net_Find (dest); if (0==O) { #ifdef DEBUG Msg("! WARNING: c_EVENT[%d] to [%d]: unknown dest",type,dest); #endif // DEBUG return; } CGameObject* GO = smart_cast<CGameObject*>(O); if (!GO) { #ifndef MASTER_GOLD Msg("! ERROR: c_EVENT[%d] : non-game-object",dest); #endif // #ifndef MASTER_GOLD return; } if (type != GE_DESTROY_REJECT) { if (type == GE_DESTROY) { Game().OnDestroy(GO); // if ( GO->H_Parent() ) // { // = GameObject.cpp (210) // Msg( "! ERROR (Level): GE_DESTROY arrived to object[%d][%s], that has parent[%d][%s], frame[%d]", // GO->ID(), GO->cNameSect().c_str(), // GO->H_Parent()->ID(), GO->H_Parent()->cName().c_str(), Device.dwFrame ); // } } GO->OnEvent (P,type); } else { // handle GE_DESTROY_REJECT here u32 pos = P.r_tell(); u16 id = P.r_u16(); P.r_seek (pos); bool ok = true; CObject *D = Objects.net_Find (id); if (0==D) { #ifndef MASTER_GOLD Msg ("! ERROR: c_EVENT[%d] : unknown dest",id); #endif // #ifndef MASTER_GOLD ok = false; } CGameObject *GD = smart_cast<CGameObject*>(D); if (!GD) { #ifndef MASTER_GOLD Msg ("! ERROR: c_EVENT[%d] : non-game-object",id); #endif // #ifndef MASTER_GOLD ok = false; } GO->OnEvent (P,GE_OWNERSHIP_REJECT); if (ok) { Game().OnDestroy(GD); GD->OnEvent (P,GE_DESTROY); }; } };