public void enqueue_network_message(CPacket buffer)
 {
     lock (this.cs_event)
     {
         this.network_message_events.Enqueue(buffer);
     }
 }
Beispiel #2
0
 public void on_receive_from_client(CPacket msg)
 {
     msg.record_size();
     CPacket clone = CPacket.create(msg.protocol_id);
     clone.overwrite(msg.buffer, 0);
     clone.pop_int16();		// LocalServer환경에서는 size값이 필요 없으므로 2바이트를 버린다.
     this.game_room.on_receive(this.players[0], clone);
 }
Beispiel #3
0
 /// <summary>
 /// 메시지를 수신했을 때 호출된다.
 /// 파라미터로 넘어온 버퍼는 워커 스레드에서 재사용 되므로 복사한 뒤 어플리케이션으로 넘겨준다.
 /// </summary>
 /// <param name="buffer"></param>
 void IPeer.on_message(Const<byte[]> buffer)
 {
     // 버퍼를 복사한 뒤 CPacket클래스로 감싼 뒤 넘겨준다.
     // CPacket클래스 내부에서는 참조로만 들고 있는다.
     byte[] app_buffer = new byte[buffer.Value.Length];
     Array.Copy(buffer.Value, app_buffer, buffer.Value.Length);
     CPacket msg = new CPacket(app_buffer, this);
     (this.freenet_eventmanager.Target as CFreeNetEventManager).enqueue_network_message(msg);
 }
Beispiel #4
0
    public static CPacket pre_send(CPacket msg)
    {
        msg.record_size();

        CPacket clone = CPacket.create(msg.protocol_id);
        clone.overwrite(msg.buffer, 0);
        clone.pop_int16();		// LocalServer환경에서는 size값이 필요 없으므로 2바이트를 버린다.

        return clone;
    }
 public void send(CPacket msg)
 {
     try
     {
         this.gameserver.send(msg);
         CPacket.destroy(msg);
     }
     catch (Exception e)
     {
         Debug.LogError(e.Message);
     }
 }
Beispiel #6
0
    void ON_BEGIN_CARD_INFO(CPacket msg)
    {
        Queue<CCard> floor_cards = new Queue<CCard>();
        this.player_index = msg.pop_byte();
        // floor cards.
        byte floor_count = msg.pop_byte();
        for (byte i = 0; i < floor_count; ++i)
        {
            byte number = msg.pop_byte();
            PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
            byte position = msg.pop_byte();

            CCard card = new CCard(number, pae_type, position);
            floor_cards.Enqueue(card);
            this.floor_card_manager.puton_card(card);
        }

        byte player_count = msg.pop_byte();
        for (byte player = 0; player < player_count; ++player)
        {
            Queue<CCard> cards = new Queue<CCard>();
            byte player_index = msg.pop_byte();
            byte card_count = msg.pop_byte();
            for (byte i = 0; i < card_count; ++i)
            {
                byte number = msg.pop_byte();
                PAE_TYPE pae_type = PAE_TYPE.KWANG;
                byte position = byte.MaxValue;
                if (number != byte.MaxValue)
                {
                    pae_type = (PAE_TYPE)msg.pop_byte();
                    position = msg.pop_byte();

                    // AI플레이어 본인 것만 담는다.
                    CCard card = new CCard(number, pae_type, position);
                    this.hand_cards.Add(card);
                }
            }
        }

        CPacket finished_msg = CPacket.create((short)PROTOCOL.DISTRIBUTED_ALL_CARDS);
        this.local_server.on_receive_from_ai(finished_msg);
    }
Beispiel #7
0
    void on_message(CPacket msg)
    {
        PROTOCOL protocol_id = (PROTOCOL)msg.pop_protocol_id();

        Debug.Log($"Response : {protocol_id}");

        switch (protocol_id)
        {
        case PROTOCOL.ERROR:
        {
            var error     = msg.pop_int32();
            var errorCode = (ERROR)error;
            OnNetworkCallback(null, errorCode);
            break;
        }

        case PROTOCOL.ENTER_GAME_ROOM_RES:
        {
            var userId   = msg.pop_int32();
            var userData = new UserData();
            userData.userId = userId;
            OnReceiveConnectedOtherUser?.Invoke(userData, ERROR.NONE);
            break;
        }

        case PROTOCOL.CHAT_MSG_ACK:
        {
            int    userId = msg.pop_int32();
            string text   = msg.pop_string();
            var    res    = new ChatData();
            res.userId  = userId;
            res.message = text;
            OnReceiveChatInfoCallback(res, ERROR.NONE);
            break;
        }

        case PROTOCOL.GET_MY_PLAYER_RES:
        {
            PlayerData data = CreatePlayerData(msg);

            OnNetworkCallback(data, ERROR.NONE);
            break;
        }

        case PROTOCOL.DISCONECTED_PLAYER_RES:
        {
            PlayerData data = new PlayerData();
            data.userId = msg.pop_int32();

            OnDisconnectedPlayer(data, ERROR.NONE);
            break;
        }

        case PROTOCOL.PLAYER_MOVE_RES:
        {
            PlayerData data = CreatePlayerData(msg);

            if (GameManager.Inst.UserId == data.userId)
            {
                OnMovePlayer(data, ERROR.NONE);
            }
            else
            {
                OnReceiveMoveOtherPlayer?.Invoke(data, ERROR.NONE);
            }
            break;
        }

        case PROTOCOL.ADD_NEAR_PLAYER_RES:
        {
            PlayerData data = CreatePlayerData(msg);

            OnReceivedAddNearPlayer?.Invoke(data, ERROR.NONE);

            GameManager.Inst.PrintSystemLog($"{data.userId}님이 범위내에 들어왔습니다.");
            break;
        }

        case PROTOCOL.REMOVE_NEAR_PLAYER_RES:
        {
            PlayerData data = CreatePlayerData(msg);

            OnReceivedRemoveNearPlayer?.Invoke(data, ERROR.NONE);

            GameManager.Inst.PrintSystemLog($"{data.userId}님이 범위내에서 사라졌습니다.");
            break;
        }
        }
    }
Beispiel #8
0
    void add_choice_card_info_to(CPacket msg)
    {
        List<CCard> target_cards = this.engine.target_cards_to_choice;
        byte count = (byte)target_cards.Count;
        msg.push(count);

        for (int i = 0; i < count; ++i)
        {
            CCard card = target_cards[i];
            msg.push(card.number);
            msg.push((byte)card.pae_type);
            msg.push(card.position);
        }
    }
    public static void ROOM_EXIT_REQ_SEND()
    {
        CPacket msg = CPacket.create((short)PROTOCOL.ROOM_EXIT_REQ);

        network_manager.send(msg);
    }
Beispiel #10
0
        public void PickUp(Character pChar, int dwDropId, short pX, short pY, bool bByPet = false)
        {
            var pDrop = this[dwDropId];

            if (pDrop is null)
            {
                return;
            }

            switch (pDrop.DropOwnType)
            {
            case DropOwnType.PartyOwn when pChar.Party?.PartyID != pDrop.DropOwnerID:
            case DropOwnType.UserOwn when pChar.dwId != pDrop.DropOwnerID:
                pChar.SendMessage("Trying to pick up a drop that doesn't belong to you.");
                return;
            }

            if (pDrop.Item != null)
            {
                if (InventoryManipulator.CountFreeSlots(pChar, ItemConstants.GetInventoryType(pDrop.Item.nItemID)) <= 0)
                {
                    return;
                }
            }

            if (bByPet)
            {
                if (Constants.MULTIPET_ACTIVATED)
                {
                    throw new NotImplementedException();                     // since we arent checking multiple pet equip slots
                }

                if (pDrop.bIsMoney == 1)
                {
                    if (InventoryManipulator.GetItem(pChar, BodyPart.BP_PETABIL_MESO, true) is null)
                    {
                        return;
                    }
                }
                else
                {
                    if (InventoryManipulator.GetItem(pChar, BodyPart.BP_PETABIL_ITEM, true) is null)
                    {
                        return;
                    }
                }

                pDrop.nLeaveType = DropLeaveType.PetPickup;
            }
            else
            {
                pDrop.nLeaveType = DropLeaveType.UserPickup;
            }

            pDrop.OwnerCharId = pChar.dwId;

            if (pDrop.bIsMoney > 0)
            {
                pChar.Modify.GainMeso(pDrop.nMesoVal);
            }
            else
            {
                if (pDrop.Item.Template is CashItemTemplate itemDataTemplate)
                {
                    if (itemDataTemplate.Max > 0 &&
                        InventoryManipulator.ContainsItem(pChar, pDrop.ItemId, (short)itemDataTemplate.Max))
                    {
                        pChar.SendMessage("Can't hold anymore of this item..");
                        return;
                    }
                }

                if (!Field.TryDropPickup(pChar, pDrop))
                {
                    return;
                }

                pChar.SendPacket(CPacket.DropPickUpMessage_Item(pDrop.ItemId, pDrop.Item.nNumber, false));

                if (pDrop.Item.Template.PickupMessage.Length > 0)
                {
                    pChar.SendMessage(pDrop.Item.Template.PickupMessage);
                }
            }

            Remove(dwDropId);
        }
