Exemplo n.º 1
0
    // ================================================================ //

    // 아이템 정보 패킷 취득 함수.
    public void OnReceiveItemPacket(int node, PacketId id, byte[] data)
    {
        ItemPacket packet = new ItemPacket(data);
        ItemData   item   = packet.GetPacket();

        // 서버 상태와 동기화.
        ItemState istate = new ItemState();

        istate.item_id = item.itemId;
        ItemController.State state = (ItemController.State)item.state;
        istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
        istate.owner = item.ownerId;
        if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id))
        {
            GlobalParam.getInstance().item_table.Remove(istate.item_id);
        }
        GlobalParam.getInstance().item_table.Add(istate.item_id, istate);

        string log = "[CLIENT] Receive itempacket [" +
                     "itemId:" + item.itemId +
                     " state:" + state.ToString() +
                     " ownerId:" + item.ownerId + "]";

        Debug.Log(log);
        dbwin.console().print(log);

        if (state == ItemController.State.Picked)
        {
            Debug.Log("Receive item pick.");
            dbwin.console().print("Receive item pick.");

            // 응답이 있는  쿼리를 탐색.
            QueryItemPick query_pick = QueryManager.get().findQuery <QueryItemPick>(x => x.target == item.itemId);

            bool remote_pick = true;

            if (query_pick != null)
            {
                string account_name = PartyControl.get().getLocalPlayer().getAcountID();
                if (item.ownerId == account_name)
                {
                    Debug.Log("Receive item pick local:" + item.ownerId);
                    dbwin.console().print("Receive item pick local:" + item.ownerId);

                    item_query_done(query_pick, true);
                    remote_pick = false;
                }
                else
                {
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    dbwin.console().print("Receive item pick remote:" + item.ownerId);

                    item_query_done(query_pick, false);
                }
            }

            if (remote_pick == true)
            {
                Debug.Log("Remote pick item:" + item.ownerId);
                dbwin.console().print("Remote pick item:" + item.ownerId);

                // 리모트 캐릭터가 가지게 한다.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // 아이템 획득 쿼리 발행.
                    QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
                    if (query != null)
                    {
                        item_query_done(query, true);
                    }
                }
            }

            // 아이템 획득 상태 변경.
            this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId);
        }
        else if (state == ItemController.State.Dropped)
        {
            Debug.Log("Receive item drop.");

            // 응답이 있는 쿼리를 검색.
            QueryItemDrop query_drop = QueryManager.get().findQuery <QueryItemDrop>(x => x.target == item.itemId);


            bool remote_drop = true;

            if (query_drop != null)
            {
                // 요청에 대한 응답이 있다.
                string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id;
                if (item.ownerId == account_name)
                {
                    // 자신이 획득.
                    Debug.Log("Receive item drop local:" + item.ownerId);
                    item_query_done(query_drop, true);
                    remote_drop = false;
                }
                else
                {
                    // 상대가 획득.
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    item_query_done(query_drop, false);
                }
            }

            if (remote_drop == true)
            {
                // 리모트 캐릭터가 획득.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // 아이템획득 쿼리 발행.
                    Debug.Log("QuetyitemDrop:cmdItemQueryDrop");
                    remote.cmdItemDrop(item.itemId, false);
                }
            }
        }
        else
        {
            Debug.Log("Receive item error.");
        }
    }
