Browse Source

Added LAN multiplayer - FINISHED

tags/crossplatform
Madiwka 3 years ago
parent
commit
e0b1af6260
2 changed files with 185 additions and 170 deletions
  1. +184
    -169
      main.lua
  2. +1
    -1
      src/baseGame.lua

+ 184
- 169
main.lua View File

@@ -750,6 +750,7 @@ function love.update(dt)
end
globalState = "selfhost"
selfHost(dt)
IP = "127.0.0.1"
end
if globalState == "clienttest" then
@@ -773,6 +774,7 @@ function love.textinput(t)
end
end
function nettest(dt)
print("nettest running")
if serverinit == false then
local socket = require "socket"
local address, port = IP, 12345
@@ -834,11 +836,12 @@ function nettest(dt)
confirmation = "U"
end

if p[15] then
if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
ball[1].disabled = false
print("illegal disabling")
end
if gameState ~= "1serve" then
if (ball[1].x > VIRTUAL_WIDTH/2) then
if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
die = tonumber(p[2])
@@ -882,7 +885,8 @@ function nettest(dt)
player2.y = tonumber(p[4])
end
end
end
end
end
until not data
if not datawaspassed then
@@ -1462,8 +1466,13 @@ end
function love.draw(dt)
simpleScale.set()

baseDraw()
if globalState == "selfhost" then
globalState = "nettest"
baseDraw()
globalState = "selfhost"
else
baseDraw()
end
if (globalState == "nettest" or globalState == "clienttest" or globalState == "selfhost") and confirmation == "D" then
love.graphics.clear(50 / 255, 50 / 255, 50 / 255, 255)
love.graphics.printf("WAIT FOR OPPONENT", 0, VIRTUAL_HEIGHT / 2, VIRTUAL_WIDTH, "center")
@@ -1624,6 +1633,8 @@ function resettinggenius()
nuclearanimation = 3
timeIsSlow = false
timeIsSlow2 = false
serverinit = false
ts = 0
originalSpeed = 200
gameState = "menu"
globalState = "menu"
@@ -1714,177 +1725,152 @@ end
end

end
actualP2DATA = nil
actualP1DATA = nil
running = false
local gts = 0
hostinit = false
player1ip = "127.0.0.1"
player1port = "12345"
player2ip = "none"
player2port = nil
local p1ping = 0
local p2ping = 0
local requesterip
local requresterport
local player1ip, player2ip, player1port, player2port = "127.0.0.1", "none", nil, nil
local gts = 0
function selfHost(dt)
ts = ts + dt
gts = gts + dt
if serverinit == false then
print("Server running")
if not hostinit then
local socket = require('socket')
udp = socket.udp()
udp:setsockname('*', 12345)
udp:settimeout(0)
serverinit = true
end


hostinit = true
else
gts = gts + dt
if gts > 0.015 then
gts = 0
data, msg_or_ip, port_or_nil = udp:receivefrom()
if not running then
print("launching server")
running = true
local socket = require 'socket'
local udp = socket.udp()
local data, msg_or_ip, port_or_nil
local p1data, p2data
repeat

udp:settimeout(0)
udp:setsockname('*', 12345)
data, msg_or_ip, port_or_nil = udp:receivefrom()
if data then

