Exemplo n.º 1
0
//		public bool AddRenderChunkPos(WorldPos pos)
//		{
//			lock(renderChunkPosList)
//			{
//				if(!renderChunkPosList.Contains(pos))
//				{
//					renderChunkPosList.Add(pos);
//					return true;
//				}
//				return false;
//			}
//		}
//
//		public bool RemoveRenderChunkPos(WorldPos pos)
//		{
//			lock(renderChunkPosList)
//			{
//				return renderChunkPosList.Remove(pos);
//			}
//		}

        public void Dispose()
        {
            lock (chunkPosList)
            {
                for (int i = chunkPosList.Count - 1; i >= 0; i--)
                {
                    NetManager.Instance.server.sceneManager.RemovePlayerChunks(this, chunkPosList[i]);
                }
            }

            for (int i = 0; i < viewPlayers.Count; i++)
            {
                ClientPlayer otherPlayer = NetManager.Instance.server.playerManager.GetPlayer(viewPlayers[i]);
                otherPlayer.RemoveViewPlayer(id);
            }

            for (int i = 0; i < viewEntities.Count; i++)
            {
                ClientEntity otherEntity = NetManager.Instance.server.entityManager.GetEntity(viewEntities[i]);
                otherEntity.RemoveViewPlayer(id);
                otherEntity.CheckViewHold();
            }
//			renderChunkPosList.Clear();
            viewPlayers.Clear();
            viewEntities.Clear();
            worker = null;
        }
Exemplo n.º 2
0
        public void UpdateViewEntity()
        {
            List <int> curViewEntities = NetManager.Instance.server.entityManager.GetAroundEntity(inChunkPos, viewWidth);

            for (int i = 0; i < curViewEntities.Count; i++)
            {
                //如果原先已经包含了该玩家,那么跳过
                if (viewEntities.Contains(curViewEntities[i]))
                {
                    RemoveViewEntity(curViewEntities[i]);
                    continue;
                }
                else
                {
                    //如果看见其他怪物了,其他怪物的应用需要更新
                    ClientEntity otherEntity = NetManager.Instance.server.entityManager.GetEntity(curViewEntities[i]);
                    otherEntity.AddViewPlayer(id);

                    //通知当前玩家,有entity进入视野
                    EntityJoinViewPackage entityJoinViewPackage = PackageFactory.GetPackage(PackageType.EntityJoinView)
                                                                  as EntityJoinViewPackage;
                    ClientEntityInfo info = new ClientEntityInfo();
                    info.aoId     = otherEntity.aoId;
                    info.type     = otherEntity.type;
                    info.entityId = otherEntity.entityId;
                    info.position = otherEntity.position;
                    info.extData  = otherEntity.extData;
                    info.roleId   = otherEntity.hostPlayer == null ? -1 : otherEntity.hostPlayer.id;
                    entityJoinViewPackage.info = info;
                    this.worker.SendPackage(entityJoinViewPackage);

                    //更新当前entity所属
                    otherEntity.CheckViewHold();
                }
            }

            //剩下的怪物都是看不见的了
            for (int i = 0; i < viewEntities.Count; i++)
            {
                ClientEntity otherEntity = NetManager.Instance.server.entityManager.GetEntity(viewEntities[i]);
                otherEntity.RemoveViewPlayer(id);

                //通知玩家,有entity退出视野
                EntityLeaveViewPackage entityLeaveViewPackage = PackageFactory.GetPackage(PackageType.EntityLeaveView)
                                                                as EntityLeaveViewPackage;
                entityLeaveViewPackage.aoId = otherEntity.aoId;
                entityLeaveViewPackage.type = otherEntity.type;
                this.worker.SendPackage(entityLeaveViewPackage);

                //更新当前entity所属
                otherEntity.CheckViewHold();
            }
            //最后更新自己能看见的人
            viewEntities = curViewEntities;
        }