Exemple #1
0
 public void LoadScenePlayers()
 {
     if (!isMainClient)
     {
         SendPackage(PackageFactory.GetPackage(PackageType.LoadScenePlayer) as LoadScenePlayerPackage);
     }
 }
Exemple #2
0
    private void OnChunkDataSave(object[] param)
    {
        NetRemovedChunk savedChunk = param[0] as NetRemovedChunk;

        if (savedChunk.needSave)
        {
            Chunk chunk = savedChunk.chunk;
            for (int i = 0; i < savedChunk.changedEntityInfos.Count; i++)
            {
                EntityData       entityData = new EntityData();
                ClientEntityInfo info       = savedChunk.changedEntityInfos[i];
                entityData.id     = info.entityId;
                entityData.type   = info.type;
                entityData.pos    = info.position;
                entityData.exData = info.extData;
                chunk.AddEntityData(entityData);
            }
            NetChunkData netChunkData = WorldPersistanceManager.Instance.GetNetChunkData(chunk, roleId);
            //如果当前客户端是主机客户端,直接保存文件到当前本地,否则,将数据发送给服务器,保存在主机
            if (isMainClient)
            {
                World.world.WorldGenerator.DataProcessorManager.EnqueueSaveNetChunkData(netChunkData);
            }
            else
            {
                PlayerSaveChunkOnServerPackage package = PackageFactory.GetPackage(PackageType.PlayerSaveChunkOnServer)
                                                         as PlayerSaveChunkOnServerPackage;
                package.pos           = chunk.worldPos;
                package.chunkByteData = netChunkData.data.data;
                package.compressType  = (byte)netChunkData.data.compressType;
                package.roleId        = netChunkData.roleId;
                SendPackage(package);
            }
        }
    }
Exemple #3
0
    //addChunk到服务器上必须比UpdateAfterPopulation早,因此,只要数据产生,无论是读取网络数据、本地数据、产生数据都需要发送
    private void OnChunkDataGenerateFinish(object[] param)
    {
        Chunk chunk = param[0] as Chunk;
        PlayerAddChunkPackage package = PackageFactory.GetPackage(PackageType.PlayerAddChunk) as PlayerAddChunkPackage;

        package.pos  = chunk.worldPos;
        package.sign = chunk.GetSign();
        SendPackage(package);
    }
Exemple #4
0
    private void SyncPlayerPosition()
    {
        PositionPackage package    = PackageFactory.GetPackage(PackageType.Position) as PositionPackage;
        GameObject      mainPlayer = HasActionObjectManager.Instance.playerManager.getMyPlayer();

        package.position = mainPlayer.transform.position;
        package.aoId     = mainPlayer.GetComponent <GOPlayerController>().playerAttribute.aoId;
        SendPackage(package);
    }
Exemple #5
0
    public void JoinGame(int playerId)
    {
        EventManager.RegisterEvent(EventMacro.ON_JOIN_SCENE_SUCCESS, OnJoinSceneSuccess);
        Debug.Log("正在进入游戏...");
        JoinGamePackage package = PackageFactory.GetPackage(PackageType.JoinGame) as JoinGamePackage;

        package.roleId   = roleId;
        package.playerId = playerId;
        SendPackage(package);
    }
Exemple #6
0
 private IEnumerator SyncGameTime()
 {
     while (true)
     {
         GameTimePackage package = PackageFactory.GetPackage(PackageType.GameTime) as GameTimePackage;
         package.time = DayNightTime.Instance.TotalTime;
         SendPackage(package);
         yield return(new WaitForSeconds(5f));
     }
 }
Exemple #7
0
 public void LoadSceneEntities()
 {
     if (!isMainClient)
     {
         LoadSceneEntityPackage package = PackageFactory.GetPackage(PackageType.LoadSceneEntity)
                                          as LoadSceneEntityPackage;
         package.list = new List <ClientEntityInfo>();
         SendPackage(package);
     }
 }
        public void GetPackageFailedManifestRead()
        {
            PlatformMock.Setup(p => p.ReadFileText(It.IsAny <string>()))
            .Returns(new Result <string>(ResultCode.Failure));

            PackageFactory test = new PackageFactory(PlatformManagerMock.Object, ManifestExtractorMock.Object, PackageVerifierMock.Object);

            IResult <IPackage> result = test.GetPackage(TempDirectory);

            Assert.Equal(ResultCode.Failure, result.ResultCode);
        }