end
print("Acting as server")
actualP2DATA = nil
local data, msg_or_ip, port_or_nil
local p1data, p2data
repeat
data, msg_or_ip, port_or_nil = udp:receivefrom()
if data then
if data == "HELLO" then
requesterip = msg_or_ip
requesterport = port_or_nil
else
print(string.sub(data,1,1) .. "Playerlist: " .. player1ip .. " " .. player2ip)
if player2ip == msg_or_ip then
p2data = data
p2ping = 0
else
if player2ip == "none" and msg_or_ip ~= player1ip then
player2ip = msg_or_ip
p2data = data
p2ping = 0
player2port = port_or_nil
print("CONNECTED: PLAYER 2 FROM: " .. player2ip)
elseif (player1ip ~= msg_or_ip and player2ip ~= msg_or_ip) then
print("Lobby Full!" .. player1ip .. player2ip)
end
end
end
end
until not data
if player2ip ~= "none" then
p2ping = p2ping + 1
if p2ping > 100 then
if p1data then
udp:sendto(p1data .. '|' .. p2ping, player2ip, player2port)
end
print("PLAYER 2 DISCONNECTED")
p2data = nil
player2ip = "none"
player2port = nil
end
end
if p1data and player2port then
udp:sendto(p1data .. '|' .. p2ping, player2ip, player2port)
print("SENT TO " .. player2ip .. ":" .. player2port .. " : " .. string.sub(p1data,1,1))
end
if p2data and player1port then
actualP2DATA = p2data
--print("SENT TO " .. player1ip .. ":" .. player1port .. " : " .. string.sub(p2data,1,1))
--print("1::" .. p1data)
--print("2::" .. p2data)
--print("SENT1: " .. player2ip .. " " .. player2port .. " " .. p1data)
--print("SENT2: " .. player1ip .. " " .. player1port .. " " .. p2data)
end
if requesterip then
print("getting pnged!")
if player2ip == "none" then
udp:sendto("clienttest", requesterip, requesterport)
print("clienttest av to: " .. requesterip)
else
udp:sendto("full", requesterip, requesterport)
print("full to: " .. msg_or_ip)
end
requesterip, requesterport = nil
if data == "HELLO" then
requesterip = msg_or_ip
requesterport = port_or_nil
else
print(string.sub(data,1,1) .. "Playerlist: " .. player1ip .. " " .. player2ip)
if player2ip == msg_or_ip then
p2data = data .. '|' .. p2ping
p2ping = 0
else
if player2ip == "none" and msg_or_ip ~= player1ip then
player2ip = msg_or_ip
p2data = data .. '|' .. p2ping
p2ping = 0
player2port = port_or_nil
print("CONNECTED: PLAYER 2 FROM: " .. player2ip)
elseif (player1ip ~= msg_or_ip and player2ip ~= msg_or_ip) then
print("Lobby Full!" .. player1ip .. player2ip)
end
end
end
print("Integrating nettest")