Exemplo n.º 2
0
    void    Update()
    {
        this.scene_timer += Time.deltaTime;
        this.disp_timer  -= Time.deltaTime;

        // ---------------------------------------------------------------- //
        // 다음 상태로 이동할지 체크합니다.

        switch (this.step.do_transition())
        {
        case STEP.GAME:
        {
        }
        break;
        }

        // ---------------------------------------------------------------- //
        // 상태가 전환될 때 초기화.

        while (this.step.get_next() != STEP.NONE)
        {
            switch (this.step.do_initialize())
            {
            case STEP.CHARACTER_CHANGE:
            {
                GlobalParam.get().account_name     = this.account_name_net;
                GlobalParam.get().skip_enter_event = true;

                Application.LoadLevel("GameScene 1");
            }
            break;

            case STEP.GAME:
            {
                this.account_name_local = GlobalParam.get().account_name;
                this.account_name_net   = GameRoot.getPartnerAcountName(this.account_name_local);

                if (this.owner == this.account_name_local)
                {
                    this.is_host = true;
                }
                else
                {
                    // 다른 플레이어의 마을에 갔을 때.
                    this.is_host = false;
                }

                // 플레이어를 만듭니다.
                this.local_player = CharacterRoot.get().createPlayerAsLocal(this.account_name_local);

                this.local_player.cmdSetPosition(Vector3.zero);

                if (GlobalParam.get().is_in_my_home == GlobalParam.get().is_remote_in_my_home)
                {
                    this.net_player = CharacterRoot.get().createPlayerAsNet(this.account_name_net);

                    this.net_player.cmdSetPosition(Vector3.left * 1.0f);
                }

                // 레벨 데이터(level_data.txt)를 읽고 NPC/아이템을 배치합니다.
                MapCreator.get().loadLevel(this.account_name_local, this.account_name_net, !this.is_host);

                SoundManager.get().playBGM(Sound.ID.TFT_BGM01);

                //

                if (!GlobalParam.get().skip_enter_event)
                {
                    EnterEvent enter_event = EventRoot.get().startEvent <EnterEvent>();

                    if (enter_event != null)
                    {
                        enter_event.setPrincipal(this.local_player.behavior as chrBehaviorPlayer);
                        enter_event.setIsLocalPlayer(true);
                    }
                }

                foreach (ItemManager.ItemState istate in GlobalParam.get().item_table.Values)
                {
                    if (istate.state == ItemController.State.Picked)
                    {
                        // 이미 아이템을 획득했다면 가져갈 수 있게 합니다.
                        ItemManager.get().finishGrowingItem(istate.item_id);
                        chrController controll = CharacterRoot.getInstance().findPlayer(istate.owner);
                        if (controll != null)
                        {
                            QueryItemPick query = controll.cmdItemQueryPick(istate.item_id, false, true);
                            if (query != null)
                            {
                                query.is_anon = true;
                                query.set_done(true);
                                query.set_success(true);
                            }
                        }
                    }
                }
            }
            break;

            // 다른 플레이어가 찾아왔습니다.
            case STEP.WELCOME:
            {
                if (this.net_player == null)
                {
                    EnterEvent enter_event = EventRoot.get().startEvent <EnterEvent>();

                    if (enter_event != null)
                    {
                        this.net_player = CharacterRoot.getInstance().createPlayerAsNet(this.account_name_net);

                        this.net_player.cmdSetPosition(Vector3.left);

                        enter_event.setPrincipal(this.net_player.behavior as chrBehaviorPlayer);
                        enter_event.setIsLocalPlayer(false);
                    }
                }
            }
            break;

            // 다른 플레이어가 돌아갑니다.
            case STEP.BYEBYE:
            {
                if (this.net_player != null)
                {
                    LeaveEvent leave_event = EventRoot.get().startEvent <LeaveEvent>();

                    if (leave_event != null)
                    {
                        leave_event.setPrincipal(this.net_player.behavior as chrBehaviorPlayer);
                        leave_event.setIsLocalPlayer(false);
                    }
                }
            }
            break;

            case STEP.VISIT:
            {
                GlobalParam.get().is_in_my_home = false;
                Application.LoadLevel("GameScene 1");
            }
            break;

            case STEP.GO_HOME:
            {
                // 자기 마을로 돌아옵니다.
                GlobalParam.get().is_in_my_home = true;
                Application.LoadLevel("GameScene 1");
            }
            break;

            case STEP.TO_TITLE:
            {
                Application.LoadLevel("TitleScene");
            }
            break;
            }
        }

        // ---------------------------------------------------------------- //
        // 각 상태에서의 실행 처리.

        switch (this.step.do_execution(Time.deltaTime))
        {
        case STEP.GAME:
        {
        }
        break;
        }

        // ---------------------------------------------------------------- //
        // 통신에 의한 이벤트 처리.

        // Network 클래스의 컴포넌트 획득.
        GameObject go      = GameObject.Find("Network");
        Network    network = go.GetComponent <Network>();

        if (network != null)
        {
            if (network.IsCommunicating() == true)
            {
                if (request_connet_event)
                {
                    // 접속 이벤트를 발동합니다.
                    GlobalParam.get().is_connected = true;
                    request_connet_event = false;
                }
                else if (GlobalParam.get().is_connected == false)
                {
                    // 접속했습니다.
                    Debug.Log("Guest connected.");
                    request_connet_event = true;
                    disp_timer           = 5.0f;
                }
            }
        }

        // 접속 종료 이벤트를 발동합니다.
        if (request_disconnet_event)
        {
            GlobalParam.get().is_disconnected = true;
            request_disconnet_event = false;
            // 접속 종료 시 이벤트.
            disconnect_event();
        }

        // ---------------------------------------------------------------- //

        if (Input.GetKeyDown(KeyCode.Z))
        {
            dbwin.console().print("로그 테스트 " + this.log_test_count);
            this.log_test_count++;
        }
    }