Exemple #9
0
    public void DelayRefreshEntity(int aoId)
    {
        if (!isConnection)
        {
            return;
        }
        DelayRefreshEntityPackage package = PackageFactory.GetPackage(PackageType.DelayRefreshEntity)
                                            as DelayRefreshEntityPackage;

        package.aoId        = aoId;
        package.needRefresh = false;
        SendPackage(package);
    }
Exemple #10
0
    private void SyncPlayerAction()
    {
        ActionPackage      package    = PackageFactory.GetPackage(PackageType.Action) as ActionPackage;
        GameObject         mainPlayer = HasActionObjectManager.Instance.playerManager.getMyPlayer();
        GOPlayerController controller = mainPlayer.GetComponent <GOPlayerController>();

        package.aoId      = controller.playerAttribute.aoId;
        package.direction = controller.playerInputState.moveDirection;
        package.isJump    = controller.playerInputState.jump;
        package.actionId  = controller.goActionController.curAction.actionData.id;
        package.yRotate   = mainPlayer.transform.localRotation.eulerAngles.y;
        SendPackage(package);
    }
Exemple #11
0
    private void SyncMonsterPosition()
    {
        List <GameObject> list = HasActionObjectManager.Instance.monsterManager.listObj();

        for (int i = 0; i < list.Count; i++)
        {
            MonsterSyncPositionPackage package = PackageFactory.GetPackage(PackageType.MonsterSyncPosition)
                                                 as MonsterSyncPositionPackage;
            package.position = list[i].transform.position;
            package.aoId     = list[i].GetComponent <GameObjectController>().baseAttribute.aoId;
            SendPackage(package);
        }
    }
        public void GetPackage()
        {
            PackageFactory test = new PackageFactory(PlatformManagerMock.Object, ManifestExtractorMock.Object, PackageVerifierMock.Object);

            IResult <IPackage> result = test.GetPackage(TempDirectory);

            string fqn = PackageManifest.Namespace + "." + PackageManifest.Name;

            Assert.Equal(ResultCode.Success, result.ResultCode);
            Assert.Equal(TempDirectory, result.ReturnValue.DirectoryName);
            Assert.Equal(fqn, result.ReturnValue.FQN);
            Assert.Equal(PackageManifest.Name, result.ReturnValue.Manifest.Name);
            Assert.Equal(PackageManifest.Namespace, result.ReturnValue.Manifest.Namespace);
        }
Exemple #13
0
    private void OnBlockUpdateAfterPopulation(object[] param)
    {
        ChunkBlockChangedPackage package = PackageFactory.GetPackage(PackageType.ChunkBlockChanged) as ChunkBlockChangedPackage;
        WorldPos pos       = (WorldPos)param[0];
        int      x         = (int)param[1];
        int      y         = (int)param[2];
        int      z         = (int)param[3];
        Block    b         = (Block)param[4];
        Int16    index     = ClientChangedChunk.GetChunkIndex(x, y, z);
        byte     blockType = (byte)b.BlockType;
        byte     extendId  = b.ExtendId;

        package.pos          = pos;
        package.changedBlock = new ClientChangedBlock(index, blockType, extendId);
        SendPackage(package);
    }
