after leaving group, issue warning instead of changing chat mode

This commit is contained in:
aljazerzen 2021-03-27 17:40:43 +01:00
parent dae8515590
commit 8ac879e4c1
3 changed files with 52 additions and 37 deletions

View File

@ -179,6 +179,14 @@ impl<G> GenericChatMsg<G> {
}
}
pub fn get_group(&self) -> Option<&G> {
match &self.chat_type {
ChatType::GroupMeta(g) => Some(&g),
ChatType::Group(_, g) => Some(&g),
_ => None,
}
}
pub fn to_bubble(&self) -> Option<(SpeechBubble, Uid)> {
let icon = self.icon();
if let ChatType::Npc(from, r) | ChatType::NpcSay(from, r) = self.chat_type {

View File

@ -15,7 +15,7 @@ use common::{
buff::{BuffCategory, BuffData, BuffKind, BuffSource},
inventory::item::MaterialStatManifest,
invite::InviteKind,
ChatMode, ChatType, Inventory, Item, LightEmitter, WaypointArea,
ChatType, Inventory, Item, LightEmitter, WaypointArea,
},
effect::Effect,
event::{EventBus, ServerEvent},
@ -2069,17 +2069,6 @@ fn handle_group_kick(
ecs.read_resource::<EventBus<ServerEvent>>()
.emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Kick(uid)));
// Set chat mode to world (if current chat mode is group)
if let Some(chat_mode) = server
.state
.ecs()
.write_storage::<ChatMode>()
.get_mut(target_player)
.filter(|mode| matches!(mode, ChatMode::Group(_)))
{
*chat_mode = ChatMode::World;
}
} else {
server.notify_client(
client,
@ -2109,17 +2098,6 @@ fn handle_group_leave(
.ecs()
.read_resource::<EventBus<ServerEvent>>()
.emit_now(ServerEvent::GroupManip(client, comp::GroupManip::Leave));
// Set chat mode to world (if current chat mode is group)
if let Some(chat_mode) = server
.state
.ecs()
.write_storage::<ChatMode>()
.get_mut(client)
.filter(|mode| matches!(mode, ChatMode::Group(_)))
{
*chat_mode = ChatMode::World;
}
}
fn handle_group_promote(

View File

@ -451,11 +451,15 @@ impl StateExt for State {
|target, a: &comp::Pos, b: &comp::Pos| a.0.distance_squared(b.0) < target * target;
let group_manager = ecs.read_resource::<comp::group::GroupManager>();
let resolved_msg = msg.clone().map_group(|group_id| {
group_manager
.group_info(group_id)
.map_or_else(|| "???".into(), |i| i.name.clone())
});
let group_info = msg
.get_group()
.map(|g| group_manager.group_info(*g))
.flatten();
let resolved_msg = msg
.clone()
.map_group(|_| group_info.map_or_else(|| "???".to_string(), |i| i.name.clone()));
match &msg.chat_type {
comp::ChatType::Offline(_)
@ -544,17 +548,29 @@ impl StateExt for State {
}
}
},
comp::ChatType::GroupMeta(g) | comp::ChatType::Group(_, g) => {
for (client, group) in (
&ecs.read_storage::<Client>(),
&ecs.read_storage::<comp::Group>(),
)
.join()
{
if g == group {
client.send_fallible(ServerGeneral::ChatMsg(resolved_msg.clone()));
comp::ChatType::Group(from, g) => {
if group_info.is_none() {
// group not found, reply with command error
let reply = comp::ChatMsg {
chat_type: comp::ChatType::CommandError,
message: "You are using group chat but do not belong to a group. Use \
/world or /region to change chat."
.into(),
};
if let Some((client, _)) =
(&ecs.read_storage::<Client>(), &ecs.read_storage::<Uid>())
.join()
.find(|(_, uid)| *uid == from)
{
client.send_fallible(ServerGeneral::ChatMsg(reply));
}
return;
}
send_to_group(g, ecs, &resolved_msg);
},
comp::ChatType::GroupMeta(g) => {
send_to_group(g, ecs, &resolved_msg);
},
}
}
@ -653,3 +669,16 @@ impl StateExt for State {
res
}
}
fn send_to_group(g: &comp::Group, ecs: &specs::World, msg: &comp::ChatMsg) {
for (client, group) in (
&ecs.read_storage::<Client>(),
&ecs.read_storage::<comp::Group>(),
)
.join()
{
if g == group {
client.send_fallible(ServerGeneral::ChatMsg(msg.clone()));
}
}
}