public override void Apply()
        {
            if (m_task == null)
            {
                m_task = LogicTask.Create <ComponentCommonTaskWithLastingTime>();
            }

            EffectDefinitionComponent definition_component = ((Effect)ParentObject).GetDefinitionComponent();
            Entity entity = GetLogicWorld().GetEntityManager().GetObject(definition_component.SourceEntityID);

            if (entity != null)
            {
                PositionComponent position_component = entity.GetComponent(PositionComponent.ID) as PositionComponent;
                if (position_component != null)
                {
                    m_direction = position_component.Facing3D;
                }
            }
            m_task.Construct(this, m_time);
            var schedeler = GetLogicWorld().GetTaskScheduler();

            schedeler.Schedule(m_task, GetCurrentTime(), LOGIC_UPDATE_INTERVAL, LOGIC_UPDATE_INTERVAL);
#if COMBAT_CLIENT
            LocomoteRenderMessage msg = RenderMessage.Create <LocomoteRenderMessage>();
            msg.ConstructAsStartMoving(GetOwnerEntityID(), true, LocomoteRenderMessage.NotLocomotion);
            GetLogicWorld().AddRenderMessage(msg);
#endif
        }
예제 #2
0
        public static void KillEntity(Entity entity, int killer_id)
        {
            DeathComponent death_component = entity.GetComponent(DeathComponent.ID) as DeathComponent;

            if (death_component != null)
            {
                death_component.KillOwner(killer_id);
            }
            else
            {
                //Player player = entity.GetOwnerPlayer();
                //Entity killer = entity.GetLogicWorld().GetEntityManager().GetObject(killer_id);
                //player.OnEntityBeKilled(killer, entity);
                //if (killer != null)
                //{
                //    Player killer_player = killer.GetOwnerPlayer();
                //    killer_player.OnKillEntity(killer, entity);
                //}

                //没有死亡组件的就从简了
                entity.SendSignal(SignalType.Die);
                entity.GetLogicWorld().AddSimpleRenderMessage(RenderMessageType.Die, entity.ID);
                entity.DeletePending = true;
                var schedeler = entity.GetLogicWorld().GetTaskScheduler();
                DeleteEntityTask delete_task = LogicTask.Create <DeleteEntityTask>();
                delete_task.Construct(entity.ID);
                schedeler.Schedule(delete_task, entity.GetCurrentTime(), ms_death_delay);
            }
        }
예제 #3
0
        public void Explode(Entity entity)
        {
#if COMBAT_CLIENT
            if (m_collision_sound_cfgid > 0)
            {
                PlaySoundMessage sound_msg = RenderMessage.Create <PlaySoundMessage>();
                sound_msg.Construct(GetOwnerEntityID(), m_collision_sound_cfgid, FixPoint.MinusOne);
                GetLogicWorld().AddRenderMessage(sound_msg);
            }
#endif

            ApplyGenerator(entity);

            if (entity == null || !m_pierce_entity)
            {
#if COMBAT_CLIENT
                LocomoteRenderMessage msg = RenderMessage.Create <LocomoteRenderMessage>();
                msg.ConstructAsStopMoving(ParentObject.ID, true);
                GetLogicWorld().AddRenderMessage(msg);
#endif
                if (m_task != null)
                {
                    m_task.Cancel();
                    LogicTask.Recycle(m_task);
                    m_task = null;
                }
                EntityUtil.KillEntity((Entity)ParentObject, ParentObject.ID);
            }
        }
예제 #4
0
        protected override void OnDestruct()
        {
            if (m_die_task != null)
            {
                m_die_task.Cancel();
                LogicTask.Recycle(m_die_task);
                m_die_task = null;
            }
            EffectManager effect_manager = GetLogicWorld().GetEffectManager();

            if (m_born_generator != null)
            {
                effect_manager.DestroyGenerator(m_born_generator.ID, GetOwnerEntityID());
                m_born_generator = null;
            }
            if (m_die_generator != null)
            {
                effect_manager.DestroyGenerator(m_die_generator.ID, GetOwnerEntityID());
                m_die_generator = null;
            }
            if (m_killer_generator != null)
            {
                effect_manager.DestroyGenerator(m_killer_generator.ID, GetOwnerEntityID());
                m_killer_generator = null;
            }
        }