Exemple #14
0
    private void OnChunkDataRemoveFinish(object[] param)
    {
        NetRemovedChunk netRemovedChunk = param[0] as NetRemovedChunk;
        Chunk           chunk           = netRemovedChunk.chunk;
        //当chunk为移除时,向服务器发送chunk移除消息
        PlayerRemoveChunkPackage removePackage = PackageFactory.GetPackage(PackageType.PlayerRemoveChunk) as PlayerRemoveChunkPackage;

        removePackage.pos = chunk.worldPos;
        SendPackage(removePackage);

        if (netRemovedChunk.needSave)
        {
            for (int i = 0; i < netRemovedChunk.changedEntityInfos.Count; i++)
            {
                EntityData       entityData = new EntityData();
                ClientEntityInfo info       = netRemovedChunk.changedEntityInfos[i];
                entityData.id     = info.entityId;
                entityData.type   = info.type;
                entityData.pos    = info.position;
                entityData.exData = info.extData;
                chunk.AddEntityData(entityData);
            }
            NetChunkData netChunkData = WorldPersistanceManager.Instance.GetNetChunkData(chunk, roleId);
            //如果当前客户端是主机客户端,直接保存文件到当前本地,否则,将数据发送给服务器,保存在主机
            if (isMainClient)
            {
                World.world.WorldGenerator.DataProcessorManager.EnqueueSaveNetChunkData(netChunkData);
            }
            else
            {
//				//上面已经移除掉了
//				//先移除
//				PlayerRemoveChunkPackage removeChunkPackage = PackageFactory.GetPackage(PackageType.PlayerRemoveChunk) as PlayerRemoveChunkPackage;
//				removeChunkPackage.pos = chunk.worldPos;
//				SendPackage(removeChunkPackage);
                //先需要从服务器上拿最新的entity数据,更新后再保存
                //再保存
                PlayerSaveChunkOnServerPackage package = PackageFactory.GetPackage(PackageType.PlayerSaveChunkOnServer)
                                                         as PlayerSaveChunkOnServerPackage;
                package.pos           = chunk.worldPos;
                package.chunkByteData = netChunkData.data.data;
                package.compressType  = (byte)netChunkData.data.compressType;
                package.roleId        = netChunkData.roleId;
                SendPackage(package);
            }
        }
    }
Exemple #15
0
    private void InitServerMainPlayerInfo()
    {
        //初始化主玩家的一些信息
        MainClientInitPackage package    = PackageFactory.GetPackage(PackageType.MainClientInit) as MainClientInitPackage;
        GameObject            mainPlayer = HasActionObjectManager.Instance.playerManager.getMyPlayer();

        package.roleId          = roleId;
        package.position        = mainPlayer.transform.position;
        package.aoId            = mainPlayer.GetComponent <PlayerAttributes>().aoId;
        package.playerId        = mainPlayer.GetComponent <PlayerAttributes>().playerId;
        package.worldConfigName = WorldConfig.Instance.name;
        package.seed            = WorldConfig.Instance.seed;
        package.time            = DayNightTime.Instance.TotalTime;
        SendPackage(package);

        //初始化当前玩家内存中的chunk信息到服务器
        foreach (var key in World.world.chunks)
        {
            WorldPos chunkPos = key.Key;
            int      sign     = key.Value.GetSign();
            PlayerAddChunkPackage addChunkPackage = PackageFactory.GetPackage(PackageType.PlayerAddChunk) as PlayerAddChunkPackage;
            addChunkPackage.pos  = chunkPos;
            addChunkPackage.sign = sign;
            SendPackage(addChunkPackage);
        }

        //初始化主玩家的entity信息到服务器上(暂时只同步怪物)
        MainClientEntityInitPackage entityInitPackage = PackageFactory.GetPackage(PackageType.MainClientEntityInit) as MainClientEntityInitPackage;
        List <ClientEntityInfo>     list        = new List <ClientEntityInfo>();
        List <GameObject>           listMonster = HasActionObjectManager.Instance.monsterManager.listObj();

        for (int i = 0; i < listMonster.Count; i++)
        {
            GOMonsterController controller = listMonster[i].GetComponent <GOMonsterController>();
            ClientEntityInfo    info       = new ClientEntityInfo();
            EntityData          entityData = controller.GetEntityData();
            info.roleId   = roleId;
            info.aoId     = controller.monsterAttribute.aoId;
            info.entityId = entityData.id;
            info.type     = EntityType.MONSTER;
            info.position = entityData.pos;
            info.extData  = entityData.exData;
            list.Add(info);
        }
        entityInitPackage.entityInfos = list;
        SendPackage(entityInitPackage);
    }
