/
SN1054NGC
/
DayZ_Projects_cpp
Обзор
Документация
Войти
/
SN1054NGC
/
DayZ_Projects_cpp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
scripts/4_world/plugins/pluginbase/pluginmessagemanager.c
144 строки
4 KB
SN1054NGC
Initial DayZ mod project commit
26 ноя 2025, 01:03
26 ноя 2025, 01:03
fddb039
Код
Авторство
О чём код?
/*! Class PluginMessageManager provides some basic Message Distribution mechanics, if you get instance of this plugin class on your object, you can use its methods to broadcast messages. */ class PluginMessageManager extends PluginBase { int channelsUsed = 0; ref array<ref MessageReceiverBase> channelList[NUM_OF_CHANNELS]; void PluginMessageManager() { for (int i = 0; i < NUM_OF_CHANNELS; i++) { channelList[i] = new array<ref MessageReceiverBase>; } } //! Broadcasts an empty message on a channel provided in the 'index' parameter void Broadcast(int index) { //Debug.Log("Broadcasting message on a channel: "+ ToString(index), "Messaging System"); array<ref MessageReceiverBase> x = channelList[index]; //int test = channelList[index].Count(); for(int i = 0; i < x.Count(); i++) { MessageReceiverBase mrb = x.Get(i); if( mrb != NULL ) { //string s = "Broadcasting message to: "+ToString(mrb); //Log(s, LogTemplates.TEMPLATE_BROADCAST); mrb.OnReceive(index); } } } //! Broadcasts a message on a channel provided in the 'index' parameter, passes the Int variable void BroadcastInt(int index, int value) { //Debug.Log("Broadcasting message on a channel: "+ ToString(index), "Messaging System"); array<ref MessageReceiverBase> x = channelList[index]; //int test = channelList[index].Count(); for(int i = 0; i < x.Count(); i++) { MessageReceiverBase mrb = x.Get(i); if( mrb ) { //string s = "Broadcasting message to: "+ToString(mrb); //Log(s, LogTemplates.TEMPLATE_BROADCAST); mrb.OnReceiveInt(index, value); } } } void BroadcastFloat(int index, float value) { //Debug.Log("Broadcasting message on a channel: "+ ToString(index), "Messaging System"); array<ref MessageReceiverBase> x = channelList[index]; //int test = channelList[index].Count(); for(int i = 0; i < x.Count(); i++) { MessageReceiverBase mrb = x.Get(i); if( mrb ) { //string s = "Broadcasting message to: "+ToString(mrb); //Log(s, LogTemplates.TEMPLATE_BROADCAST); mrb.OnReceiveFloat(index, value); } } } void BroadcastString(int index, string value) { //Debug.Log("Broadcasting message on a channel: "+ ToString(index), "Messaging System"); array<ref MessageReceiverBase> x = channelList[index]; //int test = channelList[index].Count(); for(int i = 0; i < x.Count(); i++) { if( x.Get(i) ) { Print("broadcasting message to: "); Print(x.Get(i)); x.Get(i).OnReceiveString(index, value); } } } //! Broadcasts a message on a channel provided in the 'index' parameter, passes the Param type object to the reciever void BroadcastParam(int index, Param params) { //Debug.Log("Broadcasting message on a channel: "+ ToString(index), "Messaging System"); array<ref MessageReceiverBase> x = channelList[index]; //int test = channelList[index].Count(); for(int i = 0; i < x.Count(); i++) { if( x.Get(i) ) { x.Get(i).OnReceiveParam(index, params); } } } //! Subscribes an object to listen to messages on a channel provided in the 'index' parameter void Subscribe(MessageReceiverBase receiver, int index) { if(index > channelsUsed) //this is used to speed up the unsubscribeAll method, instead of all channels, we sweep just those in usage { channelsUsed = index; } array<ref MessageReceiverBase> chan = channelList[index]; if( chan.Find(receiver) >= 0 ) return; chan.Insert(receiver); } void Unsubscribe(MessageReceiverBase receiver, int index) { array<ref MessageReceiverBase> chan = channelList[index]; int i = chan.Find(receiver); if( i >= 0 ) { chan.Remove(i); } } void UnsubscribeAll(MessageReceiverBase receiver)//REWORK.V: this is slow, should be made quicker(by registering all subscribers in a separate array upon their subscription and then going through this array instead) { //GetGame().ProfilerStart("UnsubscribeAll"); for (int i = 0; i <= channelsUsed; i++) { array<ref MessageReceiverBase> chan = channelList[i]; int c = chan.Find(receiver); if( c >= 0 ) { chan.Remove(c); } } //GetGame().ProfilerStop("UnsubscribeAll"); } }