Esempio n. 1
0
        /// <summary>
        /// Handles teleporting a player to the lifestone (/ls or /lifestone command)
        /// </summary>
        public void HandleActionTeleToLifestone()
        {
            if (Sanctuary != null)
            {
                // FIXME(ddevec): I should probably make a better interface for this
                UpdateVital(Mana, Mana.Current / 2);

                if (CombatMode != CombatMode.NonCombat)
                {
                    // this should be handled by a different thing, probably a function that forces player into peacemode
                    var updateCombatMode = new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.CombatMode, (int)CombatMode.NonCombat);
                    Session.Network.EnqueueSend(updateCombatMode);
                }

                CurrentLandblock.EnqueueBroadcastSystemChat(this, $"{Name} is recalling to the lifestone.", ChatMessageType.Recall);
                CurrentLandblock.EnqueueBroadcastMotion(this, motionLifestoneRecall);

                // Wait for animation
                ActionChain lifestoneChain = new ActionChain();

                // Then do teleport
                lifestoneChain.AddDelaySeconds(DatManager.PortalDat.ReadFromDat <MotionTable>(MotionTableId).GetAnimationLength(MotionCommand.LifestoneRecall));
                lifestoneChain.AddChain(GetTeleportChain(Sanctuary));

                lifestoneChain.EnqueueChain();
            }
            else
            {
                ChatPacket.SendServerMessage(Session, "Your spirit has not been attuned to a sanctuary location.", ChatMessageType.Broadcast);
            }
        }
