// ---------------------------------------------------------------- // // 패킷 수신 함수]. // 동기 대기 패킷 수신. public void OnReceiveSyncPacket(int node, PacketId id, byte[] data) { Debug.Log("[CLIENT]OnReceiveSyncPacket"); GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo sync = packet.GetPacket(); GlobalParam.get().seed = sync.seed; // 초기 장비를 보존한다. for (int i = 0; i < sync.items.Length; ++i) { CharEquipment equip = sync.items[i]; GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType; this.select_done_players[equip.globalId] = true; Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType); } // 응답이 있는 쿼리를 검색. string account_id = this.player.control.getAccountID(); QuerySelectFinish query = QueryManager.get().findQuery <QuerySelectFinish>(x => x.account_id == account_id); if (query != null) { Debug.Log("[CLIENT]QuerySelectDone done"); query.set_done(true); query.set_success(true); } Debug.Log("[CLIENT]Recv seed:" + sync.seed); }
// ================================================================ // public void OnReceiveGameSyncPacket(int node, PacketId id, byte[] data) { GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo info = packet.GetPacket(); Debug.Log("[SERVER] Receive Init packet"); // 게임서버에서 난수 동기화 작업 TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); double seconds = ts.TotalSeconds; info.seed = (int)((long)seconds - (long)(seconds / 1000.0) * 1000); Debug.Log("Seed: " + info.seed); // 세션 관리 정보와 플레이어 글로벌 ID를 연결 info.members = new CharacterID[NetConfig.PLAYER_MAX]; for (int i = 0; i < NetConfig.PLAYER_MAX; i++) { info.members[i].globalId = i; if (!m_nodes.ContainsKey(node)) { m_nodes.Add(node, info.members[i].globalId); } } }
private void checkInitidalEquipment() { if (m_syncFlag == false) { return; } int equipFlag = 0; foreach (int index in m_equips.Keys) { equipFlag |= 1 << index; } // 수신한 패킷 데이터로부터 캐릭터 ID와 장비의 수신을 체크. equipFlag &= m_currentPartyMask; if (equipFlag == m_currentPartyMask) { // 전원의 무기 선택 정보가 모였으므로 던전 돌입. GameSyncInfo sync = new GameSyncInfo(); // 게임 서버의 난수로 시드를 결정한다. TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); double seconds = ts.TotalSeconds; sync.seed = (int)((long)seconds - (long)(seconds / 1000.0) * 1000); Debug.Log("Seed: " + sync.seed); // 장비 정보를 저장. sync.items = new CharEquipment[NetConfig.PLAYER_MAX]; for (int i = 0; i < NetConfig.PLAYER_MAX; ++i) { sync.items[i].globalId = i; if (m_equips.ContainsKey(i)) { sync.items[i].shotType = m_equips[i]; } else { sync.items[i].shotType = 0; } } if (network_ != null) { // 각 단말에 알림. GameSyncPacket syncPacket = new GameSyncPacket(sync); network_.SendReliableToAll <GameSyncInfo>(syncPacket); } // 매칭 서버를 사용하지 않을 때의 테스트용으로 초기 장비 정보를 클리어해 둔다. m_equips.Clear(); Debug.Log("[SERVER] Clear equipment info."); m_syncFlag = false; } }
// ================================================================ // private void SendGameSyncInfo() { Debug.Log("[CLIENT]SendGameSyncInfo"); GameSyncInfo data = new GameSyncInfo(); data.seed = 0; data.items = new CharEquipment[NetConfig.PLAYER_MAX]; GameSyncPacket packet = new GameSyncPacket(data); if (m_network != null) { int serverNode = m_network.GetServerNode(); m_network.SendReliable <GameSyncInfo>(serverNode, packet); } }
// ================================================================ // public void OnReceiveGameSyncPacket(int node, PacketId id, byte[] data) { GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo info = packet.GetPacket(); Debug.Log("[SERVER] Receive Init packet"); // 게임서버에서 난수 동기화 작업 TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); double seconds = ts.TotalSeconds; info.seed = (int)((long)seconds - (long)(seconds / 1000.0) * 1000); Debug.Log("Seed: " + info.seed); // 세션 관리 정보와 플레이어 글로벌 ID를 연결 info.members = new CharacterID[NetConfig.PLAYER_MAX]; for(int i = 0; i < NetConfig.PLAYER_MAX; i++) { info.members[i].globalId = i; if (!m_nodes.ContainsKey(node)) { m_nodes.Add(node, info.members[i].globalId); } } }
// ---------------------------------------------------------------- // // 패킷 수신 함수]. // 동기 대기 패킷 수신. public void OnReceiveSyncPacket(int node, PacketId id, byte[] data) { Debug.Log("[CLIENT]OnReceiveSyncPacket"); GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo sync = packet.GetPacket(); GlobalParam.get().seed = sync.seed; // 초기 장비를 보존한다. for (int i = 0; i < sync.items.Length; ++i) { CharEquipment equip = sync.items[i]; GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType; this.select_done_players[equip.globalId] = true; Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType); } // 응답이 있는 쿼리를 검색. string account_id = this.player.control.getAccountID(); QuerySelectFinish query = QueryManager.get().findQuery<QuerySelectFinish>(x => x.account_id == account_id); if (query != null) { Debug.Log("[CLIENT]QuerySelectDone done"); query.set_done(true); query.set_success(true); } Debug.Log("[CLIENT]Recv seed:" + sync.seed); }
private void checkInitidalEquipment() { if (m_syncFlag == false) { return; } int equipFlag = 0; foreach (int index in m_equips.Keys) { equipFlag |= 1 << index; } // 수신한 패킷 데이터로부터 캐릭터 ID와 장비의 수신을 체크. equipFlag &= m_currentPartyMask; if (equipFlag == m_currentPartyMask) { // 전원의 무기 선택 정보가 모였으므로 던전 돌입. GameSyncInfo sync = new GameSyncInfo(); // 게임 서버의 난수로 시드를 결정한다. TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); double seconds = ts.TotalSeconds; sync.seed = (int) ((long)seconds - (long)(seconds/1000.0)*1000); Debug.Log("Seed: " + sync.seed); // 장비 정보를 저장. sync.items = new CharEquipment[NetConfig.PLAYER_MAX]; for (int i = 0; i < NetConfig.PLAYER_MAX; ++i) { sync.items[i].globalId = i; if (m_equips.ContainsKey(i)) { sync.items[i].shotType = m_equips[i]; } else { sync.items[i].shotType = 0; } } if (network_ != null) { // 각 단말에 알림. GameSyncPacket syncPacket = new GameSyncPacket(sync); network_.SendReliableToAll<GameSyncInfo>(syncPacket); } // 매칭 서버를 사용하지 않을 때의 테스트용으로 초기 장비 정보를 클리어해 둔다. m_equips.Clear(); Debug.Log("[SERVER] Clear equipment info."); m_syncFlag = false; } }