for i = 1, maxBalls do
if ts > updaterate then
ts = 0
actualP1DATA = tostring(lastSentKey) ..
'|' .. tostring(ball[1].dy) ..
'|' .. tostring(player2.y) ..
'|' .. tostring(player1.y) ..
'|' .. tostring(player1score) ..
'|' .. tostring(player2score) ..
'|' .. tostring(player1nukescore) ..
'|' .. tostring(player2nukescore) ..
'|' .. tostring(ball[1].x) ..
'|' .. tostring(ball[1].y) ..
'|' .. gameState ..
'|' .. tostring(ball[1].dx) ..
'|' .. tostring(ballSpeed) ..
'|' .. tostring(paddle_SPEED) ..
"|HOST"
end
end
until not data
if player1ip ~= "none" then
p1ping = p1ping + 1
end
if player2ip == "none" then
confirmation = "S"
else
print("Player2: " .. player2ip)
p2ping = p2ping + 1
if p2ping > 100 then
for i = 1, maxBalls do
ts = ts + dt
if ts > updaterate then
udp:sendto(tostring(lastSentKey) ..
'|' .. tostring(ball[1].dy) ..
'|' .. tostring(player2.y) ..
'|' .. tostring(player1.y) ..
'|' .. tostring(player1score) ..
'|' .. tostring(player2score) ..
'|' .. tostring(player1nukescore) ..
'|' .. tostring(player2nukescore) ..
'|' .. tostring(ball[1].x) ..
'|' .. tostring(ball[1].y) ..
'|' .. gameState ..
'|' .. tostring(ball[1].dx) ..
'|' .. tostring(ballSpeed) ..
'|' .. tostring(paddle_SPEED) ..
"|HOST|".. p2ping, player2ip, player2port)
ts = 0
end
end
print("PLAYER 2 DISCONNECTED")
p2data = nil
player2ip = "none"
player2port = nil
end
end
if player2port then
for i = 1, maxBalls do
ts = ts + dt
if ts > updaterate then
udp:sendto(tostring(lastSentKey) ..
'|' .. tostring(ball[1].dy) ..
'|' .. tostring(player2.y) ..
'|' .. tostring(player1.y) ..
'|' .. tostring(player1score) ..
'|' .. tostring(player2score) ..
'|' .. tostring(player1nukescore) ..
'|' .. tostring(player2nukescore) ..
'|' .. tostring(ball[1].x) ..
'|' .. tostring(ball[1].y) ..
'|' .. gameState ..
'|' .. tostring(ball[1].dx) ..
'|' .. tostring(ballSpeed) ..
'|' .. tostring(paddle_SPEED) ..
"|HOST|".. p2ping, player2ip, player2port)
ts = 0
end
end
end
local data
print("SENT TO " .. player2ip .. ":" .. player2port .. " : " ..lastSentKey)
end
local datanumtest = 0
local datawaspassed = false
if actualP2DATA then
datawaspassed = true
print("ReceivedINFO: " .. actualP2data)
confirmation = "N"
local p = split(actualP2data, '|')
if p[15] then
if tonumber(p[16]) > 90 then
confirmation = "L"
end
if p[15] ~= "CLIENT" then
if p2data and player1port then
datawaspassed = true
print("ReceivedINFO: " .. p2data)
confirmation = "N"
local p = split(p2data, '|')
if p[15] then
if tonumber(p[16]) > 90 then
confirmation = "L"
end
if p[15] ~= "CLIENT" then
confirmation = "U"
end
elseif p[1] == "RESPONSE" then
if p[2] == "1" then
elseif p[2] == "2" then
elseif p[2] == "3" then
end
else
confirmation = "U"
end
elseif p[1] == "RESPONSE" then
else
confirmation = "U"
end
if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
ball[1].disabled = false
print("illegal disabling")
end
if (ball[1].x > VIRTUAL_WIDTH/2) then
if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
die = tonumber(p[2])
lastSentKeyClient,
ball[1].dy,
player2.y,
player1score,
player2score,
player1nukescore,
player2nukescore,
ball[1].x,
ball[1].y,
gameState,
ball[1].dx,
ballSpeed,
paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
print("ACCEPTED")
else
print("DECLINED")
end
else
if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
if p[15] then
if ball[1].disabled and ball[1].x > 20 and ball[1].x < VIRTUAL_WIDTH - 20 then
ball[1].disabled = false
print("illegal disabling")
end
if gameState ~= "1serve" then
if (ball[1].x > VIRTUAL_WIDTH/2) then
if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
die = tonumber(p[2])
lastSentKeyClient,
ball[1].dy,
@@ -1901,22 +1887,51 @@ function selfHost(dt)
paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
print("ACCEPTED")
else
print("DECLINED")
end
else
if tonumber(p[9]) > VIRTUAL_WIDTH/2 then
die = tonumber(p[2])
lastSentKeyClient,
ball[1].dy,
player2.y,
player1score,
player2score,
player1nukescore,
player2nukescore,
ball[1].x,
ball[1].y,
gameState,
ball[1].dx,
ballSpeed,
paddle_SPEED = p[1], die, tonumber(p[4]), tonumber(p[5]), tonumber(p[6]), tonumber(p[7]), tonumber(p[8]), tonumber(p[9]), tonumber(p[10]), p[11], tonumber(p[12]), tonumber(p[13]), tonumber(p[14])
print("ACCEPTED")
else
print("ENFORCED" .. ball[1].x .. " " .. ball[1].dx)
lastSentKeyClient = p[1]
player2.y = tonumber(p[4])
end
end
if not datawaspassed then
datawaspassedtimer = datawaspassedtimer + 1
if datawaspassedtimer > 5 then
confirmation = "D"
datawaspassedtimer = 0
end
else
datawaspassedtimer = 0
end
end
end
end
print("SENT TO " .. player1ip .. ":" .. player1port .. " : " .. string.sub(p2data,1,1))
--print("1::" .. p1data)
--print("2::" .. p2data)
--print("SENT1: " .. player2ip .. " " .. player2port .. " " .. p1data)
--print("SENT2: " .. player1ip .. " " .. player1port .. " " .. p2data)
end
if requesterip then
print("getting pnged!")
if player2ip == "none" then
udp:sendto("clienttest", requesterip, requesterport)
print("clienttest av to: " .. requesterip)
else
udp:sendto("full", requesterip, requesterport)
print("full to: " .. msg_or_ip)
end
else
confirmation = "S"
requesterip, requesterport = nil
end
end
gts = 0
end
end
end

+ 1
- 1
src/baseGame.lua View File

@@ -697,6 +697,7 @@ function menuDraw()
AGAINST_AI = 0
gameState = "1serve"
ball[1]:reset(1, 1)
end
)
)
table.insert(
@@ -1311,6 +1312,5 @@ function clientsBaseGame(dt)
goalManager()
powerAvailability()
player1:update(dt)
love.event.quit()
player2:update(dt)
end

Loading…
Cancel
Save