Change file structure of Acedia
Improves grouping of some files in project's directories.
This commit is contained in:
parent
54e87437c2
commit
97569f9568
21 changed files with 0 additions and 0 deletions
142
sources/Core/Events/Broadcast/BroadcastEvents.uc
Normal file
142
sources/Core/Events/Broadcast/BroadcastEvents.uc
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
/**
|
||||
* Event generator for events, related to broadcasting messages
|
||||
* through standard Unreal Script means:
|
||||
* 1. text messages, typed by a player;
|
||||
* 2. localized messages, identified by a LocalMessage class and id.
|
||||
* Allows to make decisions whether or not to propagate certain messages.
|
||||
* Copyright 2020 Anton Tarasenko
|
||||
*------------------------------------------------------------------------------
|
||||
* This file is part of Acedia.
|
||||
*
|
||||
* Acedia is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Acedia is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
class BroadcastEvents extends Events
|
||||
abstract;
|
||||
|
||||
struct LocalizedMessage
|
||||
{
|
||||
// Every localized message is described by a class and id.
|
||||
// For example, consider 'KFMod.WaitingMessage':
|
||||
// if passed 'id' is '1',
|
||||
// then it's supposed to be a message about new wave,
|
||||
// but if passed 'id' is '2',
|
||||
// then it's about completing the wave.
|
||||
var class<LocalMessage> class;
|
||||
var int id;
|
||||
// Localized messages in unreal script can be passed along with
|
||||
// optional arguments, described by variables below.
|
||||
var PlayerReplicationInfo relatedPRI1;
|
||||
var PlayerReplicationInfo relatedPRI2;
|
||||
var Object relatedObject;
|
||||
};
|
||||
|
||||
static function bool CallCanBroadcast(Actor broadcaster, int recentSentTextSize)
|
||||
{
|
||||
local int i;
|
||||
local bool result;
|
||||
local array< class<Listener> > listeners;
|
||||
listeners = GetListeners();
|
||||
for (i = 0;i < listeners.length;i += 1)
|
||||
{
|
||||
result = class<BroadcastListenerBase>(listeners[i])
|
||||
.static.CanBroadcast(broadcaster, recentSentTextSize);
|
||||
if (!result) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static function bool CallHandleText
|
||||
(
|
||||
Actor sender,
|
||||
out string message,
|
||||
name messageType
|
||||
)
|
||||
{
|
||||
local int i;
|
||||
local bool result;
|
||||
local array< class<Listener> > listeners;
|
||||
listeners = GetListeners();
|
||||
for (i = 0;i < listeners.length;i += 1)
|
||||
{
|
||||
result = class<BroadcastListenerBase>(listeners[i])
|
||||
.static.HandleText(sender, message, messageType);
|
||||
if (!result) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static function bool CallHandleTextFor
|
||||
(
|
||||
PlayerController receiver,
|
||||
Actor sender,
|
||||
out string message,
|
||||
name messageType
|
||||
)
|
||||
{
|
||||
local int i;
|
||||
local bool result;
|
||||
local array< class<Listener> > listeners;
|
||||
listeners = GetListeners();
|
||||
for (i = 0;i < listeners.length;i += 1)
|
||||
{
|
||||
result = class<BroadcastListenerBase>(listeners[i])
|
||||
.static.HandleTextFor(receiver, sender, message, messageType);
|
||||
if (!result) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static function bool CallHandleLocalized
|
||||
(
|
||||
Actor sender,
|
||||
LocalizedMessage message
|
||||
)
|
||||
{
|
||||
local int i;
|
||||
local bool result;
|
||||
local array< class<Listener> > listeners;
|
||||
listeners = GetListeners();
|
||||
for (i = 0;i < listeners.length;i += 1)
|
||||
{
|
||||
result = class<BroadcastListenerBase>(listeners[i])
|
||||
.static.HandleLocalized(sender, message);
|
||||
if (!result) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static function bool CallHandleLocalizedFor
|
||||
(
|
||||
PlayerController receiver,
|
||||
Actor sender,
|
||||
LocalizedMessage message
|
||||
)
|
||||
{
|
||||
local int i;
|
||||
local bool result;
|
||||
local array< class<Listener> > listeners;
|
||||
listeners = GetListeners();
|
||||
for (i = 0;i < listeners.length;i += 1)
|
||||
{
|
||||
result = class<BroadcastListenerBase>(listeners[i])
|
||||
.static.HandleLocalizedFor(receiver, sender, message);
|
||||
if (!result) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
relatedListener = class'BroadcastListenerBase'
|
||||
}
|
||||
197
sources/Core/Events/Broadcast/BroadcastHandler.uc
Normal file
197
sources/Core/Events/Broadcast/BroadcastHandler.uc
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/**
|
||||
* 'BroadcastHandler' class that used by Acedia to catch
|
||||
* broadcasting events. For Acedia to work properly it needs to be added to
|
||||
* the very beginning of the broadcast handlers' chain.
|
||||
* Copyright 2020 Anton Tarasenko
|
||||
*------------------------------------------------------------------------------
|
||||
* This file is part of Acedia.
|
||||
*
|
||||
* Acedia is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Acedia is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
// TODO: make it work from any place in the chain.
|
||||
class BroadcastHandler extends Engine.BroadcastHandler
|
||||
dependson(BroadcastEvents);
|
||||
|
||||
// The way vanilla 'BroadcastHandler' works - it can check if broadcast is
|
||||
// possible for any actor, but for actually sending the text messages it will
|
||||
// try to extract player's data from it
|
||||
// and will simply pass 'none' if it can't.
|
||||
// We remember senders in this array in order to pass real ones to our events.
|
||||
// Array instead of variable is to account for folded calls
|
||||
// (when handling of broadcast events leads to another message generation).
|
||||
var private array<Actor> storedSenders;
|
||||
|
||||
// We want to insert our code in some of the functions between
|
||||
// 'AllowsBroadcast' check and actual broadcasting,
|
||||
// so we can't just use a 'super.AllowsBroadcast()' call.
|
||||
// Instead we first manually do this check, then perform our logic and then
|
||||
// make a super call, but with 'blockAllowsBroadcast' flag set to 'true',
|
||||
// which causes overloaded 'AllowsBroadcast()' to omit actual checks.
|
||||
var private bool blockAllowsBroadcast;
|
||||
|
||||
// Functions below simply reroute vanilla's broadcast events to
|
||||
// Acedia's 'BroadcastEvents', while keeping original senders
|
||||
// and blocking 'AllowsBroadcast()' as described in comments for
|
||||
// 'storedSenders' and 'blockAllowsBroadcast'.
|
||||
|
||||
public function bool HandlerAllowsBroadcast(Actor broadcaster, int sentTextNum)
|
||||
{
|
||||
local bool canBroadcast;
|
||||
// Check listeners
|
||||
canBroadcast = class'BroadcastEvents'.static
|
||||
.CallCanBroadcast(broadcaster, sentTextNum);
|
||||
// Check other broadcast handlers (if present)
|
||||
if (canBroadcast && nextBroadcastHandler != none)
|
||||
{
|
||||
canBroadcast = nextBroadcastHandler
|
||||
.HandlerAllowsBroadcast(broadcaster, sentTextNum);
|
||||
}
|
||||
return canBroadcast;
|
||||
}
|
||||
|
||||
function Broadcast(Actor sender, coerce string message, optional name type)
|
||||
{
|
||||
local bool canTryToBroadcast;
|
||||
if (!AllowsBroadcast(sender, Len(message)))
|
||||
return;
|
||||
canTryToBroadcast = class'BroadcastEvents'.static
|
||||
.CallHandleText(sender, message, type);
|
||||
if (canTryToBroadcast)
|
||||
{
|
||||
storedSenders[storedSenders.length] = sender;
|
||||
blockAllowsBroadcast = true;
|
||||
super.Broadcast(sender, message, type);
|
||||
blockAllowsBroadcast = false;
|
||||
storedSenders.length = storedSenders.length - 1;
|
||||
}
|
||||
}
|
||||
|
||||
function BroadcastTeam
|
||||
(
|
||||
Controller sender,
|
||||
coerce string message,
|
||||
optional name type
|
||||
)
|
||||
{
|
||||
local bool canTryToBroadcast;
|
||||
if (!AllowsBroadcast(sender, Len(message)))
|
||||
return;
|
||||
canTryToBroadcast = class'BroadcastEvents'.static
|
||||
.CallHandleText(sender, message, type);
|
||||
if (canTryToBroadcast)
|
||||
{
|
||||
storedSenders[storedSenders.length] = sender;
|
||||
blockAllowsBroadcast = true;
|
||||
super.BroadcastTeam(sender, message, type);
|
||||
blockAllowsBroadcast = false;
|
||||
storedSenders.length = storedSenders.length - 1;
|
||||
}
|
||||
}
|
||||
|
||||
event AllowBroadcastLocalized
|
||||
(
|
||||
Actor sender,
|
||||
class<LocalMessage> message,
|
||||
optional int switch,
|
||||
optional PlayerReplicationInfo relatedPRI1,
|
||||
optional PlayerReplicationInfo relatedPRI2,
|
||||
optional Object optionalObject
|
||||
)
|
||||
{
|
||||
local bool canTryToBroadcast;
|
||||
local BroadcastEvents.LocalizedMessage packedMessage;
|
||||
if (!AllowsBroadcast(sender, Len(message)))
|
||||
return;
|
||||
packedMessage.class = message;
|
||||
packedMessage.id = switch;
|
||||
packedMessage.relatedPRI1 = relatedPRI1;
|
||||
packedMessage.relatedPRI2 = relatedPRI2;
|
||||
packedMessage.relatedObject = optionalObject;
|
||||
canTryToBroadcast = class'BroadcastEvents'.static
|
||||
.CallHandleLocalized(sender, packedMessage);
|
||||
if (canTryToBroadcast)
|
||||
{
|
||||
super.AllowBroadcastLocalized( sender, message, switch,
|
||||
relatedPRI1, relatedPRI2,
|
||||
optionalObject);
|
||||
}
|
||||
}
|
||||
|
||||
function bool AllowsBroadcast(actor broadcaster, int len)
|
||||
{
|
||||
if (blockAllowsBroadcast)
|
||||
return true;
|
||||
return super.AllowsBroadcast(broadcaster, len);
|
||||
}
|
||||
|
||||
function bool AcceptBroadcastText
|
||||
(
|
||||
PlayerController receiver,
|
||||
PlayerReplicationInfo senderPRI,
|
||||
out string message,
|
||||
optional name type
|
||||
)
|
||||
{
|
||||
local bool canBroadcast;
|
||||
local Actor sender;
|
||||
if (senderPRI != none)
|
||||
{
|
||||
sender = PlayerController(senderPRI.owner);
|
||||
}
|
||||
if (sender == none && storedSenders.length > 0)
|
||||
{
|
||||
sender = storedSenders[storedSenders.length - 1];
|
||||
}
|
||||
canBroadcast = class'BroadcastEvents'.static
|
||||
.CallHandleTextFor(receiver, sender, message, type);
|
||||
if (!canBroadcast)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return super.AcceptBroadcastText(receiver, senderPRI, message, type);
|
||||
}
|
||||
|
||||
|
||||
function bool AcceptBroadcastLocalized
|
||||
(
|
||||
PlayerController receiver,
|
||||
Actor sender,
|
||||
class<LocalMessage> message,
|
||||
optional int switch,
|
||||
optional PlayerReplicationInfo relatedPRI1,
|
||||
optional PlayerReplicationInfo relatedPRI2,
|
||||
optional Object obj
|
||||
)
|
||||
{
|
||||
local bool canBroadcast;
|
||||
local BroadcastEvents.LocalizedMessage packedMessage;
|
||||
packedMessage.class = message;
|
||||
packedMessage.id = switch;
|
||||
packedMessage.relatedPRI1 = relatedPRI1;
|
||||
packedMessage.relatedPRI2 = relatedPRI2;
|
||||
packedMessage.relatedObject = obj;
|
||||
canBroadcast = class'BroadcastEvents'.static
|
||||
.CallHandleLocalizedFor(receiver, sender, packedMessage);
|
||||
if (!canBroadcast)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return super.AcceptBroadcastLocalized( receiver, sender, message, switch,
|
||||
relatedPRI1, relatedPRI2, obj);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
blockAllowsBroadcast = false
|
||||
}
|
||||
120
sources/Core/Events/Broadcast/BroadcastListenerBase.uc
Normal file
120
sources/Core/Events/Broadcast/BroadcastListenerBase.uc
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
/**
|
||||
* Listener for events, related to broadcasting messages
|
||||
* through standard Unreal Script means:
|
||||
* 1. text messages, typed by a player;
|
||||
* 2. localized messages, identified by a LocalMessage class and id.
|
||||
* Allows to make decisions whether or not to propagate certain messages.
|
||||
* Copyright 2020 Anton Tarasenko
|
||||
*------------------------------------------------------------------------------
|
||||
* This file is part of Acedia.
|
||||
*
|
||||
* Acedia is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Acedia is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
class BroadcastListenerBase extends Listener
|
||||
abstract;
|
||||
|
||||
static final function PlayerController GetController(Actor sender)
|
||||
{
|
||||
local Pawn senderPawn;
|
||||
senderPawn = Pawn(sender);
|
||||
if (senderPawn != none) return PlayerController(senderPawn.controller);
|
||||
return PlayerController(sender);
|
||||
}
|
||||
|
||||
// This event is called whenever registered broadcast handlers are asked if
|
||||
// they'd allow given actor ('broadcaster') to broadcast a text message,
|
||||
// given that none so far rejected it and he recently already broadcasted
|
||||
// or tried to broadcast 'recentSentTextSize' symbols of text
|
||||
// (that value is periodically reset in 'GameInfo',
|
||||
// by default should be each second).
|
||||
// NOTE: this function is ONLY called when someone tries to
|
||||
// broadcast TEXT messages.
|
||||
// If one of the listeners returns 'false', -
|
||||
// it will be treated just like one of broadcasters returning 'false'
|
||||
// in 'AllowsBroadcast' and this method won't be called for remaining
|
||||
// active listeners.
|
||||
static function bool CanBroadcast(Actor broadcaster, int recentSentTextSize)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// This event is called whenever a someone is trying to broadcast
|
||||
// a text message (typically the typed by a player).
|
||||
// This function is called once per message and allows you to change it
|
||||
// (by changing 'message' argument) before any of the players receive it.
|
||||
// Return 'true' to allow the message through.
|
||||
// If one of the listeners returns 'false', -
|
||||
// it will be treated just like one of broadcasters returning 'false'
|
||||
// in 'AcceptBroadcastText' and this method won't be called for remaining
|
||||
// active listeners.
|
||||
static function bool HandleText
|
||||
(
|
||||
Actor sender,
|
||||
out string message,
|
||||
optional name messageType
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// This event is similar to 'HandleText', but is called for every player
|
||||
// the message is sent to.
|
||||
// If allows you to alter the message, but the changes are accumulated
|
||||
// as events go through the players.
|
||||
static function bool HandleTextFor
|
||||
(
|
||||
PlayerController receiver,
|
||||
Actor sender,
|
||||
out string message,
|
||||
optional name messageType
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// This event is called whenever a localized message is trying to
|
||||
// get broadcasted to a certain player ('receiver').
|
||||
// Return 'true' to allow the message through.
|
||||
// If one of the listeners returns 'false', -
|
||||
// it will be treated just like one of broadcasters returning 'false'
|
||||
// in 'AcceptBroadcastText' and this method won't be called for remaining
|
||||
// active listeners.
|
||||
static function bool HandleLocalized
|
||||
(
|
||||
Actor sender,
|
||||
BroadcastEvents.LocalizedMessage message
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// This event is similar to 'HandleLocalized', but is called for
|
||||
// every player the message is sent to.
|
||||
static function bool HandleLocalizedFor
|
||||
(
|
||||
PlayerController receiver,
|
||||
Actor sender,
|
||||
BroadcastEvents.LocalizedMessage message
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
relatedEvents = class'BroadcastEvents'
|
||||
}
|
||||
|
||||
// Text messages can (optionally) have their type specified.
|
||||
// Examples of it are names 'Say' and 'CriticalEvent'.
|
||||
Reference in a new issue