diff options
| author | realtradam <[email protected]> | 2021-08-08 19:45:02 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2021-08-08 19:45:02 -0400 |
| commit | 112a1de4774c13ad2433286a79c3c4d6e910a1b1 (patch) | |
| tree | e3a2dbe09e5b64a14a78914738ca4d64854948ec /server.rb | |
| download | bad-networking-112a1de4774c13ad2433286a79c3c4d6e910a1b1.tar.gz bad-networking-112a1de4774c13ad2433286a79c3c4d6e910a1b1.zip | |
.
Diffstat (limited to 'server.rb')
| -rw-r--r-- | server.rb | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/server.rb b/server.rb new file mode 100644 index 0000000..139ea9b --- /dev/null +++ b/server.rb @@ -0,0 +1,93 @@ +require 'socket' + +class Player + attr_accessor :color, :x, :y, :port + + def initialize(port, color) + @port = port + @color = color + @x = 0 + @y = 0 + end +end +change = false +threads = [] + +# Ctrl-c will kill threads +at_exit do + puts 'trapping' + threads.each do |t| + puts 'killing' + Thread.kill t + end +end + +# this gurantees something you choose will not be executed more then 60 times a second +def once_per_frame + last = Time.now + while true + yield + now = Time.now + _next = [last + (1 / 60), now].max + sleep(_next - now) + last = _next + end +end + +semaphore = Mutex.new + +players = [] + +#Socket.do_not_reverse_lookup = true +s = UDPSocket.new +s.bind(nil, 4000) + +#reciever +threads.push(Thread.new do + loop do + text, _sender = s.recvfrom(16) + temp = text.split(' ') + # if new connection + # format: "0 #{port}" + if temp[0] == '0' + semaphore.synchronize do + players.push Player.new(temp[1], 'red')#colors.delete(colors.sample)) + s.send("0 #{players.last.color}", 0, 'localhost', temp[1]) + end + #else if player updating their position + # format: "1 #{port} #{x}-#{y}" + elsif temp[0] == '1' + semaphore.synchronize do + user = players.select { |player| player.port == temp[1] } + # something changed, inform sender to send update + if (user.first.x != temp[2].split('-')[0]) && (user.first.x != temp[2].split('-')[0]) + user.first.x = temp[2].split('-')[0] + user.first.y = temp[2].split('-')[1] + change = true + end + end + end + end +end) + +#sender +threads.push(Thread.new do + once_per_frame do + semaphore.synchronize do + # only if something changed should you send an update + if change + change = false + players.each do |target| + players.each do |player, _str| + s.send("#{player.color}-#{player.x}-#{player.y}", 0, 'localhost', target.port) + end + end + end + end + end +end) + +#prevents threads of going to background +loop do + sleep 2 +end |
