Exemplo n.º 1
0
        public static EnterWorld read(BinaryReader binaryReader)
        {
            EnterWorld newObj = new EnterWorld();

            newObj.gid     = binaryReader.ReadUInt32();
            newObj.account = PStringChar.read(binaryReader);
            return(newObj);
        }
Exemplo n.º 2
0
        public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters)
        {
            var operation = new EnterWorld(peer.Protocol, request);
            if (!operation.IsValid)
            {
                return new OperationResponse(request.OperationCode) { ReturnCode = (int)ErrorCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() };
            }

            MmoWorld world = MmoWorld.Instance;

            var actor = new MmoActor(peer, world, interestArea);
            var avatar = new MmoItem(world, operation.Position, operation.Rotation, operation.Properties, actor, operation.Username, (byte)ItemType.Avatar);

            while (world.ItemCache.AddItem(avatar) == false)
            {
                Item otherAvatarItem;
                if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem))
                {
                    avatar.Dispose();
                    actor.Dispose();
                    interestArea.Dispose();

                    ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters);

                    // request continued later, no response here
                    return null;
                }
            }

            // init avatar
            actor.AddItem(avatar);
            actor.Avatar = avatar;

            ((Peer)peer).SetCurrentOperationHandler(actor);

            // set return values
            var responseObject = new EnterWorldResponse
            {
            };

            // send response; use item channel to ensure that this event arrives before any move or subscribe events
            var response = new OperationResponse(request.OperationCode, responseObject);
            sendParameters.ChannelId = Settings.ItemEventChannel;
            peer.SendOperationResponse(response, sendParameters);

            avatar.Spawn(operation.Position);

            // response already sent
            return null;
        }