Esempio n. 2
0
        private void OnKill(Session session)
        {
            IsAlive = false;
            // This will determine if the derived type is a player
            var isDerivedPlayer = Guid.IsPlayer();

            if (!isDerivedPlayer)
            {
                // Create and send the death notice
                string killMessage        = $"{session.Player.Name} has killed {Name}.";
                var    creatureDeathEvent = new GameEventDeathNotice(session, killMessage);
                session.Network.EnqueueSend(creatureDeathEvent);
            }

            // MovementEvent: (Hand-)Combat or in the case of smite: from Standing to Death
            // TODO: Check if the duration of the motion can somehow be computed
            UniversalMotion motionDeath = new UniversalMotion(MotionStance.Standing, new MotionItem(MotionCommand.Dead));

            CurrentLandblock.EnqueueBroadcastMotion(this, motionDeath);

            // If the object is a creature, Remove it from from Landblock
            if (!isDerivedPlayer)
            {
                CurrentLandblock.RemoveWorldObject(Guid, false);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Do the player log out work.<para />
        /// If you want to force a player to logout, use Session.LogOffPlayer().
        /// </summary>
        private void LogoutInternal(bool clientSessionTerminatedAbruptly)
        {
            if (Fellowship != null)
            {
                FellowshipQuit(false);
            }

            if (!IsOnline)
            {
                return;
            }

            InWorld  = false;
            IsOnline = false;

            SendFriendStatusUpdates();

            if (!clientSessionTerminatedAbruptly)
            {
                var logout = new UniversalMotion(MotionStance.Standing, new MotionItem(MotionCommand.LogOut));
                CurrentLandblock.EnqueueBroadcastMotion(this, logout);

                EnqueueBroadcastPhysicsState();

                // Thie retail server sends a ChatRoomTracker 0x0295 first, then the status message, 0x028B. It does them one at a time for each individual channel.
                // The ChatRoomTracker message doesn't seem to change at all.
                // For the purpose of ACE, we simplify this process.
                var general  = new GameEventWeenieErrorWithString(Session, WeenieErrorWithString.YouHaveLeftThe_Channel, "General");
                var trade    = new GameEventWeenieErrorWithString(Session, WeenieErrorWithString.YouHaveLeftThe_Channel, "Trade");
                var lfg      = new GameEventWeenieErrorWithString(Session, WeenieErrorWithString.YouHaveLeftThe_Channel, "LFG");
                var roleplay = new GameEventWeenieErrorWithString(Session, WeenieErrorWithString.YouHaveLeftThe_Channel, "Roleplay");
                Session.Network.EnqueueSend(general, trade, lfg, roleplay);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Starts rotating a creature from its current direction
        /// so that it eventually is facing the rotation from the input position
        /// Used by the emote system, which has the target rotation stored in positions
        /// </summary>
        /// <returns>The amount of time in seconds for the rotation to complete</returns>
        public float TurnTo(Position position)
        {
            // send network message to start turning creature
            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, position);

            turnToMotion.MovementTypes = MovementTypes.TurnToHeading;
            CurrentLandblock?.EnqueueBroadcastMotion(this, turnToMotion);

            var angle = GetAngle(position);
            //Console.WriteLine("Angle: " + angle);

            // estimate time to rotate to target
            var rotateDelay = GetRotateDelay(angle);
            //Console.WriteLine("RotateTime: " + rotateTime);

            // update server object rotation on completion
            // TODO: proper incremental rotation
            var actionChain = new ActionChain();

            actionChain.AddDelaySeconds(rotateDelay);
            actionChain.AddAction(this, () =>
            {
                var targetDir = position.GetCurrentDir();
                Location.Rotate(targetDir);
            });
            actionChain.EnqueueChain();

            return(rotateDelay);
        }
Esempio n. 5
0
        /// <summary>
        /// Starts rotating a creature from its current direction
        /// so that it eventually is facing the target position
        /// </summary>
        /// <returns>The amount of time in seconds for the rotation to complete</returns>
        public virtual float Rotate(WorldObject target)
        {
            // send network message to start turning creature
            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            turnToMotion.MovementTypes = MovementTypes.TurnToObject;
            CurrentLandblock?.EnqueueBroadcastMotion(this, turnToMotion);

            var angle = GetAngle(target);
            //Console.WriteLine("Angle: " + angle);

            // estimate time to rotate to target
            var rotateDelay = GetRotateDelay(angle);
            //Console.WriteLine("RotateTime: " + rotateTime);

            // update server object rotation on completion
            // TODO: proper incremental rotation
            var actionChain = new ActionChain();

            actionChain.AddDelaySeconds(rotateDelay);
            actionChain.AddAction(this, () =>
            {
                var targetDir = GetDirection(Location.ToGlobal(), target.Location.ToGlobal());
                Location.Rotate(targetDir);
            });
            actionChain.EnqueueChain();

            return(rotateDelay);
        }
Esempio n. 6
0
 /// <summary>
 /// Sets the current vital to a new value
 /// </summary>
 public override void UpdateVital(CreatureVital vital, uint newVal)
 {
     //check for exhaustion
     if (vital.Vital == PropertyAttribute2nd.Stamina || vital.Vital == PropertyAttribute2nd.MaxStamina)
     {
         if (vital.Current != newVal && newVal < 1)
         {
             // force player to experience exhaustion
             var motion = new UniversalMotion(CurrentMotionState.Stance);
             // this should be autonymous, like retail, but if it's set to autonymous here, the desired effect doesn't happen
             // motion.IsAutonomous = true;
             motion.MovementData = new MovementData()
             {
                 CurrentStyle   = (uint)CurrentMotionState.Stance,
                 ForwardCommand = (uint)MotionCommand.RunForward
             };
             CurrentMotionState = motion;
             if (CurrentLandblock != null)
             {
                 CurrentLandblock.EnqueueBroadcastMotion(this, motion);
                 Session.Network.EnqueueSend(new GameEventCommunicationTransientString(Session, "You're Exhausted!"));
             }
         }
     }
     base.UpdateVital(vital, newVal);
     Session.Network.EnqueueSend(new GameMessagePrivateUpdateAttribute2ndLevel(this, vital.ToEnum(), vital.Current));
 }
Esempio n. 7
0
        /// <summary>
        /// This is called by the monster AI system for ranged attacks
        /// It is mostly a duplicate of Rotate(), and should be refactored eventually...
        /// It sets CurrentMotionState and AttackTarget here
        /// </summary>
        public void TurnTo(WorldObject target)
        {
            if (this is Player)
            {
                return;
            }

            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            turnToMotion.MovementTypes = MovementTypes.TurnToObject;
            CurrentLandblock?.EnqueueBroadcastMotion(this, turnToMotion);

            CurrentMotionState = turnToMotion;

            AttackTarget = target;
            var rotateDelay = EstimateTurnTo();
            //Console.WriteLine("TurnTime = " + turnTime);
            var actionChain = new ActionChain();

            actionChain.AddDelaySeconds(rotateDelay);
            actionChain.AddAction(this, () =>
            {
                // fix me: in progress turn
                var targetDir = GetDirection(Location.ToGlobal(), target.Location.ToGlobal());
                Location.Rotate(targetDir);
                //Console.WriteLine("Finished turning - " + turnTime + "s");
            });
            actionChain.EnqueueChain();
        }
Esempio n. 8
0
        /// <summary>
        /// This is raised by Player.HandleActionUseItem, and is wrapped in ActionChain.<para />
        /// The actor of the ActionChain is the item being used.<para />
        /// The item does not exist in the players possession.<para />
        /// If the item was outside of range, the player will have been commanded to move using DoMoveTo before ActOnUse is called.<para />
        /// When this is called, it should be assumed that the player is within range.
        /// </summary>
        public override void ActOnUse(Player player)
        {
            ActionChain sancTimer = new ActionChain();

            sancTimer.AddAction(player, () =>
            {
                CurrentLandblock.EnqueueBroadcastMotion(player, sanctuary);
                CurrentLandblock.EnqueueBroadcastSound(player, Sound.LifestoneOn, 1);
            });
            sancTimer.AddDelaySeconds(DatManager.PortalDat.ReadFromDat <MotionTable>(player.MotionTableId).GetAnimationLength(MotionCommand.Sanctuary));
            sancTimer.AddAction(player, () =>
            {
                if (player.IsWithinUseRadiusOf(this))
                {
                    player.Session.Network.EnqueueSend(new GameMessageSystemChat(GetProperty(PropertyString.UseMessage), ChatMessageType.Magic));
                    player.Sanctuary = player.Location;
                }
                // Unsure if there was a fail message...
                //else
                //{
                //    var serverMessage = "You wandered too far to attune with the Lifestone!";
                //    player.Session.Network.EnqueueSend(new GameMessageSystemChat(serverMessage, ChatMessageType.Magic));
                //}

                player.SendUseDoneEvent();
            });
            sancTimer.EnqueueChain();
        }
Esempio n. 9
0
        public void RequestUpdateMotion(uint holdKey, MovementData md, MotionItem[] commands)
        {
            new ActionChain(this, () =>
            {
                // Update our current style
                if ((md.MovementStateFlag & MovementStateFlag.CurrentStyle) != 0)
                {
                    MotionStance newStance = (MotionStance)md.CurrentStyle;

                    if (newStance != stance)
                    {
                        stance = (MotionStance)md.CurrentStyle;
                    }
                }

                md = md.ConvertToClientAccepted(holdKey, GetCreatureSkill(Skill.Run));
                UniversalMotion newMotion = new UniversalMotion(stance, md);

                // This is a hack to make walking work correctly.   Og II
                if (holdKey != 0 || (md.ForwardCommand == (uint)MotionCommand.WalkForward))
                {
                    newMotion.IsAutonomous = true;
                }

                // FIXME(ddevec): May need to de-dupe animation/commands from client -- getting multiple (e.g. wave)
                // FIXME(ddevec): This is the operation that should update our velocity (for physics later)
                newMotion.Commands.AddRange(commands);
                CurrentLandblock?.EnqueueBroadcastMotion(this, newMotion);

                // TODO: use real motion / animation system from physics
                CurrentMotionCommand = md.ForwardCommand;
            }).EnqueueChain();
        }
Esempio n. 10
0
        /// <summary>
        /// This signature services MoveToObject and TurnToObject
        /// Update Position prior to start, start them moving or turning, set statemachine to moving.
        /// Moved from player - we need to be able to move creatures as well.   Og II
        /// </summary>
        /// <param name="worldObjectPosition">Position in the world</param>
        /// <param name="sequence">Sequence for the object getting the message.</param>
        /// <param name="movementType">What type of movement are we about to execute</param>
        /// <param name="targetGuid">Who are we moving or turning toward</param>
        public void OnAutonomousMove(ACE.Entity.Position worldObjectPosition, SequenceManager sequence, MovementTypes movementType, ObjectGuid targetGuid)
        {
            UniversalMotion newMotion = new UniversalMotion(MotionStance.Standing, worldObjectPosition, targetGuid);

            newMotion.DistanceFrom  = 0.60f;
            newMotion.MovementTypes = movementType;
            CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageUpdatePosition(this));
            CurrentLandblock.EnqueueBroadcastMotion(this, newMotion);
        }
Esempio n. 11
0
        public float Rotate(WorldObject target)
        {
            // execute the TurnToObject motion
            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            turnToMotion.MovementTypes = MovementTypes.TurnToObject;
            CurrentLandblock.EnqueueBroadcastMotion(this, turnToMotion);

            return(GetRotateDelay(target));
        }
Esempio n. 12
0
        public float TurnTo(ACE.Entity.Position position)
        {
            // execute the TurnToObject motion
            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, position);

            turnToMotion.MovementTypes = MovementTypes.TurnToHeading;
            CurrentLandblock.EnqueueBroadcastMotion(this, turnToMotion);

            return(GetTurnToDelay(position));
        }
Esempio n. 13
0
        /// <summary>
        /// Switch to attack stance
        /// </summary>
        public void DoAttackStance()
        {
            // TODO: get attack stance based on weapon type
            var attackStance = MotionStance.UaNoShieldAttack;

            var motion = new UniversalMotion(attackStance);

            motion.MovementData.CurrentStyle   = (uint)attackStance;
            motion.MovementData.ForwardCommand = (uint)MotionCommand.Ready;

            CurrentMotionState = motion;
            CurrentLandblock.EnqueueBroadcastMotion(this, motion);
        }
Esempio n. 14
0
        /// <summary>
        /// Sends a network message for moving a creature to a new position
        /// </summary>
        public void MoveTo(Position position, float runRate = 1.0f)
        {
            var motion = new UniversalMotion(CurrentMotionState.Stance, position);

            motion.MovementTypes = MovementTypes.MoveToPosition;
            //motion.Flag |= MovementParams.CanCharge | MovementParams.FailWalk | MovementParams.UseFinalHeading | MovementParams.MoveAway;
            motion.WalkRunThreshold = 1.0f;
            motion.RunRate          = runRate;

            // todo: use better movement system
            Location = position;

            CurrentLandblock?.EnqueueBroadcastMotion(this, motion);
        }
Esempio n. 15
0
        public override void Close(Player player)
        {
            if (!(IsOpen ?? false))
            {
                return;
            }

            CurrentLandblock.EnqueueBroadcastMotion(this, motionClosed);
            CurrentMotionState = motionStateClosed;
            player.Session.Network.EnqueueSend(new GameEventCloseGroundContainer(player.Session, this));
            // send removeobject msgs to player for all chest inventory here
            Viewer = null;
            IsOpen = false;

            //player.SendUseDoneEvent();
        }
Esempio n. 16
0
        private void Close(ObjectGuid closer = new ObjectGuid())
        {
            if (CurrentMotionState == motionStateClosed)
            {
                return;
            }

            CurrentLandblock.EnqueueBroadcastMotion(this, motionClosed);
            CurrentMotionState = motionStateClosed;
            Ethereal           = false;
            IsOpen             = false;
            if (closer.Full > 0)
            {
                UseTimestamp++;
            }
        }
Esempio n. 17
0
        private void Open(ObjectGuid opener = new ObjectGuid())
        {
            if (CurrentMotionState == motionStateOpen)
            {
                return;
            }

            CurrentLandblock.EnqueueBroadcastMotion(this, motionOpen);
            CurrentMotionState = motionStateOpen;
            Ethereal           = true;
            IsOpen             = true;
            if (opener.Full > 0)
            {
                UseTimestamp++;
            }
        }
Esempio n. 18
0
        public void Die()
        {
            ActionChain dieChain = new ActionChain();

            dieChain.AddAction(this, () =>
            {
                CurrentLandblock.EnqueueBroadcastMotion(this, dead);
            });
            dieChain.AddDelaySeconds(DatManager.PortalDat.ReadFromDat <MotionTable>(MotionTableId).GetAnimationLength(MotionCommand.Dead));
            dieChain.AddAction(this, () =>
            {
                LandblockManager.RemoveObject(this);
                CreateCorpse();
            });
            dieChain.EnqueueChain();
        }
Esempio n. 19
0
        public override void Open(Player player)
        {
            if (IsOpen ?? false)
            {
                return;
            }

            IsOpen = true;
            CurrentLandblock.EnqueueBroadcastMotion(this, motionOpen);
            CurrentMotionState = motionStateOpen;
            Viewer             = player.Guid.Full;
            player.Session.Network.EnqueueSend(new GameEventViewContents(player.Session, this));

            // send createobject msgs to player for all chest inventory here

            player.SendUseDoneEvent();
        }
Esempio n. 20
0
        /// <summary>
        /// Used by the monster AI system to start turning / running towards a target
        /// </summary>
        public void MoveTo(WorldObject target, float runRate = 1.0f)
        {
            if (this is Player)
            {
                return;
            }

            var motion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            motion.MovementTypes    = MovementTypes.MoveToObject;
            motion.Flag            |= MovementParams.CanCharge | MovementParams.FailWalk | MovementParams.UseFinalHeading | MovementParams.Sticky | MovementParams.MoveAway;
            motion.WalkRunThreshold = 1.0f;
            motion.RunRate          = runRate;

            CurrentMotionState = motion;

            CurrentLandblock?.EnqueueBroadcastMotion(this, motion);
        }
Esempio n. 21
0
        public void TurnTo(WorldObject target)
        {
            if (this is Player)
            {
                return;
            }

            var motion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            motion.MovementTypes = MovementTypes.TurnToObject;

            CurrentMotionState = motion;

            if (CurrentLandblock != null)
            {
                CurrentLandblock.EnqueueBroadcastMotion(this, motion);
            }
        }
Esempio n. 22
0
        private void Close(ObjectGuid closer = new ObjectGuid())
        {
            if (CurrentMotionState == motionStateClosed)
            {
                return;
            }

            CurrentLandblock.EnqueueBroadcastMotion(this, motionClosed);
            CurrentMotionState = motionStateClosed;
            Ethereal           = false;
            IsOpen             = false;
            CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePublicUpdatePropertyBool(Sequences, Guid, PropertyBool.Ethereal, Ethereal ?? false));
            CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePublicUpdatePropertyBool(Sequences, Guid, PropertyBool.Open, IsOpen ?? false));
            if (closer.Full > 0)
            {
                UseTimestamp++;
            }
        }