Exemple #16
0
    private void SyncMonsterAction()
    {
        List <GameObject> list = HasActionObjectManager.Instance.monsterManager.listObj();

        for (int i = 0; i < list.Count; i++)
        {
            MonsterSyncActionPakage package = PackageFactory.GetPackage(PackageType.MonsterSyncAction)
                                              as MonsterSyncActionPakage;
            GameObjectController controller = list[i].GetComponent <GameObjectController>();
            package.aoId      = controller.baseAttribute.aoId;
            package.direction = controller.gameObjectInputState.moveDirection;
            package.isJump    = controller.gameObjectInputState.jump;
            package.actionId  = controller.goActionController.curAction.actionData.id;
            package.yRotate   = list[i].transform.localRotation.eulerAngles.y;
            SendPackage(package);
        }
    }
Exemple #17
0
    public void Connect(string ip, int port)
    {
        Debug.Log("正在连接服务器:" + ip + ":" + port + " ....");
        this.ip   = ip;
        this.port = port;
        TcpConnection conn = new TcpConnection(ip, port, false);

        conn.Connect();

        serverConnectionWorker = new ServerConnectionWorker(conn);
        serverConnectionWorker.Start();

        isConnection = true;
        StartCoroutine(HandleReadPackage());
        //连接成功后缓存当前人物的roleId
        roleId = GetRoleId();
        LinkStatePackage package = PackageFactory.GetPackage(PackageType.LinkState) as LinkStatePackage;

        SendPackage(package);
        AddClientEvents();
    }
Exemple #18
0
    public void DoWork()
    {
        while (true)
        {
//			Debug.Log(this is ClientConnectionWorker ? "ServerDetailWorker:work" : "ClientDetailWorker");
            int length = 0;
            //这里要检测是否有一段可读数据的时候只读一部分仍然检测为可读
            if (conn.CanRead())
            {
                length = conn.Read(buffer);
                if (length > 0)
                {
                    readBuffer.Write(buffer, 0, length);
                }
            }

            if (conn.CanWrite())
            {
                byte[] tempBuffer = writeBuffer.GetDataBuffer();
                int    readPos    = writeBuffer.GetReadPos();
                length = writeBuffer.GetDataLength();
                if (length > 0)
                {
                    int writeLen = conn.Write(tempBuffer, readPos, length);
                    if (length > 0)
                    {
                        writeBuffer.SetReadPos(length, SeekOrigin.Current);
                    }
                }
            }

            if (conn.HasError())
            {
                //Debug.Log ("HasError~~~~~~~~~~~");
                stop = true;
                break;
            }

            //从buffer中读package
            while (!stop)
            {
                int dataLength = readBuffer.GetDataLength();
                if (dataLength < 8)
                {
                    break;
                }
                int packageLeng = readBuffer.ReadInt();
                System.Diagnostics.Debug.Assert(packageLeng > 0);
                if (dataLength < packageLeng)
                {
                    readBuffer.SetReadPos(-4, SeekOrigin.Current);
                    break;
                }
                int        packageId   = readBuffer.ReadInt();
                byte[]     packageData = readBuffer.ReadBytes(packageLeng - 8);
                NetPackage package     = PackageFactory.GetPackage(packageId);
                System.Diagnostics.Debug.Assert(package != null);
                package.Deserialize(packageData);
                package.DeserializeRemoteEndPoint(conn.RemoteEndPoint);
                lock (readPackageQueue)
                {
                    readPackageQueue.Enqueue(package);
                }
            }
            if (stop)
            {
                break;
            }
            lock (writePackageQueue)
            {
                while (writePackageQueue.Count > 0)
                {
                    NetPackage package = writePackageQueue.Dequeue();
                    lock (package)
                    {
                        package.Serialize();
                        MemoryStream ms = package.GetMemoryStream();
                        writeBuffer.Write(ms.GetBuffer(), 0, (int)ms.Length);
                    }
                }
            }
            Thread.Sleep(1);
        }
    }