Exemplo n.º 3
0
    // 아이템 정보 패킷 획득 함수.
    public void OnReceiveItemPacket(PacketId id, byte[] data)
    {
        ItemPacket packet = new ItemPacket(data);
        ItemData   item   = packet.GetPacket();

        // 서버의 상태와 동기화합니다.
        ItemState istate = new ItemState();

        istate.item_id = item.itemId;
        ItemController.State state = (ItemController.State)item.state;
        istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
        istate.owner = item.ownerId;
        if (GlobalParam.get().item_table.ContainsKey(item.itemId))
        {
            GlobalParam.get().item_table.Remove(istate.item_id);
        }
        GlobalParam.get().item_table.Add(istate.item_id, istate);

        string log = "[CLIENT] Receive itempacket. " +
                     "itemId:" + item.itemId +
                     " state:" + state.ToString() +
                     " ownerId:" + item.ownerId;

        Debug.Log(log);

        if (state == ItemController.State.Picked)
        {
            Debug.Log("Receive item pick.");

            // 응답이 있는 쿼리를 검색.
            QueryItemPick query_pick = null;
            foreach (var query in this.queries)
            {
                QueryItemPick pick = query as QueryItemPick;
                if (pick != null && pick.target == item.itemId)
                {
                    query_pick = pick;
                    break;
                }
            }

            bool remote_pick = true;

            if (query_pick != null)
            {
                if (item.ownerId == GlobalParam.get().account_name)
                {
                    Debug.Log("Receive item pick local:" + item.ownerId);
                    item_query_done(query_pick, true);
                    remote_pick = false;
                }
                else
                {
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    item_query_done(query_pick, false);
                }
            }

            if (remote_pick == true)
            {
                // 리모트 캐릭터가 취득하게 합니다.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // 아이템 획득 쿼리 발행.
                    QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
                    if (query != null)
                    {
                        item_query_done(query, true);
                    }
                }
            }
        }
        else if (state == ItemController.State.Dropped)
        {
            Debug.Log("Receive item drop.");

            // 응답이 있는 쿼리를 검색.
            QueryItemDrop query_drop = null;
            foreach (var query in this.queries)
            {
                QueryItemDrop drop = query as QueryItemDrop;
                if (drop != null && drop.target == item.itemId)
                {
                    query_drop = drop;
                    break;
                }
            }

            bool remote_drop = true;

            if (query_drop != null)
            {
                // 요청에 대한 응답이 있을 때.
                if (item.ownerId == GlobalParam.get().account_name)
                {
                    // 자신이 획득.
                    Debug.Log("Receive item drop local:" + item.ownerId);
                    item_query_done(query_drop, true);
                    remote_drop = false;
                }
                else
                {
                    // 상대가 획득.
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    item_query_done(query_drop, false);
                }
            }

            if (remote_drop == true)
            {
                // 리모트 캐릭터가 회득하게 합니다.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // 아이템 획득 쿼리 발행.
                    Debug.Log("QuetyitemDrop:cmdItemQueryDrop");
                    QueryItemDrop query = remote.cmdItemQueryDrop(false);
                    if (query != null)
                    {
                        query.is_drop_done = true;
                        item_query_done(query, true);
                    }
                }
            }
        }
        else
        {
            Debug.Log("Receive item error.");
        }
    }