Esempio n. 23
0
        private void Open(ObjectGuid opener = new ObjectGuid())
        {
            if (CurrentMotionState == motionStateOpen)
            {
                return;
            }

            CurrentLandblock.EnqueueBroadcastMotion(this, motionOpen);
            CurrentMotionState = motionStateOpen;
            Ethereal           = true;
            IsOpen             = true;
            CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePublicUpdatePropertyBool(Sequences, Guid, PropertyBool.Ethereal, Ethereal ?? true));
            CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePublicUpdatePropertyBool(Sequences, Guid, PropertyBool.Open, IsOpen ?? true));
            if (opener.Full > 0)
            {
                UseTimestamp++;
            }
        }
Esempio n. 24
0
        /// <summary>
        /// Perform the melee attack swing animation
        /// </summary>
        public virtual ActionChain DoSwingMotion(WorldObject target, out float animLength)
        {
            var swingAnimation = new MotionItem(GetSwingAnimation(), 1.25f);

            animLength = MotionTable.GetAnimationLength(MotionTableId, CurrentMotionState.Stance, swingAnimation);

            var motion = new UniversalMotion(CurrentMotionState.Stance, swingAnimation);

            motion.MovementData.CurrentStyle = (uint)CurrentMotionState.Stance;
            motion.MovementData.TurnSpeed    = 2.25f;
            motion.HasTarget   = true;
            motion.TargetGuid  = target.Guid;
            CurrentMotionState = motion;

            CurrentLandblock.EnqueueBroadcastMotion(this, motion);

            return(null);
        }
