コード例 #1
0
        public void PerformMovement(Monster monster)
        {
            var oldPosition = monster.Position;
            var newPosition = new Position(oldPosition.X, oldPosition.Y);
            var rnd         = new Random().Next(1, 5);

            if (Server.Map.IsPassable(newPosition.X - 1, newPosition.Y))
            {
                newPosition.X -= 1;
            }
            if (Server.Map.IsPassable(newPosition.X + 1, newPosition.Y))
            {
                newPosition.X += 1;
            }

            if (Server.Map.IsPassable(newPosition.X, newPosition.Y))
            {
                var monsterMoveEvent = new EntityMoveEvent()
                {
                    Entity = monster,
                    To     = newPosition
                };
                //Server.Events.Call(monsterMoveEvent);
            }
        }
コード例 #2
0
ファイル: RandomWalk.cs プロジェクト: tuita520/MobileMMORTS
        public void PerformMovement(Monster monster)
        {
            var oldPosition = monster.Position;
            var newPosition = new Position(oldPosition.X, oldPosition.Y);
            var rnd         = new Random().Next(1, 5);

            switch (rnd)
            {
            case 1:
                newPosition.X += 1; break;

            case 2:
                newPosition.Y += 1; break;

            case 3:
                newPosition.X -= 1; break;

            case 4:
                newPosition.Y -= 1; break;

            default:
                break;
            }

            if (Server.Map.IsPassable(newPosition.X, newPosition.Y))
            {
                var monsterMoveEvent = new EntityMoveEvent()
                {
                    Entity = monster,
                    From   = oldPosition,
                    To     = newPosition
                };
                Server.Events.Call(monsterMoveEvent);
            }
        }
コード例 #3
0
ファイル: ServerListener.cs プロジェクト: Ziden/Lisergy
        public void EntityMove(EntityMoveEvent ev)
        {
            var owner       = _game.GetWorld().GetOrCreateClientPlayer(ev.OwnerID);
            var knownEntity = owner.GetKnownEntity(ev.ID);

            if (knownEntity == null)
            {
                throw new System.Exception($"Server sent move event for entity {ev.ID} from {ev.OwnerID} at {ev.X}-{ev.Y} however its not visible to client");
            }
            var newTile = (ClientTile)_game.GetWorld().GetTile(ev.X, ev.Y);

            knownEntity.Tile = newTile;
        }
コード例 #4
0
        // server recieving entitymove means its a player moving
        public void OnEntityMovePacket(EntityMovePacket packet)
        {
            var player        = Server.GetPlayerByConnectionId(packet.ClientId);
            var distanceMoved = MapHelpers.GetDistance(player.Position, packet.To);
            var timeToMove    = Formulas.GetTimeToMoveBetweenTwoTiles(player.MoveSpeed);

            Log.Info("TIME TO MOVE " + timeToMove);

            var now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            // Player tryng to hack ?
            if (distanceMoved > 1 || now < player.CanMoveAgainTime)
            {
                Log.Debug($"Player time to move {player.CanMoveAgainTime - now}");
                // send player back to the position client-side
                player.Tcp.Send(new SyncPacket()
                {
                    Position = player.Position
                });
                return;
            }

            // subtract the player latency for possibility of lag for a smoother movement
            player.CanMoveAgainTime = now + timeToMove - player.Tcp.Latency;

            var entityMoveEvent = new EntityMoveEvent()
            {
                From   = packet.From,
                To     = packet.To,
                Entity = player
            };

            Server.Events.Call(entityMoveEvent);

            if (entityMoveEvent.IsCancelled)
            {
                // send player back to the position client-side
                player.Tcp.Send(new SyncPacket()
                {
                    Position = player.Position
                });
                return;
            }

            // Updating player position locally
            player.Position.X = packet.To.X;
            player.Position.Y = packet.To.Y;

            // updating in database
            PlayerService.UpdatePlayerPosition(player.UID, player.Position.X, player.Position.Y);
        }
