void CPhantom::net_Import (NET_Packet& P) { // import R_ASSERT (Remote()); u8 flags; float health; P.r_float (health); SetfHealth (health); float fDummy; u32 dwDummy; P.r_float (fDummy); P.r_u32 (dwDummy); P.r_u32 (dwDummy); P.r_u32 (dwDummy); P.r_u8 (flags); float yaw, pitch, bank = 0, roll = 0; P.r_float /*r_angle8*/ (yaw); P.r_float /*r_angle8*/ (yaw); P.r_float /*r_angle8*/ (pitch); P.r_float /*r_angle8*/ (roll); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); XFORM().setHPB (yaw,pitch,bank); }
void game_cl_Deathmatch::net_import_state (NET_Packet& P) { inherited::net_import_state (P); m_s32FragLimit = P.r_s32(); m_s32TimeLimit = P.r_s32() * 60000; m_u32ForceRespawn = P.r_u32() * 1000; m_cl_dwWarmUp_Time = P.r_u32(); m_bDamageBlockIndicators = !!P.r_u8(); // Teams u16 t_count; P.r_u16 (t_count); teams.clear (); for (u16 t_it=0; t_it<t_count; ++t_it) { game_TeamState ts; P.r (&ts,sizeof(game_TeamState)); teams.push_back (ts); }; switch (Phase()) { case GAME_PHASE_PLAYER_SCORES: { P.r_stringZ(WinnerName); bool NeedSndMessage = (xr_strlen(WinnerName) != 0); if (NeedSndMessage && local_player && !xr_strcmp(WinnerName, local_player->getName())) { PlaySndMessage(ID_YOU_WON); } }break; } }
void CCustomMonster::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } setVisible (TRUE); setEnabled (TRUE); }
void game_PlayerState::net_Import(NET_Packet& P) { BOOL bFullUpdate = !!P.r_u8(); if (bFullUpdate) P.r_stringZ (name); P.r_u8 ( team ); P.r_s16 ( m_iRivalKills ); P.r_s16 ( m_iSelfKills ); P.r_s16 ( m_iTeamKills ); P.r_s16 ( m_iDeaths ); P.r_s32 ( money_for_round ); P.r_float_q8 ( experience_D, -1.0f, 2.0f); P.r_u8 ( rank ); P.r_u8 ( af_count ); P.r_u16 ( flags__ ); P.r_u16 ( ping ); P.r_u16 ( GameID ); P.r_s8 ( skin ); P.r_u8 ( m_bCurrentVoteAgreed ); DeathTime = P.r_u32(); };
void CInventoryItem::net_Import (NET_Packet& P) { P.r_float (m_fCondition) ; net_update_IItem N ; N.dwTimeStamp=P.r_u32 ( ); u16 NumItems = 0; NumItems=P.r_u16 ( ); if (CSE_ALifeInventoryItem::FLAG_NO_POSITION != NumItems) N.State.position=P.r_vec3 (); if (!NumItems || (CSE_ALifeInventoryItem::FLAG_NO_POSITION == NumItems)) return; position_Import (P,N) ; net_updateData *p = NetSync() ; if ( !p->NET_IItem.empty() && (p->NET_IItem.back().dwTimeStamp>=N.dwTimeStamp)) return; if (!p->NET_IItem.empty()){ m_flags.set (FInInterpolate, TRUE); // m_bInterpolate = true; } Level().AddObject_To_Objects4CrPr (m_object); object().CrPr_SetActivated (false); object().CrPr_SetActivationStep (0); p->NET_IItem.push_back (N); while (p->NET_IItem.size() > 2) { p->NET_IItem.pop_front (); }; };
void game_cl_GameState::OnGameMessage (NET_Packet& P) { VERIFY (this && &P); u32 msg ; P.r_u32 (msg); TranslateGameMessage(msg, P); };
void CAI_Stalker::net_Import (NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; P.r_float (); set_money ( P.r_u32(), false ); float health; P.r_float (health); SetfHealth (health); // fEntityHealth = health; P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID graph_vertex_id = movement().game_dest_vertex_id(); P.r (&graph_vertex_id, sizeof(GameGraph::_GRAPH_ID)); graph_vertex_id = ai_location().game_vertex_id(); P.r (&graph_vertex_id, sizeof(GameGraph::_GRAPH_ID)); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } P.r_float (); P.r_float (); P.r_stringZ (m_sStartDialog); setVisible (TRUE); setEnabled (TRUE); }
void SHit::Read_Packet (NET_Packet Packet) { u16 type_dummy; Packet.r_begin (type_dummy); Packet.r_u32 (Time); Packet.r_u16 (PACKET_TYPE); Packet.r_u16 (DestID); Read_Packet_Cont (Packet); };
void message_filter::msg_type_subtype_t::import(NET_Packet& packet) { packet.r_begin (msg_type); msg_subtype = 0; switch (msg_type) { case M_EVENT: { u16 tmp_subtype; packet.r_u32 (msg_receive_time); packet.r_u16 (tmp_subtype); packet.r_u16 (dest_obj_id); msg_subtype = static_cast<u32>(tmp_subtype); }break; case M_GAMEMESSAGE: { packet.r_u32 (msg_subtype); }break; };//switch (msg_type) }
void CAI_Trader::net_Import (NET_Packet& P) { R_ASSERT (Remote()); float fDummy; P.r_float (fDummy); set_money ( P.r_u32(), false ); setVisible (TRUE); setEnabled (TRUE); }
void CBaseMonster::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_float /*r_angle8*/ (N.o_model); P.r_float /*r_angle8*/ (N.o_torso.yaw); P.r_float /*r_angle8*/ (N.o_torso.pitch); P.r_float /*r_angle8*/ (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID l_game_vertex_id = ai_location().game_vertex_id(); P.r (&l_game_vertex_id, sizeof(l_game_vertex_id)); P.r (&l_game_vertex_id, sizeof(l_game_vertex_id)); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } // P.r (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); // P.r (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); float f1 = 0; if (ai().game_graph().valid_vertex_id(l_game_vertex_id)) { f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.r (&f1, sizeof(f1)); f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.r (&f1, sizeof(f1)); } else { P.r (&f1, sizeof(f1)); P.r (&f1, sizeof(f1)); } setVisible (TRUE); setEnabled (TRUE); }
void CInventoryItem::OnEvent (NET_Packet& P, u16 type) { switch (type) { case GE_ADDON_ATTACH: { u32 ItemID; P.r_u32 (ItemID); CInventoryItem* ItemToAttach = smart_cast<CInventoryItem*>(Level().Objects.net_Find(ItemID)); if (!ItemToAttach) break; Attach(ItemToAttach,true); CActor* pActor = smart_cast<CActor*>(object().H_Parent()); if (pActor && pActor->inventory().ActiveItem() == this) { pActor->inventory().SetPrevActiveSlot(pActor->inventory().GetActiveSlot()); pActor->inventory().Activate(NO_ACTIVE_SLOT); } }break; case GE_ADDON_DETACH: { string64 i_name; P.r_stringZ (i_name); Detach(i_name, true); CActor* pActor = smart_cast<CActor*>(object().H_Parent()); if (pActor && pActor->inventory().ActiveItem() == this) { pActor->inventory().SetPrevActiveSlot(pActor->inventory().GetActiveSlot()); pActor->inventory().Activate(NO_ACTIVE_SLOT); }; }break; case GE_CHANGE_POS: { Fvector p; P.r_vec3(p); CPHSynchronize* pSyncObj = NULL; pSyncObj = object().PHGetSyncItem(0); if (!pSyncObj) return; SPHNetState state; pSyncObj->get_State(state); state.position = p; state.previous_position = p; pSyncObj->set_State(state); }break; } }
void xrServer::OnSecureMessage(NET_Packet & P, xrClientData* xrClSender) { #ifdef DEBUG char dbg_tmp_buff[33]; ZeroMemory (dbg_tmp_buff, sizeof(dbg_tmp_buff)); xr_strcpy (dbg_tmp_buff, "xray crypt check"); u32 dbg_encrypt_checksum = secure_messaging::encrypt(dbg_tmp_buff, sizeof(dbg_tmp_buff), xrClSender->m_secret_key); u32 dbg_decrypt_checksum = secure_messaging::decrypt(dbg_tmp_buff, sizeof(dbg_tmp_buff), xrClSender->m_secret_key); VERIFY(dbg_encrypt_checksum == dbg_decrypt_checksum); #endif NET_Packet dec_packet; dec_packet.B.count = P.B.count - sizeof(u16) - sizeof(u32); // - r_begin - crypt_check_sum P.r (dec_packet.B.data, dec_packet.B.count); u32 checksum = secure_messaging::decrypt(dec_packet.B.data, dec_packet.B.count, xrClSender->m_secret_key); u32 real_checksum = 0; P.r_u32 (real_checksum); VERIFY2 (checksum == real_checksum, "caught cheater"); if (checksum != real_checksum) return; // WARNING!: do not add any log messages - security treat! OnMessage (dec_packet, xrClSender->ID); }
void SHit::Read_Packet_Cont (NET_Packet Packet) { Packet.r_u16 (whoID); Packet.r_u16 (weaponID); Packet.r_dir (dir); Packet.r_float (power); Packet.r_u16 (boneID); Packet.r_vec3 (p_in_bone_space); Packet.r_float (impulse); aim_bullet = Packet.r_u16()!=0; hit_type = (ALife::EHitType)Packet.r_u16(); //hit type if (hit_type == ALife::eHitTypeFireWound) { Packet.r_float (ap); } if (PACKET_TYPE == GE_HIT_STATISTIC) { Packet.r_u32(BulletID); Packet.r_u32(SenderID); } }
void CAI_Rat::net_Import(NET_Packet& P) { R_ASSERT (Remote()); net_update N; u8 flags; float health; P.r_float (health); SetfHealth (health); P.r_u32 (N.dwTimeStamp); P.r_u8 (flags); P.r_vec3 (N.p_pos); P.r_angle8 (N.o_model); P.r_angle8 (N.o_torso.yaw); P.r_angle8 (N.o_torso.pitch); P.r_angle8 (N.o_torso.roll ); id_Team = P.r_u8(); id_Squad = P.r_u8(); id_Group = P.r_u8(); GameGraph::_GRAPH_ID t; P.r (&t, sizeof(t)); P.r (&t, sizeof(t)); ai_location().game_vertex (t); if (NET.empty() || (NET.back().dwTimeStamp<N.dwTimeStamp)) { NET.push_back (N); NET_WasInterpolating = TRUE; } setVisible (TRUE); setEnabled (TRUE); CEatableItem::net_Import(P); }
void CEntity::OnEvent (NET_Packet& P, u16 type) { inherited::OnEvent (P,type); switch (type) { case GE_DIE: { u16 id; u32 cl; P.r_u16 (id); P.r_u32 (cl); CObject *who = Level().Objects.net_Find (id); if (who && !IsGameTypeSingle()) { if (this!=who) /*if(bDebug) */ Msg( "%s killed by %s ...", cName().c_str(), who->cName().c_str() ); else /*if(bDebug) */ Msg( "%s dies himself ...", cName().c_str() ); } Die (who); } break; } }
void CActor::OnEvent(NET_Packet& P, u16 type) { inherited::OnEvent (P,type); CInventoryOwner::OnEvent (P,type); u16 id; switch (type) { case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_TAKE: Object not found. object_id = [%d]", id ); break; } CGameObject* _GO = smart_cast<CGameObject*>(Obj); if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't take items [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); break; } if( inventory().CanTakeItem(smart_cast<CInventoryItem*>(_GO)) ) { Obj->H_SetParent (smart_cast<CObject*>(this)); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_BUY)? "buys" : "takes" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, _GO->ID(), _GO->cNameSect().c_str()); #endif // MP_LOGGING inventory().Take (_GO, false, true); SelectBestWeapon(Obj); } else { if (IsGameTypeSingle()) { NET_Packet P; u_EventGen (P,GE_OWNERSHIP_REJECT,ID()); P.w_u16 (u16(Obj->ID())); u_EventSend (P); } else { Msg("! ERROR: Actor [%d][%s] tries to drop on take [%d][%s]", ID(), Name(), _GO->ID(), _GO->cNameSect().c_str()); } } } break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); VERIFY2 ( Obj, make_string("GE_OWNERSHIP_REJECT: Object not found, id = %d", id).c_str() ); if ( !Obj ) { Msg ( "! GE_OWNERSHIP_REJECT: Object not found, id = %d", id ); break; } bool just_before_destroy = !P.r_eof() && P.r_u8(); bool dont_create_shell = (type==GE_TRADE_SELL) || just_before_destroy; Obj->SetTmpPreDestroy (just_before_destroy); CGameObject * GO = smart_cast<CGameObject*>(Obj); #ifdef MP_LOGGING string64 act; xr_strcpy( act, (type == GE_TRADE_SELL)? "sells" : "rejects" ); Msg("--- Actor [%d][%s] %s [%d][%s]", ID(), Name(), act, GO->ID(), GO->cNameSect().c_str()); #endif // MP_LOGGING VERIFY( GO->H_Parent() ); if ( !GO->H_Parent() ) { Msg("! ERROR: Actor [%d][%s] tries to reject item [%d][%s] that has no parent", ID(), Name(), GO->ID(), GO->cNameSect().c_str()); break; } VERIFY2( GO->H_Parent()->ID() == ID(), make_string("actor [%d][%s] tries to drop not own object [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str() ).c_str() ); if ( GO->H_Parent()->ID() != ID() ) { CActor* real_parent = smart_cast<CActor*>(GO->H_Parent()); Msg("! ERROR: Actor [%d][%s] tries to drop not own item [%d][%s], his parent is [%d][%s]", ID(), Name(), GO->ID(), GO->cNameSect().c_str(), real_parent->ID(), real_parent->Name()); break; } if (!Obj->getDestroy() && inventory().DropItem(GO, just_before_destroy, dont_create_shell)) { //O->H_SetParent(0,just_before_destroy);//moved to DropItem //feel_touch_deny(O,2000); Level().m_feel_deny.feel_touch_deny(Obj, 1000); // [12.11.07] Alexander Maniluk: extended GE_OWNERSHIP_REJECT packet for drop item to selected position Fvector dropPosition; if (!P.r_eof()) { P.r_vec3(dropPosition); GO->MoveTo(dropPosition); //Other variant :) /*NET_Packet MovePacket; MovePacket.w_begin(M_MOVE_ARTEFACTS); MovePacket.w_u8(1); MovePacket.w_u16(id); MovePacket.w_vec3(dropPosition); u_EventSend(MovePacket);*/ } } if (!just_before_destroy) SelectBestWeapon(Obj); } break; case GE_INV_ACTION: { u16 cmd; P.r_u16 (cmd); u32 flags; P.r_u32 (flags); s32 ZoomRndSeed = P.r_s32(); s32 ShotRndSeed = P.r_s32(); if (!IsGameTypeSingle() && !g_Alive()) { // Msg("! WARNING: dead player tries to rize inventory action"); break; } if (flags & CMD_START) { if (cmd == kWPN_ZOOM) SetZoomRndSeed(ZoomRndSeed); if (cmd == kWPN_FIRE) SetShotRndSeed(ShotRndSeed); IR_OnKeyboardPress(cmd); } else IR_OnKeyboardRelease(cmd); } break; case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GEG_PLAYER_ITEM_EAT: case GEG_PLAYER_ACTIVATEARTEFACT: { P.r_u16 (id); CObject* Obj = Level().Objects.net_Find (id); // R_ASSERT2( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); VERIFY2 ( Obj, make_string("GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id).c_str() ); if ( !Obj ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object not found. object_id = [%d]", id ); break; } // R_ASSERT2( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); VERIFY2 ( !Obj->getDestroy(), make_string("GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id).c_str() ); if ( Obj->getDestroy() ) { // Msg ( "! GEG_PLAYER_ITEM_EAT(use): Object is destroying. object_id = [%d]", id ); break; } if (!IsGameTypeSingle() && !g_Alive()) { Msg("! WARNING: dead player [%d][%s] can't use items [%d][%s]", ID(), Name(), Obj->ID(), Obj->cNameSect().c_str()); break; } if ( type == GEG_PLAYER_ACTIVATEARTEFACT ) { CArtefact* pArtefact = smart_cast<CArtefact*>(Obj); // R_ASSERT2( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); VERIFY2 ( pArtefact, make_string("GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id).c_str() ); if ( !pArtefact ) { Msg ( "! GEG_PLAYER_ACTIVATEARTEFACT: Artefact not found. artefact_id = [%d]", id ); break;//1 } pArtefact->ActivateArtefact (); break;//1 } PIItem iitem = smart_cast<CInventoryItem*>(Obj); R_ASSERT( iitem ); switch (type) { case GEG_PLAYER_ITEM2SLOT: { u16 slot_id = P.r_u16(); inventory().Slot(slot_id, iitem ); }break;//2 case GEG_PLAYER_ITEM2BELT: inventory().Belt( iitem ); break;//2 case GEG_PLAYER_ITEM2RUCK: inventory().Ruck( iitem ); break;//2 case GEG_PLAYER_ITEM_EAT: inventory().Eat( iitem ); break;//2 }//switch }break;//1 case GEG_PLAYER_ACTIVATE_SLOT: { u16 slot_id; P.r_u16 (slot_id); inventory().Activate (slot_id); }break; case GEG_PLAYER_DISABLE_SPRINT: { s8 cmd = P.r_s8(); m_block_sprint_counter = m_block_sprint_counter+cmd; Msg("m_block_sprint_counter=%d",m_block_sprint_counter); if(m_block_sprint_counter>0) { mstate_wishful &=~mcSprint; } }break; case GEG_PLAYER_WEAPON_HIDE_STATE: { u16 State = P.r_u16(); BOOL Set = !!P.r_u8(); inventory().SetSlotsBlocked (State, !!Set); }break; case GE_MOVE_ACTOR: { Fvector NewPos, NewRot; P.r_vec3(NewPos); P.r_vec3(NewRot); MoveActor(NewPos, NewRot); }break; case GE_ACTOR_MAX_POWER: { conditions().MaxPower(); conditions().ClearWounds(); ClearBloodWounds(); }break; case GE_ACTOR_MAX_HEALTH: { SetfHealth(GetMaxHealth()); }break; case GEG_PLAYER_ATTACH_HOLDER: { u16 id = P.r_u16(); CObject* O = Level().Objects.net_Find (id); if (!O){ Msg("! Error: No object to attach holder [%d]", id); break; } VERIFY(m_holder==NULL); CHolderCustom* holder = smart_cast<CHolderCustom*>(O); if(!holder->Engaged()) use_Holder (holder); }break; case GEG_PLAYER_DETACH_HOLDER: { if (!m_holder) break; u16 id = P.r_u16(); CGameObject* GO = smart_cast<CGameObject*>(m_holder); VERIFY (id==GO->ID()); use_Holder (NULL); }break; case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: { OnPlayHeadShotParticle(P); }break; case GE_ACTOR_JUMPING: { /* Fvector dir; P.r_dir(dir); float jump = P.r_float(); NET_SavedAccel = dir; extern float NET_Jump; NET_Jump = jump; m_bInInterpolation = false; mstate_real |= mcJump; */ }break; } }
void game_cl_GameState::net_import_state (NET_Packet& P) { // Generic P.r_clientID (local_svdpnid); P.r_s32 (m_type); u16 ph; P.r_u16 (ph); if(Phase()!=ph) switch_Phase(ph); P.r_s32 (m_round); P.r_u32 (m_start_time); m_u16VotingEnabled = u16(P.r_u8()); m_bServerControlHits = !!P.r_u8(); m_WeaponUsageStatistic->SetCollectData(!!P.r_u8()); // Players u16 p_count; P.r_u16 (p_count); PLAYERS_MAP players_new; /* players.clear (); */ PLAYERS_MAP_IT I; for (u16 p_it=0; p_it<p_count; ++p_it) { ClientID ID; P.r_clientID (ID); game_PlayerState* IP; I = players.find(ID); if( I!=players.end() ) { IP = I->second; //*********************************************** u16 OldFlags = IP->flags__; u8 OldVote = IP->m_bCurrentVoteAgreed; //----------------------------------------------- IP->net_Import(P); //----------------------------------------------- if (OldFlags != IP->flags__) if (Type() != GAME_SINGLE) OnPlayerFlagsChanged(IP); if (OldVote != IP->m_bCurrentVoteAgreed) OnPlayerVoted(IP); //*********************************************** players_new.insert(mk_pair(ID,IP)); players.erase(I); }else{ IP = createPlayerState(); IP->net_Import (P); if (Type() != GAME_SINGLE) OnPlayerFlagsChanged(IP); players_new.insert(mk_pair(ID,IP)); } if (IP->testFlag(GAME_PLAYER_FLAG_LOCAL) ) local_player = IP; } I = players.begin(); for(;I!=players.end(); ++I) xr_delete(I->second); players.clear(); players = players_new; net_import_GameTime(P); }
void CActor::OnEvent (NET_Packet& P, u16 type) { inherited::OnEvent (P,type); CInventoryOwner::OnEvent (P,type); u16 id; switch (type) { case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if (!O) { Msg("! Error: No object to take/buy [%d]", id); break; } CGameObject* _GO = smart_cast<CGameObject*>(O); CFoodItem* pFood = smart_cast<CFoodItem*>(O); if(pFood) #if defined(INV_NEW_SLOTS_SYSTEM) if (pFood->m_eItemPlace != eItemPlaceSlot) #endif pFood->m_eItemPlace = eItemPlaceRuck; if( inventory().CanTakeItem(smart_cast<CInventoryItem*>(_GO)) ) { O->H_SetParent(smart_cast<CObject*>(this)); inventory().Take(_GO, false, true); CUIGameSP* pGameSP = NULL; CUI* ui = HUD().GetUI(); if( ui&&ui->UIGame() ) { pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); if (Level().CurrentViewEntity() == this) HUD().GetUI()->UIGame()->ReInitShownUI(); }; //добавить отсоединенный аддон в инвентарь if(pGameSP) { if(pGameSP->MainInputReceiver() == pGameSP->InventoryMenu) { pGameSP->InventoryMenu->AddItemToBag(smart_cast<CInventoryItem*>(O)); } } SelectBestWeapon(O); } else { NET_Packet P; u_EventGen(P,GE_OWNERSHIP_REJECT,ID()); P.w_u16(u16(O->ID())); u_EventSend(P); } } break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if (!O) { Msg("! Error: No object to reject/sell [%d]", id); break; } bool just_before_destroy = !P.r_eof() && P.r_u8(); O->SetTmpPreDestroy (just_before_destroy); if (inventory().DropItem(smart_cast<CGameObject*>(O)) && !O->getDestroy()) { O->H_SetParent(0,just_before_destroy); //. feel_touch_deny(O,2000); Level().m_feel_deny.feel_touch_deny(O, 1000); } SelectBestWeapon(O); if (Level().CurrentViewEntity() == this && HUD().GetUI() && HUD().GetUI()->UIGame()) HUD().GetUI()->UIGame()->ReInitShownUI(); } break; case GE_INV_ACTION: { s32 cmd; P.r_s32 (cmd); u32 flags; P.r_u32 (flags); s32 ZoomRndSeed = P.r_s32(); s32 ShotRndSeed = P.r_s32(); if (flags & CMD_START) { if (cmd == kWPN_ZOOM) SetZoomRndSeed(ZoomRndSeed); if (cmd == kWPN_FIRE) SetShotRndSeed(ShotRndSeed); IR_OnKeyboardPress(cmd); } else IR_OnKeyboardRelease(cmd); } break; case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GEG_PLAYER_ITEM_EAT: case GEG_PLAYER_ACTIVATEARTEFACT: { P.r_u16 (id); CObject* O = Level().Objects.net_Find (id); if(!O) break; if (O->getDestroy()) { #ifdef DEBUG Msg("! something to destroyed object - %s[%d]0x%X", *O->cName(), id, smart_cast<CInventoryItem*>(O)); #endif break; } switch (type) { case GEG_PLAYER_ITEM2SLOT: inventory().Slot(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM2BELT: inventory().Belt(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM2RUCK: inventory().Ruck(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ITEM_EAT: inventory().Eat(smart_cast<CInventoryItem*>(O)); break; case GEG_PLAYER_ACTIVATEARTEFACT: { CArtefact* pArtefact = smart_cast<CArtefact*>(O); pArtefact->ActivateArtefact (); }break; } }break; case GEG_PLAYER_ACTIVATE_SLOT: { u32 slot_id; P.r_u32 (slot_id); inventory().Activate (slot_id); }break; case GEG_PLAYER_WEAPON_HIDE_STATE: { u32 State = P.r_u32(); BOOL Set = !!P.r_u8(); inventory().SetSlotsBlocked ((u16)State, !!Set); }break; case GE_MOVE_ACTOR: { Fvector NewPos, NewRot; P.r_vec3(NewPos); P.r_vec3(NewRot); MoveActor(NewPos, NewRot); }break; case GE_ACTOR_MAX_POWER: { conditions().MaxPower(); conditions().ClearWounds(); ClearBloodWounds(); }break; case GEG_PLAYER_ATTACH_HOLDER: { u32 id = P.r_u32(); CObject* O = Level().Objects.net_Find (id); if (!O){ Msg("! Error: No object to attach holder [%d]", id); break; } VERIFY(m_holder==NULL); CHolderCustom* holder = smart_cast<CHolderCustom*>(O); if(!holder->Engaged()) use_Holder (holder); }break; case GEG_PLAYER_DETACH_HOLDER: { if (!m_holder) break; u32 id = P.r_u32(); CGameObject* GO = smart_cast<CGameObject*>(m_holder); VERIFY (id==GO->ID()); use_Holder (NULL); }break; case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: { OnPlayHeadShotParticle(P); }break; case GE_ACTOR_JUMPING: { /* Fvector dir; P.r_dir(dir); float jump = P.r_float(); NET_SavedAccel = dir; extern float NET_Jump; NET_Jump = jump; m_bInInterpolation = false; mstate_real |= mcJump; */ }break; } }
void xrServer::Process_event (NET_Packet& P, ClientID sender) { # ifdef SLOW_VERIFY_ENTITIES VERIFY (verify_entities()); # endif u32 timestamp; u16 type; u16 destination; u32 MODE = net_flags(TRUE,TRUE); // correct timestamp with server-unique-time (note: direct message correction) P.r_u32 (timestamp ); // read generic info P.r_u16 (type ); P.r_u16 (destination); CSE_Abstract* receiver = game->get_entity_from_eid (destination); if (receiver) { R_ASSERT(receiver->owner); receiver->OnEvent (P,type,timestamp,sender); }; switch (type) { case GE_GAME_EVENT: { u16 game_event_type; P.r_u16(game_event_type); game->AddDelayedEvent(P,game_event_type,timestamp,sender); }break; case GE_INFO_TRANSFER: case GE_WPN_STATE_CHANGE: case GE_ZONE_STATE_CHANGE: case GE_ACTOR_JUMPING: case GEG_PLAYER_PLAY_HEADSHOT_PARTICLE: case GEG_PLAYER_ATTACH_HOLDER: case GEG_PLAYER_DETACH_HOLDER: case GEG_PLAYER_ITEM2SLOT: case GEG_PLAYER_ITEM2BELT: case GEG_PLAYER_ITEM2RUCK: case GE_GRENADE_EXPLODE: { SendBroadcast (BroadcastCID,P,MODE); }break; case GEG_PLAYER_ACTIVATEARTEFACT: { Process_event_activate (P,sender,timestamp,destination,P.r_u16(), true); break; }; case GE_INV_ACTION: { xrClientData* CL = ID_to_client(sender); if (CL) CL->net_Ready = TRUE; if (SV_Client) SendTo(SV_Client->ID, P, net_flags(TRUE, TRUE)); }break; case GE_RESPAWN: { CSE_Abstract* E = receiver; if (E) { R_ASSERT (E->s_flags.is(M_SPAWN_OBJECT_PHANTOM)); svs_respawn R; R.timestamp = timestamp + E->RespawnTime*1000; R.phantom = destination; q_respawn.insert (R); } } break; case GE_TRADE_BUY: case GE_OWNERSHIP_TAKE: { Process_event_ownership (P,sender,timestamp,destination); VERIFY (verify_entities()); }break; case GE_OWNERSHIP_TAKE_MP_FORCED: { Process_event_ownership (P,sender,timestamp,destination,TRUE); VERIFY (verify_entities()); }break; case GE_TRADE_SELL: case GE_OWNERSHIP_REJECT: case GE_LAUNCH_ROCKET: { Process_event_reject (P,sender,timestamp,destination,P.r_u16()); VERIFY (verify_entities()); }break; case GE_DESTROY: { Process_event_destroy (P,sender,timestamp,destination, NULL); VERIFY (verify_entities()); } break; case GE_TRANSFER_AMMO: { u16 id_entity; P.r_u16 (id_entity); CSE_Abstract* e_parent = receiver; // кто забирает (для своих нужд) CSE_Abstract* e_entity = game->get_entity_from_eid (id_entity); // кто отдает if (!e_entity) break; if (0xffff != e_entity->ID_Parent) break; // this item already taken xrClientData* c_parent = e_parent->owner; xrClientData* c_from = ID_to_client (sender); R_ASSERT (c_from == c_parent); // assure client ownership of event // Signal to everyone (including sender) SendBroadcast (BroadcastCID,P,MODE); // Perfrom real destroy entity_Destroy (e_entity ); VERIFY (verify_entities()); } break; case GE_HIT: case GE_HIT_STATISTIC: { P.r_pos -=2; if (type == GE_HIT_STATISTIC) { P.B.count -= 4; P.w_u32(sender.value()); }; game->AddDelayedEvent(P,GAME_EVENT_ON_HIT, 0, ClientID() ); } break; case GE_ASSIGN_KILLER: { u16 id_src; P.r_u16 (id_src); CSE_Abstract *e_dest = receiver; // кто умер // this is possible when hit event is sent before destroy event if (!e_dest) break; CSE_ALifeCreatureAbstract *creature = smart_cast<CSE_ALifeCreatureAbstract*>(e_dest); if (creature) creature->set_killer_id( id_src ); // Msg ("[%d][%s] killed [%d][%s]",id_src,id_src==u16(-1) ? "UNKNOWN" : game->get_entity_from_eid(id_src)->name_replace(),id_dest,e_dest->name_replace()); break; } case GE_CHANGE_VISUAL: { CSE_Visual* visual = smart_cast<CSE_Visual*>(receiver); VERIFY(visual); string256 tmp; P.r_stringZ (tmp); visual->set_visual (tmp); }break; case GE_DIE: { // Parse message u16 id_dest = destination, id_src; P.r_u16 (id_src); xrClientData *l_pC = ID_to_client(sender); VERIFY (game && l_pC); #ifndef MASTER_GOLD if ((game->Type() != eGameIDSingle) && l_pC && l_pC->owner) { Msg ("* [%2d] killed by [%2d] - sended by [%s:%2d]", id_dest, id_src, game->get_option_s(*l_pC->name,"name","Player"), l_pC->owner->ID); } #endif // #ifndef MASTER_GOLD CSE_Abstract* e_dest = receiver; // кто умер // this is possible when hit event is sent before destroy event if (!e_dest) break; #ifndef MASTER_GOLD if (game->Type() != eGameIDSingle) Msg ("* [%2d] is [%s:%s]", id_dest, *e_dest->s_name, e_dest->name_replace()); #endif // #ifndef MASTER_GOLD CSE_Abstract* e_src = game->get_entity_from_eid (id_src ); // кто убил if (!e_src) { xrClientData* C = (xrClientData*) game->get_client(id_src); if (C) e_src = C->owner; }; VERIFY (e_src); if (!e_src) { Msg("! ERROR: SV: src killer not exist."); return; } // R_ASSERT2 (e_dest && e_src, "Killer or/and being killed are offline or not exist at all :("); #ifndef MASTER_GOLD if (game->Type() != eGameIDSingle) Msg ("* [%2d] is [%s:%s]", id_src, *e_src->s_name, e_src->name_replace()); #endif // #ifndef MASTER_GOLD game->on_death (e_dest,e_src); xrClientData* c_src = e_src->owner; // клиент, чей юнит убил if (c_src->owner->ID == id_src) { // Main unit P.w_begin (M_EVENT); P.w_u32 (timestamp); P.w_u16 (type); P.w_u16 (destination); P.w_u16 (id_src); P.w_clientID (c_src->ID); } SendBroadcast (BroadcastCID,P,MODE); ////////////////////////////////////////////////////////////////////////// // if (game->Type() == eGameIDSingle) { P.w_begin (M_EVENT); P.w_u32 (timestamp); P.w_u16 (GE_KILL_SOMEONE); P.w_u16 (id_src); P.w_u16 (destination); SendTo (c_src->ID, P, net_flags(TRUE, TRUE)); } ////////////////////////////////////////////////////////////////////////// VERIFY (verify_entities()); } break; case GE_ADDON_ATTACH: case GE_ADDON_DETACH: case GE_CHANGE_POS: { SendTo(SV_Client->ID, P, net_flags(TRUE, TRUE)); }break; case GE_INSTALL_UPGRADE: { shared_str upgrade_id; P.r_stringZ ( upgrade_id ); CSE_ALifeInventoryItem* iitem = smart_cast<CSE_ALifeInventoryItem*>( receiver ); if ( !iitem ) { break; } iitem->add_upgrade ( upgrade_id ); }break; case GEG_PLAYER_DISABLE_SPRINT: case GEG_PLAYER_WEAPON_HIDE_STATE: { SendTo (SV_Client->ID, P, net_flags(TRUE, TRUE)); # ifdef SLOW_VERIFY_ENTITIES VERIFY (verify_entities()); # endif }break; case GEG_PLAYER_ACTIVATE_SLOT: case GEG_PLAYER_ITEM_EAT: { SendTo(SV_Client->ID, P, net_flags(TRUE, TRUE)); # ifdef SLOW_VERIFY_ENTITIES VERIFY (verify_entities()); # endif }break; case GEG_PLAYER_ITEM_SELL: { game->OnPlayer_Sell_Item(sender, P); }break; case GE_TELEPORT_OBJECT: { game->teleport_object (P,destination); }break; case GE_ADD_RESTRICTION: { game->add_restriction (P,destination); }break; case GE_REMOVE_RESTRICTION: { game->remove_restriction(P,destination); }break; case GE_REMOVE_ALL_RESTRICTIONS: { game->remove_all_restrictions(P,destination); }break; case GE_MONEY: { CSE_Abstract *e_dest = receiver; CSE_ALifeTraderAbstract* pTa = smart_cast<CSE_ALifeTraderAbstract*>(e_dest); pTa->m_dwMoney = P.r_u32(); }break; case GE_FREEZE_OBJECT: break; default: R_ASSERT2 (0,"Game Event not implemented!!!"); break; } }
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 CLevel::ClientReceive() { Demo_StartFrame(); Demo_Update(); m_dwRPC = 0; m_dwRPS = 0; for (NET_Packet* P = net_msg_Retreive(); P; P=net_msg_Retreive()) { //----------------------------------------------------- m_dwRPC++; m_dwRPS += P->B.count; //----------------------------------------------------- u16 m_type; u16 ID; P->r_begin (m_type); switch (m_type) { case M_MAP_SYNC: { shared_str map_name; P->r_stringZ(map_name); shared_str _name = net_Hosts.size() ? net_Hosts.front().dpSessionName:""; if(_name.size() && _name!=map_name && OnClient()) { Msg("!!! map sync failed. current is[%s] server is[%s]",m_name.c_str(), map_name.c_str()); Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",m_caServerOptions.size() ? size_t( xr_strdup(*m_caServerOptions)) : 0, m_caClientOptions.size() ? size_t(xr_strdup(*m_caClientOptions)) : 0); } }break; case M_SPAWN: { if (!m_bGameConfigStarted || !bReady) { Msg ("Unconventional M_SPAWN received : cgf[%s] | bReady[%s]", (m_bGameConfigStarted) ? "true" : "false", (bReady) ? "true" : "false"); break; } /*/ cl_Process_Spawn(*P); /*/ game_events->insert (*P); if (g_bDebugEvents) ProcessGameEvents(); //*/ } break; case M_EVENT: game_events->insert (*P); if (g_bDebugEvents) ProcessGameEvents(); break; case M_EVENT_PACK: NET_Packet tmpP; while (!P->r_eof()) { tmpP.B.count = P->r_u8(); P->r(&tmpP.B.data, tmpP.B.count); tmpP.timeReceive = P->timeReceive; game_events->insert (tmpP); if (g_bDebugEvents) ProcessGameEvents(); }; break; case M_UPDATE: { game->net_import_update (*P); //------------------------------------------- if (OnServer()) break; //------------------------------------------- }; // ни в коем случае нельзя здесь ставить break, т.к. в случае если все объекты не влазят в пакет M_UPDATE, // они досылаются через M_UPDATE_OBJECTS case M_UPDATE_OBJECTS: { Objects.net_Import (P); if (OnClient()) UpdateDeltaUpd(timeServer()); IClientStatistic pStat = Level().GetStatistic(); u32 dTime = 0; if ((Level().timeServer() + pStat.getPing()) < P->timeReceive) { dTime = pStat.getPing(); } else dTime = Level().timeServer() - P->timeReceive + pStat.getPing(); u32 NumSteps = ph_world->CalcNumSteps(dTime); SetNumCrSteps(NumSteps); }break; // case M_UPDATE_OBJECTS: // { // Objects.net_Import (P); // }break; //----------- for E3 ----------------------------- case M_CL_UPDATE: { if (OnClient()) break; P->r_u16 (ID); u32 Ping = P->r_u32(); CGameObject* O = smart_cast<CGameObject*>(Objects.net_Find (ID)); if (0 == O) break; O->net_Import(*P); //--------------------------------------------------- UpdateDeltaUpd(timeServer()); if (pObjects4CrPr.empty() && pActors4CrPr.empty()) break; if (O->CLS_ID != CLSID_OBJECT_ACTOR) break; u32 dTime = 0; if ((Level().timeServer() + Ping) < P->timeReceive) { #ifdef DEBUG // Msg("! TimeServer[%d] < TimeReceive[%d]", Level().timeServer(), P->timeReceive); #endif dTime = Ping; } else dTime = Level().timeServer() - P->timeReceive + Ping; u32 NumSteps = ph_world->CalcNumSteps(dTime); SetNumCrSteps(NumSteps); O->CrPr_SetActivationStep(u32(ph_world->m_steps_num) - NumSteps); AddActor_To_Actors4CrPr(O); }break; case M_MOVE_PLAYERS: { u8 Count = P->r_u8(); for (u8 i=0; i<Count; i++) { u16 ID = P->r_u16(); Fvector NewPos, NewDir; P->r_vec3(NewPos); P->r_vec3(NewDir); CActor* OActor = smart_cast<CActor*>(Objects.net_Find (ID)); if (0 == OActor) break; OActor->MoveActor(NewPos, NewDir); }; NET_Packet PRespond; PRespond.w_begin(M_MOVE_PLAYERS_RESPOND); Send(PRespond, net_flags(TRUE, TRUE)); }break; //------------------------------------------------ case M_CL_INPUT: { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_ImportInput(*P); }break; //--------------------------------------------------- case M_SV_CONFIG_NEW_CLIENT: InitializeClientGame(*P); break; case M_SV_CONFIG_GAME: game->net_import_state (*P); break; case M_SV_CONFIG_FINISHED: game_configured = TRUE; Msg("- Game configuring : Finished "); break; case M_MIGRATE_DEACTIVATE: // TO: Changing server, just deactivate { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_MigrateInactive (*P); if (bDebug) Log("! MIGRATE_DEACTIVATE",*O->cName()); } break; case M_MIGRATE_ACTIVATE: // TO: Changing server, full state { P->r_u16 (ID); CObject* O = Objects.net_Find (ID); if (0 == O) break; O->net_MigrateActive (*P); if (bDebug) Log("! MIGRATE_ACTIVATE",*O->cName()); } break; case M_CHAT: { char buffer[256]; P->r_stringZ(buffer); Msg ("- %s",buffer); } break; case M_GAMEMESSAGE: { if (!game) break; Game().OnGameMessage(*P); }break; case M_RELOAD_GAME: case M_LOAD_GAME: case M_CHANGE_LEVEL: { if(m_type==M_LOAD_GAME) { string256 saved_name; P->r_stringZ (saved_name); if(xr_strlen(saved_name) && ai().get_alife()) { CSavedGameWrapper wrapper(saved_name); if (wrapper.level_id() == ai().level_graph().level_id()) { Engine.Event.Defer ("Game:QuickLoad", size_t(xr_strdup(saved_name)), 0); break; } } } Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",size_t(xr_strdup(*m_caServerOptions)),size_t(xr_strdup(*m_caClientOptions))); }break; case M_SAVE_GAME: { ClientSave (); }break; case M_GAMESPY_CDKEY_VALIDATION_CHALLENGE: { OnGameSpyChallenge(P); }break; case M_AUTH_CHALLENGE: { OnBuildVersionChallenge(); }break; case M_CLIENT_CONNECT_RESULT: { OnConnectResult(P); }break; case M_CHAT_MESSAGE: { if (!game) break; Game().OnChatMessage(P); }break; case M_CLIENT_WARN: { if (!game) break; Game().OnWarnMessage(P); }break; case M_REMOTE_CONTROL_AUTH: case M_REMOTE_CONTROL_CMD: { Game().OnRadminMessage(m_type, P); }break; case M_CHANGE_LEVEL_GAME: { Msg("- M_CHANGE_LEVEL_GAME Received"); if (OnClient()) { Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",m_caServerOptions.size() ? size_t( xr_strdup(*m_caServerOptions)) : 0,m_caClientOptions.size() ? size_t(xr_strdup(*m_caClientOptions)) : 0); } else { const char* m_SO = m_caServerOptions.c_str(); // const char* m_CO = m_caClientOptions.c_str(); m_SO = strchr(m_SO, '/'); if (m_SO) m_SO++; m_SO = strchr(m_SO, '/'); string128 LevelName = ""; string128 GameType = ""; P->r_stringZ(LevelName); P->r_stringZ(GameType); string4096 NewServerOptions = ""; sprintf_s(NewServerOptions, "%s/%s", LevelName, GameType); if (m_SO) strcat(NewServerOptions, m_SO); m_caServerOptions = NewServerOptions; Engine.Event.Defer ("KERNEL:disconnect"); Engine.Event.Defer ("KERNEL:start",size_t(xr_strdup(*m_caServerOptions)),size_t(xr_strdup(*m_caClientOptions))); }; }break; case M_CHANGE_SELF_NAME: { net_OnChangeSelfName(P); }break; case M_BULLET_CHECK_RESPOND: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->On_Check_Respond(P); }break; case M_STATISTIC_UPDATE: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->OnUpdateRequest(P); }break; case M_STATISTIC_UPDATE_RESPOND: { if (!game) break; if (GameID() != GAME_SINGLE) Game().m_WeaponUsageStatistic->OnUpdateRespond(P); }break; case M_BATTLEYE: { #ifdef BATTLEYE battleye_system.ReadPacketClient( P ); #endif // BATTLEYE }break; } net_msg_Release(); } // if (!g_bDebugEvents) ProcessGameSpawns(); }
u32 xrServer::OnMessage (NET_Packet& P, ClientID sender) // Non-Zero means broadcasting with "flags" as returned { if (g_pGameLevel && Level().IsDemoSave()) Level().Demo_StoreServerData(P.B.data, P.B.count); u16 type; P.r_begin (type); csPlayers.Enter (); VERIFY (verify_entities()); xrClientData* CL = ID_to_client(sender); switch (type) { case M_UPDATE: { Process_update (P,sender); // No broadcast VERIFY (verify_entities()); }break; case M_SPAWN: { // R_ASSERT(CL->flags.bLocal); if (CL->flags.bLocal) Process_spawn (P,sender); VERIFY (verify_entities()); }break; case M_EVENT: { Process_event (P,sender); VERIFY (verify_entities()); }break; case M_EVENT_PACK: { NET_Packet tmpP; while (!P.r_eof()) { tmpP.B.count = P.r_u8(); P.r (&tmpP.B.data, tmpP.B.count); OnMessage (tmpP, sender); }; }break; case M_CL_UPDATE: { xrClientData* CL = ID_to_client (sender); if (!CL) break; CL->net_Ready = TRUE; if (!CL->net_PassUpdates) break; //------------------------------------------------------------------- u32 ClientPing = CL->stats.getPing(); P.w_seek(P.r_tell()+2, &ClientPing, 4); //------------------------------------------------------------------- if (SV_Client) SendTo (SV_Client->ID, P, net_flags(TRUE, TRUE)); VERIFY (verify_entities()); }break; case M_MOVE_PLAYERS_RESPOND: { xrClientData* CL = ID_to_client (sender); if (!CL) break; CL->net_Ready = TRUE; CL->net_PassUpdates = TRUE; }break; //------------------------------------------------------------------- case M_CL_PING_CHALLENGE: { P.r_u32(); u32 id = sender.value(); P.w_seek( P.r_tell(), &(id), 4); if (SV_Client) SendTo (SV_Client->ID, P, net_flags(FALSE)); }break; case M_CL_PING_CHALLENGE_RESPOND: { P.r_u32(); u32 id = P.r_u32(); ClientID clientID; clientID.set(id); u32 clLastPing = P.r_u32(); xrClientData* pCL = ID_to_client(clientID); pCL->ps->Rping = u16(clLastPing); SendTo (clientID, P, net_flags(FALSE)); }break; //------------------------------------------------------------------- case M_CL_INPUT: { xrClientData* CL = ID_to_client (sender); if (CL) CL->net_Ready = TRUE; if (SV_Client) SendTo (SV_Client->ID, P, net_flags(TRUE, TRUE)); VERIFY (verify_entities()); }break; case M_GAMEMESSAGE: { ClientID clientID;clientID.setBroadcast(); SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); VERIFY (verify_entities()); }break; case M_CLIENTREADY: { xrClientData* CL = ID_to_client(sender); if (CL) { CL->net_Ready = TRUE; CL->ps->DeathTime = Device.dwTimeGlobal; game->OnPlayerConnectFinished(sender); }; game->signal_Syncronize (); VERIFY (verify_entities()); }break; case M_SWITCH_DISTANCE: { game->switch_distance (P,sender); VERIFY (verify_entities()); }break; case M_CHANGE_LEVEL: { if (game->change_level(P,sender)){ ClientID clientID;clientID.setBroadcast(); SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); } VERIFY (verify_entities()); }break; case M_SAVE_GAME: { game->save_game (P,sender); VERIFY (verify_entities()); }break; case M_LOAD_GAME: { game->load_game (P,sender); ClientID clientID;clientID.setBroadcast(); SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); VERIFY (verify_entities()); }break; case M_RELOAD_GAME: { ClientID clientID;clientID.setBroadcast(); SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); VERIFY (verify_entities()); }break; case M_SAVE_PACKET: { Process_save (P,sender); VERIFY (verify_entities()); }break; case M_CLIENT_REQUEST_CONNECTION_DATA: { xrClientData* CL = ID_to_client (sender); OnCL_Connected (CL); }break; case M_CHAT_MESSAGE: { xrClientData *l_pC = ID_to_client(sender); OnChatMessage (&P, l_pC); }break; case M_CHANGE_LEVEL_GAME: { ClientID CID; CID.set (0xffffffff); SendBroadcast (CID,P,net_flags(TRUE,TRUE)); }break; case M_CL_AUTH: { game->AddDelayedEvent (P,GAME_EVENT_PLAYER_AUTH, 0, sender); }break; case M_PAUSE_GAME: { ClientID clientID;clientID.setBroadcast(); SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); }break; case M_STATISTIC_UPDATE: { ClientID clientID;clientID.setBroadcast(); if (SV_Client) SendBroadcast (SV_Client->ID,P,net_flags(TRUE,TRUE)); else SendBroadcast (clientID,P,net_flags(TRUE,TRUE)); }break; case M_STATISTIC_UPDATE_RESPOND: { if (SV_Client) SendTo (SV_Client->ID, P, net_flags(TRUE, TRUE)); }break; case M_PLAYER_FIRE: { if (game) game->OnPlayerFire(sender, P); }break; } VERIFY (verify_entities()); csPlayers.Leave (); return IPureServer::OnMessage(P, sender); }
void game_cl_Deathmatch::OnVoteStart(NET_Packet& P) { CStringTable st; inherited::OnVoteStart(P); string1024 Command = ""; string64 Player = ""; P.r_stringZ(Command); P.r_stringZ(Player); m_dwVoteEndTime = Level().timeServer() + P.r_u32(); if(m_game_ui) { string4096 CmdName = ""; string1024 NewCmd; xr_strcpy(NewCmd, Command); string1024 CmdParams[MAX_VOTE_PARAMS] = {"", "", "", "", ""}; sscanf (Command,"%s %s %s %s %s %s", CmdName, CmdParams[0], CmdParams[1], CmdParams[2], CmdParams[3], CmdParams[4]); if (!xr_strcmp(CmdName, "restart")) { xr_sprintf(NewCmd, "%s", *st.translate("mp_restart") ); } else if (!xr_strcmp(CmdName, "restart_fast")) { xr_sprintf(NewCmd, "%s", *st.translate("mp_restart_fast") ); } else if (!xr_strcmp(CmdName, "kick")) { xr_sprintf(NewCmd, "%s %s", *st.translate("mp_kick"), CmdParams[0] ); for (int i=1; i<MAX_VOTE_PARAMS; i++) { if (xr_strlen(CmdParams[i])) { xr_strcat(NewCmd, " "); xr_strcat(NewCmd, CmdParams[i]); } } } else if (!xr_strcmp(CmdName, "ban")) { xr_sprintf(NewCmd, "%s %s", *st.translate("mp_ban"), CmdParams[0] ); for (int i=1; i<MAX_VOTE_PARAMS; i++) { if (xr_strlen(CmdParams[i])) { xr_strcat(NewCmd, " "); xr_strcat(NewCmd, CmdParams[i]); } } } else if (!xr_strcmp(CmdName, "changemap")) { xr_sprintf(NewCmd, "%s %s", *st.translate("mp_change_map"), *st.translate(CmdParams[0]) ); } else if (!xr_strcmp(CmdName, "changeweather")) { xr_sprintf(NewCmd, "%s %s", *st.translate("mp_change_weather"), *st.translate(CmdParams[0]) ); } string1024 VoteStr; xr_sprintf(VoteStr, *st.translate("mp_voting_started"), NewCmd, Player); m_game_ui->SetVoteMessage(VoteStr); m_game_ui->SetVoteTimeResultMsg(""); if (!m_pVoteRespondWindow) m_pVoteRespondWindow = xr_new<CUIVote>(); m_pVoteRespondWindow->SetVoting(VoteStr); }; };