/// <summary> /// /// </summary> internal void OnLeavedMapSpaceNode(BaseCharacter character, MapSpaceNode mapSpaceNode) { EventHandler <CharacterLeaveSpaceNodeEventArgs> tempEventArgs = m_EventCharacterLeavedSpaceNode; if (tempEventArgs != null) { CharacterLeaveSpaceNodeEventArgs eventArgs = new CharacterLeaveSpaceNodeEventArgs(character, mapSpaceNode); tempEventArgs(this, eventArgs); } }
/// <summary> /// /// </summary> internal void OnLeavingMapSpaceNode(WorldEntity worldEntity, MapSpaceNode mapSpaceNode) { EventHandler <WorldEntityLeaveSpaceNodeEventArgs> tempEventArgs = m_EventWorldEntityLeavingSpaceNode; if (tempEventArgs != null) { WorldEntityLeaveSpaceNodeEventArgs eventArgs = new WorldEntityLeaveSpaceNodeEventArgs(worldEntity, mapSpaceNode); tempEventArgs(this, eventArgs); } }
/// <summary> /// /// </summary> internal void OnLeavedMapSpaceNode(BaseItem item, MapSpaceNode mapSpaceNode) { EventHandler <ItemLeaveSpaceNodeEventArgs> tempEventArgs = m_EventItemLeavedSpaceNode; if (tempEventArgs != null) { ItemLeaveSpaceNodeEventArgs eventArgs = new ItemLeaveSpaceNodeEventArgs(item, mapSpaceNode); tempEventArgs(this, eventArgs); } }
/// <summary> /// /// </summary> internal void OnLeavedMapSpaceNode(BaseCreature creature, MapSpaceNode mapSpaceNode) { EventHandler <CreatureLeaveSpaceNodeEventArgs> tempEventArgs = m_EventCreatureLeavedSpaceNode; if (tempEventArgs != null) { CreatureLeaveSpaceNodeEventArgs eventArgs = new CreatureLeaveSpaceNodeEventArgs(creature, mapSpaceNode); tempEventArgs(this, eventArgs); } }
/// <summary> /// /// </summary> /// <param name="mapSpaceNode"></param> public void CheckToDeadSpaceNode( MapSpaceNode mapSpaceNode ) { Debug.Assert( mapSpaceNode != null, "PartitionSpaceStrategy.DeactivateSpaceNode(...) - mapSpaceNode == null error!" ); MapSpaceNode parentMapSpaceNode = mapSpaceNode.Parent; Debug.Assert( parentMapSpaceNode != null, "PartitionSpaceStrategy.DeactivateSpaceNode(...) - parentMapSpaceNode == null error!" ); ReaderWriterLockSlimEx.EnterWriteLock( m_LockAllSpaceNodes ); { do { MapSpaceNode outValue = null; if ( m_DeactivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == false ) break; int iGridCellPointX = parentMapSpaceNode.RankIndex.Rank0Index * MAX_NUMBER_OF_CELLS; int iGridCellPointY = parentMapSpaceNode.RankIndex.Rank1Index * MAX_NUMBER_OF_CELLS; MapSpaceNode subSpaceNode1 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index - 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index - 1, mapSpaceNode.Owner ); ; if ( subSpaceNode1 != null && this.IsDeadOrDeactivate( subSpaceNode1 ) == false ) break; MapSpaceNode subSpaceNode2 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index - 1, mapSpaceNode.Owner ); ; if ( subSpaceNode2 != null && this.IsDeadOrDeactivate( subSpaceNode2 ) == false ) break; MapSpaceNode subSpaceNode3 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index + 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index - 1, mapSpaceNode.Owner ); ; if ( subSpaceNode3 != null && this.IsDeadOrDeactivate( subSpaceNode3 ) == false ) break; MapSpaceNode subSpaceNode4 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index - 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index, mapSpaceNode.Owner ); ; if ( subSpaceNode4 != null && this.IsDeadOrDeactivate( subSpaceNode4 ) == false ) break; // DeactivateSpaceNode5 == SelfSpaceNode MapSpaceNode subSpaceNode6 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index + 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index, mapSpaceNode.Owner ); ; if ( subSpaceNode6 != null && this.IsDeadOrDeactivate( subSpaceNode6 ) == false ) break; MapSpaceNode subSpaceNode7 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index - 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index + 1, mapSpaceNode.Owner ); if ( subSpaceNode7 != null && this.IsDeadOrDeactivate( subSpaceNode7 ) == false ) break; MapSpaceNode subSpaceNode8 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index + 1, mapSpaceNode.Owner ); ; if ( subSpaceNode8 != null && this.IsDeadOrDeactivate( subSpaceNode8 ) == false ) break; MapSpaceNode subSpaceNode9 = this.GetSubSpaceNode( iGridCellPointX + mapSpaceNode.RankIndex.Rank0Index + 1, iGridCellPointY + mapSpaceNode.RankIndex.Rank1Index + 1, mapSpaceNode.Owner ); ; if ( subSpaceNode9 != null && this.IsDeadOrDeactivate( subSpaceNode9 ) == false ) break; // All DeadOrDeactivate this.DeadSelfSpaceNode( mapSpaceNode ); } while ( false ); } ReaderWriterLockSlimEx.ExitWriteLock( m_LockAllSpaceNodes ); }
/// <summary> /// /// </summary> internal void OnUpdatedMapSpaceNode( MapSpaceNode mapSpaceNode, WorldEntity gameEntity ) { EventHandler<UpdatedMapSpaceNodeEventArgs> tempAfterEventArgs = m_EventUpdatedMapSpaceNode; if ( tempAfterEventArgs != null ) { UpdatedMapSpaceNodeEventArgs eventArgs = new UpdatedMapSpaceNodeEventArgs( mapSpaceNode, gameEntity ); tempAfterEventArgs( this, eventArgs ); } }
/// <summary> /// /// </summary> /// <param name="mapSpaceNode"></param> private void DeactivateSpaceNodeNow( MapSpaceNode mapSpaceNode ) { BaseCreature[] creatureArray = mapSpaceNode.ToArrayInCreatures(); foreach ( BaseCreature creature in creatureArray ) creature.OnSpaceNodeDeactivate(); BaseItem[] itemArray = mapSpaceNode.ToArrayInItems(); foreach ( BaseItem item in itemArray ) item.OnSpaceNodeDeactivate(); WorldEntity[] entityArray = mapSpaceNode.ToArrayInEntitys(); foreach ( WorldEntity gameEntity in entityArray ) gameEntity.OnSpaceNodeDeactivate(); }
/// <summary> /// 开始静止物体行为 /// </summary> /// <param name="mapSpaceNode"></param> private void DeadSelfSpaceNode( MapSpaceNode mapSpaceNode ) { MapSpaceNode outValue = null; if ( m_DeactivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { m_DeactivateSpaceNodes.Remove( mapSpaceNode ); m_DeadSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); this.DeactivateSpaceNodeNow( mapSpaceNode ); } else if ( m_ActivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { // 如果是在激活状态就跳过不用静止物体 } else if ( m_DeadSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == false ) { m_DeadSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); this.DeactivateSpaceNodeNow( mapSpaceNode ); } }
/// <summary> /// /// </summary> /// <param name="mapSpaceNode"></param> /// <returns></returns> private bool IsDeadOrDeactivate( MapSpaceNode mapSpaceNode ) { MapSpaceNode outValue = null; if ( m_DeactivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) return true; if ( m_DeadSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) return true; return false; }
/// <summary> /// 地图节点已不活动,但现在还不是静止物体行为的时候,需要检查邻边的节点 /// </summary> /// <param name="mapSpaceNode"></param> private void DeactivateSelfSpaceNode( MapSpaceNode mapSpaceNode ) { MapSpaceNode outValue = null; if ( m_ActivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { m_ActivateSpaceNodes.Remove( mapSpaceNode ); m_DeactivateSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); } else if ( m_DeadSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { // 如果已经在静止的状态就跳过 } else if ( m_DeactivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == false ) m_DeactivateSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); }
/// <summary> /// 激活邻边的节点 /// </summary> /// <param name="mapSpaceNode"></param> private void ActivateNearSpaceNode( MapSpaceNode mapSpaceNode ) { MapSpaceNode outValue = null; if ( m_DeactivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { // 如果已经在不活动的状态就跳过 } else if ( m_DeadSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == true ) { m_DeadSpaceNodes.Remove( mapSpaceNode ); m_DeactivateSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); this.ActivateSpaceNodeNow( mapSpaceNode ); } else if ( m_ActivateSpaceNodes.TryGetValue( mapSpaceNode, out outValue ) == false ) { m_DeactivateSpaceNodes.Add( mapSpaceNode, mapSpaceNode ); this.ActivateSpaceNodeNow( mapSpaceNode ); } }
/// <summary> /// 初始化构造 /// </summary> /// <param name="baseCreature"></param> public UpdatedMapSpaceNodeEventArgs( MapSpaceNode mapSpaceNode, WorldEntity gameEntity ) : base( gameEntity ) { m_OldMapSpaceNode = mapSpaceNode; }
/// <summary> /// 初始化构造 /// </summary> /// <param name="baseCreature"></param> public UpdatingMapSpaceNodeEventArgs( MapSpaceNode mapSpaceNode, WorldEntity gameEntity ) : base( gameEntity ) { m_NewMapSpaceNode = mapSpaceNode; }