Beispiel #11
0
    void add_turn_result_to(CPacket msg, byte current_turn_player_index)
    {
        // 점수 정보.
        msg.push(this.players[current_turn_player_index].agent.score);

        // 기타 정보.
        msg.push(this.players[current_turn_player_index].agent.remain_bomb_count);

        // 카드 이벤트 정보.
        byte count = (byte)this.engine.flipped_card_event_type.Count;
        msg.push(count);
        for (byte i = 0; i < count; ++i)
        {
            msg.push((byte)this.engine.flipped_card_event_type[i]);
        }
    }
 public void SendCode(CPacket _packet)
 {
     Console.WriteLine(this + " SendCode _packet:{0}", _packet);
     this.token.SendCode(_packet);
 }
 public void send(CPacket msg)
 {
     this.owner.send(msg);
 }
Beispiel #14
0
 void IPeer.process_user_operation(CPacket msg)
 {
 }
Beispiel #15
0
 void IPeer.send(CPacket msg)
 {
     this.token.send(msg);
 }
Beispiel #16
0
 void send(CPacket msg)
 {
     CPacket clone = CLocalServer.pre_send(msg);
     CPacket.destroy(msg);
     this.appcallback_on_message(clone);
 }
Beispiel #17
0
 void add_flip_result_to(CPacket msg)
 {
     // 덱에서 뒤집은 카드 정보.
     msg.push(this.engine.card_from_deck.number);
     msg.push((byte)this.engine.card_from_deck.pae_type);
     msg.push(this.engine.card_from_deck.position);
     msg.push(this.engine.same_card_count_with_deck);
 }
Beispiel #18
0
    void add_others_card_result_to(CPacket msg)
    {
        msg.push((byte)this.engine.other_cards_to_player.Count);

        foreach (KeyValuePair<byte, List<CCard>> kvp in this.engine.other_cards_to_player)
        {
            msg.push(kvp.Key);

            byte count = (byte)this.engine.other_cards_to_player[kvp.Key].Count;
            msg.push(count);
            for (byte card_index = 0; card_index < count; ++card_index)
            {
                CCard card = this.engine.other_cards_to_player[kvp.Key][card_index];
                msg.push(card.number);
                msg.push((byte)card.pae_type);
                msg.push(card.position);
            }
        }
    }
Beispiel #19
0
 void add_player_get_cards_info_to(CPacket msg)
 {
     // 플레이어가 가져갈 카드 정보.
     byte count_to_player = (byte)this.engine.cards_to_give_player.Count;
     msg.push(count_to_player);
     for (byte card_index = 0; card_index < count_to_player; ++card_index)
     {
         CCard card = this.engine.cards_to_give_player[card_index];
         msg.push(card.number);
         msg.push((byte)card.pae_type);
         msg.push(card.position);
     }
 }
Beispiel #20
0
    //--------------------------------------------------------
    // Handler.
    //--------------------------------------------------------
    public void on_receive(CPlayer owner, CPacket msg)
    {
        PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();
        if (is_received(owner.player_index, protocol))
        {
            //error!! already exist!!
            return;
        }

        checked_protocol(owner.player_index, protocol);

        //UnityEngine.Debug.Log("protocol " + protocol);
        switch (protocol)
        {
            case PROTOCOL.READY_TO_START:
                on_ready_req();
                break;

            case PROTOCOL.DISTRIBUTED_ALL_CARDS:
                {
                    if (all_received(protocol))
                    {
                        CPacket turn_msg = CPacket.create((short)PROTOCOL.START_TURN);
                        turn_msg.push((byte)0);
                        this.players[this.engine.current_player_index].send(turn_msg);
                    }
                }
                break;

            case PROTOCOL.SELECT_CARD_REQ:
                {
                    byte number = msg.pop_byte();
                    PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
                    byte position = msg.pop_byte();
                    byte slot_index = msg.pop_byte();
                    byte is_shaking = msg.pop_byte();
                    //UnityEngine.Debug.Log("server. " + slot_index);
                    on_player_put_card(
                        owner.player_index,
                        number, pae_type, position, slot_index,
                        is_shaking);
                }
                break;

            case PROTOCOL.CHOOSE_CARD:
                {
                    clear_received_protocol();

                    PLAYER_SELECT_CARD_RESULT client_result = (PLAYER_SELECT_CARD_RESULT)msg.pop_byte();
                    byte choice_index = msg.pop_byte();
                    PLAYER_SELECT_CARD_RESULT server_result =
                        this.engine.on_choose_card(owner.player_index, client_result, choice_index);
                    if (server_result == PLAYER_SELECT_CARD_RESULT.CHOICE_ONE_CARD_FROM_PLAYER)
                    {
                        PLAYER_SELECT_CARD_RESULT choose_result =
                            this.engine.flip_process(owner.player_index,
                            TURN_RESULT_TYPE.RESULT_OF_NORMAL_CARD);
                        send_flip_result(choose_result, this.engine.current_player_index);
                    }
                    else
                    {
                        send_turn_result(this.engine.current_player_index);
                    }
                    //send_turn_result(this.engine.current_player_index, this.engine.selected_slot_index);
                }
                break;

            case PROTOCOL.FLIP_BOMB_CARD_REQ:
                {
                    clear_received_protocol();

                    if (this.engine.current_player_index != owner.player_index)
                    {
                        break;
                    }

                    if (!owner.agent.decrease_bomb_count())
                    {
                        // error!
                        UnityEngine.Debug.Log(string.Format("Invalid bomb count!! player {0}", owner.player_index));
                        break;
                    }

                    PLAYER_SELECT_CARD_RESULT choose_result = this.engine.flip_process(owner.player_index, TURN_RESULT_TYPE.RESULT_OF_BOMB_CARD);
                    send_flip_result(choose_result, this.engine.current_player_index);
                }
                break;

            case PROTOCOL.FLIP_DECK_CARD_REQ:
                {
                    clear_received_protocol();

                    PLAYER_SELECT_CARD_RESULT result =
                        this.engine.flip_process(this.engine.current_player_index,
                        TURN_RESULT_TYPE.RESULT_OF_NORMAL_CARD);
                    send_flip_result(result, this.engine.current_player_index);
                }
                break;

            case PROTOCOL.TURN_END:
                {
                    if (!all_received(PROTOCOL.TURN_END))
                    {
                        break;
                    }

                    if (this.engine.has_kookjin(this.engine.current_player_index))
                    {
                        CPacket ask_msg = CPacket.create((short)PROTOCOL.ASK_KOOKJIN_TO_PEE);
                        this.players[this.engine.current_player_index].send(ask_msg);
                    }
                    else
                    {
                        check_game_finish();
                    }
                }
                break;

            case PROTOCOL.ANSWER_KOOKJIN_TO_PEE:
                {
                    clear_received_protocol();
                    owner.agent.kookjin_selected();
                    byte answer = msg.pop_byte();
                    if (answer == 1)
                    {
                        // 국진을 쌍피로 이동.
                        owner.agent.move_kookjin_to_pee();
                        send_player_statistics(owner.player_index);
                        broadcast_move_kookjin(owner.player_index);
                    }

                    check_game_finish();
                }
                break;

            case PROTOCOL.ANSWER_GO_OR_STOP:
                {
                    clear_received_protocol();
                    // answer가 1이면 GO, 0이면 STOP.
                    byte answer = msg.pop_byte();
                    if (answer == 1)
                    {
                        owner.agent.plus_go_count();
                        broadcast_go_count(owner);
                        next_turn();
                    }
                    else
                    {
                        broadcast_game_result();
                    }
                }
                break;
        }
    }
 void on_message(CPacket msg)
 {
     this.message_receiver.SendMessage("on_recv", msg);
 }