Exemplo n.º 3
0
        public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters)
        {
            try {
                var operation = new EnterWorld(peer.Protocol, request);
                if (!operation.IsValid)
                {
                    return(new OperationResponse(request.OperationCode)
                    {
                        ReturnCode = (int)ReturnCode.InvalidOperationParameter,
                        DebugMessage = operation.GetErrorMessage()
                    });
                }

                MmoWorld world;
                if (MmoWorldCache.Instance(application).TryGet(operation.WorldName, out world) == false)
                {
                    return(operation.GetOperationResponse((int)ReturnCode.WorldNotFound, "WorldNotFound", new System.Collections.Hashtable()));
                }
                var interestArea = new MmoClientInterestArea(peer, operation.InterestAreaId, world)
                {
                    ViewDistanceEnter = operation.ViewDistanceEnter.ToVector(true),
                    ViewDistanceExit  = operation.ViewDistanceExit.ToVector(true)
                };

                PlayerCharacter character = new PlayerCharacter();
                character.SetCharacterId(operation.CharacterId);
                character.SetModel(operation.Model);
                character.SetName(operation.Name);
                character.SetRace((Race)operation.Race);
                character.SetWorkshop((Workshop)operation.Workshop);
                character.Login = operation.Login;

                Type[] components = new Type[] {
                    typeof(MmoActor),
                    typeof(AIState),
                    typeof(PlayerCharacterObject),
                    typeof(RaceableObject),
                    typeof(MmoMessageComponent),
                    typeof(PlayerShip),
                    typeof(ShipWeapon),
                    typeof(PlayerSkills),
                    typeof(PlayerBonuses),
                    typeof(PlayerLoaderObject),
                    typeof(ShipBasedDamagableObject),
                    typeof(PlayerTarget),
                    typeof(ShipEnergyBlock),
                    typeof(PlayerShipMovable),
                    typeof(PassiveBonusesComponent),
                    typeof(PlayerTimedEffects),
                    typeof(PetManager),
                    typeof(PlayerEventSubscriber),
                    typeof(ContractManager),
                    typeof(AchievmentComponent),
                    typeof(QuestManager)
                    //typeof(QuestManager),
                    //typeof(DialogManager)
                };

                Dictionary <byte, object> tags = new Dictionary <byte, object> {
                    { (byte)PlayerTags.GameRefId, operation.GameRefId },
                    { (byte)PlayerTags.CharacterId, character.CharacterId },
                    { (byte)PlayerTags.Race, character.Race },
                    { (byte)PlayerTags.Workshop, character.Workshop },
                    { (byte)PlayerTags.Name, (character.Name != null) ? character.Name : string.Empty },
                    { (byte)PlayerTags.Model, character.Model },
                    { (byte)PlayerTags.Login, operation.Login }
                };
                //var actor = new MmoActor(peer, world, interestArea, operation.GameRefId, character, application);
                log.InfoFormat("before creating player item = {0}", operation.GameRefId);
                var avatar = new MmoItem(peer, interestArea, world, application, operation.Position, operation.Rotation, operation.Properties, operation.GameRefId, tags, 1f, 0, components);
                avatar.GetComponent <MmoActor>().SetApplication(application);
                log.InfoFormat("init player item at position = {0}", operation.Position.ToVector3());
                log.InfoFormat("Before Start() player");
                avatar.GetComponent <DamagableObject>().SetIgnoreDamageAtStart(true);
                avatar.GetComponent <DamagableObject>().SetIgnoreDamageInterval(30);
                avatar.Update(0);
                log.InfoFormat("Before Load() player");


                log.InfoFormat("calling load on avatar [dy]");
                avatar.GetComponent <PlayerLoaderObject>().Load();

                while (world.ItemCache.AddItem(avatar) == false)
                {
                    Item otherAvatarItem;
                    if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem))
                    {
                        avatar.Dispose();
                        avatar.GetComponent <MmoActor>().Dispose();
                        interestArea.Dispose();
                        ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters);
                        return(null);
                    }
                }

                log.Info("After adding player to world");


                //actor.AddItem(avatar);
                //actor.Avatar = avatar;
                //actor.Initialize();
                //actor.Target.ResetTarget();

                ((Peer)peer).SetCurrentOperationHandler(avatar.GetComponent <MmoActor>());
                log.Info("Set player item operation handler to Actor");

                var responseObject = new EnterWorldResponse {
                    BottomRightCorner = world.Area.Max.ToFloatArray(3),
                    TopLeftCorner     = world.Area.Min.ToFloatArray(3),
                    TileDimensions    = world.TileDimensions.ToFloatArray(3),
                    WorldName         = world.Name,
                    Content           = world.GetInfo(),
                    ItemId            = avatar.Id,
                    components        = avatar.componentIds,
                    size    = avatar.size,
                    subZone = avatar.subZone
                              //startAtStation = operation.EnterAtStation
                };
                log.InfoFormat("Components = {0} sended to player back", avatar.componentIds.Length);


                var response = new OperationResponse(request.OperationCode, responseObject);
                sendParameters.ChannelId = Settings.ItemEventChannel;
                peer.SendOperationResponse(response, sendParameters);
                log.Info("World entered response sended back");

                lock (interestArea.SyncRoot) {
                    interestArea.AttachToItem(avatar);
                    interestArea.UpdateInterestManagement();
                }

                avatar.Spawn(operation.Position);
                log.Info("Avatar Spawn fire....");

                return(null);
            } catch (Exception ex) {
                CL.Out(LogFilter.PLAYER, ex.Message);
                CL.Out(LogFilter.PLAYER, ex.StackTrace);
            }
            return(null);
        }