Esempio n. 25
0
File: Cow.cs Progetto: roidzilla/ACE
        private void Activate(ObjectGuid activator = new ObjectGuid())
        {
            AllowedActivator = activator.Full;

            CurrentLandblock.EnqueueBroadcastMotion(this, motionTipRight);

            // Stamp Cow tipping quest here;

            ActionChain autoResetTimer = new ActionChain();

            autoResetTimer.AddDelaySeconds(4);
            autoResetTimer.AddAction(this, () => Reset());
            autoResetTimer.EnqueueChain();

            if (activator.Full > 0)
            {
                UseTimestamp++;
            }
        }
Esempio n. 26
0
        public void HandleActionTeleToMarketPlace()
        {
            var updateCombatMode = new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.CombatMode, (int)CombatMode.NonCombat);

            CurrentLandblock.EnqueueBroadcastSystemChat(this, $"{Name} is recalling to the marketplace.", ChatMessageType.Recall);
            Session.Network.EnqueueSend(updateCombatMode); // this should be handled by a different thing, probably a function that forces player into peacemode
            CurrentLandblock.EnqueueBroadcastMotion(this, motionMarketplaceRecall);

            // TODO: (OptimShi): Actual animation length is longer than in retail. 18.4s
            // float mpAnimationLength = MotionTable.GetAnimationLength((uint)MotionTableId, MotionCommand.MarketplaceRecall);
            // mpChain.AddDelaySeconds(mpAnimationLength);
            ActionChain mpChain = new ActionChain();

            mpChain.AddDelaySeconds(14);

            // Then do teleport
            mpChain.AddChain(GetTeleportChain(MarketplaceDrop));

            // Set the chain to run
            mpChain.EnqueueChain();
        }