Beispiel #22
0
        /* 패킷 태스트 코드
         * public static void Process_Packet(CPacket packet)
         * {
         *  var protocol = (PROTOCOL)packet.pop_protocol_id();
         *
         *  Console.WriteLine("protocol :" + protocol.ToString());
         *  switch (protocol)
         *  {
         *      case PROTOCOL.SEND_ROOMLIST:
         *          {
         *              var List = Utility.RoomListToDictionary(packet);
         *
         *              foreach (KeyValuePair<string, GameRoom> keyValue in List)
         *              {
         *                  Console.WriteLine(keyValue.Value.RoomTitle);
         *              }
         *          }
         *          break;
         *
         *      case PROTOCOL.DEC_MAKINGROOM:
         *          {
         *              var result = Convert.ToBoolean(packet.pop_int16());
         *
         *              Console.WriteLine(result);
         *          }
         *          break;
         *
         *      case PROTOCOL.DEC_ENTERROOM:
         *          {
         *              var result = Convert.ToBoolean(packet.pop_int16());
         *
         *              Console.WriteLine(result);
         *          }
         *          break;
         *
         *      case PROTOCOL.DEC_STARTGAME:
         *          {
         *              var result = Convert.ToBoolean(packet.pop_int16());
         *
         *              Console.WriteLine(result);
         *          }
         *          break;
         *
         *      case PROTOCOL.DEC_REGISTER:
         *          {
         *              var flag = Convert.ToBoolean(packet.pop_byte());
         *
         *              if(!flag)
         *              {
         *                  var error = (RegisterFailure)packet.pop_int16();
         *
         *                  Console.WriteLine($"REGISTER FAIL CAUSE {error}");
         *              }
         *              else
         *              {
         *                  Console.WriteLine($"REGISTER SUCCESS");
         *              }
         *          }
         *          break;
         *
         *      case PROTOCOL.DEC_LOGIN:
         *          {
         *              var flag = Convert.ToBoolean(packet.pop_byte());
         *
         *              if (!flag)
         *              {
         *                  var error = (LoginFailure)packet.pop_int16();
         *
         *                  Console.WriteLine($"LOGIN FAIL CAUSE {error}");
         *              }
         *              else
         *              {
         *                  Console.WriteLine($"LOGIN SUCCESS");
         *              }
         *          }
         *          break;
         *  }
         * }
         */

        public static void Process_Packet(CPacket msg)
        {
            var protocol = (PROTOCOL)msg.pop_protocol_id();

            //Console.WriteLine("protocol :" + protocol.ToString());
            switch (protocol)
            {
            case PROTOCOL.DEC_REGISTER:
            {
                var flag = Convert.ToBoolean(msg.pop_byte());
                wait = false;

                if (!flag)
                {
                    var exist = (RegisterFailure)msg.pop_int16();

                    Console.WriteLine(exist);
                }
                else
                {
                    Console.WriteLine("회원가입 성공");

                    print  = Menu;
                    action = MenuAction;
                }
            }
            break;

            case PROTOCOL.DEC_LOGIN:
            {
                var flag = Convert.ToBoolean(msg.pop_byte());
                wait = false;

                if (!flag)
                {
                    var exist = (LoginFailure)msg.pop_int16();

                    Console.WriteLine(exist);
                }
                else
                {
                    Console.WriteLine("로그인 성공");

                    print  = RoomMenu;
                    action = RoomMenuAction;
                }
            }
            break;

            case PROTOCOL.SEND_ROOMLIST:
            {
                roomList = Utility.RoomListToDictionary(msg);
                wait     = false;
            }
            break;

            case PROTOCOL.DEC_MAKINGROOM:
            {
                var flag = Convert.ToBoolean(msg.pop_byte());

                wait = false;

                if (flag)
                {
                    IsMaster = true;
                    print    = InRoomMenu;
                    action   = InRoomMenuAction;
                    Console.WriteLine("방 제작 성공");
                }
                else
                {
                    Console.WriteLine("방 제작 실패");
                }
            }
            break;

            case PROTOCOL.DEC_ENTERROOM:
            {
                var flag = Convert.ToBoolean(msg.pop_byte());

                if (flag)
                {
                    print  = InRoomMenu;
                    action = InRoomMenuAction;
                    wait   = false;
                }
                else
                {
                    Console.WriteLine("방 입장 실패");
                }
            }
            break;

            case PROTOCOL.SEND_ENTERROOM:
            {
                Names.Add(msg.pop_string());
                Master.Add(Convert.ToBoolean(msg.pop_byte()));
            }
            break;

            case PROTOCOL.DEC_STARTGAME:
            {
                var flag = Convert.ToBoolean(msg.pop_byte());

                if (flag)
                {
                    Console.WriteLine("게임 시작");
                    Console.WriteLine("{0}", masterIP);
                }
                else
                {
                    Console.WriteLine("인원수 부족");
                }
            }
            break;

            case PROTOCOL.SEND_NICKNAME:
            {
                string name = msg.pop_string();
            }
            break;
            }
        }
Beispiel #23
0
 void IPeer.process_user_operation(CPacket msg)
 {
 }
Beispiel #24
0
        public static void Handle_UserSkillLearnItemUseRequest(WvsGameClient c, CInPacket p)
        {
            int   dwTickCount = p.Decode4();
            short nPOS        = p.Decode2();
            int   nItemID     = p.Decode4();

            c.Character.Action.Enable();

            if (c.Character.Stats.nHP <= 0)
            {
                return;
            }

            if (InventoryManipulator.GetItem(c.Character, ItemConstants.GetInventoryType(nItemID), nPOS) is GW_ItemSlotBundle item &&
                item.Template is ConsumeItemTemplate template)
            {
                var jobroot = Math.Floor(c.Character.Stats.nJob * 0.01);                 // 3500 -> 35

                var bUsed         = false;
                var bSuccess      = false;
                var bIsMasterBook = item.nItemID / 10000 == 229;

                foreach (var skillId in template.SkillData)
                {
                    var skillJob  = (int)Math.Floor(skillId / 10000f); // 35111010 -> 3511
                    var skillRoot = (int)Math.Floor(skillJob / 100f);  // 3511 -> 35

                    if (skillRoot == jobroot)                          // this can only be true once
                    {
                        if (skillJob > c.Character.Stats.nJob)
                        {
                            break;
                        }

                        var skill = c.Character.Skills.FirstOrDefault(s => s.nSkillID == skillId);

                        if (bIsMasterBook)
                        {
                            if (skill is null || skill.nSLV < template.ReqSkillLevel || skill.CurMastery >= template.MasterLevel)
                            {
                                return;
                            }
                        }
                        else
                        {
                            if (skill != null && skill.CurMastery > 0)
                            {
                                break;
                            }
                        }

                        bUsed = true;

                        if (template.SuccessRate != 100)
                        {
                            if (Constants.Rand.Next() % 100 > template.SuccessRate)
                            {
                                break;
                            }
                        }

                        c.Character.Modify.Skills(mod => mod.AddEntry(skillId, s => s.CurMastery = (byte)template.MasterLevel));
                        bSuccess = true;
                        break;
                    }
                }

                if (bUsed)
                {
                    InventoryManipulator.RemoveFrom(c.Character, item.InvType, nPOS);                     // always remove
                }

                c.Character.Field.Broadcast(CPacket.SkillLearnItemResult(c.dwCharId, bIsMasterBook, bUsed, bSuccess));
            }
        }
        public void SendPacket(CPacket header)
        {
            byte[] arr = MakePacket(header.GetDataToSend(Console), header.Type);

            SendToConsole(arr);
        }
Beispiel #26
0
 /// <summary>
 /// 모든 유저들에게 메시지를 전송한다.
 /// </summary>
 /// <param name="msg"></param>
 void broadcast(CPacket msg)
 {
     this.players.ForEach(player => player.send_for_broadcast(msg));
     CPacket.destroy(msg);
 }
Beispiel #27
0
 public void send(CPacket msg)
 {
     this.token.send(msg);
 }