예제 #5
0
 public override void ResetNode()
 {
     if (m_listener_context != null)
     {
         Entity owner = m_context.GetData <Entity>(BTContextKey.OwnerEntity);
         for (int i = 0; i < m_signal_datas.Count; ++i)
         {
             owner.RemoveListener(m_signal_datas[i].m_signal_id, m_listener_context.ID);
         }
         SignalListenerContext.Recycle(m_listener_context);
         m_listener_context = null;
         m_context.GetLogicWorld().UnregisterBehaviorTree(this);
         m_register_id = 0;
     }
     ClearRunningTrace();
     base.ResetNode();
     if (m_context != null)
     {
         BTContext context = m_context;
         SetContext(null);
         RecyclableObject.Recycle(context);
     }
     m_current_running_entry_index = -1;
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
        public void Impact()
        {
            m_remain_attack_cnt = m_combo_attack_cnt;
            if (m_combo_type_crc == ComboType_Time)
            {
                CreateOneObject(0);
                if (m_combo_attack_cnt > 1)
                {
                    if (m_task == null)
                    {
                        m_task = LogicTask.Create <ComponentCommonTask>();
                        m_task.Construct(this);
                    }
                    var schedeler = GetLogicWorld().GetTaskScheduler();
                    schedeler.Schedule(m_task, GetCurrentTime(), m_combo_interval, m_combo_interval);
                }
            }
            else if (m_combo_type_crc == ComboType_Angle || m_combo_type_crc == ComboType_Circle)
            {
                for (int i = 0; i < m_combo_attack_cnt; ++i)
                {
                    CreateOneObject(i);
                }
            }

#if COMBAT_CLIENT
            if (m_render_effect_cfgid > 0)
            {
                PlayRenderEffectMessage msg = RenderMessage.Create <PlayRenderEffectMessage>();
                msg.ConstructAsPlay(GetOwnerEntityID(), m_render_effect_cfgid, FixPoint.MinusOne);
                GetLogicWorld().AddRenderMessage(msg);
            }
#endif
        }
        public override void Inflict(FixPoint start_time)
        {
            if (m_generator == null)
            {
                return;
            }
            if (m_delay_time == FixPoint.Zero)
            {
                Impact();
            }
            else
            {
                if (m_delay_task == null)
                {
                    m_delay_task = LogicTask.Create <ComponentCommonTask>();
                    m_delay_task.Construct(this);
                }
                var schedeler = GetLogicWorld().GetTaskScheduler();
                schedeler.Schedule(m_delay_task, GetCurrentTime(), m_delay_time);
            }

#if COMBAT_CLIENT
            if (m_render_effect_cfgid > 0 && m_render_delay_time > FixPoint.Zero)
            {
                if (m_render_delay_task == null)
                {
                    m_render_delay_task = LogicTask.Create <PlayRenderEffectTask>();
                    m_render_delay_task.Construct(this);
                }
                var schedeler = GetLogicWorld().GetTaskScheduler();
                schedeler.Schedule(m_render_delay_task, GetCurrentTime(), m_render_delay_time);
            }
#endif
        }
예제 #8
0
        protected override void OnDestruct()
        {
            EffectManager effect_manager = GetLogicWorld().GetEffectManager();

            if (m_enter_generator != null)
            {
                effect_manager.DestroyGenerator(m_enter_generator.ID, GetOwnerEntityID());
                m_enter_generator = null;
            }
            if (m_period_generator != null)
            {
                effect_manager.DestroyGenerator(m_period_generator.ID, GetOwnerEntityID());
                m_period_generator = null;
            }
            if (m_region != null)
            {
                m_region.Destruct();
                m_region = null;
            }
            if (m_task != null)
            {
                m_task.Cancel();
                LogicTask.Recycle(m_task);
                m_task = null;
            }
        }
예제 #9
0
        protected override void PostInitializeComponent()
        {
            Entity            owner = GetOwnerEntity();
            PositionComponent position_component = owner.GetComponent(PositionComponent.ID) as PositionComponent;

            if (position_component == null)
            {
                return;
            }

            EffectManager effect_manager = GetLogicWorld().GetEffectManager();

            if (m_enter_generator_cfgid > 0)
            {
                m_enter_generator = effect_manager.CreateGenerator(m_enter_generator_cfgid, owner);
            }
            if (m_period_generator_cfgid > 0)
            {
                m_period_generator = effect_manager.CreateGenerator(m_period_generator_cfgid, owner);
            }

            m_region = GetLogicWorld().GetRegionCallbackManager().CreateRegion();
            m_region.Construct(this, owner);
            m_region.SetUpdateInterval(m_region_update_interval);
            m_region.SetTargetGatheringParam(m_target_gathering_param);
            m_region.Activate();

            if (m_period_generator != null)
            {
                m_task = LogicTask.Create <ComponentCommonTask>();
                m_task.Construct(this);
                var schedeler = GetLogicWorld().GetTaskScheduler();
                schedeler.Schedule(m_task, GetCurrentTime(), m_period, m_period);
            }
        }
예제 #10
0
        public void InitParam(ProjectileParameters param)
        {
            m_param = param;
            if (m_trajectory_type == TrajectoryTypeBezier)
            {
                m_param.m_bezier_b    = (m_param.m_start_position + m_param.m_target_position) / FixPoint.Two;
                m_param.m_bezier_b.y += m_extra_hight;
            }
            if (m_param.m_life_time <= FixPoint.Zero)
            {
                m_param.m_life_time = m_life_time;
            }

            PositionComponent position_component = ParentObject.GetComponent(PositionComponent.ID) as PositionComponent;
            GridGraph         grid_graph         = position_component.GetGridGraph();
            GridNode          node = grid_graph.Position2Node(position_component.CurrentPosition);

            m_previous_walkable = (node != null && node.Walkable);

            if (m_task == null)
            {
                m_task = LogicTask.Create <UpdateProjectileTask>();
            }
            m_task.Construct(this, m_param.m_life_time);
            var schedeler = GetLogicWorld().GetTaskScheduler();

            schedeler.Schedule(m_task, GetCurrentTime(), LOGIC_UPDATE_INTERVAL, LOGIC_UPDATE_INTERVAL);

#if COMBAT_CLIENT
            LocomoteRenderMessage msg = RenderMessage.Create <LocomoteRenderMessage>();
            msg.ConstructAsStartMoving(ParentObject.ID, true);
            GetLogicWorld().AddRenderMessage(msg);
#endif
        }
 protected override void OnDestruct()
 {
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #12
0
 void CancelTask()
 {
     if (m_combo_task == null)
     {
         return;
     }
     m_combo_task.Cancel();
     LogicTask.Recycle(m_combo_task);
     m_combo_task = null;
 }
예제 #13
0
 protected override void OnDestruct()
 {
     DeleteLocomotorSpeedRateTask();
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #14
0
 void DeleteLocomotorSpeedRateTask()
 {
     if (m_update_locomotor_speed_rate_task == null)
     {
         return;
     }
     m_update_locomotor_speed_rate_task.Cancel();
     LogicTask.Recycle(m_update_locomotor_speed_rate_task);
     m_update_locomotor_speed_rate_task = null;
 }
예제 #15
0
        public void KillOwner(int killer_id)
        {
            //ZZWTODO Resurrect

            if (m_die_task != null)
            {
                m_die_task.Cancel();
            }
            LogicWorld logic_world = GetLogicWorld();

            Entity killer = logic_world.GetEntityManager().GetObject(killer_id);

            if (!DieSilently && killer_id != ParentObject.ID && m_killer_generator != null && killer != null)
            {
                EffectApplicationData app_data = RecyclableObject.Create <EffectApplicationData>();
                app_data.m_original_entity_id = ParentObject.ID;
                app_data.m_source_entity_id   = ParentObject.ID;
                m_killer_generator.Activate(app_data, killer);
                RecyclableObject.Recycle(app_data);
            }

            var schedeler = logic_world.GetTaskScheduler();

            if (DieSilently)
            {
                logic_world.AddSimpleRenderMessage(RenderMessageType.Hide, ParentObject.ID);
            }
            else
            {
                HideEntityTask hide_task = LogicTask.Create <HideEntityTask>();
                hide_task.Construct(ParentObject.ID);
                schedeler.Schedule(hide_task, GetCurrentTime(), m_hide_delay);
            }

            ParentObject.DeletePending = true;
            ParentObject.SendSignal(SignalType.Die);
            logic_world.AddSimpleRenderMessage(RenderMessageType.Die, ParentObject.ID);

            StateComponent state_component = ParentObject.GetComponent(StateComponent.ID) as StateComponent;

            if (state_component != null)
            {
                state_component.AddState(StateSystem.DEAD_STATE, 0);
            }

            if (!m_can_resurrect)
            {
                DeleteEntityTask delete_task = LogicTask.Create <DeleteEntityTask>();
                delete_task.Construct(ParentObject.ID);
                schedeler.Schedule(delete_task, GetCurrentTime(), m_delete_delay);
            }

            logic_world.OnKillEntity(killer, GetOwnerEntity());
        }
예제 #16
0
        void Schedule()
        {
            if (m_task == null)
            {
                m_task = LogicTask.Create <ComponentCommonTask>();
                m_task.Construct(this);
            }
            var schedeler = GetLogicWorld().GetTaskScheduler();

            schedeler.Schedule(m_task, GetCurrentTime(), FixPoint.One, FixPoint.One);
        }
        public override void Unapply()
        {
            m_task.Cancel();
            LogicTask.Recycle(m_task);
            m_task = null;
#if COMBAT_CLIENT
            LocomoteRenderMessage msg = RenderMessage.Create <LocomoteRenderMessage>();
            msg.ConstructAsStopMoving(GetOwnerEntityID(), false, LocomoteRenderMessage.NotFromCommand);
            GetLogicWorld().AddRenderMessage(msg);
#endif
        }
예제 #18
0
 protected override void OnDestruct()
 {
     SignalListenerContext.Recycle(m_listener_context);
     m_listener_context = null;
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #19
0
        public void ScheduleTargeting(FixPoint delay)
        {
            if (m_task == null)
            {
                m_task = LogicTask.Create <ComponentCommonTask>();
                m_task.Construct(this);
            }
            LogicWorld logic_world    = GetLogicWorld();
            var        task_scheduler = logic_world.GetTaskScheduler();

            task_scheduler.Schedule(m_task, logic_world.GetCurrentTime(), delay);
        }
        protected override void OnDestruct()
        {
            RecyclableObject.Recycle(m_damage_amount);
            m_damage_amount = null;

            if (m_period_task != null)
            {
                m_period_task.Cancel();
                LogicTask.Recycle(m_period_task);
                m_period_task = null;
            }
        }
예제 #21
0
 protected override void PreDestruct()
 {
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
     if (m_is_active)
     {
         Deactivate(true);
     }
 }
예제 #22
0
 protected override void OnDestruct()
 {
     if (m_collision_target_generator != null)
     {
         GetLogicWorld().GetEffectManager().DestroyGenerator(m_collision_target_generator.ID, GetOwnerEntityID());
         m_collision_target_generator = null;
     }
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #23
0
 protected override void OnDestruct()
 {
     if (m_param != null)
     {
         RecyclableObject.Recycle(m_param);
         m_param = null;
     }
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
 }
예제 #24
0
 protected override void OnDestruct()
 {
     m_targeting_component = null;
     SignalListenerContext.Recycle(m_listener_context);
     m_listener_context = null;
     if (m_task != null)
     {
         m_task.Cancel();
         LogicTask.Recycle(m_task);
         m_task = null;
     }
     ClearTargets();
     m_current_enemy = null;
 }
예제 #25
0
 public void Construct(LogicWorld logic_world)
 {
     if (m_context == null)
     {
         BTContext context = RecyclableObject.Create <BTContext>();
         context.Construct(logic_world, this);
         SetContext(context);
     }
     if (m_task == null)
     {
         m_task = LogicTask.Create <BehaviorTreeTask>();
         m_task.Construct(this);
     }
 }
 public override void Apply()
 {
     ApplyDamage();
     if (m_period > FixPoint.Zero)
     {
         if (m_period_task == null)
         {
             m_period_task = LogicTask.Create <ComponentCommonTask>();
             m_period_task.Construct(this);
         }
         var schedeler = GetLogicWorld().GetTaskScheduler();
         schedeler.Schedule(m_period_task, GetCurrentTime(), m_period, m_period);
     }
 }
 public override void Apply()
 {
     m_remain_count = m_object_count;
     CreateOneObject();
     if (m_object_count > 1 || m_object_count == -1)
     {
         if (m_task == null)
         {
             m_task = LogicTask.Create <ComponentCommonTask>();
             m_task.Construct(this);
         }
         var schedeler = GetLogicWorld().GetTaskScheduler();
         schedeler.Schedule(m_task, GetCurrentTime(), m_interval, m_interval);
     }
 }
예제 #28
0
 public void RealInflict()
 {
     m_remain_attack_cnt = m_combo_attack_cnt;
     Impact();
     if (m_combo_attack_cnt > 1)
     {
         if (m_combo_task == null)
         {
             m_combo_task = LogicTask.Create <ComboAttackTask>();
             m_combo_task.Construct(this);
         }
         var schedeler = GetLogicWorld().GetTaskScheduler();
         schedeler.Schedule(m_combo_task, GetCurrentTime(), m_combo_interval, m_combo_interval);
     }
 }
예제 #29
0
        void StopSpurt()
        {
            if (m_task == null)
            {
                return;
            }
            m_task.Cancel();
            LogicTask.Recycle(m_task);
            m_task = null;
#if COMBAT_CLIENT
            LocomoteRenderMessage msg = RenderMessage.Create <LocomoteRenderMessage>();
            msg.ConstructAsStopMoving(GetOwnerEntityID(), false, LocomoteRenderMessage.NotFromCommand);
            GetLogicWorld().AddRenderMessage(msg);
#endif
        }
예제 #30
0
        void StartLocomotorSpeedRateTask()
        {
            if (m_update_locomotor_speed_rate_task != null)
            {
                return;
            }
            var schedeler = GetLogicWorld().GetTaskScheduler();

            if (schedeler == null)
            {
                return; //ZZWTOOD 世界销毁的时候
            }
            m_update_locomotor_speed_rate_task = LogicTask.Create <UpdateLocomotorSpeedRateTask>();
            m_update_locomotor_speed_rate_task.Construct(this);
            schedeler.Schedule(m_update_locomotor_speed_rate_task, GetCurrentTime(), FixPoint.PrecisionFP);
        }