Exemple #1
0
        //
        public bool Deserialize(ref GameSyncInfo element)
        {
            if (GetDataSize() == 0)
            {
                // 데이터가 설정되지 않았다.
                return(false);
            }

            bool ret = true;

            // 동기화할 난수의 시드.
            ret &= Deserialize(ref element.seed);

            // 동기화할 장비 정보.
            element.items = new CharEquipment[NetConfig.PLAYER_MAX];
            for (int i = 0; i < NetConfig.PLAYER_MAX; ++i)
            {
                // 캐릭터의 글로벌 ID.
                ret &= Deserialize(ref element.items[i].globalId);
                // 캐릭터의 글로벌 ID.
                ret &= Deserialize(ref element.items[i].shotType);
            }

            return(ret);
        }
    // ---------------------------------------------------------------- //
    // 패킷 수신 함수].

    // 동기 대기 패킷 수신.
    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);
            }
        }
    }
Exemple #4
0
    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;
        }
    }
        //
        public bool Serialize(GameSyncInfo packet)
        {
            bool ret = true;

            // 동기화할 난수의 시드.
            ret &= Serialize(packet.seed);

            // 동기화할 정보.
            for (int i = 0; i < NetConfig.PLAYER_MAX; ++i)
            {
                // 캐릭터의 글로벌 ID.
                ret &= Serialize(packet.members[i].globalId);
            }

            return(ret);
        }
Exemple #6
0
    // ================================================================ //

    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);
        }
    }
Exemple #7
0
        //
        public bool Serialize(GameSyncInfo packet)
        {
            bool ret = true;

            // 동기화할 난수의 시드.
            ret &= Serialize(packet.seed);

            // 동기화할 장비 정보.
            for (int i = 0; i < 4; ++i)
            {
                // 캐릭터의 글로벌 ID.
                ret &= Serialize(packet.items[i].globalId);
                //
                ret &= Serialize(packet.items[i].itemId, CharEquipment.itemNameLength);
            }

            return(ret);
        }
Exemple #8
0
        //
        public bool Deserialize(ref GameSyncInfo element)
        {
            if (GetDataSize() == 0)
            {
                // 데이터가 설정되어 있지 않습니다.
                return(false);
            }

            bool ret = true;

            // 동기할 난수의 시드.
            ret &= Deserialize(ref element.seed);

            // 동기화할 장비 정보.
            for (int i = 0; i < 4; ++i)
            {
                // 캐릭터의 글로벌 ID.
                ret &= Deserialize(ref element.items[i].globalId);
                // 캐릭터의 글로벌 ID.
                ret &= Deserialize(ref element.items[i].itemId, CharEquipment.itemNameLength);
            }

            return(ret);
        }
Exemple #9
0
	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;
		}
	}