Beispiel #28
0
        protected override void InsertItem(int index, Character user)
        {
            try
            {
                if (user.Party != null)
                {
                    foreach (var buff in user.Buffs)
                    {
                        if (buff.dwCharFromId != user.dwId)
                        {
                            continue;
                        }

                        if (buff.StatType != SecondaryStatFlag.BlueAura &&
                            buff.StatType != SecondaryStatFlag.DarkAura &&
                            buff.StatType != SecondaryStatFlag.YellowAura)
                        {
                            continue;
                        }

                        ForEachPartyMember(user.Party.PartyID,
                                           member => member.Buffs
                                           .AddAura(buff.StatType, buff.dwCharFromId, buff.nSkillID, buff.nSLV));
                        break;
                    }
                }

                //Spawn the player being added to everyone in the room
                {
                    var pPacketEnter = user.MakeEnterFieldPacket();
                    Field.EncodeFieldSpecificData(pPacketEnter, user);
                    Field.Broadcast(pPacketEnter);
                }

                //So i need to fix a bug where when u change map - u dont receive ur own dmg skin lol

                //Spawn [other players + ext data] in room to person entering
                foreach (var c in this)
                {
                    var pPacketEnter = c.MakeEnterFieldPacket();
                    Field.EncodeFieldSpecificData(pPacketEnter, c);
                    user.SendPacket(pPacketEnter);

                    //var pPacketEnterExt = CPacket.Custom.UserEnter(c.dwId, c.nDamageSkin);
                    //user.SendPacket(pPacketEnterExt);
                }

                Field.Drops.Update();                 // remove expired drops (required cuz map might be empty and thus not removing drops)

                //This must be here !!!!
                base.InsertItem(index, user);

                //Spawn entering person's extension data to everyone on map
                {
                    //var pPacketEnterExt = CPacket.Custom.UserEnter(user.dwId, user.nDamageSkin);
                    //Field.Broadcast(pPacketEnterExt);
                }

                //Spawn entering person's entities to everyone on map
                if (JobLogic.IsEvan(user.Stats.nJob) && user.Stats.nJob != 2001)
                {
                    user.Dragon = new CDragon(user);
                    user.Dragon.SpawnDragonToMap();
                }

                user.Pets.SpawnPetsToMap();

                //Spawn field entities to person entering
                Field.SendSpawnDragons(user);
                // pets are handled in UserEnterField packet

                Field.SendSpawnSummons(user);
                Field.Summons.InsertFromStorage(user);                 // needs to be after SendSpawnSummons

                Field.SendSpawnMobs(user);
                Field.SendSpawnNpcs(user);
                Field.SendSpawnReactors(user);
                Field.SendSpawnAffectedAreas(user);
                Field.SendSpawnMinirooms(user);
                Field.SendSpawnKites(user);
                Field.SendSpawnTownPortals(user);
                Field.SendSpawnOpenGates(user);
                Field.SendSpawnDrops(user);
                Field.SendActiveWeatherEffect(user);

                Field.AssignControllerMobs();
                Field.AssignControllerNpcs();

                if (Field.tFieldTimerExpiration.SecondsUntilEnd() > 0)
                {
                    user.SendPacket(CPacket.CreateClock((int)Field.tFieldTimerExpiration.SecondsUntilEnd()));
                }

                if (Field.nFieldDeathCount > -1)
                {
                    //user.SendPacket(CPacket.Custom.FieldDeathCount(Field.nFieldDeathCount));
                }

                if (user.Party != null)
                {
                    foreach (var c in this)
                    {
                        if (c.Party?.PartyID != user.Party.PartyID)
                        {
                            continue;
                        }
                        foreach (var buff in c.Buffs)
                        {
                            if (buff.dwCharFromId != c.dwId)
                            {
                                continue;
                            }
                            if (buff.StatType == SecondaryStatFlag.BlueAura ||
                                buff.StatType == SecondaryStatFlag.DarkAura ||
                                buff.StatType == SecondaryStatFlag.YellowAura)
                            {
                                user.Buffs.AddAura(buff.StatType, buff.dwCharFromId, buff.nSkillID, buff.nSLV);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                user?.Socket?.Disconnect();
            }
        }
Beispiel #29
0
    void ON_FLIP_DECK_CARD_ACK(CPacket msg)
    {
        byte player_index = msg.pop_byte();

        // 덱에서 뒤집은 카드 정보.
        byte deck_card_number = msg.pop_byte();
        PAE_TYPE deck_card_pae_type = (PAE_TYPE)msg.pop_byte();
        byte deck_card_position = msg.pop_byte();
        byte same_count_with_deck = msg.pop_byte();

        PLAYER_SELECT_CARD_RESULT result = (PLAYER_SELECT_CARD_RESULT)msg.pop_byte();
        if (result == PLAYER_SELECT_CARD_RESULT.CHOICE_ONE_CARD_FROM_DECK)
        {
            if (is_me(player_index))
            {
                CPacket choose_msg = CPacket.create((short)PROTOCOL.CHOOSE_CARD);
                choose_msg.push((byte)result);
                choose_msg.push((byte)0);
                this.local_server.on_receive_from_ai(choose_msg);
            }
        }
        else
        {
            CPacket ret = CPacket.create((short)PROTOCOL.TURN_END);
            this.local_server.on_receive_from_ai(ret);
        }
    }
Beispiel #30
0
    void add_player_select_result_to(CPacket msg, byte slot_index)
    {
        // 플레이어가 낸 카드 정보.
        msg.push(this.engine.card_from_player.number);
        msg.push((byte)this.engine.card_from_player.pae_type);
        msg.push(this.engine.card_from_player.position);
        msg.push(this.engine.same_card_count_with_player);
        msg.push(slot_index);

        // 카드 이벤트.
        msg.push((byte)this.engine.card_event_type);

        // 폭탄 카드 정보.
        switch (this.engine.card_event_type)
        {
            case CARD_EVENT_TYPE.BOMB:
                {
                    byte bomb_cards_count = (byte)this.engine.bomb_cards_from_player.Count;
                    msg.push((byte)bomb_cards_count);
                    for (byte card_index = 0; card_index < bomb_cards_count; ++card_index)
                    {
                        msg.push(this.engine.bomb_cards_from_player[card_index].number);
                        msg.push((byte)this.engine.bomb_cards_from_player[card_index].pae_type);
                        msg.push(this.engine.bomb_cards_from_player[card_index].position);
                    }
                }
                break;

            case CARD_EVENT_TYPE.SHAKING:
                {
                    byte shaking_cards_count = (byte)this.engine.shaking_cards.Count;
                    msg.push((byte)shaking_cards_count);
                    for (byte card_index = 0; card_index < shaking_cards_count; ++card_index)
                    {
                        msg.push(this.engine.shaking_cards[card_index].number);
                        msg.push((byte)this.engine.shaking_cards[card_index].pae_type);
                        msg.push(this.engine.shaking_cards[card_index].position);
                    }
                }
                break;
        }
    }
Beispiel #31
0
 public static void send(CPacket msg)
 {
     gameserver.send(msg);
 }
Beispiel #32
0
 void ON_GAME_RESULT(CPacket msg)
 {
     send_ready_to_start();
 }
Beispiel #33
0
        /// <summary>
        /// 클라이언트의 이동 요청.
        /// </summary>
        /// <param name="sender">요청한 유저</param>
        /// <param name="begin_pos">시작 위치</param>
        /// <param name="target_pos">이동하고자 하는 위치</param>
        public void moving_req(CPlayer sender, short begin_pos, short target_pos)
        {
            // sender차례인지 체크.
            if (this.current_turn_player != sender.player_index)
            {
                // 현재 턴이 아닌 플레이어가 보낸 요청이라면 무시한다.
                // 이런 비정상적인 상황에서는 화면이나 파일로 로그를 남겨두는것이 좋다.
                return;
            }

            // begin_pos에 sender의 세균이 존재하는지 체크.
            if (this.gameboard[begin_pos] != sender.player_index)
            {
                // 시작 위치에 해당 플레이어의 세균이 존재하지 않는다.
                return;
            }

            // 목적지는 EMPTY_SLOT으로 설정된 빈 공간이어야 한다.
            // 다른 세균이 자리하고 있는 곳으로는 이동할 수 없다.
            if (this.gameboard[target_pos] != EMPTY_SLOT)
            {
                // 목적지에 다른 세균이 존재한다.
                return;
            }

            // target_pos가 이동 또는 복제 가능한 범위인지 체크.
            short distance = CHelper.get_distance(begin_pos, target_pos);

            if (distance > 2)
            {
                // 2칸을 초과하는 거리는 이동할 수 없다.
                return;
            }

            if (distance <= 0)
            {
                // 자기 자신의 위치로는 이동할 수 없다.
                return;
            }

            // 모든 체크가 정상이라면 이동을 처리한다.
            if (distance == 1)                          // 이동 거리가 한칸일 경우에는 복제를 수행한다.
            {
                put_virus(sender.player_index, target_pos);
            }
            else if (distance == 2)                     // 이동 거리가 두칸일 경우에는 이동을 수행한다.
            {
                // 이전 위치에 있는 세균은 삭제한다.
                remove_virus(sender.player_index, begin_pos);

                // 새로운 위치에 세균을 놓는다.
                put_virus(sender.player_index, target_pos);
            }

            // 목적지를 기준으로 주위에 존재하는 상대방 세균을 감염시켜 같은 편으로 만든다.
            CPlayer opponent = get_opponent_player();

            infect(target_pos, sender, opponent);

            // 최종 결과를 broadcast한다.
            CPacket msg = CPacket.create((short)PROTOCOL.PLAYER_MOVED);

            msg.push(sender.player_index);                      // 누가
            msg.push(begin_pos);                                // 어디서
            msg.push(target_pos);                               // 어디로 이동 했는지
            broadcast(msg);
        }
Beispiel #34
0
 // handler.
 void ON_LOCAL_SERVER_STARTED(CPacket msg)
 {
     send_ready_to_start();
 }
Beispiel #35
0
 public void send(CPacket msg)
 {
     this.send_function(msg);
 }
Beispiel #36
0
    void on_receive(CPacket msg)
    {
        PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();

        //UnityEngine.Debug.Log("AIPlayer received : " + protocol);

        if (!this.packet_handler.ContainsKey(protocol))
        {
            return;
        }

        this.packet_handler[protocol](msg);
    }
        public override void Execute(CommandCtx ctx)
        {
            if (ctx.Empty)
            {
                ctx.Character.SendMessage("!test <ftype | event | makerskill>");
            }
            else
            {
                switch (ctx.NextString().ToLowerInvariant())
                {
                case "instance":
                    ctx.Character.SendMessage($"Instance: {ctx.Character.Field.nInstanceID}");
                    break;

                case "potential":
                    if (ctx.Empty)
                    {
                        return;
                    }

                    var itemid = ctx.NextInt();

                    var pots = new int[3];

                    var i = 0;
                    while (!ctx.Empty)
                    {
                        pots[i] = ctx.NextInt();
                        i      += 1;
                    }

                    var pItem = MasterManager.CreateItem(itemid, false) as GW_ItemSlotEquip;

                    if (pItem is null)
                    {
                        return;
                    }

                    pItem.nGrade = PotentialGradeCode.Visible_Unique;

                    pItem.nOption1 = (short)pots[0];
                    pItem.nOption2 = (short)pots[1];
                    pItem.nOption3 = (short)pots[2];

                    InventoryManipulator.InsertInto(ctx.Character, pItem);

                    break;

                case "sheepranch":
                    ctx.Character.Action.SetFieldInstance(BattlefieldData.BattleMap, 1);
                    break;

                case "sethorns":
                    ctx.Character.Buffs.AddSkillBuff((int)Skills.BOWMASTER_SHARP_EYES, 30);
                    ctx.Character.Buffs.AddSkillBuff((int)Skills.DUAL5_THORNS_EFFECT, 30);
                    break;

                case "makerskill":
                    ctx.Character.Skills.Add(new SkillEntry(1007)
                    {
                        nSLV = 1
                    });
                    break;

                case "ftype":
                    ctx.Character.SendMessage("Map Field Type: " + Enum.GetName(typeof(FieldType), ctx.Character.Field.Template.FieldType));
                    break;

                case "event":
                    MasterManager.EventManager.TryDoEvent(true);
                    break;

                case "shop":
                {
                    var pShop = new CShop(69);

                    pShop.Items.Add(new CShopItem(0));

                    pShop.AddDefaultItems();

                    MasterManager.ShopManager.InitUserShop(ctx.Character, 9900000, pShop);
                }
                break;

                case "balloon":
                    ctx.SendPacket(CPacket.BalloonMessage("Hello World!", 96));
                    break;

                default:
                    ctx.Character.SendMessage("No test command with that argument.");
                    break;
                }
            }

            return;

            foreach (var mob in ctx.Character.Field.Mobs)
            {
                ctx.Character.SendMessage($"{mob.nMobTemplateId}");
            }
            return;

            int imob = 0;

            foreach (var mob in ctx.Character.Field.Mobs.aMobGen)
            {
                if (mob.FH == 0)
                {
                    imob += 1;
                }
            }
            ctx.Character.SendMessage($"Mobs with FH 0: {imob}");
            ctx.Character.SendMessage($"Mobs In Map: {ctx.Character.Field.Mobs.Count} || Spawns: {ctx.Character.Field.Mobs.aMobGen.Count}");
            return;

            //foreach(var reactor in ctx.Character.Field.Reactors)
            //{
            //	reactor.IncreaseReactorState(0, 0);
            //}

            //return;
            ctx.Character.Action.SetFieldInstance(240060200, Constants.Rand.Next(), 0);

            return;

            var drop = new CDrop(ctx.Character.Position, ctx.Character.dwId)
            {
                ItemId = 100
            };

            drop.Position.X = drop.StartPosX;
            drop.CalculateY(ctx.Character.Field, drop.StartPosY);

            ctx.Character.Field.Drops.Add(drop);

            return;

            ctx.Character.SendMessage("" + Enum.GetName(typeof(FieldType), ctx.Character.Field.Template.FieldType));

            return;

            var p    = new COutPacket(SendOps.LP_Clock);
            var type = ctx.NextInt();

            p.Encode1((byte)type);
            switch (type)
            {
            case 0:                       // OnEventTimer
                p.Encode4(ctx.NextInt()); // nDuration

                break;

            case 1:                             // Clock
                p.Encode1((byte)ctx.NextInt()); // nHour
                p.Encode1((byte)ctx.NextInt()); // nMin
                p.Encode1((byte)ctx.NextInt()); // nSec

                break;

            case 2:                       // Timer
                p.Encode4(ctx.NextInt()); // tDuration (0 to disable the clock)

                break;

            case 3:                             // some kind of event timer also
                p.Encode1((byte)ctx.NextInt()); // bool (on/off)
                p.Encode4(ctx.NextInt());       // tDuration

                break;

            case 100:                           // cakepie event timer
                p.Encode1((byte)ctx.NextInt()); // bool (timer on/off)
                p.Encode1((byte)ctx.NextInt()); // nTimerType
                p.Encode4(ctx.NextInt());       // tDuration

                break;
            }

            ctx.Character.SendPacket(p);

            for (int i = 0; i < 2; i++)
            {
                var p2 = new COutPacket(SendOps.LP_CakePieEventResult);
                p2.Encode1(1);                         // bool -> continue while loop
                p2.Encode4(ctx.Character.Field.MapId); // fieldid
                p2.Encode4(4220176);                   // itemid
                p2.Encode1(25);                        // percentage
                p2.Encode1((byte)ctx.NextInt());       // eventstatus
                p2.Encode1((byte)(i + 1));             // nwinnerteam
                p2.Encode1(0);                         // end while loop

                ctx.SendPacket(p2);
            }

            return;

            //var poo = ctx.Character.Pets.Pets[0];

            //if (poo != null)
            //{
            //	ctx.Character.SendMessage($"{poo.Position.X} || {poo.Position.Y}");
            //}

            //var p = new COutPacket(SendOps.LP_AvatarMegaphoneUpdateMessage);
            //var x = new AvatarMegaphone
            //{
            //	nItemID = 05390000,
            //	sName = "pooodop",
            //	sMsgs = new string[5] { "one", "  two", " three", "    four", " five" },
            //	nChannelNumber = 1,
            //	bWhisper = true,
            //	alSender = ctx.Character.GetLook()
            //};

            //x.Encode(p);

            //MasterManager.CharacterPool.Broadcast(p);

            //var nItemID = ctx.NextInt();

            //ctx.Character.Modify.Inventory(inv =>
            //{
            //	for (short i = 1; i <= ctx.Character.InventoryEquip.SlotLimit; i++)
            //	{
            //		ctx.Character.InventoryEquip.Remove(i);
            //		var newItem = MasterManager.CreateItem(nItemID) as GW_ItemSlotEquip;
            //		newItem.nGrade = PotentialGradeCode.Visible_Unique;
            //		newItem.nOption1 = (int)PotentialLineIDs.LEARN_SKILL_HASTE;
            //		ctx.Character.InventoryEquip.Add(i, newItem);
            //		inv.Add(InventoryType.Equip, i, newItem);
            //	}

            //	var magnifyingGlass = MasterManager.CreateItem(02460003) as GW_ItemSlotBundle;
            //	magnifyingGlass.nNumber = 500; // pretty sure i can override the 100 slotmax lol
            //	ctx.Character.InventoryConsume.Remove(15);
            //	ctx.Character.InventoryConsume.Add(15, magnifyingGlass);

            //	inv.Remove(InventoryType.Consume, 15);
            //	inv.Add(InventoryType.Consume, 15, magnifyingGlass);

            //});

            //return;

            //foreach (var item in ctx.Character.InventoryEquip)
            //{
            //	ctx.Character.Action.ConsumeItem.UseMagnifyingGlass(15, item.Key);
            //	item.Value.sTitle = $"{item.Value.nOption1}|{item.Value.nOption2}";
            //}

            //ctx.Character.InventoryEquip.RemoveAllItems(ctx.Character); // gotta cc for this to take effect so we can look then cc to clean inv

            // ctx.Character.SendPacket(CPacket.UserOpenUI((UIWindow)ctx.NextInt()));

            //ctx.Character.Field.bPauseSpawn = !ctx.Character.Field.bPauseSpawn;

            //ctx.Character.Modify.Stats(mod => mod.SP += (short)ctx.NextInt());

            //var p = new COutPacket(SendOps.LP_UserEffectLocal);

            //for (int i = 8; i >= 1; i--)
            //{
            //    p.Encode4(i == statup.getPosition() ? statup.getValue() : 0);
            //}

            //p.Encode1(1); // skill use
            //p.Encode4(22160000); // skillID
            //p.Encode1(100); // nCharLevel
            //p.Encode1(1); // nSLV
            //p.Encode1(1);

            //ctx.SendPacket(p);

            //ctx.Character.SendMessage($"You have {ctx.Character.Buffs.Count} buffs.");

            //var pChar = ctx.Character;

            //if (pChar.PlayerGuild == null)
            //{
            //    var name = ctx.NextString();
            //    MasterManager.GuildManager.Add(new Guild(name, pChar.dwId));
            //}
            //else
            //{
            //    var p = new COutPacket(SendOps.LP_GuildResult);
            //    p.Encode1((byte)ctx.NextInt());

            //    pChar.SendPacket(p);
            //}
            //var storage = ServerApp.Container.Resolve<CenterStorage>();
            //var sub = storage.Multiplexer().GetSubscriber();

            //sub.Publish("donate", $"{character.AccId}/5000");

            // character.Modify.GainNX(1000);

            // character.SendPacket(CPacket.OpenClassCompetitionPage());

            //var stat = new SecondaryStat();

            //var entry = new SecondaryStatEntry()
            //{
            //    nValue = 10,
            //    rValue = 2001002,
            //    tValue = 110000,
            //};

            //stat.Add(SecondaryStatType.MagicGuard, entry);
            //stat.Add(SecondaryStatType.Flying, entry);

            //character.SendPacket(CPacket.TemporaryStatSetLocal(stat));
            //character.Field.Broadcast(CPacket.UserTemporaryStatSet(stat, character.CharId));

            //var summon = new CSummon();
            //summon.Parent = character;
            //summon.dwSummonedId = 2330810;
            //summon.nSkillID = 14001005;

            //summon.Position.Position.X = character.Position.Position.X;
            //summon.Position.Position.Y = character.Position.Position.Y;
            //summon.Position.Foothold = character.Position.Foothold;

            //summon.nCharLevel = character.Stats.nLevel;
            //summon.nSLV = 1;
            //summon.bMoveAbility = 1;
            //summon.bAssistType = 1;
            //summon.nEnterType = 1;

            //character.Summons.Add(summon);

            //character.SendPacket(CPacket.TradeMoneyLimit(true));
            //character.SendPacket(CPacket.WarnMessage("YEOOOOOO THIS IS A WARNING BOY"));
            //character.SendPacket(CPacket.AdminShopCommodity(9900000));
            //character.SendPacket(CPacket.StandAloneMode(true));
            //character.SendPacket(CPacket.LogoutGift());

            //character.SendPacket(CPacket.UserHireTutor(true));
            //character.SendPacket(CPacket.UserTutorMsg(Constants.ServerMessage2,400,60000));

            //character.SendPacket(CPacket.HontaleTimer(0,5));
            //character.SendPacket(CPacket.HontaleTimer(1, 5));
            //character.SendPacket(CPacket.HontaleTimer(2, 5));
            //character.SendPacket(CPacket.HontaleTimer(3, 5));

            //character.SendPacket(CPacket.HontailTimer(0,69));
            //character.SendPacket(CPacket.HontailTimer(1, 69));
            //character.SendPacket(CPacket.HontailTimer(0, 0));

            //var town = new CTownPortal();
            //town.dwCharacterID = character.dwId;
            //town.Position.X = character.Position.X;
            //town.Position.Y = character.Position.Y;

            //character.Field.TownPortals.Add(town);

            //character.SendPacket(CPacket.DragonEnterField(character.dwId, character.Position.X, character.Position.Y, 0, 2218));
            //character.Dragon = new CDragon(character);
            //character.Dragon.JobCode = 2218;
            //character.Dragon.Position.X = character.Position.X;
            //character.Dragon.Position.Y = character.Position.Y;


            //    var gate1 = new COpenGate()
            //    {
            //        dwCharacterID = character.dwId,
            //    };

            //    gate1.Position.X = character.Position.X;
            //    gate1.Position.Y = character.Position.Y;

            //    character.Field.OpenGates1.Add(gate1);

            //    var gate2 = new COpenGate()
            //    {
            //        dwCharacterID = character.dwId,
            //    };

            //    gate2.Position.X = character.Position.X;
            //    gate2.Position.X -= 250;

            //    gate2.Position.Y = character.Position.Y;

            //    character.Field.OpenGates2.Add(gate2);


            //character.SendPacket(CPacket.StageChange("ThemeBack1.img", 0));

            //character.Field.Employees.RemoveAt(0);

            //character.SendPacket(CPacket.SetBackgroundEffect(2, 100000000, 1, 30 * 1000));

            //character.SendPacket(CPacket.Desc(true));

            //character.SendPacket(CPacket.StalkResult(character.dwId, character.Stats.sCharacterName, character.Position.X, character.Position.Y));

            //character.SendPacket(CPacket.PlayJukeBox("Hydromorph"));
            //character.SendPacket(CPacket.BlowWeather(0, 5120000, "Hello Twitch!!!"));

            //character.SendPacket(CPacket.AntiMacroResult(6, "SnitchNigga")); //Crash
            //character.SendPacket(CPacket.AntiMacroResult(7, "SnitchNigga")); //This dude reported you !

            //Diemension mirror reeeeeeeeeeeeeee
            //var p = NpcScript.ScriptMessageHeader(0, 9900000, ScriptMsgType.AskSlideMenu);
            //p.Encode4(0); //dlg type
            //p.Encode4(0); //index?
            //p.EncodeString("Hello World");
            //character.SendPacket(p);

            //var pet = new CPet(ctx.Character);
            //pet.nIdx = 0;
            //pet.liPetLockerSN = 9001;
            //pet.dwTemplateID = 5000102;
            //pet.sName = "Charlie";
            //pet.Position.X = character.Position.X;
            //pet.Position.Y = character.Position.Y;

            //ctx.Character.Pets.Add(pet.liPetLockerSN, pet);
        }
Beispiel #38
0
    void ON_SELECT_CARD_ACK(CPacket msg)
    {
        byte delay = msg.pop_byte();
        byte current_player_index = msg.pop_byte();
        //short score = msg.pop_int16();
        //byte remain_bomb_card_count = msg.pop_byte();

        if (is_me(current_player_index))
        {
            // 카드 내는 연출을 위해 필요한 변수들.
            CARD_EVENT_TYPE card_event = CARD_EVENT_TYPE.NONE;
            byte slot_index = byte.MaxValue;
            byte player_card_number = byte.MaxValue;
            PAE_TYPE player_card_pae_type = PAE_TYPE.PEE;
            byte player_card_position = byte.MaxValue;

            // 플레이어가 낸 카드 정보.
            player_card_number = msg.pop_byte();
            player_card_pae_type = (PAE_TYPE)msg.pop_byte();
            player_card_position = msg.pop_byte();
            byte same_count_with_player = msg.pop_byte();
            slot_index = msg.pop_byte();

            card_event = (CARD_EVENT_TYPE)msg.pop_byte();
            switch (card_event)
            {
                case CARD_EVENT_TYPE.BOMB:
                    {
                        byte bomb_card_count = (byte)msg.pop_byte();
                        for (byte i = 0; i < bomb_card_count; ++i)
                        {
                            byte number = msg.pop_byte();
                            PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
                            byte position = msg.pop_byte();

                            CCard card = this.hand_cards.Find(obj => obj.is_same(number, pae_type, position));
                            this.hand_cards.Remove(card);
                        }
                    }
                    break;

                case CARD_EVENT_TYPE.SHAKING:
                    {
                        byte shaking_card_count = (byte)msg.pop_byte();
                        for (byte i = 0; i < shaking_card_count; ++i)
                        {
                            byte number = msg.pop_byte();
                            PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
                            byte position = msg.pop_byte();
                        }

                        this.hand_cards.RemoveAt(slot_index);
                    }
                    break;

                default:
                    this.hand_cards.RemoveAt(slot_index);
                    break;
            }

            PLAYER_SELECT_CARD_RESULT select_result = (PLAYER_SELECT_CARD_RESULT)msg.pop_byte();
            if (select_result == PLAYER_SELECT_CARD_RESULT.CHOICE_ONE_CARD_FROM_PLAYER)
            {
                byte count = msg.pop_byte();
                for (byte i = 0; i < count; ++i)
                {
                    byte number = msg.pop_byte();
                    PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
                    byte position = msg.pop_byte();
                }

                CPacket choose_msg = CPacket.create((short)PROTOCOL.CHOOSE_CARD);
                choose_msg.push((byte)select_result);
                choose_msg.push((byte)0);
                this.local_server.on_receive_from_ai(choose_msg);
                return;
            }

            CPacket ret = CPacket.create((short)PROTOCOL.FLIP_DECK_CARD_REQ);
            this.local_server.on_receive_from_ai(ret);
        }
    }
Beispiel #39
0
        void IPeer.process_user_operation(CPacket msg)
        {
            PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();

            Console.WriteLine("protocol id " + protocol);
            switch (protocol)
            {
            case PROTOCOL.SERVER_LIST_REQ:

                CPacket new_msg = CPacket.create((short)PROTOCOL.SERVER_LIST_SEND);
                new_msg.push_int32(Program.game_main.room_manager.rooms.Count);

                send(new_msg);
                break;

            case PROTOCOL.ENTER_GAME_ROOM_REQ:

                Program.game_main.matching_req(this);

                break;

            case PROTOCOL.LOADING_COMPLETED:
                byte Job = msg.pop_byte();
                this.battle_room.loading_complete(player, Job);
                break;

            case PROTOCOL.MOVING_REQ:
            {
                byte player_index = msg.pop_byte();

                float px = msg.pop_Single();
                float py = msg.pop_Single();
                float pz = msg.pop_Single();

                float rx = msg.pop_Single();
                float ry = msg.pop_Single();
                float rz = msg.pop_Single();

                byte idle = msg.pop_byte();
                byte walk = msg.pop_byte();
                byte run  = msg.pop_byte();
                byte die  = msg.pop_byte();

                this.battle_room.moving_req(this.player, new Vector3(px, py, pz), new Quaternion(rx, ry, rz), new byte[4] {
                        idle, walk, run, die
                    }, player_index);
            }
            break;

            case PROTOCOL.DAMAGED:
            {
                byte  player_index;
                float HP;

                player_index = msg.pop_byte();
                HP           = msg.pop_Single();

                this.battle_room.damaged(player_index, HP, this);
            }
            break;

            case PROTOCOL.USE_SKILLONE:
            {
                byte player_index = msg.pop_byte();
                this.battle_room.useskill(player_index, PROTOCOL.USE_SKILLONE);
            }
            break;

            case PROTOCOL.USE_SKILLTWO:
            {
                byte player_index = msg.pop_byte();
                this.battle_room.useskill(player_index, PROTOCOL.USE_SKILLTWO);
            }
            break;

            case PROTOCOL.USE_SKILLTHREE:
            {
                byte player_index = msg.pop_byte();
                this.battle_room.useskill(player_index, PROTOCOL.USE_SKILLTHREE);
            }
            break;

            case PROTOCOL.PLAYER_DEAD:
            {
                byte player_index = msg.pop_byte();
                this.battle_room.deadPlayer(player_index);
            }
            break;
            }
        }
Beispiel #40
0
    void ON_START_TURN(CPacket msg)
    {
        byte remain_bomb_card_count = msg.pop_byte();
        update_floor_cards(msg);

        if (remain_bomb_card_count > 0)
        {
            CPacket card_msg = CPacket.create((short)PROTOCOL.FLIP_BOMB_CARD_REQ);
            this.local_server.on_receive_from_ai(card_msg);
        }
        else
        {
            byte slot_index = this.brain.choice_card_to_put(this.hand_cards, null, this.floor_card_manager);
            CPacket card_msg = CPacket.create((short)PROTOCOL.SELECT_CARD_REQ);
            CCard card = this.hand_cards[slot_index];

            card_msg.push(card.number);
            card_msg.push((byte)card.pae_type);
            card_msg.push(card.position);
            card_msg.push(slot_index);

            byte is_shaking = 1;
            card_msg.push(is_shaking);

            //UnityEngine.Debug.Log(string.Format("sent {0}, {1}, {2}", card.number, card.pae_type, card.position));
            this.local_server.on_receive_from_ai(card_msg);
        }
    }
Beispiel #41
0
 void IMessageReceiver.on_recv(CPacket msg)
 {
 }
Beispiel #42
0
 void ON_TURN_RESULT(CPacket msg)
 {
     CPacket finish = CPacket.create((short)PROTOCOL.TURN_END);
     this.local_server.on_receive_from_ai(finish);
 }
Beispiel #43
0
 public void SendLoad()
 {
     Parent.SendPacket(CPacket.MacroSysDataInit(this));
 }
Beispiel #44
0
    void update_floor_cards(CPacket msg)
    {
        this.floor_card_manager.reset();
        byte slot_count = msg.pop_byte();
        for (byte i = 0; i < slot_count; ++i)
        {
            byte card_count = msg.pop_byte();
            for (byte card_index = 0; card_index < card_count; ++card_index)
            {
                byte number = msg.pop_byte();
                PAE_TYPE pae_type = (PAE_TYPE)msg.pop_byte();
                byte position = msg.pop_byte();

                this.floor_card_manager.puton_card(new CCard(number, pae_type, position));
            }
        }
    }
 public void send(CPacket msg)
 {
     this.gameserver.send(msg);
 }
Beispiel #46
0
 public void send(CPacket msg)
 {
     CPacket clone = CLocalServer.pre_send(msg);
     CPacket.destroy(msg);
     on_receive(clone);
 }
Beispiel #47
0
 void IPeer.send(CPacket msg)
 {
     msg.record_size();
     this.token.send(new ArraySegment <byte>(msg.buffer, 0, msg.position));
 }
Beispiel #48
0
 void ON_ASK_GO_OR_STOP(CPacket msg)
 {
     CPacket answer_msg = CPacket.create((short)PROTOCOL.ANSWER_GO_OR_STOP);
     answer_msg.push((byte)1);		// 0:스톱, 1:고.
     this.local_server.on_receive_from_ai(answer_msg);
 }
        //void IPeer.ParseCode(Const<byte[]> _buffer)
        public void ParseCode(Const <byte[]> _buffer)
        {
            Console.WriteLine("======================================");
            Console.WriteLine(this + " 패킷 들어옴... 파싱하기. ParseCode");
            Console.WriteLine("======================================");
            //_packet은 함수 안에서만 유효한것임... 다른데에서는 사용안함...
            CPacket     _receive = new CPacket(_buffer.Value, this);
            LOGIN_PROTO _code    = (LOGIN_PROTO)_receive.pop_protocol_id();

            Console.WriteLine(" > _code:" + _code);

            switch (_code)
            {
            case LOGIN_PROTO.CREATE_ROOM_REQ:
            {
                Console.WriteLine("[C -> S] CREATE_ROOM_REQ");
                if (myRoom == null)
                {
                    bRoomMaster = true;         //방장이여

                    string _strRoomName = _receive.ReadString();
                    Program.RoomCreate(this, _strRoomName);
                    Console.WriteLine(" > _strRoomName:{0}", _strRoomName);

                    Console.WriteLine("[C <- S] CREATE_ROOM_OK");
                    CPacket _response = CPacket.Create((short)LOGIN_PROTO.CREATE_ROOM_OK);
                    _response.WriteInt(m_SN);
                    SendCode(_response);
                }
                else
                {
                    Console.WriteLine("[C <- S] CREATE_ROOM_FAILED");
                    SendCode(CPacket.Create((short)LOGIN_PROTO.CREATE_ROOM_FAILED));                                     //이미 접속한 방이있어
                }
            }
            break;

            case LOGIN_PROTO.ROOM_LIST_REQ:
            {
                Console.WriteLine("[C -> S] ROOM_LIST_REQ");

                CPacket _response  = CPacket.Create((short)LOGIN_PROTO.ROOM_LIST_ACK);
                int     _countRoom = Program.listRoom.Count;
                _response.WriteInt(_countRoom);

                Console.WriteLine(" > 방수량:{0}", _countRoom);
                for (int i = 0; i < _countRoom; i++)                                 // Loop with for.
                {
                    if (Program.listRoom[i] != null)
                    {
                        _response.WriteString(Program.listRoom[i].name);
                        _response.WriteInt(Program.listRoom[i].playerCount);
                        _response.WriteInt(Program.listRoom[i].playerMax);
                    }
                }
                Console.WriteLine("[C <- S] ROOM_LIST_ACK");
                SendCode(_response);
            }
            break;

            case LOGIN_PROTO.ROOM_EXIT_REQ:
            {
                Console.WriteLine("[C -> S] ROOM_EXIT_REQ");
                Program.Exit_Room(this);
                myRoom = null;
            }
            break;

            case LOGIN_PROTO.ROOM_CONNECT_REQ:
            {
                Console.WriteLine("[C -> S] ROOM_CONNECT_REQ");
                int _roomNum = _receive.ReadInt();

                if (Program.RoomConnect(this, _roomNum))
                {
                    //성공
                    CPacket _response = CPacket.Create((short)LOGIN_PROTO.ROOM_CONNECT_OK);

                    _response.WriteInt(myRoom.listGameUser.Count);
                    _response.WriteInt(m_SN);
                    for (int i = 0; i < myRoom.listGameUser.Count; ++i)
                    {
                        _response.WriteInt(myRoom.listGameUser[i].m_SN);
                    }
                    Console.WriteLine("[C <- S] ROOM_CONNECT_OK");
                    SendCode(_response);                                     //잘만들었으

                    CPacket _response2 = CPacket.Create((short)LOGIN_PROTO.ROOM_CONNECT_OTHER);
                    _response2.WriteInt(m_SN);
                    Console.WriteLine("[C <- S] ROOM_CONNECT_OTHER");
                    myRoom.BroadCast(_response2, this);
                }
                else
                {
                    //실패
                    Console.WriteLine("[C <- S] ROOM_CONNECT_FAILED");
                    SendCode(CPacket.Create((short)LOGIN_PROTO.ROOM_CONNECT_FAILED));
                }
            }
            break;

            case LOGIN_PROTO.CHAT_MSG_REQ:
            {
                Console.WriteLine("[C -> S] CHAT_MSG_REQ");
                string _strMsg = _receive.ReadString();
                Console.WriteLine(" > _strMsg:{0}", _strMsg);
                if (myRoom != null)
                {
                    CPacket _response = CPacket.Create((short)LOGIN_PROTO.CHAT_MSG_REQ);
                    _response.WriteInt(m_SN);
                    _response.WriteString(_strMsg);
                    Console.WriteLine("[C <- S] CHAT_MSG_REQ");
                    myRoom.BroadCast(_response, this);
                }
                else
                {
                    CPacket _response = CPacket.Create((short)LOGIN_PROTO.CHAT_MSG_REQ);
                    _response.WriteInt(0);
                    _response.WriteString(_strMsg);
                    Console.WriteLine("[C <- S] CHAT_MSG_REQ");
                    SendCode(_response);
                }
            }
            break;

            case LOGIN_PROTO.LOGIN_REQUEST:
            {
                Console.WriteLine("[C -> S] LOGIN_REQUEST");
                //msg.pop_string();

                UserInfo _userInfo = new UserInfo();
                _userInfo.Name = _receive.ReadString();
                _userInfo.SN   = m_SN;
                listUserInfo.Add(_userInfo);
                //Console.WriteLine(" Connect" + _userInfo.Name);

                CPacket _response1 = CPacket.Create((short)LOGIN_PROTO.LOGIN_REPLY);
                _response1.WriteInt(m_SN);
                _response1.WriteString(_userInfo.Name);
                Console.WriteLine("[C <- S] LOGIN_REPLY");
                BroadCast(_response1);


                CPacket _response = CPacket.Create((short)LOGIN_PROTO.USER_CONNECT);
                _response.WriteInt(m_SN);
                _response.WriteString(_userInfo.Name);
                Console.WriteLine("[C <- S] USER_CONNECT");
                SendCode(_response);

                for (int i = 0; i < listUserInfo.Count; i++)                                 // Loop with for.
                {
                    if (m_SN != listUserInfo[i].SN)
                    {
                        CPacket _response3 = CPacket.Create((short)LOGIN_PROTO.LOGIN_REPLY);
                        _response3.WriteInt(listUserInfo[i].SN);
                        _response3.WriteString(listUserInfo[i].Name);
                        Console.WriteLine("[C <- S] LOGIN_REPLY");
                        SendCode(_response3);
                    }
                }

                ++m_SN;
            }
            break;

            case LOGIN_PROTO.MOVING_USER_REQ:
            {
                Console.WriteLine("[C -> S] MOVING_USER_REQ");
                int   SN = _receive.ReadInt();
                float x  = _receive.ReadFloat();
                float y  = _receive.ReadFloat();
                float z  = _receive.ReadFloat();
                Console.WriteLine(" > SN:{0} x:{1} y:{2}, z:{3}", SN, x, y, z);
                Console.WriteLine("[C <- S] MOVING_USER_REQ");

                BroadCast(_receive);
            }
            break;

            case LOGIN_PROTO.MOVING_USER_ONLY:
            {
                Console.WriteLine("[C -> S] MOVING_USER_ONLY");
                int   SN = _receive.ReadInt();
                float x  = _receive.ReadFloat();
                float y  = _receive.ReadFloat();
                float z  = _receive.ReadFloat();
                Console.WriteLine(" > SN:{0} x:{1} y:{2}, z:{3}", SN, x, y, z);
                Console.WriteLine("[C <- S] MOVING_USER_ONLY");


                CPacket _response = CPacket.Create((short)LOGIN_PROTO.MOVING_USER_ONLY);
                _response.WriteInt(SN);
                _response.WriteFloat(x);
                _response.WriteFloat(y);
                _response.WriteFloat(z);

                List <CGameUser> _userList = Program.listGameUser;
                foreach (CGameUser _client in _userList)
                {
                    _client.token.SendCode(_response);
                }
            }
            break;

            case LOGIN_PROTO.ATTACK:
            {
                Console.WriteLine("[C -> S] ATTACK");
                int   SN   = _receive.ReadInt();
                byte  Type = _receive.ReadByte();
                float x    = _receive.ReadFloat();
                float y    = _receive.ReadFloat();
                float z    = _receive.ReadFloat();
                float w    = _receive.ReadFloat();
                Console.WriteLine(" > SN:{0} Type:{1} x:{2}, y:{3}, z:{4}, w:{5}", SN, Type, x, y, z, w);
                Console.WriteLine("[C <- S] ATTACK");
                BroadCast(_receive);
            }
            break;

            case LOGIN_PROTO.PTC_ECHO:
            {
                Console.WriteLine("[C -> S] PTC_ECHO");
                string _strMsg = _receive.ReadString();
                Console.WriteLine(" > _strMsg:{0}", _strMsg);

                CPacket _response = CPacket.Create((short)LOGIN_PROTO.PTS_ECHO);
                _response.WriteString(_strMsg);
                Console.WriteLine("[C <- S] PTS_ECHO");
                SendCode(_response);
            }
            break;

            default:
            {
                Console.WriteLine("[C -> S] ####(프로토콜이 지정되지 않았어요.) " + (LOGIN_PROTO)_code);
            }
            break;
            }

            //사용하고 남은 것은 해제해준다.
            //CPacket.Destroy(_packet);
        }
Beispiel #50
0
 void ON_ASK_KOOKJIN_TO_PEE(CPacket msg)
 {
     CPacket answer_msg = CPacket.create((short)PROTOCOL.ANSWER_KOOKJIN_TO_PEE);
     answer_msg.push((byte)1);		// 0:사용하지 않음, 1:쌍피로 사용.
     this.local_server.on_receive_from_ai(answer_msg);
 }
        /// <summary>
        /// 클라이언트의 이동 요청.
        /// </summary>
        /// <param name="sender">요청한 유저</param>
        /// <param name="begin_pos">시작 위치</param>
        /// <param name="target_pos">이동하고자 하는 위치</param>
        public void moving_req(CPlayer sender, CPacket received_data)
        {
            this.room.clear_received_protocol();

            short begin_pos  = received_data.pop_int16();
            short target_pos = received_data.pop_int16();

            // sender차례인지 체크.
            if (!this.room.is_current_player(sender))
            {
                this.room.error(sender);
                return;
            }

            // begin_pos에 sender의 세균이 존재하는지 체크.
            if (this.gameboard[begin_pos] != sender.player_index)
            {
                // 시작 위치에 해당 플레이어의 세균이 존재하지 않는다.
                this.room.error(sender);
                return;
            }

            // 목적지는 EMPTY_SLOT으로 설정된 빈 공간이어야 한다.
            // 다른 세균이 자리하고 있는 곳으로는 이동할 수 없다.
            if (this.gameboard[target_pos] != EMPTY_SLOT)
            {
                // 목적지에 다른 세균이 존재한다.
                this.room.error(sender);
                return;
            }

            // target_pos가 이동 또는 복제 가능한 범위인지 체크.
            short distance = CHelper.get_distance(begin_pos, target_pos);

            if (distance > 2)
            {
                // 2칸을 초과하는 거리는 이동할 수 없다.
                this.room.error(sender);
                return;
            }

            if (distance <= 0)
            {
                // 자기 자신의 위치로는 이동할 수 없다.
                this.room.error(sender);
                return;
            }

            // 모든 체크가 정상이라면 이동을 처리한다.
            if (distance == 1)      // 이동 거리가 한칸일 경우에는 복제를 수행한다.
            {
                put_virus(sender.player_index, target_pos);
            }
            else if (distance == 2)     // 이동 거리가 두칸일 경우에는 이동을 수행한다.
            {
                // 이전 위치에 있는 세균은 삭제한다.
                remove_virus(sender.player_index, begin_pos);

                // 새로운 위치에 세균을 놓는다.
                put_virus(sender.player_index, target_pos);
            }

            // 목적지를 기준으로 주위에 존재하는 상대방 세균을 감염시켜 같은 편으로 만든다.
            CPlayer opponent = this.room.get_opponent_player();

            infect(target_pos, sender, opponent);

            // 최종 결과를 broadcast한다.
            CPacket msg = CPacket.create((short)PROTOCOL.PLAYER_MOVED);

            msg.push(sender.player_index);      // 누가
            msg.push(begin_pos);                // 어디서
            msg.push(target_pos);               // 어디로 이동 했는지
            this.room.broadcast(msg);
        }
 protected void CloseRegistration()
 {
     MasterManager.CharacterPool.Broadcast(CPacket.SystemMessage($"[Community Event] {sEventName} has closed for new entrants."));
     QR     = "1";
     tStart = DateTime.Now;
 }
 public void send_for_broadcast(CPacket msg)
 {
     this.owner.send(msg);
 }
Beispiel #54
0
 public void SendToClient(RemoteID remote, IRemoteClient client, CMessage msg, CPackOption op)
 {
     PreparePacket(remote, RemoteID.Remote_Server, msg, op);
     client.SendToRemote(CPacket.create(msg));
 }
Beispiel #55
0
 public void Send(CPacket msg)
 {
     gameserver.send(msg);
 }
Beispiel #56
0
        public void CreateMiniRoom(Character c, MR_Type nType, CInPacket p)
        {
            switch (nType)
            {
            case MR_Type.Omok:
                // todo
                break;

            case MR_Type.MemoryGame:
                // todo
                break;

            case MR_Type.TradingRoom:
                if (c.CurMiniRoom != null)
                {
                    c.SendPacket(CPacket.SystemMessage("You are already in a trade."));
                }
                else
                {
                    Log.Debug($"Adding trade mini room to field minirooms.");
                    Add(new CTradingRoom(c));
                }
                break;

            // Recv [CP_MiniRoom] 90 00 00 05 07 00 70 65 65 66 61 63 65 00 01 00 76 C0 4C 00
            case MR_Type.PersonalShop:
                c.SendMessage("no");
                break;

            case MR_Type.EntrustedShop:
            {
                // TODO check closeness to other shops
                var sTitle = p.DecodeString();
                p.Skip(3);         // TODO what is this
                var nShopTemplateId = p.Decode4();

                var(nItemSlot, pItem) = InventoryManipulator.GetAnyItem(c, InventoryType.Cash, nShopTemplateId);

                Log.Info($"Player [{c.Stats.sCharacterName}] attempting to create a shop with ItemID [{nShopTemplateId}] and Title [{sTitle}]");

                if (pItem == null || nItemSlot == 0)
                {
                    c.SendPacket(CPacket.SystemMessage("Invalid item or item slot."));         // packet editing?
                }
                else if (!c.Field.MapId.InRange(910000000, 910000023))
                {
                    c.SendPacket(CPacket.SystemMessage("Item does not work in this map."));
                }
                else if (!ItemConstants.is_entrusted_shop_item(pItem.nItemID))
                {
                    c.SendPacket(CPacket.SystemMessage("Invalid shop item."));         // packet editing??
                }
                else
                {
                    var pMiniRoom = new CEntrustedShop(c, nShopTemplateId, sTitle);

                    if (pMiniRoom.HasItems())
                    {
                        c.SendMessage("Please retrieve items from fredrick before opening a shop.");
                    }
                    else
                    {
                        //Add(pMiniRoom); // packet is sent in here
                    }
                }
                break;
            }

            case MR_Type.CashTradingRoom:
                // todo
                break;

            default:
                break;
            }
        }
 void IPeer.send(CPacket msg)
 {
     this.token.send(msg);
 }
Beispiel #58
0
 public void send(CPacket msg)
 {
     this.send_function(msg);
 }