Skip to content

Commit

Permalink
Work on websockets
Browse files Browse the repository at this point in the history
  • Loading branch information
jefvel committed Dec 2, 2024
1 parent 8f6f5ce commit 19728f8
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 48 deletions.
6 changes: 3 additions & 3 deletions source/activities/ActivityArea.hx
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ class ActivityArea extends FlxSprite

public function on_event(event:NetEventDef, player:BaseUser)
{
var area = active_players[player.username];
if (area == null)
var area_user_instance = active_players[player.username];
if (area_user_instance == null)
return;
area.on_event(event);
area_user_instance.on_event(event);
}

// Happens when the local player presses the interact button
Expand Down
6 changes: 3 additions & 3 deletions source/entities/Player.hx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class Player extends BaseUser
if (costume == null)
costume = JsonData.get_costume("tankman");

last_update_json = {name: username};
last_update_json = {username: username};

type = "player";

Expand Down Expand Up @@ -275,7 +275,7 @@ class Player extends BaseUser

public function get_user_update_json(force_send_full_user:Bool = false):NetUserDef
{
var def:NetUserDef = {name: username};
var def:NetUserDef = {username: username, room_id: PlayState.self.current_room_id};

var new_sx = flipX ? -1 : 1;
if (last_update_json.x != x.floor() || force_send_full_user)
Expand All @@ -291,7 +291,7 @@ class Player extends BaseUser
def.costume = costume.name;

last_update_json = {
name: username,
username: username,
x: x.floor(),
y: y.floor(),
sx: new_sx,
Expand Down
8 changes: 8 additions & 0 deletions source/entities/base/BaseUser.hx
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,18 @@ class BaseUser extends NGSprite
{
leave_activity_area();

shadow.destroy();
nameTag.destroy();

PlayState.self.users.remove(this, true);
super.kill();
}

public function on_user_left()
{
kill();
}

public static function get_user(username:String, ?make_user_function:Void->BaseUser):BaseUser
{
for (user in PlayState.self.users)
Expand Down
2 changes: 1 addition & 1 deletion source/net/tankmas/NetDefs.hx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package net.tankmas;

typedef NetUserDef =
{
name:String,
username:String,
?x:Int,
?y:Int,
?sx:Int, // Scale x, if facing right or left
Expand Down
61 changes: 44 additions & 17 deletions source/net/tankmas/OnlineLoop.hx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.tankmas;

import bunnymark.PlayState;
import data.JsonData;
import data.SaveManager;
import data.types.TankmasDefs.CostumeDef;
Expand Down Expand Up @@ -29,6 +30,8 @@ class OnlineLoop
static var last_rooms_get_timestamp:Float;
static var last_events_get_timestamp:Float;

static var last_websocket_player_tick_timestamp:Float;

static final tick_wait_timeout:Int = -1;

public static var current_timestamp(get, default):Float;
Expand All @@ -55,17 +58,33 @@ class OnlineLoop
last_rooms_post_timestamp = current_timestamp;
last_rooms_get_timestamp = current_timestamp;
last_events_get_timestamp = current_timestamp;

last_websocket_player_tick_timestamp = current_timestamp;
}

public static function iterate(elapsed:Float = 0.0)
{
#if offline return; #end

#if websocket
websocket.update(elapsed);

var tick_diff = current_timestamp - last_websocket_player_tick_timestamp;
if (tick_diff < 0.2)
return;

last_websocket_player_tick_timestamp = current_timestamp;

var json:NetUserDef = PlayState.self.player.get_user_update_json();
if (json.x != null || json.y != null || json.costume != null || json.sx != null)
{
websocket.send_player(json);
}
#end

#if !websocket
var post_time_diff:Float = current_timestamp - last_rooms_post_timestamp;
var get_time_diff:Float = current_timestamp - last_rooms_get_timestamp;

if (post_time_diff > rooms_post_tick_rate * .001 && rooms_post_tick_rate > -1)
{
last_rooms_post_timestamp = current_timestamp;
Expand All @@ -82,6 +101,7 @@ class OnlineLoop
last_events_get_timestamp = current_timestamp;
OnlineLoop.get_events("1");
}
#end
}

/**This is a post request**/
Expand All @@ -92,7 +112,7 @@ class OnlineLoop

if (json.x != null || json.y != null || json.costume != null || json.sx != null)
{
websocket.send_player(json);
// websocket.send_player(json);
TankmasClient.post_user(room_id, json, after_post_player);
}
}
Expand Down Expand Up @@ -141,6 +161,27 @@ class OnlineLoop
}
}

public static function update_user_visual(username:String, def:NetUserDef)
{
if (username == Main.username)
return;

var costume:CostumeDef = JsonData.get_costume(def.costume);

if (costume == null)
costume = JsonData.get_costume(Main.default_costume);

var user:BaseUser = BaseUser.get_user(username, function()
{
return new NetUser(def.x, def.y, username, costume);
});

cast(user, NetUser).move_to(def.x != null ? def.x : user.x, def.y != null ? def.y : user.y, def.sx);

if (user.costume == null || user.costume.name != costume.name)
user.new_costume(costume);
}

