From b579a5bbc353f1962e689d8f426d0c90ebb5aed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 19 May 2010 19:26:24 +0200 Subject: [PATCH] Add global messages feature. They can be sent using egs:global from the console. --- src/egs.erl | 11 +++++++++-- src/egs_proto.erl | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/egs.erl b/src/egs.erl index c3d7c0d..f9612f4 100644 --- a/src/egs.erl +++ b/src/egs.erl @@ -17,9 +17,11 @@ % along with EGS. If not, see . -module(egs). --export([start/0, reload/0]). +-export([start/0, reload/0, global/2]). --define(MODULES, [egs_db, egs_game, egs_login, egs_patch, egs_proto]). +-include("include/records.hrl"). + +-define(MODULES, [egs, egs_db, egs_game, egs_login, egs_patch, egs_proto]). %% @doc Start all the application servers. Return the PIDs of the listening processes. @@ -38,3 +40,8 @@ start() -> reload() -> [code:soft_purge(Module) || Module <- ?MODULES], [code:load_file(Module) || Module <- ?MODULES]. + +%% @doc Send a global message. + +global(Type, Message) -> + lists:foreach(fun(User) -> egs_proto:send_global(User#users.socket, Type, Message) end, egs_db:users_select_all()). diff --git a/src/egs_proto.erl b/src/egs_proto.erl index 4264763..a1d9129 100644 --- a/src/egs_proto.erl +++ b/src/egs_proto.erl @@ -245,6 +245,35 @@ send_game_server_info(CSocket, GID, IP, Port) -> Packet = << 16#0216:16, 0:208, GID:32/little-unsigned-integer, 0:64, IP/binary, Port:32/little-unsigned-integer >>, packet_send(CSocket, Packet). +%% @doc Shortcut for send_global/4. + +send_global(CSocket, Type, Message) -> + send_global(CSocket, Type, Message, 2). + +%% @doc Send a global message. +%% There are four types of global messages: dialog, top, scroll and timeout. +%% * dialog: A dialog in the center of the screen, which can be OK'd by players. +%% * top: Horizontal scroll on top of the screen, traditionally used for server-wide messages. +%% * scroll: Vertical scroll on the right of the screen, traditionally used for Player X joined the party. +%% * timeout: A dialog in the center of the screen that disappears after Duration seconds. + +send_global(CSocket, Type, Message, Duration) -> + TypeID = case Type of + dialog -> 0; + top -> 1; + scroll -> 2; + timeout -> 3; + _ -> 1 + end, + UCS2Message = << << X:8, 0:8 >> || X <- Message >>, + try + Packet = << 16#0228:16, 0:304, TypeID:32/little-unsigned-integer, Duration:32/little-unsigned-integer, UCS2Message/binary, 0, 0 >>, + packet_send(CSocket, Packet) + catch + _:_ -> + ignore + end. + %% @doc Say hello. Used by the game server where a temporary session ID isn't needed. send_hello(CSocket) ->