Esempio n. 27
0
 /// <summary>
 /// Called when the Player's stamina has recently changed to 0
 /// </summary>
 public void OnExhausted()
 {
     // adjust player speed if running
     if (CurrentMotionCommand == (uint)MotionCommand.RunForward)
     {
         var motion = new UniversalMotion(CurrentMotionState.Stance);
         // this should be autonomous, like retail, but if it's set to autonomous here, the desired effect doesn't happen
         // motion.IsAutonomous = true;
         motion.MovementData = new MovementData()
         {
             CurrentStyle   = (uint)CurrentMotionState.Stance,
             ForwardCommand = (uint)MotionCommand.RunForward
         };
         CurrentMotionState = motion;
         if (CurrentLandblock != null)
         {
             CurrentLandblock?.EnqueueBroadcastMotion(this, motion);
         }
     }
     Session.Network.EnqueueSend(new GameEventCommunicationTransientString(Session, "You're Exhausted!"));
 }
Esempio n. 28
0
        public float Rotate(WorldObject target)
        {
            // get inner angle between current heading and target
            var angle = GetAngle(target);

            if (angle < PhysicsGlobals.EPSILON)
            {
                return(0.0f);
            }

            // execute the TurnToObject motion
            var turnToMotion = new UniversalMotion(CurrentMotionState.Stance, target.Location, target.Guid);

            turnToMotion.MovementTypes = MovementTypes.TurnToObject;
            CurrentLandblock.EnqueueBroadcastMotion(this, turnToMotion);

            // calculate time to complete the rotation
            var rotateTime = Math.PI / (360.0f / angle);

            var waitTime = 0.25f;

            return((float)rotateTime + waitTime);
        }
Esempio n. 29
0
File: Chest.cs Progetto: zarlant/ACE
 protected override void DoOnCloseMotionChanges()
 {
     CurrentLandblock.EnqueueBroadcastMotion(this, motionClosed);
     CurrentMotionState = motionClosed;
 }
Esempio n. 30
0
 public void DoMotion(UniversalMotion motion)
 {
     CurrentLandblock.EnqueueBroadcastMotion(this, motion);
 }