diff --git a/cbp/Module.cbp b/cbp/Module.cbp index ffd08044..49e9ae0a 100644 --- a/cbp/Module.cbp +++ b/cbp/Module.cbp @@ -532,6 +532,7 @@ + diff --git a/source/Misc/Broadcast.cpp b/source/Misc/Broadcast.cpp new file mode 100644 index 00000000..c16e37b0 --- /dev/null +++ b/source/Misc/Broadcast.cpp @@ -0,0 +1,438 @@ +// ------------------------------------------------------------------------------------------------ +#include "Core.hpp" +#include "Base/Shared.hpp" +#include "Base/Color3.hpp" +#include "Base/Color4.hpp" +#include "Entity/Player.hpp" + +// ------------------------------------------------------------------------------------------------ +namespace SqMod { + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastMsg(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the message color specified? + if (top <= 1) + { + return sq_throwerror(vm, "Missing message color"); + } + // Was the message value specified? + else if (top <= 2) + { + return sq_throwerror(vm, "Missing message value"); + } + // Failed to retrieve a Color4 value + bool failed = false; + // The message color + Color4 color; + // Attempt to extract the argument values + try + { + color = Var< Color4 >(vm, 2).value; + } + catch (...) + { + failed = true; + } + // Did we failed to retrieve a Color4 instance? + if (failed) + { + // Attempt to extract the argument values + try + { + color = Var< Color3 >(vm, 2).value; + } + catch (const Sqrat::Exception & e) + { + // Propagate the error + return sq_throwerror(vm, e.Message().c_str()); + } + } + // Attempt to generate the string value + StackStrF val(vm, 3); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted message string + const vcmpError result = _Func->SendClientMessage(itr->mID, color.GetRGBA(), + "%s%s%s", + player->mMessagePrefix.c_str(), + val.mPtr, + player->mMessagePostfix.c_str()); + // Check the result + if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastMsgP(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the index of the message prefix specified? + if (top <= 1) + { + return sq_throwerror(vm, "Missing prefix index"); + } + // Was the message value specified? + else if (top <= 2) + { + return sq_throwerror(vm, "Missing message value"); + } + // The prefix index + Uint32 index; + // Attempt to extract the argument values + try + { + index = Var< Uint32 >(vm, 2).value; + } + catch (const Sqrat::Exception & e) + { + // Propagate the error + return sq_throwerror(vm, e.Message().c_str()); + } + // Perform a range check on the specified prefix index + if (index > SQMOD_PLAYER_MSG_PREFIXES) + { + return sq_throwerror(vm, ToStrF("Prefix index is out of range: %u > %u", + index, SQMOD_PLAYER_MSG_PREFIXES)); + } + // Attempt to generate the string value + StackStrF val(vm, 3); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + vcmpError result = vcmpErrorNone; + // Send the resulted message string + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted message string + if (player->mLimitPrefixPostfixMessage) + { + result = _Func->SendClientMessage(itr->mID, player->mMessageColor, "%s%s", + player->mMessagePrefixes[index].c_str(), val.mPtr); + } + else + { + result = _Func->SendClientMessage(itr->mID, player->mMessageColor, "%s%s%s%s", + player->mMessagePrefix.c_str(), + player->mMessagePrefixes[index].c_str(), val.mPtr, + player->mMessagePostfix.c_str()); + } + // Check the result + if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastMsgEx(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the message color specified? + if (top <= 4) + { + return sq_throwerror(vm, "Missing message color"); + } + // Was the message value specified? + else if (top <= 5) + { + return sq_throwerror(vm, "Missing message value"); + } + // The message color + Uint32 color; + // Attempt to extract the argument values + try + { + color = SQMOD_PACK_RGBA(Var< Uint8 >(vm, 2).value, + Var< Uint8 >(vm, 3).value, + Var< Uint8 >(vm, 4).value, + Var< Uint8 >(vm, 5).value); + } + catch (const Sqrat::Exception & e) + { + // Propagate the error + return sq_throwerror(vm, e.Message().c_str()); + } + // Attempt to generate the string value + StackStrF val(vm, 6); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted message string + const vcmpError result = _Func->SendClientMessage(itr->mID, color, + "%s%s%s", + player->mMessagePrefix.c_str(), + val.mPtr, + player->mMessagePostfix.c_str()); + // Check the result + if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastMessage(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the message value specified? + if (top <= 1) + { + return sq_throwerror(vm, "Missing message value"); + } + // Attempt to generate the string value + StackStrF val(vm, 2); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted message string + const vcmpError result = _Func->SendClientMessage(itr->mID, player->mMessageColor, + "%s%s%s", + player->mMessagePrefix.c_str(), + val.mPtr, + player->mMessagePostfix.c_str()); + // Check the result + if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastAnnounce(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the announcement value specified? + if (top <= 1) + { + return sq_throwerror(vm, "Missing announcement value"); + } + // Attempt to generate the string value + StackStrF val(vm, 2); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted announcement string + const vcmpError result = _Func->SendGameMessage(itr->mID, player->mAnnounceStyle, + "%s%s%s", + player->mAnnouncePrefix.c_str(), + val.mPtr, + player->mAnnouncePostfix.c_str()); + // Validate the result + if (result == vcmpErrorArgumentOutOfBounds) + { + return sq_throwerror(vm, ToStrF("Invalid announcement style [%s]", player->GetTag().c_str())); + } + else if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Game message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ------------------------------------------------------------------------------------------------ +static SQInteger SqBroadcastAnnounceEx(HSQUIRRELVM vm) +{ + const Int32 top = sq_gettop(vm); + // Was the announcement style specified? + if (top <= 1) + { + return sq_throwerror(vm, "Missing announcement style"); + } + // Was the announcement value specified? + else if (top <= 2) + { + return sq_throwerror(vm, "Missing announcement value"); + } + // The announcement style + Int32 style; + // style to extract the argument values + try + { + style = Var< Int32 >(vm, 2).value; + } + catch (const Sqrat::Exception & e) + { + // Propagate the error + return sq_throwerror(vm, e.Message().c_str()); + } + // Attempt to generate the string value + StackStrF val(vm, 3); + // Have we failed to retrieve the string? + if (SQ_FAILED(val.mRes)) + { + return val.mRes; // Propagate the error! + } + // Obtain the ends of the entity pool + Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); + Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); + // The number of players that the message was sent to + Uint32 count = 0; + // Process each entity in the pool + for (; itr != end; ++itr) + { + // Is this player instance valid? + if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) + { + // Grab the player instance + CPlayer * player = itr->mInst; + // Send the resulted announcement string + const vcmpError result = _Func->SendGameMessage(itr->mID, style, + "%s%s%s", + player->mAnnouncePrefix.c_str(), + val.mPtr, + player->mAnnouncePostfix.c_str()); + // Validate the result + if (result == vcmpErrorArgumentOutOfBounds) + { + return sq_throwerror(vm, ToStrF("Invalid announcement style [%s]", player->GetTag().c_str())); + } + else if (result == vcmpErrorTooLargeInput) + { + return sq_throwerror(vm, ToStrF("Game message too big [%s]", player->GetTag().c_str())); + } + // Add this player to the count + ++count; + } + } + // Push the count count on the stack + sq_pushinteger(vm, count); + // Specify that this function returned a value + return 1; +} + +// ================================================================================================ +void Register_Broadcast(HSQUIRRELVM vm) +{ + Table bns(vm); + + bns + .SquirrelFunc(_SC("Msg"), &SqBroadcastMsg) + .SquirrelFunc(_SC("MsgP"), &SqBroadcastMsgP) + .SquirrelFunc(_SC("MsgEx"), &SqBroadcastMsgEx) + .SquirrelFunc(_SC("Message"), &SqBroadcastMessage) + .SquirrelFunc(_SC("Announce"), &SqBroadcastAnnounce) + .SquirrelFunc(_SC("AnnounceEx"), &SqBroadcastAnnounceEx) + .SquirrelFunc(_SC("Text"), &SqBroadcastAnnounce) + .SquirrelFunc(_SC("TextEx"), &SqBroadcastAnnounceEx); + + RootTable(vm).Bind(_SC("SqBroadcast"), bns); +} + +} // Namespace:: SqMod diff --git a/source/Misc/Register.cpp b/source/Misc/Register.cpp index 66cf24ab..8dd126d9 100644 --- a/source/Misc/Register.cpp +++ b/source/Misc/Register.cpp @@ -2,7 +2,6 @@ #include "Core.hpp" #include "Base/Shared.hpp" #include "Base/Color3.hpp" -#include "Base/Color4.hpp" #include "Base/Vector2.hpp" #include "Base/Vector3.hpp" #include "Entity/Player.hpp" @@ -50,413 +49,7 @@ static const Object & FindPlayer(Object & by) } // ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastMsg(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the message color specified? - if (top <= 1) - { - return sq_throwerror(vm, "Missing message color"); - } - // Was the message value specified? - else if (top <= 2) - { - return sq_throwerror(vm, "Missing message value"); - } - // Failed to retrieve a Color4 value - bool failed = false; - // The message color - Color4 color; - // Attempt to extract the argument values - try - { - color = Var< Color4 >(vm, 2).value; - } - catch (...) - { - failed = true; - } - // Did we failed to retrieve a Color4 instance? - if (failed) - { - // Attempt to extract the argument values - try - { - color = Var< Color3 >(vm, 2).value; - } - catch (const Sqrat::Exception & e) - { - // Propagate the error - return sq_throwerror(vm, e.Message().c_str()); - } - } - // Attempt to generate the string value - StackStrF val(vm, 3); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted message string - const vcmpError result = _Func->SendClientMessage(itr->mID, color.GetRGBA(), - "%s%s%s", - player->mMessagePrefix.c_str(), - val.mPtr, - player->mMessagePostfix.c_str()); - // Check the result - if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} - -// ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastMsgP(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the index of the message prefix specified? - if (top <= 1) - { - return sq_throwerror(vm, "Missing prefix index"); - } - // Was the message value specified? - else if (top <= 2) - { - return sq_throwerror(vm, "Missing message value"); - } - // The prefix index - Uint32 index; - // Attempt to extract the argument values - try - { - index = Var< Uint32 >(vm, 2).value; - } - catch (const Sqrat::Exception & e) - { - // Propagate the error - return sq_throwerror(vm, e.Message().c_str()); - } - // Perform a range check on the specified prefix index - if (index > SQMOD_PLAYER_MSG_PREFIXES) - { - return sq_throwerror(vm, ToStrF("Prefix index is out of range: %u > %u", - index, SQMOD_PLAYER_MSG_PREFIXES)); - } - // Attempt to generate the string value - StackStrF val(vm, 3); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - vcmpError result = vcmpErrorNone; - // Send the resulted message string - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted message string - if (player->mLimitPrefixPostfixMessage) - { - result = _Func->SendClientMessage(itr->mID, player->mMessageColor, "%s%s", - player->mMessagePrefixes[index].c_str(), val.mPtr); - } - else - { - result = _Func->SendClientMessage(itr->mID, player->mMessageColor, "%s%s%s%s", - player->mMessagePrefix.c_str(), - player->mMessagePrefixes[index].c_str(), val.mPtr, - player->mMessagePostfix.c_str()); - } - // Check the result - if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} - -// ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastMsgEx(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the message color specified? - if (top <= 4) - { - return sq_throwerror(vm, "Missing message color"); - } - // Was the message value specified? - else if (top <= 5) - { - return sq_throwerror(vm, "Missing message value"); - } - // The message color - Uint32 color; - // Attempt to extract the argument values - try - { - color = SQMOD_PACK_RGBA(Var< Uint8 >(vm, 2).value, - Var< Uint8 >(vm, 3).value, - Var< Uint8 >(vm, 4).value, - Var< Uint8 >(vm, 5).value); - } - catch (const Sqrat::Exception & e) - { - // Propagate the error - return sq_throwerror(vm, e.Message().c_str()); - } - // Attempt to generate the string value - StackStrF val(vm, 6); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted message string - const vcmpError result = _Func->SendClientMessage(itr->mID, color, - "%s%s%s", - player->mMessagePrefix.c_str(), - val.mPtr, - player->mMessagePostfix.c_str()); - // Check the result - if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} - -// ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastMessage(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the message value specified? - if (top <= 1) - { - return sq_throwerror(vm, "Missing message value"); - } - // Attempt to generate the string value - StackStrF val(vm, 2); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted message string - const vcmpError result = _Func->SendClientMessage(itr->mID, player->mMessageColor, - "%s%s%s", - player->mMessagePrefix.c_str(), - val.mPtr, - player->mMessagePostfix.c_str()); - // Check the result - if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Client message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} - -// ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastAnnounce(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the announcement value specified? - if (top <= 1) - { - return sq_throwerror(vm, "Missing announcement value"); - } - // Attempt to generate the string value - StackStrF val(vm, 2); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted announcement string - const vcmpError result = _Func->SendGameMessage(itr->mID, player->mAnnounceStyle, - "%s%s%s", - player->mAnnouncePrefix.c_str(), - val.mPtr, - player->mAnnouncePostfix.c_str()); - // Validate the result - if (result == vcmpErrorArgumentOutOfBounds) - { - return sq_throwerror(vm, ToStrF("Invalid announcement style [%s]", player->GetTag().c_str())); - } - else if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Game message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} - -// ------------------------------------------------------------------------------------------------ -static SQInteger SqBroadcastAnnounceEx(HSQUIRRELVM vm) -{ - const Int32 top = sq_gettop(vm); - // Was the announcement style specified? - if (top <= 1) - { - return sq_throwerror(vm, "Missing announcement style"); - } - // Was the announcement value specified? - else if (top <= 2) - { - return sq_throwerror(vm, "Missing announcement value"); - } - // The announcement style - Int32 style; - // style to extract the argument values - try - { - style = Var< Int32 >(vm, 2).value; - } - catch (const Sqrat::Exception & e) - { - // Propagate the error - return sq_throwerror(vm, e.Message().c_str()); - } - // Attempt to generate the string value - StackStrF val(vm, 3); - // Have we failed to retrieve the string? - if (SQ_FAILED(val.mRes)) - { - return val.mRes; // Propagate the error! - } - // Obtain the ends of the entity pool - Core::Players::const_iterator itr = Core::Get().GetPlayers().cbegin(); - Core::Players::const_iterator end = Core::Get().GetPlayers().cend(); - // The number of players that the message was sent to - Uint32 count = 0; - // Process each entity in the pool - for (; itr != end; ++itr) - { - // Is this player instance valid? - if (VALID_ENTITYEX(itr->mID, SQMOD_PLAYER_POOL) && itr->mInst != nullptr) - { - // Grab the player instance - CPlayer * player = itr->mInst; - // Send the resulted announcement string - const vcmpError result = _Func->SendGameMessage(itr->mID, style, - "%s%s%s", - player->mAnnouncePrefix.c_str(), - val.mPtr, - player->mAnnouncePostfix.c_str()); - // Validate the result - if (result == vcmpErrorArgumentOutOfBounds) - { - return sq_throwerror(vm, ToStrF("Invalid announcement style [%s]", player->GetTag().c_str())); - } - else if (result == vcmpErrorTooLargeInput) - { - return sq_throwerror(vm, ToStrF("Game message too big [%s]", player->GetTag().c_str())); - } - // Add this player to the count - ++count; - } - } - // Push the count count on the stack - sq_pushinteger(vm, count); - // Specify that this function returned a value - return 1; -} +extern void Register_Broadcast(HSQUIRRELVM vm); // ================================================================================================ void Register_Misc(HSQUIRRELVM vm) @@ -578,15 +171,9 @@ void Register_Misc(HSQUIRRELVM vm) .Func(_SC("PlaySound"), &PlaySound) .Func(_SC("PlaySoundEx"), &PlaySoundEx) .Func(_SC("CreateExplosion"), &CreateExplosion) - .Func(_SC("CreateExplosionEx"), &CreateExplosionEx) - .SquirrelFunc(_SC("SqBroadcastMsg"), &SqBroadcastMsg) - .SquirrelFunc(_SC("SqBroadcastMsgP"), &SqBroadcastMsgP) - .SquirrelFunc(_SC("SqBroadcastMsgEx"), &SqBroadcastMsgEx) - .SquirrelFunc(_SC("SqBroadcastMessage"), &SqBroadcastMessage) - .SquirrelFunc(_SC("SqBroadcastAnnounce"), &SqBroadcastAnnounce) - .SquirrelFunc(_SC("SqBroadcastAnnounceEx"), &SqBroadcastAnnounceEx) - .SquirrelFunc(_SC("SqBroadcastText"), &SqBroadcastAnnounce) - .SquirrelFunc(_SC("SqBroadcastTextEx"), &SqBroadcastAnnounceEx); + .Func(_SC("CreateExplosionEx"), &CreateExplosionEx); + + Register_Broadcast(vm); } } // Namespace:: SqMod