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); } }
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); } }
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; }
// 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); }
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); } } }
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; }
// 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); }