public static function update_user_visuals(data:Dynamic)
{
#if !ghost_town
Expand All @@ -152,22 +193,8 @@ class OnlineLoop
{
if (username.contains("temporary_random_username"))
continue;

var def:NetUserDef = Reflect.field(data.data, username);
var costume:CostumeDef = JsonData.get_costume(def.costume);

if (costume == null)
costume = JsonData.get_costume(Main.default_costume);

var user:BaseUser = BaseUser.get_user(username, function()
{
return new NetUser(def.x, def.y, username, costume);
});

cast(user, NetUser).move_to(def.x, def.y, def.sx);

if (user.costume == null || user.costume.name != costume.name)
user.new_costume(costume);
update_user_visual(username, def);
}

PlayState.self.users.remove(PlayState.self.player, true);
Expand Down
4 changes: 2 additions & 2 deletions source/net/tankmas/TankmasClient.hx
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ class TankmasClient
{
var url:String = '$address/rooms/$room_id/users';

user.name = Main.username;
if (user.name == null || user.name.length == 0)
user.username = Main.username;
if (user.username == null || user.username.length == 0)
{
return;
}
Expand Down
90 changes: 68 additions & 22 deletions source/net/tankmas/WebsocketClient.hx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.tankmas;

import hx.ws.Types.MessageType;
import net.tankmas.NetDefs.NetUserDef;
import haxe.Json;
#if websocket
Expand All @@ -9,9 +10,10 @@ import haxe.io.Bytes;

enum abstract WebsocketEventType(Int)
{
var SignIn = 1;
var PositionUpdate = 2;
var Event = 3;
var PlayerStateUpdate = 2;
var Event = 3; // Events are custom types, the contain names

var PlayerLeft = 4; // When player disconnects or goes to another room
}

typedef WebsocketEvent =
Expand All @@ -30,16 +32,44 @@ class WebsocketClient
#end

var connected = false;
var username:String = null;
var session_id:String = null;

public function new()
{
connect();
#if offline
return;
#end

username = Main.username;
session_id = null;

#if newgrounds
session_id = Main.ng_api.NG_SESSION_ID;
username = Main.ng_api.NG_USERNAME;
#end

#if (dev && test_local)
session_id = 'test_dev_session';
#end

if (session_id != null && username != null)
{
connect();
}
}

function connect()
{
#if websocket
socket = new WebSocket(address);
if (username == null || session_id == null)
{
trace("Trying to connect with a session id or username");
return;
}

var url = '${address}?username=${username}&session=${session_id}';
socket = new WebSocket(url);
socket.onmessage = on_message;
socket.onopen = on_connect;
socket.onerror = on_error;
Expand All @@ -50,29 +80,55 @@ class WebsocketClient
function on_error(error)
{
trace(error);
connected = false;
}

function on_close()
{
trace('disconnect');
trace('Disconnected to server.');
connected = false;
}

function on_connect()
{
trace('Connected to server.');
connected = true;
sign_in(Main.username);
}

function on_message(message)
function on_message(data:MessageType)
{
trace(message);
try
{
switch (data)
{
case StrMessage(content):
var events:{events:Array<WebsocketEvent>} = Json.parse(content);
if (events == null || events.events == null)
return;
for (event in events.events)
{
if (event.type == PlayerStateUpdate)
{
var d:NetUserDef = event.data;
OnlineLoop.update_user_visual(d.username, d);
}
if (event.type == PlayerLeft)
{
var d:NetUserDef = event.data;
PlayState.self.remove_user(d.username);
}
}
default:
}
}
catch (err)
{
trace(err);
}
}

var queued_messages:Array<Dynamic> = [];

var flush_interval = 0.5;
var flush_interval = 0.2;
var until_flush = 0.0;

public function update(elapsed:Float)
Expand Down Expand Up @@ -123,7 +179,7 @@ class WebsocketClient
public function send_player(player:NetUserDef)
{
send({
type: WebsocketEventType.PositionUpdate,
type: WebsocketEventType.PlayerStateUpdate,
data: player,
});
}
Expand All @@ -136,14 +192,4 @@ class WebsocketClient
data: data,
}, immediate);
}

public function sign_in(username:String)
{
send({
type: WebsocketEventType.SignIn,
data: {
username: username,
}
}, true);
}
}
14 changes: 14 additions & 0 deletions source/states/PlayState.hx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class PlayState extends BaseState

static final default_world:String = "outside_hotel";

public var current_room_id = 1;

var current_world:String;

public var player:Player;
Expand Down Expand Up @@ -208,6 +210,18 @@ class PlayState extends BaseState
level.place_entities();
}

public function remove_user(username:String)
{
if (username == Main.username)
return;

var user:BaseUser = BaseUser.get_user(username);
if (user != null)
{
user.on_user_left();
}
}

function make_ui()
{
ui_overlay = new MainGameOverlay();
Expand Down

0 comments on commit 19728f8

Please sign in to comment.