class GameLogic
Public Class Methods
new(console)
click to toggle source
# File lib/server/gamelogic.rb, line 2 def initialize(console) @console = console @alive_players = 0 end
Public Instance Methods
check_collide(players, player)
click to toggle source
# File lib/server/gamelogic.rb, line 7 def check_collide(players, player) players.each do |other| next if other == player next if !player.collide[:down] x_force = player.check_player_collide(other) player.apply_force(x_force, -8) if !x_force.zero? end end
gravity(player, dt)
click to toggle source
# File lib/server/gamelogic.rb, line 111 def gravity(player, dt) if player.dead player.dead_ticks += 1 player.state[:bleeding] = true if player.dead_ticks > 3 player.dead = false player.state[:bleeding] = false player.die end else if player.y + player.h > 384 # too far down --> die player.dead = true player.dead_ticks = 0 end end # outside of the save zone if player.x < 214 || player.x > 800 || player.dead if player.y + player.h > 484 # player.collide[:down] = true player.do_collide(:down, true) return end else # on the save zone if player.y + player.h > 324 # player.collide[:down] = true player.do_collide(:down, true) return end end # grav = 100000 * dt # @console.log "grav: #{grav}" # player.y += grav player.dy += 2 if player.dy < 16 end
handle_client_requests(data, id, players, dt)
click to toggle source
# File lib/server/gamelogic.rb, line 31 def handle_client_requests(data, id, players, dt) player = Player.get_player_by_id(players, id) if player.nil? @console.log "WARNING failed to update nil player with id=#{id}" if players.count > 0 @console.log "connected players:" else @console.log "no players currently connected!" end players.each do |p| @console.log "id=#{p.id} name='#{p.name}'" end return players end # reset values (should stay first) player.state[:crouching] = false # move request if data[0] == '1' @console.dbg "player=#{id} wants to crouch" player.state[:crouching] = true player.x -= TILE_SIZE / 4 unless player.was_crouching player.was_crouching = true end if data[1] == 'l' @console.dbg "player=#{id} wants to walk left" player.move_left end if data[1] == 'r' @console.dbg "player=#{id} wants to walk right" player.move_right end if data[2] == '1' @console.dbg "player=#{id} wants to jump" player.do_jump end if data[3] == '1' && player.state[:crouching] == false @console.dbg "player=#{id} wants to fire" player.fire_ticks += 1 if player.fire_ticks > 29 player.state[:fire] = 3 elsif player.fire_ticks > 19 player.state[:fire] = 2 elsif player.fire_ticks > 9 player.state[:fire] = 1 end else if player.fire_ticks > 0 dx = (player.aimX - player.x).clamp(-200, 200) / 20 dy = (player.aimY - player.y).clamp(-200, 200) / 20 dx *= (player.fire_ticks / 10).clamp(1, 3) dy *= (player.fire_ticks / 10).clamp(1, 3) player.projectile.fire(player.x + TILE_SIZE/4, player.y + TILE_SIZE/2, dx, dy, player) end player.fire_ticks = 0 player.state[:fire] = 0 end player.aimX = net_unpack_bigint(data[4..5]) player.aimY = net_unpack_bigint(data[6..7]) # player.projectile.x = player.aimX + 20 # player.projectile.y = player.aimY + 20 player.check_out_of_world # return updated players players end
posttick(players, dt)
click to toggle source
# File lib/server/gamelogic.rb, line 100 def posttick(players, dt) players.each do |player| # stopped crouching -> stand up if player.was_crouching && player.state[:crouching] == false player.y -= TILE_SIZE player.x += TILE_SIZE / 4 player.was_crouching = false end end end
tick(players, dt)
click to toggle source
# File lib/server/gamelogic.rb, line 17 def tick(players, dt) players.each do |player| # reset values (should stay first) player.reset_collide gravity(player, dt) player.tick player.projectile.tick(players) # player collsions works # but it eats performance and delays jumping check_collide(players, player) end end