// ================================================================ // // 아이템 정보 패킷 취득 함수. 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."); } }
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++; } }
// 아이템 정보 패킷 획득 함수. 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."); } }
// ================================================================ // // ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔. 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."); } }