Exemplo n.º 4
0
    public override bool acceptMessageData(BinaryReader messageDataReader, TreeView outputTreeView)
    {
        bool handled = true;

        PacketOpcode opcode = Util.readOpcode(messageDataReader);

        switch (opcode)
        {
        case PacketOpcode.CLIENT_REQUEST_ENTER_GAME_EVENT:
        case PacketOpcode.Evt_Admin__GetServerVersion_ID: {
            EmptyMessage message = new EmptyMessage(opcode);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.CHARACTER_GENERATION_VERIFICATION_RESPONSE_EVENT: {
            CharGenVerificationResponse message = CharGenVerificationResponse.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.CHARACTER_EXIT_GAME_EVENT: {
            LogOff message = LogOff.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        // TODO: CHARACTER_PREVIEW_EVENT
        case PacketOpcode.CHARACTER_DELETE_EVENT: {
            CharacterDelete message = CharacterDelete.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.CHARACTER_CREATE_EVENT: {
            CharacterCreate message = CharacterCreate.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.CHARACTER_ENTER_GAME_EVENT: {
            EnterWorld message = EnterWorld.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.CONTROL_FORCE_OBJDESC_SEND_EVENT: {
            ForceObjdesc message = ForceObjdesc.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.Evt_Admin__Friends_ID: {
            Friends message = Friends.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.Evt_Admin__AdminRestoreCharacter_ID: {
            AdminRestoreCharacter message = AdminRestoreCharacter.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        case PacketOpcode.ACCOUNT_BOOTED_EVENT:
        {
            AccountBootedEvent message = AccountBootedEvent.read(messageDataReader);
            message.contributeToTreeView(outputTreeView);
            break;
        }

        default: {
            handled = false;
            break;
        }
        }

        return(handled);
    }
Exemplo n.º 5
0
        /// <summary>
        ///   Expects operation <see cref = "EnterWorld" /> and creates a new <see cref = "MmoActor" /> with a new <see cref = "MmoItem" /> as avatar and a new <see cref = "MmoClientInterestArea" />.
        ///   The <see cref = "MmoActor" /> becomes the new <see cref = "Peer.CurrentOperationHandler">operation handler</see>.
        ///   If another <see cref = "MmoActor" /> with the same name exists he is disconnected.
        ///   An <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.Ok" /> is published on success.
        /// </summary>
        /// <param name = "peer">
        ///   The client peer.
        /// </param>
        /// <param name = "request">
        ///   The request.
        /// </param>
        /// <param name = "sendParameters">
        ///   The send Parameters.
        /// </param>
        /// <returns>
        ///   Null or an <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.WorldNotFound" />.
        /// </returns>
        public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters)
        {
            var operation = new EnterWorld(peer.Protocol, request);

            if (!operation.IsValid)
            {
                return(new OperationResponse(request.OperationCode)
                {
                    ReturnCode = (int)ReturnCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage()
                });
            }

            MmoWorld world;

            if (MmoWorldCache.Instance.TryGet(operation.WorldName, out world) == false)
            {
                return(operation.GetOperationResponse((int)ReturnCode.WorldNotFound, "WorldNotFound"));
            }

            var interestArea = new MmoClientInterestArea(peer, operation.InterestAreaId, world)
            {
                ViewDistanceEnter = operation.ViewDistanceEnter.ToVector(), ViewDistanceExit = operation.ViewDistanceExit.ToVector()
            };

            var actor  = new MmoActor(peer, world, interestArea);
            var avatar = new MmoItem(world, operation.Position, operation.Rotation, operation.Properties, actor, operation.Username, (byte)ItemType.Avatar);

            while (world.ItemCache.AddItem(avatar) == false)
            {
                Item otherAvatarItem;
                if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem))
                {
                    avatar.Dispose();
                    actor.Dispose();
                    interestArea.Dispose();

                    ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters);

                    // request continued later, no response here
                    return(null);
                }
            }

            // init avatar
            actor.AddItem(avatar);
            actor.Avatar = avatar;

            ((Peer)peer).SetCurrentOperationHandler(actor);

            // set return values
            var responseObject = new EnterWorldResponse
            {
                BottomRightCorner = world.Area.Max.ToFloatArray(2),
                TopLeftCorner     = world.Area.Min.ToFloatArray(2),
                TileDimensions    = world.TileDimensions.ToFloatArray(2),
                WorldName         = world.Name
            };

            // send response; use item channel to ensure that this event arrives before any move or subscribe events
            var response = new OperationResponse(request.OperationCode, responseObject);

            sendParameters.ChannelId = Settings.ItemEventChannel;
            peer.SendOperationResponse(response, sendParameters);

            lock (interestArea.SyncRoot)
            {
                interestArea.AttachToItem(avatar);
                interestArea.UpdateInterestManagement();
            }

            avatar.Spawn(operation.Position);
            world.Radar.AddItem(avatar, operation.Position);

            // response already sent
            return(null);
        }
Exemplo n.º 6
0
        public static void handlePacket(GameClient client, byte[] buff)
        {
            byte   id     = buff[0];
            string cninfo = "handlepacket: request " + id.ToString("x2") + " size " + buff.Length;

            string str = "header: " + buff[0].ToString("x2") + "\n";

            foreach (byte b in buff)
            {
                str += b.ToString("x2") + " ";
            }

            Console.WriteLine(str);
            //File.WriteAllText("header_" + buff[0].ToString("x2")+".txt", str);


            GameServerNetworkRequest msg = null;

            switch (id)
            {
            case 0x00:
                msg = new ProtocolVersion(client, buff);
                break;

            case 0x08:
                msg = new AuthLogin(client, buff);
                break;

            case 0x09:
                msg = new Logout(client, buff);
                break;

            case 0x0b:
                msg = new CharacterCreate(client, buff);
                break;

            //case 0x0c:
            //    msg = new CharacterDelete(client, buff);
            //    break;
            case 0x0d:
                msg = new CharacterSelected(client, buff);
                break;

            case 0x0e:
                msg = new NewCharacter(client, buff);
                break;
            //case 0x62:
            //    msg = new CharacterRestore(client, buff);
            //    break;
            //case 0x68:
            //    msg = new RequestPledgeCrest(client, buff);
            //    break;

            //case 0x0c:
            //    msg = new CharacterCreate(client, buff);
            //    break;
            //case 0x00:
            //    msg = new ProtocolVersion(client, buff);
            //    break;
            //case 0x09:
            //    msg = new RequestSetPledgeCrest(client, buff);
            //    break;
            case 0x01:
                msg = new MoveBackwardToLocation(client, buff);
                break;

            case 0x03:
                msg = new EnterWorld(client, buff);
                break;

            case 0x0f:
                msg = new RequestItemList(client, buff);
                break;

            case 0x11:
                msg = new RequestUnEquipItem(client, buff);
                break;

            case 0x14:
                msg = new RequestUseItem(client, buff);
                break;

            case 0x1A:
                msg = new RequestStartTrade(client, buff);
                break;

            case 0x16:
                msg = new RequestAddTradeItem(client, buff);
                break;

            case 0x17:
                msg = new RequestTradeDone(client, buff);
                break;

            case 0x04:
                msg = new RequestAction(client, buff);
                break;

            case 0x20:
                msg = new RequestLinkHtml(client, buff);
                break;

            case 0x21:
                msg = new RequestBypassToServer(client, buff);
                break;

            case 0x26:
                msg = new RequestWithdrawalPledge(client, buff);
                break;

            case 0x8c:
                msg = new RequestGetItemFromPet(client, buff);
                break;

            case 0x1b:
                msg = new RequestSocialAction(client, buff);
                break;

            case 0x1e:
                msg = new RequestSellItem(client, buff);
                break;

            case 0x2f:
                msg = new RequestMagicSkillUse(client, buff);
                break;

            case 0x30:
                msg = new Appearing(client, buff);
                break;

            case 0x3B:
                msg = new RequestWarehouseDeposit(client, buff);
                break;

            case 0x32:
                msg = new RequestWarehouseWithdraw(client, buff);
                break;

            case 0x33:
                msg = new RequestShortCutReg(client, buff);
                break;

            case 0x35:
                msg = new RequestShortCutDel(client, buff);
                break;

            case 0x1f:
                msg = new RequestBuyItem(client, buff);
                break;

            case 0x29:
                msg = new RequestJoinParty(client, buff);
                break;

            case 0x2a:
                msg = new RequestAnswerJoinParty(client, buff);
                break;

            case 0x2b:
                msg = new RequestWithDrawalParty(client, buff);
                break;

            case 0x2c:
                msg = new RequestOustPartyMember(client, buff);
                break;

            case 0x36:
                msg = new CannotMoveAnymore(client, buff);
                break;

            case 0x37:
                msg = new RequestTargetCanceld(client, buff);
                break;

            case 0x38:
                msg = new Say2(client, buff);
                break;

            case 0x42:
                msg = new RequestGetOnVehicle(client, buff);
                break;

            case 0x43:
                msg = new RequestGetOffVehicle(client, buff);
                break;

            case 0x44:
                msg = new AnswerTradeRequest(client, buff);
                break;

            case 0x45:
                msg = new RequestActionUse(client, buff);
                break;

            case 0x46:
                msg = new RequestRestart(client, buff);
                break;

            case 0x48:
                msg = new ValidatePosition(client, buff);
                break;

            case 0x4a:
                msg = new StartRotating(client, buff);
                break;

            case 0x4b:
                msg = new FinishRotating(client, buff);
                break;

            case 0x57:
                msg = new RequestShowBoard(client, buff);
                break;

            case 0x58:
                msg = new RequestEnchantItem(client, buff);
                break;

            case 0x59:
                msg = new RequestDestroyItem(client, buff);
                break;

            case 0x64:
                msg = new RequestQuestAbort(client, buff);
                break;

            case 0x66:
                msg = new RequestPledgeInfo(client, buff);
                break;

            case 0xcd:
                msg = new RequestShowMiniMap(client, buff);
                break;

            case 0x6D:
                msg = new RequestSendMsnChatLog(client, buff);
                break;

            case 0xcf:
                msg = new RequestRecordInfo(client, buff);
                break;

            case 0x73:
                msg = new RequestAcquireSkillInfo(client, buff);
                break;

            case 0x74:
                msg = new SendBypassBuildCmd(client, buff);
                break;

            case 0x75:
                msg = new RequestMoveToLocationInVehicle(client, buff);
                break;

            case 0x7C:
                msg = new RequestAcquireSkill(client, buff);
                break;

            case 0x7D:
                msg = new RequestRestartPoint(client, buff);
                break;

            case 0x80:
                msg = new RequestPartyMatchList(client, buff);
                break;

            case 0x85:
                msg = new RequestTutorialLinkHtml(client, buff);
                break;

            case 0x86:
                msg = new RequestTutorialPassCmdToServer(client, buff);
                break;
            //  case 0x87:
            //      msg = new RequestTutorialQuestionMark();
            //     break;

            case 0x93:
                msg = new RequestChangePetName(client, buff);
                break;

            case 0x94:
                msg = new RequestPetUseItem(client, buff);
                break;

            case 0x95:
                msg = new RequestGiveItemToPet(client, buff);
                break;

            case 0xB0:
                msg = new MultiSellChoose(client, buff);
                break;

            case 0xB1:
                msg = new NetPingResponse(client, buff);
                break;

            case 0xaa:
                msg = new BypassUserCmd(client, buff);
                break;

            case 0xB5:
                msg = new RequestRecipeBookOpen(client, buff);
                break;

            case 0xB6:
                msg = new RequestRecipeBookDestroy(client, buff);
                break;

            case 0xB7:
                msg = new RequestRecipeItemMakeInfo(client, buff);
                break;

            case 0xB8:
                msg = new RequestRecipeItemMakeSelf(client, buff);
                break;

            case 0xC1:
                msg = new ObserverReturn(client, buff);
                break;

            case 0xC7:
                msg = new RequestWearItem(client, buff);
                break;

            case 0xD0:
                byte id2 = buff[1];
                cninfo = "handlepacket: request unk id2 " + id2.ToString("x2") + " size " + buff.Length;
                switch (id2)
                {
                case 8:
                    msg = new RequestManorList(client, buff);
                    break;

                case 0x11:
                    msg = new RequestExSetPledgeCrestLarge(client, buff);
                    break;

                case 5:
                    msg = new RequestAutoSoulShot(client, buff);
                    break;

                case 0x16:
                    msg = new RequestPledgeMemberInfo(client, buff);
                    break;


                case 0x1E:
                    msg = new RequestExRqItemLink(client, buff);
                    break;

                case 0x24:
                    msg = new RequestSaveInventoryOrder(client, buff);
                    break;

                case 0x22:
                    msg = new RequestCursedWeaponList(client, buff);
                    break;

                case 0x4B:
                    msg = new RequestDispel(client, buff);
                    break;

                case 0x4C:
                    msg = new RequestExTryToPutEnchantTargetItem(client, buff);
                    break;

                case 0x4D:
                    msg = new RequestExTryToPutEnchantSupportItem(client, buff);
                    break;

                case 0x4E:
                    msg = new RequestExCancelEnchantItem(client, buff);
                    break;

                //case 0x51:
                //    byte id3 = buff[3];
                //    cninfo = "handlepacket: request unk id3 " + id3.ToString("x2") + " size " + buff.Length;

                //    switch (id3)
                //    {
                //        case 0:
                //            msg = new RequestBookMarkSlotInfo(client, buff);
                //            break;
                //        case 1:
                //            msg = new RequestSaveBookMarkSlot(client, buff);
                //            break;
                //        case 2:
                //            msg = new RequestModifyBookMarkSlot(client, buff);
                //            break;
                //        case 3:
                //            msg = new RequestDeleteBookMarkSlot(client, buff);
                //            break;
                //        case 4:
                //            msg = new RequestTeleportBookMark(client, buff);
                //            break;
                //    }
                //    break;

                case 0x58:
                    msg = new RequestDominionInfo(client, buff);
                    break;

                case 0x65:
                    msg = new RequestPostItemList(client, buff);
                    break;

                case 0x67:
                    msg = new RequestReceivedPostList(client, buff);
                    break;

                case 0x69:
                    msg = new RequestReceivedPost(client, buff);
                    break;

                case 0x6C:
                    msg = new RequestSentPostList(client, buff);
                    break;

                case 0x6E:
                    msg = new RequestSentPost(client, buff);
                    break;

                case 0x76:
                    msg = new RequestBuySellUIClose(client, buff);
                    break;

                case 0x78:
                    msg = new RequestPartyLootModification(client, buff);
                    break;

                case 0x79:
                    msg = new AnswerPartyLootModification(client, buff);
                    break;

                case 0x7F:
                    msg = new RequestBR_GamePoint(client, buff);
                    break;

                case 0x80:
                    msg = new RequestBR_ProductList(client, buff);
                    break;

                case 0x81:
                    msg = new RequestBR_ProductInfo(client, buff);
                    break;

                case 0x82:
                    msg = new RequestBR_BuyProduct(client, buff);
                    break;

                case 0x83:
                    msg = new RequestBR_RecentProductList(client, buff);
                    break;

                case 0x84:
                    msg = new RequestBR_MinigameLoadScores(client, buff);
                    break;

                case 0x85:
                    msg = new RequestBR_MinigameInsertScore(client, buff);
                    break;

                default:
                    // out_debug(2, buff);
                    break;
                }
                break;

            default:
                //  out_debug(1, buff);
                break;
            }
            // Console.WriteLine(cninfo + ", " + cnt);
            if (msg == null)
            {
                Console.WriteLine(cninfo + ", " + cnt);

                //   out_debug(0, buff);
                //  cnt++;
                return;
            }

            if (msg.Client.IsTerminated)
            {
                return;
            }

            new Thread(new ThreadStart(msg.run)).Start();
        }