Exemplo n.º 4
0
    // ================================================================ //

    // ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔.
    public void OnReceiveItemPacket(int node, PacketId id, byte[] data)
    {
        ItemPacket packet = new ItemPacket(data);
        ItemData   item   = packet.GetPacket();

        // ?쒕쾭 ?곹깭?€ ?숆린??
        ItemState istate = new ItemState();

        istate.item_id = item.itemId;
        ItemController.State state = (ItemController.State)item.state;
        istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state;
        istate.owner = item.ownerId;
        if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id))
        {
            GlobalParam.getInstance().item_table.Remove(istate.item_id);
        }
        GlobalParam.getInstance().item_table.Add(istate.item_id, istate);

        string log = "[CLIENT] Receive itempacket [" +
                     "itemId:" + item.itemId +
                     " state:" + state.ToString() +
                     " ownerId:" + item.ownerId + "]";

        Debug.Log(log);
        dbwin.console().print(log);

        if (state == ItemController.State.Picked)
        {
            Debug.Log("Receive item pick.");
            dbwin.console().print("Receive item pick.");

            // ?묐떟???덈뒗  荑쇰━瑜??먯깋.
            QueryItemPick query_pick = QueryManager.get().findQuery <QueryItemPick>(x => x.target == item.itemId);

            bool remote_pick = true;

            if (query_pick != null)
            {
                string account_name = PartyControl.get().getLocalPlayer().getAcountID();
                if (item.ownerId == account_name)
                {
                    Debug.Log("Receive item pick local:" + item.ownerId);
                    dbwin.console().print("Receive item pick local:" + item.ownerId);

                    item_query_done(query_pick, true);
                    remote_pick = false;
                }
                else
                {
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    dbwin.console().print("Receive item pick remote:" + item.ownerId);

                    item_query_done(query_pick, false);
                }
            }

            if (remote_pick == true)
            {
                Debug.Log("Remote pick item:" + item.ownerId);
                dbwin.console().print("Remote pick item:" + item.ownerId);

                // 由щえ??罹먮┃?곌? 媛€吏€寃??쒕떎.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // ?꾩씠???띾뱷 荑쇰━ 諛쒗뻾.
                    QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true);
                    if (query != null)
                    {
                        item_query_done(query, true);
                    }
                }
            }

            // ?꾩씠???띾뱷 ?곹깭 蹂€寃?
            this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId);
        }
        else if (state == ItemController.State.Dropped)
        {
            Debug.Log("Receive item drop.");

            // ?묐떟???덈뒗 荑쇰━瑜?寃€??
            QueryItemDrop query_drop = QueryManager.get().findQuery <QueryItemDrop>(x => x.target == item.itemId);


            bool remote_drop = true;

            if (query_drop != null)
            {
                // ?붿껌???€???묐떟???덈떎.
                string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id;
                if (item.ownerId == account_name)
                {
                    // ?먯떊???띾뱷.
                    Debug.Log("Receive item drop local:" + item.ownerId);
                    item_query_done(query_drop, true);
                    remote_drop = false;
                }
                else
                {
                    // ?곷?媛€ ?띾뱷.
                    Debug.Log("Receive item pick remote:" + item.ownerId);
                    item_query_done(query_drop, false);
                }
            }

            if (remote_drop == true)
            {
                // 由щえ??罹먮┃?곌? ?띾뱷.
                chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId);
                if (remote)
                {
                    // ?꾩씠?쒗쉷??荑쇰━ 諛쒗뻾.
                    Debug.Log("QuetyitemDrop:cmdItemQueryDrop");
                    remote.cmdItemDrop(item.itemId, false);
                }
            }
        }
        else
        {
            Debug.Log("Receive item error.");
        }
    }