コード例 #5
0
        public void OnEntityMove(EntityMoveEvent ev)
        {
            ev.Entity.LastPosition.X = ev.Entity.Position.X;
            ev.Entity.LastPosition.Y = ev.Entity.Position.Y;
            ev.Entity.Position.X     = ev.To.X;
            ev.Entity.Position.Y     = ev.To.Y;

            Server.Map.UpdateEntityPosition(ev.Entity, ev.Entity.LastPosition, ev.To);

            var nearPlayers = ev.Entity.GetPlayersNear();

            var movePacket = new EntityMovePacket()
            {
                To  = ev.Entity.Position,
                UID = ev.Entity.UID
            };

            // Updating this movement to nearby players soo the client updates
            foreach (var nearPlayer in nearPlayers)
            {
                if (nearPlayer.UID != ev.Entity.UID)
                {
                    nearPlayer.Tcp.Send(movePacket);
                }
            }

            if (typeof(LivingEntity).IsAssignableFrom(ev.Entity.GetType()))
            {
                // if im targeting something, i might attack it now after this movement
                var livingEntity = (LivingEntity)ev.Entity;
                if (livingEntity.Target != null)
                {
                    livingEntity.TryAttacking(livingEntity.Target);
                }

                // if someone is targeting me, he might be able to hit me now
                foreach (var targettingThisEntity in livingEntity.BeingTargetedBy)
                {
                    targettingThisEntity.TryAttacking(livingEntity);
                }
            }
        }
コード例 #6
0
        public void OnEntityMove(EntityMoveEvent ev)
        {
            var fromChunkX = ev.From.X >> 4;
            var fromChunkY = ev.From.Y >> 4;

            var toChunkX = ev.To.X >> 4;
            var toChunkY = ev.To.Y >> 4;

            var toChunk = Server.Map.GetChunk(toChunkX, toChunkY);

            var nearPlayers = ev.Entity.GetPlayersNear();

            var movePacket = new EntityMovePacket()
            {
                From = ev.From,
                To   = ev.To,
                UID  = ev.Entity.UID
            };

            // Update Entity Position Cache
            Server.Map.EntityPositions.RemoveEntity(ev.Entity, ev.From);
            Server.Map.EntityPositions.AddEntity(ev.Entity, ev.To);

            ev.Entity.LastPosition = ev.From;

            // Updating this movement to nearby players soo the client updates
            foreach (var nearPlayer in nearPlayers)
            {
                nearPlayer.Tcp.Send(movePacket);
            }

            // Changed chunk
            if (fromChunkX != toChunkX || fromChunkY != toChunkY)
            {
                var fromChunk = Server.Map.GetChunk(fromChunkX, fromChunkY);
                toChunk.MoveFromChunk(ev.Entity, fromChunk);
            }

            ev.Entity.Position = ev.To;
        }
コード例 #7
0
        // server recieving entitymove means its a player moving
        public void OnEntityMovePacket(EntityMovePacket packet)
        {
            var player           = Server.GetPlayerByConnectionId(packet.ClientId);
            var originalPosition = new Position(player.Position.X, player.Position.Y);
            var distanceMoved    = PositionExtensions.GetDistance(player.Position, packet.To);
            var timeToMove       = Formulas.GetTimeToMoveBetweenTwoTiles(player.MoveSpeed);

            var now = GameThread.TIME_MS_NOW;

            // Player tryng to hack ?
            var isPassable = Server.Map.IsPassable(packet.To.X, packet.To.Y);

            if (distanceMoved > 1 || now < player.CanMoveAgainTime || !isPassable)
            {
                // send player back to the position client-side
                player.Tcp.Send(new SyncPacket()
                {
                    Position = player.Position
                });
                return;
            }

            // subtract the player latency for possibility of lag for a smoother movement
            player.CanMoveAgainTime = now + timeToMove - player.Tcp.Latency;

            var entityMoveEvent = new EntityMoveEvent()
            {
                To     = packet.To,
                Entity = player
            };

            Server.Events.Call(entityMoveEvent);

            // updating in database
            PlayerService.UpdatePlayerPosition(player.UID, player.Position.X, player.Position.Y);


            // update chunks for that player
            ChunkProvider.CheckChunks(player);
        }