/// <summary> /// /// </summary> public virtual void BroadcastValueUpdate() { if ( m_isInWorld == false ) return; // 广播周围的数据 if ( m_KnownCharacters.Count > 0 ) { foreach ( WowCharacter character in m_KnownCharacters ) { if ( character.KnowsOf( this ) == true ) { MemoryPacket updatePacket = new MemoryPacket(); WriteObjectValueUpdate( updatePacket, false ); character.AddUpdateData( updatePacket, 1 ); } } } // 添加自己的数据 MemoryPacket selfPacket = new MemoryPacket(); WriteObjectValueUpdate( selfPacket, true ); AddUpdateData( selfPacket, 1 ); ResetUpdateInfo(); }
/// <summary> /// /// </summary> /// <param name="dt"></param> public virtual void OnUpdate( object sender, ProcessSliceEventArgs eventArgs ) { if ( m_isInWorld == false ) return; uint uiUpdateCount = 0; MemoryPacket memoryPacket = new MemoryPacket(); // 把自己改变得值广播到附近 this.BroadcastValueUpdate(); // 开始更新道具 // 开始更新 新的游戏道具 if ( m_NewItems.Count > 0 ) { WowItem[] newItemArray = m_NewItems.ToArrayAndClear(); foreach ( var newItem in newItemArray ) { //item.OnInsert(); newItem.ObjectCreationUpdate( memoryPacket, true ); //obj.m_isInWorld = true; } uiUpdateCount += (uint)newItemArray.Length; } // 结束更新 新的游戏道具 // 开始跟新 存在的游戏道具 WowItem[] ownedItemArray = m_OwnedItemsRequiringUpdates.ToArrayAndClear(); foreach ( var ownedItem in ownedItemArray ) ownedItem.BroadcastValueUpdate(); // 结束跟新 存在的游戏道具 // 检测 if ( ( eventArgs.UpdateTime - m_PreUpdateTime ) < ProcessServer.WowZoneCluster.World.UpdateWorldSpeed && uiUpdateCount > 0 ) { // 仅仅更新道具,就发送数据 然后退出 // 完成更新 this.AddUpdateData( memoryPacket, uiUpdateCount ); this.SendUpdates(); return; } // 如果还需要更新人物等。。。 HashSet<WorldEntity> newWorldEntity = new HashSet<WorldEntity>(); // 获取附近的对象 IEnumerable<WorldEntity> nearbyWorldEntity = this.GetAllEntitysInRange( WowCharacter.BROAD_CAST_RANGE ); // 排除已存在的对象 newWorldEntity.AddRange( nearbyWorldEntity ); newWorldEntity.ExceptWith( m_KnownEntity ); newWorldEntity.Remove( this ); // 开始更新 新的游戏物体 foreach ( WorldEntity entity in newWorldEntity ) { WowCharacter wowCharacter = entity as WowCharacter; if ( wowCharacter != null ) m_KnownCharacters.Add( wowCharacter ); IWowUpdate wowUpdate = entity.GetComponent<IWowUpdate>( WowUpdate.WOW_UPDATE_COMPONENT_ID ); if ( wowUpdate != null ) wowUpdate.ObjectCreationUpdate( memoryPacket, false ); //OnEncountered( obj ); } uiUpdateCount += (uint)newWorldEntity.Count; // 结束更新 新的游戏物体 // 获取已不再附近的对象 HashSet<WorldEntity> outOfRangeWorldEntity = new HashSet<WorldEntity>(); // 排除已不存在的对象 outOfRangeWorldEntity.AddRange( m_KnownEntity ); outOfRangeWorldEntity.ExceptWith( nearbyWorldEntity ); foreach ( WorldEntity entity in outOfRangeWorldEntity ) { WowCharacter wowCharacter = entity as WowCharacter; if ( wowCharacter != null ) m_KnownCharacters.Remove( wowCharacter ); // m_outOfRange.Add(obj.EntityId); //OnOutOfRange( obj ); } // 添加现在已存在附近的游戏物体 m_KnownEntity.Clear(); m_KnownEntity.AddRange( nearbyWorldEntity ); // 完成更新 if ( uiUpdateCount > 0 ) { this.AddUpdateData( memoryPacket, uiUpdateCount ); this.SendUpdates(); } foreach ( var entity in outOfRangeWorldEntity ) { // send the destroy packet IWowUpdate wowUpdate = entity.GetComponent<IWowUpdate>( WowUpdate.WOW_UPDATE_COMPONENT_ID ); if ( wowUpdate != null ) wowUpdate.SendDestroyToPlayer( this ); } m_PreUpdateTime = eventArgs.UpdateTime; }