2020-07-25 23:21:15 +00:00
|
|
|
use super::{
|
2021-01-18 19:08:13 +00:00
|
|
|
cr_color,
|
2020-10-16 06:08:45 +00:00
|
|
|
img_ids::{Imgs, ImgsRot},
|
|
|
|
Show, BLACK, BUFF_COLOR, DEBUFF_COLOR, ERROR_COLOR, GROUP_COLOR, HP_COLOR, KILL_COLOR,
|
2021-01-18 19:08:13 +00:00
|
|
|
LOW_HP_COLOR, STAMINA_COLOR, TEXT_COLOR, TEXT_COLOR_GREY, UI_HIGHLIGHT_0, UI_MAIN,
|
2020-07-25 23:21:15 +00:00
|
|
|
};
|
2020-07-12 00:39:50 +00:00
|
|
|
|
2020-07-19 21:49:18 +00:00
|
|
|
use crate::{
|
2020-10-17 22:41:59 +00:00
|
|
|
hud::get_buff_info,
|
2020-05-25 18:11:39 +00:00
|
|
|
i18n::Localization,
|
2020-10-16 06:08:45 +00:00
|
|
|
settings::Settings,
|
2020-05-25 18:11:39 +00:00
|
|
|
ui::{fonts::Fonts, ImageFrame, Tooltip, TooltipManager, Tooltipable},
|
2020-10-16 06:08:45 +00:00
|
|
|
window::GameInput,
|
|
|
|
GlobalState,
|
2020-07-19 21:49:18 +00:00
|
|
|
};
|
2020-07-12 00:39:50 +00:00
|
|
|
use client::{self, Client};
|
|
|
|
use common::{
|
2021-01-16 17:01:57 +00:00
|
|
|
combat,
|
2021-02-11 04:54:31 +00:00
|
|
|
comp::{
|
|
|
|
group::{InviteKind, Role},
|
|
|
|
BuffKind, Stats,
|
|
|
|
},
|
2020-12-13 17:11:55 +00:00
|
|
|
uid::{Uid, UidAllocator},
|
2020-07-12 00:39:50 +00:00
|
|
|
};
|
2020-12-13 17:11:55 +00:00
|
|
|
use common_net::sync::WorldSyncExt;
|
2020-07-12 00:39:50 +00:00
|
|
|
use conrod_core::{
|
|
|
|
color,
|
2020-07-19 21:49:18 +00:00
|
|
|
position::{Place, Relative},
|
2020-07-12 00:39:50 +00:00
|
|
|
widget::{self, Button, Image, Rectangle, Scrollbar, Text},
|
2020-07-25 23:21:15 +00:00
|
|
|
widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon,
|
2020-07-12 00:39:50 +00:00
|
|
|
};
|
2020-07-25 23:21:15 +00:00
|
|
|
use specs::{saveload::MarkerAllocator, WorldExt};
|
2021-01-07 21:02:50 +00:00
|
|
|
|
2020-07-12 00:39:50 +00:00
|
|
|
widget_ids! {
|
|
|
|
pub struct Ids {
|
2020-07-25 23:21:15 +00:00
|
|
|
group_button,
|
2020-07-12 00:39:50 +00:00
|
|
|
bg,
|
|
|
|
title,
|
2020-08-05 11:29:42 +00:00
|
|
|
title_bg,
|
2020-07-12 00:39:50 +00:00
|
|
|
btn_bg,
|
|
|
|
btn_friend,
|
|
|
|
btn_leader,
|
|
|
|
btn_link,
|
|
|
|
btn_kick,
|
|
|
|
btn_leave,
|
2020-07-19 21:49:18 +00:00
|
|
|
scroll_area,
|
|
|
|
scrollbar,
|
2020-07-12 00:39:50 +00:00
|
|
|
members[],
|
|
|
|
bubble_frame,
|
|
|
|
btn_accept,
|
|
|
|
btn_decline,
|
2020-07-25 23:21:15 +00:00
|
|
|
member_panels_bg[],
|
|
|
|
member_panels_frame[],
|
|
|
|
member_panels_txt_bg[],
|
|
|
|
member_panels_txt[],
|
|
|
|
member_health[],
|
|
|
|
member_stam[],
|
2020-10-16 06:08:45 +00:00
|
|
|
buffs[],
|
|
|
|
buff_timers[],
|
2020-07-25 23:21:15 +00:00
|
|
|
dead_txt[],
|
|
|
|
health_txt[],
|
2021-01-16 17:01:57 +00:00
|
|
|
combat_rating_indicators[],
|
2020-08-04 07:22:59 +00:00
|
|
|
timeout_bg,
|
|
|
|
timeout,
|
2020-07-12 00:39:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct State {
|
|
|
|
ids: Ids,
|
|
|
|
// Selected group member
|
|
|
|
selected_member: Option<Uid>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(WidgetCommon)]
|
|
|
|
pub struct Group<'a> {
|
2020-07-19 21:49:18 +00:00
|
|
|
show: &'a mut Show,
|
2020-07-12 00:39:50 +00:00
|
|
|
client: &'a Client,
|
2020-07-19 21:49:18 +00:00
|
|
|
settings: &'a Settings,
|
2020-07-12 00:39:50 +00:00
|
|
|
imgs: &'a Imgs,
|
2020-10-16 06:08:45 +00:00
|
|
|
rot_imgs: &'a ImgsRot,
|
2020-05-25 18:11:39 +00:00
|
|
|
fonts: &'a Fonts,
|
|
|
|
localized_strings: &'a Localization,
|
2020-07-25 23:21:15 +00:00
|
|
|
pulse: f32,
|
|
|
|
global_state: &'a GlobalState,
|
2020-10-16 06:08:45 +00:00
|
|
|
tooltip_manager: &'a mut TooltipManager,
|
2020-07-12 00:39:50 +00:00
|
|
|
|
|
|
|
#[conrod(common_builder)]
|
|
|
|
common: widget::CommonBuilder,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Group<'a> {
|
2020-08-04 07:22:59 +00:00
|
|
|
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
|
2020-07-12 00:39:50 +00:00
|
|
|
pub fn new(
|
2020-07-19 21:49:18 +00:00
|
|
|
show: &'a mut Show,
|
2020-07-12 00:39:50 +00:00
|
|
|
client: &'a Client,
|
2020-07-19 21:49:18 +00:00
|
|
|
settings: &'a Settings,
|
2020-07-12 00:39:50 +00:00
|
|
|
imgs: &'a Imgs,
|
2020-10-16 06:08:45 +00:00
|
|
|
rot_imgs: &'a ImgsRot,
|
2020-05-25 18:11:39 +00:00
|
|
|
fonts: &'a Fonts,
|
|
|
|
localized_strings: &'a Localization,
|
2020-07-25 23:21:15 +00:00
|
|
|
pulse: f32,
|
|
|
|
global_state: &'a GlobalState,
|
2020-10-16 06:08:45 +00:00
|
|
|
tooltip_manager: &'a mut TooltipManager,
|
2020-07-12 00:39:50 +00:00
|
|
|
) -> Self {
|
|
|
|
Self {
|
|
|
|
show,
|
|
|
|
client,
|
2020-07-19 21:49:18 +00:00
|
|
|
settings,
|
2020-07-12 00:39:50 +00:00
|
|
|
imgs,
|
2020-10-16 06:08:45 +00:00
|
|
|
rot_imgs,
|
2020-07-12 00:39:50 +00:00
|
|
|
fonts,
|
|
|
|
localized_strings,
|
2020-07-25 23:21:15 +00:00
|
|
|
pulse,
|
|
|
|
global_state,
|
2020-10-16 06:08:45 +00:00
|
|
|
tooltip_manager,
|
2020-07-12 00:39:50 +00:00
|
|
|
common: widget::CommonBuilder::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub enum Event {
|
|
|
|
Accept,
|
2020-07-19 21:49:18 +00:00
|
|
|
Decline,
|
2020-07-12 00:39:50 +00:00
|
|
|
Kick(Uid),
|
|
|
|
LeaveGroup,
|
|
|
|
AssignLeader(Uid),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> Widget for Group<'a> {
|
|
|
|
type Event = Vec<Event>;
|
|
|
|
type State = State;
|
|
|
|
type Style = ();
|
|
|
|
|
|
|
|
fn init_state(&self, id_gen: widget::id::Generator) -> Self::State {
|
|
|
|
Self::State {
|
|
|
|
ids: Ids::new(id_gen),
|
|
|
|
selected_member: None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-07 05:00:09 +00:00
|
|
|
fn style(&self) -> Self::Style {}
|
2020-07-12 00:39:50 +00:00
|
|
|
|
2020-07-25 23:21:15 +00:00
|
|
|
//TODO: Disband groups when there's only one member in them
|
|
|
|
//TODO: Always send health, energy, level and position of group members to the
|
|
|
|
// client
|
2020-08-04 07:22:59 +00:00
|
|
|
#[allow(clippy::unused_unit)] // TODO: Pending review in #587
|
2020-08-07 05:00:09 +00:00
|
|
|
#[allow(clippy::blocks_in_if_conditions)] // TODO: Pending review in #587
|
2020-07-12 00:39:50 +00:00
|
|
|
fn update(self, args: widget::UpdateArgs<Self>) -> Self::Event {
|
|
|
|
let widget::UpdateArgs { state, ui, .. } = args;
|
|
|
|
let mut events = Vec::new();
|
2020-10-16 06:08:45 +00:00
|
|
|
let localized_strings = self.localized_strings;
|
|
|
|
let buff_ani = ((self.pulse * 4.0/* speed factor */).cos() * 0.5 + 0.8) + 0.5; //Animation timer
|
2020-12-10 20:31:04 +00:00
|
|
|
let debug_on = self.global_state.settings.gameplay.toggle_debug;
|
|
|
|
let offset = if debug_on { 270.0 } else { 0.0 };
|
2020-10-16 06:08:45 +00:00
|
|
|
let buffs_tooltip = Tooltip::new({
|
|
|
|
// Edge images [t, b, r, l]
|
|
|
|
// Corner images [tr, tl, br, bl]
|
|
|
|
let edge = &self.rot_imgs.tt_side;
|
|
|
|
let corner = &self.rot_imgs.tt_corner;
|
|
|
|
ImageFrame::new(
|
|
|
|
[edge.cw180, edge.none, edge.cw270, edge.cw90],
|
|
|
|
[corner.none, corner.cw270, corner.cw90, corner.cw180],
|
|
|
|
Color::Rgba(0.08, 0.07, 0.04, 1.0),
|
|
|
|
5.0,
|
|
|
|
)
|
|
|
|
})
|
|
|
|
.title_font_size(self.fonts.cyri.scale(15))
|
|
|
|
.parent(ui.window)
|
|
|
|
.desc_font_size(self.fonts.cyri.scale(12))
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.desc_text_color(TEXT_COLOR);
|
2020-07-12 00:39:50 +00:00
|
|
|
|
2020-07-19 21:49:18 +00:00
|
|
|
// Don't show pets
|
|
|
|
let group_members = self
|
|
|
|
.client
|
|
|
|
.group_members()
|
|
|
|
.iter()
|
|
|
|
.filter_map(|(u, r)| match r {
|
|
|
|
Role::Member => Some(u),
|
|
|
|
Role::Pet => None,
|
|
|
|
})
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
// Not considered in group for ui purposes if it is just pets
|
|
|
|
let in_group = !group_members.is_empty();
|
2020-07-31 03:46:08 +00:00
|
|
|
if !in_group {
|
|
|
|
self.show.group_menu = false;
|
2020-08-03 19:42:06 +00:00
|
|
|
self.show.group = false;
|
2020-07-31 03:46:08 +00:00
|
|
|
}
|
2020-07-19 21:49:18 +00:00
|
|
|
|
|
|
|
// Helper
|
2020-11-25 17:13:59 +00:00
|
|
|
let uid_to_name_text = |uid, client: &Client| match client.player_list().get(&uid) {
|
2020-07-19 21:49:18 +00:00
|
|
|
Some(player_info) => player_info
|
|
|
|
.character
|
|
|
|
.as_ref()
|
|
|
|
.map_or_else(|| format!("Player<{}>", uid), |c| c.name.clone()),
|
|
|
|
None => client
|
|
|
|
.state()
|
|
|
|
.ecs()
|
|
|
|
.entity_from_uid(uid.0)
|
|
|
|
.and_then(|entity| {
|
|
|
|
client
|
|
|
|
.state()
|
|
|
|
.ecs()
|
|
|
|
.read_storage::<Stats>()
|
|
|
|
.get(entity)
|
|
|
|
.map(|stats| stats.name.clone())
|
|
|
|
})
|
|
|
|
.unwrap_or_else(|| format!("Npc<{}>", uid)),
|
|
|
|
};
|
|
|
|
|
|
|
|
let open_invite = self.client.group_invite();
|
|
|
|
|
|
|
|
let my_uid = self.client.uid();
|
2020-07-12 00:39:50 +00:00
|
|
|
|
2020-07-19 21:49:18 +00:00
|
|
|
// TODO show something to the player when they click on the group button while
|
|
|
|
// they are not in a group so that it doesn't look like the button is
|
|
|
|
// broken
|
2020-07-25 23:21:15 +00:00
|
|
|
if self.show.group_menu || open_invite.is_some() {
|
2020-07-12 00:39:50 +00:00
|
|
|
// Frame
|
2020-08-05 11:29:42 +00:00
|
|
|
Rectangle::fill_with([220.0, 140.0], color::Color::Rgba(0.0, 0.0, 0.0, 0.8))
|
|
|
|
.bottom_left_with_margins_on(ui.window, 108.0, 490.0)
|
2020-08-03 19:42:06 +00:00
|
|
|
.crop_kids()
|
2020-07-12 00:39:50 +00:00
|
|
|
.set(state.ids.bg, ui);
|
|
|
|
}
|
2021-02-12 10:51:32 +00:00
|
|
|
if let Some((_, timeout_start, timeout_dur, _)) = open_invite {
|
2020-07-25 23:21:15 +00:00
|
|
|
// Group Menu button
|
|
|
|
Button::image(self.imgs.group_icon)
|
|
|
|
.w_h(49.0, 26.0)
|
2020-08-05 11:29:42 +00:00
|
|
|
.bottom_left_with_margins_on(ui.window, 10.0, 490.0)
|
2020-07-25 23:21:15 +00:00
|
|
|
.set(state.ids.group_button, ui);
|
2020-08-04 07:22:59 +00:00
|
|
|
// Show timeout bar
|
2020-08-07 01:59:28 +00:00
|
|
|
let timeout_progress =
|
|
|
|
1.0 - timeout_start.elapsed().as_secs_f32() / timeout_dur.as_secs_f32();
|
2020-08-04 07:22:59 +00:00
|
|
|
Image::new(self.imgs.progress_frame)
|
|
|
|
.w_h(100.0, 10.0)
|
|
|
|
.middle_of(state.ids.bg)
|
|
|
|
.color(Some(UI_MAIN))
|
|
|
|
.set(state.ids.timeout_bg, ui);
|
|
|
|
Image::new(self.imgs.progress)
|
2020-08-07 01:59:28 +00:00
|
|
|
.w_h(98.0 * timeout_progress as f64, 8.0)
|
2020-08-04 07:22:59 +00:00
|
|
|
.top_left_with_margins_on(state.ids.timeout_bg, 1.0, 1.0)
|
|
|
|
.color(Some(UI_HIGHLIGHT_0))
|
|
|
|
.set(state.ids.timeout, ui);
|
2020-07-25 23:21:15 +00:00
|
|
|
}
|
2020-07-12 00:39:50 +00:00
|
|
|
// Buttons
|
2020-07-19 21:49:18 +00:00
|
|
|
if let Some((group_name, leader)) = self.client.group_info().filter(|_| in_group) {
|
2020-07-25 23:21:15 +00:00
|
|
|
// Group Menu Button
|
|
|
|
if Button::image(if self.show.group_menu {
|
|
|
|
self.imgs.group_icon_press
|
|
|
|
} else {
|
|
|
|
self.imgs.group_icon
|
|
|
|
})
|
|
|
|
.w_h(49.0, 26.0)
|
2020-08-05 11:29:42 +00:00
|
|
|
.bottom_left_with_margins_on(ui.window, 10.0, 490.0)
|
2020-07-25 23:21:15 +00:00
|
|
|
.hover_image(self.imgs.group_icon_hover)
|
|
|
|
.press_image(self.imgs.group_icon_press)
|
|
|
|
.set(state.ids.group_button, ui)
|
|
|
|
.was_clicked()
|
|
|
|
{
|
|
|
|
self.show.group_menu = !self.show.group_menu;
|
|
|
|
};
|
2020-08-05 11:29:42 +00:00
|
|
|
Text::new(&group_name)
|
|
|
|
.up_from(state.ids.group_button, 5.0)
|
|
|
|
.font_size(14)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(BLACK)
|
|
|
|
.set(state.ids.title_bg, ui);
|
|
|
|
Text::new(&group_name)
|
|
|
|
.bottom_right_with_margins_on(state.ids.title_bg, 1.0, 1.0)
|
|
|
|
.font_size(14)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(TEXT_COLOR)
|
|
|
|
.set(state.ids.title, ui);
|
2020-07-25 23:21:15 +00:00
|
|
|
// Member panels
|
2020-07-31 03:46:08 +00:00
|
|
|
let group_size = group_members.len();
|
2020-07-25 23:21:15 +00:00
|
|
|
if state.ids.member_panels_bg.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_panels_bg
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.member_health.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_health
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.member_stam.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_stam
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.member_panels_frame.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_panels_frame
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.member_panels_txt.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_panels_txt
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.dead_txt.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.dead_txt
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.health_txt.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.health_txt
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
|
|
|
if state.ids.member_panels_txt_bg.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.member_panels_txt_bg
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
2021-01-16 17:01:57 +00:00
|
|
|
if state.ids.combat_rating_indicators.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.combat_rating_indicators
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
|
|
|
})
|
|
|
|
};
|
2020-07-25 23:21:15 +00:00
|
|
|
let client_state = self.client.state();
|
|
|
|
let stats = client_state.ecs().read_storage::<common::comp::Stats>();
|
2020-10-31 22:34:08 +00:00
|
|
|
let healths = client_state.ecs().read_storage::<common::comp::Health>();
|
2020-07-25 23:21:15 +00:00
|
|
|
let energy = client_state.ecs().read_storage::<common::comp::Energy>();
|
2020-10-16 06:08:45 +00:00
|
|
|
let buffs = client_state.ecs().read_storage::<common::comp::Buffs>();
|
2021-01-16 17:01:57 +00:00
|
|
|
let inventory = client_state.ecs().read_storage::<common::comp::Inventory>();
|
2020-12-13 17:40:15 +00:00
|
|
|
let uid_allocator = client_state.ecs().read_resource::<UidAllocator>();
|
2021-01-22 21:12:16 +00:00
|
|
|
let bodies = client_state.ecs().read_storage::<common::comp::Body>();
|
2020-12-10 20:31:04 +00:00
|
|
|
|
2020-10-17 22:41:59 +00:00
|
|
|
// Keep track of the total number of widget ids we are using for buffs
|
|
|
|
let mut total_buff_count = 0;
|
2020-07-31 03:46:08 +00:00
|
|
|
for (i, &uid) in group_members.iter().copied().enumerate() {
|
2020-07-25 23:21:15 +00:00
|
|
|
self.show.group = true;
|
|
|
|
let entity = uid_allocator.retrieve_entity_internal(uid.into());
|
|
|
|
let stats = entity.and_then(|entity| stats.get(entity));
|
2020-10-31 22:34:08 +00:00
|
|
|
let health = entity.and_then(|entity| healths.get(entity));
|
2020-07-25 23:21:15 +00:00
|
|
|
let energy = entity.and_then(|entity| energy.get(entity));
|
2020-10-16 06:08:45 +00:00
|
|
|
let buffs = entity.and_then(|entity| buffs.get(entity));
|
2021-01-16 17:01:57 +00:00
|
|
|
let inventory = entity.and_then(|entity| inventory.get(entity));
|
2020-10-31 22:34:08 +00:00
|
|
|
let is_leader = uid == leader;
|
2021-01-22 21:12:16 +00:00
|
|
|
let body = entity.and_then(|entity| bodies.get(entity));
|
2020-10-31 22:34:08 +00:00
|
|
|
|
2021-01-22 21:12:16 +00:00
|
|
|
if let (Some(stats), Some(inventory), Some(health), Some(body)) =
|
|
|
|
(stats, inventory, health, body)
|
|
|
|
{
|
|
|
|
let combat_rating = combat::combat_rating(inventory, health, stats, *body);
|
2020-07-25 23:21:15 +00:00
|
|
|
let char_name = stats.name.to_string();
|
2021-01-22 21:12:16 +00:00
|
|
|
let health_perc = health.current() as f64 / health.maximum() as f64;
|
|
|
|
// change panel positions when debug info is shown
|
|
|
|
let x = if debug_on { i / 8 } else { i / 12 };
|
|
|
|
let y = if debug_on { i % 8 } else { i % 12 };
|
|
|
|
let back = Image::new(self.imgs.member_bg).top_left_with_margins_on(
|
|
|
|
ui.window,
|
|
|
|
50.0 + offset + y as f64 * 77.0,
|
|
|
|
10.0 + x as f64 * 180.0,
|
|
|
|
);
|
|
|
|
let hp_ani = (self.pulse * 4.0/* speed factor */).cos() * 0.5 + 0.8; //Animation timer
|
|
|
|
let crit_hp_color: Color = Color::Rgba(0.79, 0.19, 0.17, hp_ani);
|
|
|
|
let health_col = match (health_perc * 100.0) as u8 {
|
|
|
|
0..=20 => crit_hp_color,
|
|
|
|
21..=40 => LOW_HP_COLOR,
|
|
|
|
_ => HP_COLOR,
|
|
|
|
};
|
|
|
|
// Don't show panel for the player!
|
|
|
|
// Panel BG
|
|
|
|
back.w_h(152.0, 36.0)
|
|
|
|
.color(if is_leader {
|
|
|
|
Some(ERROR_COLOR)
|
|
|
|
} else {
|
|
|
|
Some(TEXT_COLOR)
|
|
|
|
})
|
|
|
|
.set(state.ids.member_panels_bg[i], ui);
|
|
|
|
// Health
|
|
|
|
Image::new(self.imgs.bar_content)
|
|
|
|
.w_h(148.0 * health_perc, 22.0)
|
|
|
|
.color(Some(health_col))
|
|
|
|
.top_left_with_margins_on(state.ids.member_panels_bg[i], 2.0, 2.0)
|
|
|
|
.set(state.ids.member_health[i], ui);
|
|
|
|
if health.is_dead {
|
|
|
|
// Death Text
|
|
|
|
Text::new(&self.localized_strings.get("hud.group.dead"))
|
|
|
|
.mid_top_with_margin_on(state.ids.member_panels_bg[i], 1.0)
|
|
|
|
.font_size(20)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(KILL_COLOR)
|
|
|
|
.set(state.ids.dead_txt[i], ui);
|
|
|
|
} else {
|
|
|
|
// Health Text
|
|
|
|
let txt = format!(
|
|
|
|
"{}/{}",
|
|
|
|
health.current() / 10_u32,
|
|
|
|
health.maximum() / 10_u32,
|
2020-12-10 20:31:04 +00:00
|
|
|
);
|
2021-01-22 21:12:16 +00:00
|
|
|
// Change font size depending on health amount
|
|
|
|
let font_size = match health.maximum() {
|
|
|
|
0..=999 => 14,
|
|
|
|
1000..=9999 => 13,
|
|
|
|
10000..=99999 => 12,
|
|
|
|
_ => 11,
|
2020-07-25 23:21:15 +00:00
|
|
|
};
|
2021-01-22 21:12:16 +00:00
|
|
|
// Change text offset depending on health amount
|
|
|
|
let txt_offset = match health.maximum() {
|
|
|
|
0..=999 => 4.0,
|
|
|
|
1000..=9999 => 4.5,
|
|
|
|
10000..=99999 => 5.0,
|
|
|
|
_ => 5.5,
|
2020-10-31 22:34:08 +00:00
|
|
|
};
|
2021-01-22 21:12:16 +00:00
|
|
|
Text::new(&txt)
|
|
|
|
.mid_top_with_margin_on(state.ids.member_panels_bg[i], txt_offset)
|
|
|
|
.font_size(font_size)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(Color::Rgba(1.0, 1.0, 1.0, 0.5))
|
|
|
|
.set(state.ids.health_txt[i], ui);
|
|
|
|
};
|
2020-10-31 22:34:08 +00:00
|
|
|
|
2020-07-25 23:21:15 +00:00
|
|
|
// Panel Frame
|
|
|
|
Image::new(self.imgs.member_frame)
|
|
|
|
.w_h(152.0, 36.0)
|
|
|
|
.middle_of(state.ids.member_panels_bg[i])
|
2020-07-31 03:46:08 +00:00
|
|
|
.color(Some(UI_HIGHLIGHT_0))
|
2020-07-25 23:21:15 +00:00
|
|
|
.set(state.ids.member_panels_frame[i], ui);
|
2021-01-16 17:01:57 +00:00
|
|
|
|
2021-01-18 19:08:13 +00:00
|
|
|
let indicator_col = cr_color(combat_rating);
|
2021-01-16 17:01:57 +00:00
|
|
|
Image::new(self.imgs.combat_rating_ico_shadow)
|
2021-01-18 19:08:13 +00:00
|
|
|
.w_h(18.0, 18.0)
|
2021-01-20 11:20:06 +00:00
|
|
|
.top_left_with_margins_on(state.ids.member_panels_frame[i], -20.0, 2.0)
|
2021-01-16 17:01:57 +00:00
|
|
|
.color(Some(indicator_col))
|
|
|
|
.set(state.ids.combat_rating_indicators[i], ui);
|
2020-07-25 23:21:15 +00:00
|
|
|
// Panel Text
|
|
|
|
Text::new(&char_name)
|
2021-01-18 19:08:13 +00:00
|
|
|
.top_left_with_margins_on(state.ids.member_panels_frame[i], -22.0, 22.0)
|
2021-01-16 17:01:57 +00:00
|
|
|
.font_size(20)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(BLACK)
|
|
|
|
.w(300.0) // limit name length display
|
|
|
|
.set(state.ids.member_panels_txt_bg[i], ui);
|
2020-07-25 23:21:15 +00:00
|
|
|
Text::new(&char_name)
|
2020-10-16 06:08:45 +00:00
|
|
|
.bottom_left_with_margins_on(state.ids.member_panels_txt_bg[i], 2.0, 2.0)
|
|
|
|
.font_size(20)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(if is_leader { ERROR_COLOR } else { GROUP_COLOR })
|
|
|
|
.w(300.0) // limit name length display
|
|
|
|
.set(state.ids.member_panels_txt[i], ui);
|
2020-07-25 23:21:15 +00:00
|
|
|
if let Some(energy) = energy {
|
|
|
|
let stam_perc = energy.current() as f64 / energy.maximum() as f64;
|
|
|
|
// Stamina
|
|
|
|
Image::new(self.imgs.bar_content)
|
|
|
|
.w_h(100.0 * stam_perc, 8.0)
|
2020-10-11 21:52:16 +00:00
|
|
|
.color(Some(STAMINA_COLOR))
|
2020-07-25 23:21:15 +00:00
|
|
|
.top_left_with_margins_on(state.ids.member_panels_bg[i], 26.0, 2.0)
|
|
|
|
.set(state.ids.member_stam[i], ui);
|
|
|
|
}
|
2020-10-16 06:08:45 +00:00
|
|
|
if let Some(buffs) = buffs {
|
2020-10-17 22:41:59 +00:00
|
|
|
// Limit displayed buffs to 11
|
2020-10-24 20:12:37 +00:00
|
|
|
let buff_count = buffs.kinds.len().min(11);
|
2020-10-17 22:41:59 +00:00
|
|
|
total_buff_count += buff_count;
|
|
|
|
let gen = &mut ui.widget_id_generator();
|
|
|
|
if state.ids.buffs.len() < total_buff_count {
|
|
|
|
state.update(|state| state.ids.buffs.resize(total_buff_count, gen));
|
|
|
|
}
|
|
|
|
if state.ids.buff_timers.len() < total_buff_count {
|
|
|
|
state.update(|state| {
|
|
|
|
state.ids.buff_timers.resize(total_buff_count, gen)
|
|
|
|
});
|
2020-10-16 06:08:45 +00:00
|
|
|
}
|
|
|
|
// Create Buff Widgets
|
2020-10-17 22:41:59 +00:00
|
|
|
let mut prev_id = None;
|
|
|
|
state
|
|
|
|
.ids
|
|
|
|
.buffs
|
|
|
|
.iter()
|
|
|
|
.copied()
|
|
|
|
.zip(state.ids.buff_timers.iter().copied())
|
|
|
|
.skip(total_buff_count - buff_count)
|
2020-10-24 20:12:37 +00:00
|
|
|
.zip(buffs.iter_active().map(get_buff_info))
|
2020-10-17 22:41:59 +00:00
|
|
|
.for_each(|((id, timer_id), buff)| {
|
2020-10-24 20:12:37 +00:00
|
|
|
let max_duration = buff.data.duration;
|
2020-10-16 06:08:45 +00:00
|
|
|
let pulsating_col = Color::Rgba(1.0, 1.0, 1.0, buff_ani);
|
|
|
|
let norm_col = Color::Rgba(1.0, 1.0, 1.0, 1.0);
|
|
|
|
let current_duration = buff.dur;
|
2020-10-19 03:00:35 +00:00
|
|
|
let duration_percentage = current_duration.map_or(1000.0, |cur| {
|
|
|
|
max_duration.map_or(1000.0, |max| {
|
|
|
|
cur.as_secs_f32() / max.as_secs_f32() * 1000.0
|
|
|
|
})
|
|
|
|
}) as u32; // Percentage to determine which frame of the timer overlay is displayed
|
|
|
|
let buff_img = match buff.kind {
|
|
|
|
BuffKind::Regeneration { .. } => self.imgs.buff_plus_0,
|
2020-11-01 13:39:32 +00:00
|
|
|
BuffKind::Saturation { .. } => self.imgs.buff_saturation_0,
|
2020-10-19 03:00:35 +00:00
|
|
|
BuffKind::Bleeding { .. } => self.imgs.debuff_bleed_0,
|
|
|
|
BuffKind::Cursed { .. } => self.imgs.debuff_skull_0,
|
2020-11-05 20:02:54 +00:00
|
|
|
BuffKind::Potion { .. } => self.imgs.buff_potion_0,
|
2020-12-04 22:24:56 +00:00
|
|
|
BuffKind::CampfireHeal { .. } => self.imgs.buff_campfire_heal_0,
|
StaminaPlus buff, modifying stamina via buffs
trying to fix this, coming back to this later
please remember to change potion back future self!
this ALMOST works. maybe MR ready, kinda jank tho
so close, and yet so far...
IT WORKS IT WORKS IT WORKS IT WORKS IT WORKS IT WO
did the same with health, ill fix this garbage l8r
think we're basically done here
whoops forgot to change the food back
fixing and cleaning up part 1
fixed everything part 2 now with buff images
ran clippy + fmt, fixed items that i modified
bracket bulldozing, boldly
hopefully this should be good?
need to rebase real quick
please let me be done
StaminaPlus buff, modifying stamina via buffs
trying to fix this, coming back to this later
please remember to change potion back future self!
this ALMOST works. maybe MR ready, kinda jank tho
so close, and yet so far...
IT WORKS IT WORKS IT WORKS IT WORKS IT WORKS IT WO
did the same with health, ill fix this garbage l8r
think we're basically done here
whoops forgot to change the food back
fixing and cleaning up part 1
fixed everything part 2 now with buff images
ran clippy + fmt, fixed items that i modified
hopefully this should be good?
cargo clippy fmt stuff
deleted an extraneous file?? how did that even...?
2021-01-26 22:47:55 +00:00
|
|
|
BuffKind::IncreaseMaxEnergy { .. } => {
|
|
|
|
self.imgs.buff_energyplus_0
|
|
|
|
},
|
|
|
|
BuffKind::IncreaseMaxHealth { .. } => {
|
|
|
|
self.imgs.buff_healthplus_0
|
|
|
|
},
|
2020-10-16 06:08:45 +00:00
|
|
|
};
|
2020-10-18 02:09:33 +00:00
|
|
|
let buff_widget = Image::new(buff_img).w_h(15.0, 15.0);
|
2020-10-17 22:41:59 +00:00
|
|
|
let buff_widget = if let Some(id) = prev_id {
|
|
|
|
buff_widget.right_from(id, 1.0)
|
|
|
|
} else {
|
2020-10-16 06:08:45 +00:00
|
|
|
buff_widget.bottom_left_with_margins_on(
|
|
|
|
state.ids.member_panels_frame[i],
|
2020-10-18 02:09:33 +00:00
|
|
|
-16.0,
|
2020-10-16 06:08:45 +00:00
|
|
|
1.0,
|
|
|
|
)
|
|
|
|
};
|
2020-10-17 22:41:59 +00:00
|
|
|
prev_id = Some(id);
|
2020-10-16 06:08:45 +00:00
|
|
|
buff_widget
|
2020-10-19 03:00:35 +00:00
|
|
|
.color(
|
|
|
|
if current_duration
|
|
|
|
.map_or(false, |cur| cur.as_secs_f32() < 10.0)
|
|
|
|
{
|
|
|
|
Some(pulsating_col)
|
|
|
|
} else {
|
|
|
|
Some(norm_col)
|
|
|
|
},
|
|
|
|
)
|
2020-10-17 22:41:59 +00:00
|
|
|
.set(id, ui);
|
2020-10-16 06:08:45 +00:00
|
|
|
// Create Buff tooltip
|
2020-10-19 03:00:35 +00:00
|
|
|
let title = match buff.kind {
|
|
|
|
BuffKind::Regeneration { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("buff.title.heal")
|
2020-10-16 06:08:45 +00:00
|
|
|
},
|
2020-10-27 21:27:19 +00:00
|
|
|
BuffKind::Saturation { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("buff.title.saturation")
|
2020-10-27 21:27:19 +00:00
|
|
|
},
|
2020-10-19 03:00:35 +00:00
|
|
|
BuffKind::Bleeding { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("debuff.title.bleed")
|
2020-10-16 06:08:45 +00:00
|
|
|
},
|
2020-10-19 03:00:35 +00:00
|
|
|
_ => localized_strings.get("buff.title.missing"),
|
2020-10-16 06:08:45 +00:00
|
|
|
};
|
2020-10-19 03:00:35 +00:00
|
|
|
let remaining_time = if current_duration.is_none() {
|
2020-10-16 06:08:45 +00:00
|
|
|
"Permanent".to_string()
|
|
|
|
} else {
|
2020-10-19 03:00:35 +00:00
|
|
|
format!(
|
|
|
|
"Remaining: {:.0}s",
|
|
|
|
current_duration.unwrap().as_secs_f32()
|
|
|
|
)
|
2020-10-16 06:08:45 +00:00
|
|
|
};
|
2020-10-19 03:00:35 +00:00
|
|
|
let desc_txt = match buff.kind {
|
|
|
|
BuffKind::Regeneration { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("buff.desc.heal")
|
2020-10-16 06:08:45 +00:00
|
|
|
},
|
2020-10-27 21:27:19 +00:00
|
|
|
BuffKind::Saturation { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("buff.desc.saturation")
|
2020-10-27 21:27:19 +00:00
|
|
|
},
|
2020-10-19 03:00:35 +00:00
|
|
|
BuffKind::Bleeding { .. } => {
|
2020-11-01 13:39:32 +00:00
|
|
|
localized_strings.get("debuff.desc.bleed")
|
2020-10-16 06:08:45 +00:00
|
|
|
},
|
2020-10-19 03:00:35 +00:00
|
|
|
_ => localized_strings.get("buff.desc.missing"),
|
2020-10-16 06:08:45 +00:00
|
|
|
};
|
|
|
|
let desc = format!("{}\n\n{}", desc_txt, remaining_time);
|
|
|
|
Image::new(match duration_percentage as u64 {
|
|
|
|
875..=1000 => self.imgs.nothing, // 8/8
|
|
|
|
750..=874 => self.imgs.buff_0, // 7/8
|
|
|
|
625..=749 => self.imgs.buff_1, // 6/8
|
|
|
|
500..=624 => self.imgs.buff_2, // 5/8
|
|
|
|
375..=499 => self.imgs.buff_3, // 4/8
|
|
|
|
250..=374 => self.imgs.buff_4, // 3/8
|
|
|
|
125..=249 => self.imgs.buff_5, // 2/8
|
|
|
|
0..=124 => self.imgs.buff_6, // 1/8
|
|
|
|
_ => self.imgs.nothing,
|
|
|
|
})
|
2020-10-18 02:09:33 +00:00
|
|
|
.w_h(15.0, 15.0)
|
2020-10-17 22:41:59 +00:00
|
|
|
.middle_of(id)
|
2020-10-16 06:08:45 +00:00
|
|
|
.with_tooltip(
|
|
|
|
self.tooltip_manager,
|
|
|
|
title,
|
|
|
|
&desc,
|
|
|
|
&buffs_tooltip,
|
2020-10-17 22:41:59 +00:00
|
|
|
if buff.is_buff {
|
|
|
|
BUFF_COLOR
|
|
|
|
} else {
|
|
|
|
DEBUFF_COLOR
|
|
|
|
},
|
2020-10-16 06:08:45 +00:00
|
|
|
)
|
2020-10-17 22:41:59 +00:00
|
|
|
.set(timer_id, ui);
|
|
|
|
});
|
2020-10-16 06:08:45 +00:00
|
|
|
} else {
|
|
|
|
// Values N.A.
|
2020-07-25 23:21:15 +00:00
|
|
|
Text::new(&stats.name.to_string())
|
|
|
|
.top_left_with_margins_on(state.ids.member_panels_frame[i], -22.0, 0.0)
|
|
|
|
.font_size(20)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(GROUP_COLOR)
|
2020-10-18 22:39:13 +00:00
|
|
|
.set(state.ids.member_panels_txt[i], ui);
|
2020-10-16 06:08:45 +00:00
|
|
|
let back = if i == 0 {
|
|
|
|
Image::new(self.imgs.member_bg)
|
|
|
|
.top_left_with_margins_on(ui.window, offset, 20.0)
|
|
|
|
} else {
|
|
|
|
Image::new(self.imgs.member_bg)
|
|
|
|
.down_from(state.ids.member_panels_bg[i - 1], 40.0)
|
|
|
|
};
|
|
|
|
back.w_h(152.0, 36.0)
|
|
|
|
.color(Some(TEXT_COLOR))
|
|
|
|
.set(state.ids.member_panels_bg[i], ui);
|
|
|
|
// Panel Frame
|
|
|
|
Image::new(self.imgs.member_frame)
|
|
|
|
.w_h(152.0, 36.0)
|
|
|
|
.middle_of(state.ids.member_panels_bg[i])
|
|
|
|
.color(Some(UI_HIGHLIGHT_0))
|
|
|
|
.set(state.ids.member_panels_frame[i], ui);
|
|
|
|
// Panel Text
|
|
|
|
Text::new(&self.localized_strings.get("hud.group.out_of_range"))
|
|
|
|
.mid_top_with_margin_on(state.ids.member_panels_bg[i], 3.0)
|
|
|
|
.font_size(16)
|
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(TEXT_COLOR)
|
|
|
|
.set(state.ids.dead_txt[i], ui);
|
|
|
|
}
|
2020-07-25 23:21:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if self.show.group_menu {
|
|
|
|
let selected = state.selected_member;
|
2020-08-05 11:29:42 +00:00
|
|
|
if Button::image(self.imgs.button) // Change button behaviour and style when the friendslist is working
|
2020-08-02 23:53:02 +00:00
|
|
|
.w_h(90.0, 22.0)
|
2020-08-05 11:29:42 +00:00
|
|
|
.top_right_with_margins_on(state.ids.bg, 5.0, 5.0)
|
|
|
|
.hover_image(self.imgs.button)
|
|
|
|
.press_image(self.imgs.button)
|
|
|
|
.label_color(TEXT_COLOR_GREY)
|
|
|
|
.image_color(TEXT_COLOR_GREY)
|
2020-08-02 23:53:02 +00:00
|
|
|
.label(&self.localized_strings.get("hud.group.add_friend"))
|
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(10))
|
|
|
|
.set(state.ids.btn_friend, ui)
|
|
|
|
.was_clicked()
|
2020-07-25 23:21:15 +00:00
|
|
|
{};
|
2020-07-19 21:49:18 +00:00
|
|
|
if Button::image(self.imgs.button)
|
|
|
|
.w_h(90.0, 22.0)
|
2020-07-25 23:21:15 +00:00
|
|
|
.bottom_right_with_margins_on(state.ids.bg, 5.0, 5.0)
|
2020-07-19 21:49:18 +00:00
|
|
|
.hover_image(self.imgs.button_hover)
|
|
|
|
.press_image(self.imgs.button_press)
|
2020-07-25 23:21:15 +00:00
|
|
|
.label(&self.localized_strings.get("hud.group.leave"))
|
|
|
|
.label_color(TEXT_COLOR)
|
2020-07-19 21:49:18 +00:00
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(10))
|
2020-07-25 23:21:15 +00:00
|
|
|
.set(state.ids.btn_leave, ui)
|
2020-07-19 21:49:18 +00:00
|
|
|
.was_clicked()
|
|
|
|
{
|
2020-07-25 23:21:15 +00:00
|
|
|
self.show.group_menu = false;
|
2020-08-02 23:53:02 +00:00
|
|
|
self.show.group = !self.show.group;
|
2020-07-25 23:21:15 +00:00
|
|
|
events.push(Event::LeaveGroup);
|
2020-07-19 21:49:18 +00:00
|
|
|
};
|
2020-07-25 23:21:15 +00:00
|
|
|
// Group leader functions
|
|
|
|
if my_uid == Some(leader) {
|
|
|
|
if Button::image(self.imgs.button)
|
|
|
|
.w_h(90.0, 22.0)
|
|
|
|
.mid_bottom_with_margin_on(state.ids.btn_friend, -27.0)
|
|
|
|
.hover_image(self.imgs.button_hover)
|
|
|
|
.press_image(self.imgs.button_press)
|
|
|
|
.label(&self.localized_strings.get("hud.group.assign_leader"))
|
|
|
|
.label_color(if state.selected_member.is_some() {
|
|
|
|
TEXT_COLOR
|
|
|
|
} else {
|
|
|
|
TEXT_COLOR_GREY
|
|
|
|
})
|
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(10))
|
|
|
|
.set(state.ids.btn_leader, ui)
|
|
|
|
.was_clicked()
|
|
|
|
{
|
|
|
|
if let Some(uid) = selected {
|
|
|
|
events.push(Event::AssignLeader(uid));
|
|
|
|
state.update(|s| {
|
|
|
|
s.selected_member = None;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
if Button::image(self.imgs.button)
|
2020-08-05 11:29:42 +00:00
|
|
|
.w_h(90.0, 22.0)
|
|
|
|
.mid_bottom_with_margin_on(state.ids.btn_leader, -27.0)
|
|
|
|
.hover_image(self.imgs.button)
|
|
|
|
.press_image(self.imgs.button)
|
|
|
|
.label(&self.localized_strings.get("hud.group.link_group"))
|
|
|
|
.hover_image(self.imgs.button)
|
|
|
|
.press_image(self.imgs.button)
|
|
|
|
.label_color(TEXT_COLOR_GREY)
|
|
|
|
.image_color(TEXT_COLOR_GREY)
|
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(10))
|
|
|
|
.set(state.ids.btn_link, ui)
|
|
|
|
.was_clicked()
|
2020-07-25 23:21:15 +00:00
|
|
|
{};
|
|
|
|
if Button::image(self.imgs.button)
|
|
|
|
.w_h(90.0, 22.0)
|
|
|
|
.mid_bottom_with_margin_on(state.ids.btn_link, -27.0)
|
|
|
|
.down_from(state.ids.btn_link, 5.0)
|
|
|
|
.hover_image(self.imgs.button_hover)
|
|
|
|
.press_image(self.imgs.button_press)
|
|
|
|
.label(&self.localized_strings.get("hud.group.kick"))
|
|
|
|
.label_color(if state.selected_member.is_some() {
|
|
|
|
TEXT_COLOR
|
|
|
|
} else {
|
|
|
|
TEXT_COLOR_GREY
|
|
|
|
})
|
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(10))
|
|
|
|
.set(state.ids.btn_kick, ui)
|
|
|
|
.was_clicked()
|
|
|
|
{
|
|
|
|
if let Some(uid) = selected {
|
|
|
|
events.push(Event::Kick(uid));
|
|
|
|
state.update(|s| {
|
|
|
|
s.selected_member = None;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
// Group Members, only character names, cut long names when they exceed the
|
|
|
|
// button size
|
2020-07-31 03:46:08 +00:00
|
|
|
let group_size = group_members.len();
|
2020-07-25 23:21:15 +00:00
|
|
|
if state.ids.members.len() < group_size {
|
|
|
|
state.update(|s| {
|
|
|
|
s.ids
|
|
|
|
.members
|
|
|
|
.resize(group_size, &mut ui.widget_id_generator())
|
2020-07-19 21:49:18 +00:00
|
|
|
})
|
2020-07-25 23:21:15 +00:00
|
|
|
}
|
|
|
|
// Scrollable area for group member names
|
2020-08-02 23:53:02 +00:00
|
|
|
Rectangle::fill_with([110.0, 135.0], color::TRANSPARENT)
|
2020-08-05 11:29:42 +00:00
|
|
|
.top_left_with_margins_on(state.ids.bg, 5.0, 5.0)
|
|
|
|
.crop_kids()
|
2020-07-25 23:21:15 +00:00
|
|
|
.scroll_kids_vertically()
|
|
|
|
.set(state.ids.scroll_area, ui);
|
|
|
|
Scrollbar::y_axis(state.ids.scroll_area)
|
|
|
|
.thickness(5.0)
|
|
|
|
.rgba(0.33, 0.33, 0.33, 1.0)
|
|
|
|
.set(state.ids.scrollbar, ui);
|
|
|
|
// List member names
|
2020-07-31 03:46:08 +00:00
|
|
|
for (i, &uid) in group_members.iter().copied().enumerate() {
|
2020-07-25 23:21:15 +00:00
|
|
|
let selected = state.selected_member.map_or(false, |u| u == uid);
|
|
|
|
let char_name = uid_to_name_text(uid, &self.client);
|
|
|
|
// TODO: Do something special visually if uid == leader
|
|
|
|
if Button::image(if selected {
|
|
|
|
self.imgs.selection
|
2020-07-19 21:49:18 +00:00
|
|
|
} else {
|
2020-07-25 23:21:15 +00:00
|
|
|
self.imgs.nothing
|
|
|
|
})
|
|
|
|
.w_h(100.0, 22.0)
|
|
|
|
.and(|w| {
|
|
|
|
if i == 0 {
|
|
|
|
w.top_left_with_margins_on(state.ids.scroll_area, 5.0, 0.0)
|
|
|
|
} else {
|
2020-08-02 23:53:02 +00:00
|
|
|
w.down_from(state.ids.members[i - 1], 5.0)
|
2020-07-25 23:21:15 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.hover_image(self.imgs.selection_hover)
|
|
|
|
.press_image(self.imgs.selection_press)
|
|
|
|
.crop_kids()
|
|
|
|
.label_x(Relative::Place(Place::Start(Some(4.0))))
|
|
|
|
.label(&char_name)
|
2020-08-05 11:29:42 +00:00
|
|
|
.label_color(if uid == leader {
|
|
|
|
ERROR_COLOR
|
|
|
|
} else {
|
|
|
|
TEXT_COLOR
|
|
|
|
})
|
2020-07-25 23:21:15 +00:00
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.label_font_size(self.fonts.cyri.scale(12))
|
|
|
|
.set(state.ids.members[i], ui)
|
|
|
|
.was_clicked()
|
|
|
|
{
|
|
|
|
// Do nothing when clicking yourself
|
|
|
|
if Some(uid) != my_uid {
|
|
|
|
// Select the group member
|
|
|
|
state.update(|s| {
|
|
|
|
s.selected_member = if selected { None } else { Some(uid) }
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
// Maximum of 6 Players/Npcs per Group
|
|
|
|
// Player pets count as group members, too. They are not counted
|
|
|
|
// into the maximum group size.
|
2020-07-19 21:49:18 +00:00
|
|
|
}
|
2020-07-12 00:39:50 +00:00
|
|
|
}
|
2021-02-11 00:59:14 +00:00
|
|
|
if let Some((invite_uid, _, _, kind)) = open_invite {
|
2020-07-19 21:49:18 +00:00
|
|
|
self.show.group = true; // Auto open group menu
|
|
|
|
// TODO: add group name here too
|
|
|
|
// Invite text
|
2020-07-25 23:21:15 +00:00
|
|
|
|
2020-07-19 21:49:18 +00:00
|
|
|
let name = uid_to_name_text(invite_uid, &self.client);
|
2021-02-11 00:59:14 +00:00
|
|
|
let invite_text = match kind {
|
2021-02-11 04:54:31 +00:00
|
|
|
InviteKind::Group => self
|
2021-02-11 00:59:14 +00:00
|
|
|
.localized_strings
|
|
|
|
.get("hud.group.invite_to_join")
|
2021-02-11 04:54:31 +00:00
|
|
|
.replace("{name}", &name),
|
|
|
|
InviteKind::Trade => self
|
2021-02-11 00:59:14 +00:00
|
|
|
.localized_strings
|
|
|
|
.get("hud.group.invite_to_trade")
|
2021-02-11 04:54:31 +00:00
|
|
|
.replace("{name}", &name),
|
2021-02-11 00:59:14 +00:00
|
|
|
};
|
2020-07-19 21:49:18 +00:00
|
|
|
Text::new(&invite_text)
|
2020-08-05 11:29:42 +00:00
|
|
|
.mid_top_with_margin_on(state.ids.bg, 5.0)
|
2020-07-25 23:21:15 +00:00
|
|
|
.font_size(12)
|
2020-07-12 00:39:50 +00:00
|
|
|
.font_id(self.fonts.cyri.conrod_id)
|
|
|
|
.color(TEXT_COLOR)
|
2020-08-05 11:29:42 +00:00
|
|
|
.w(165.0) // Text stays within frame
|
2020-07-12 00:39:50 +00:00
|
|
|
.set(state.ids.title, ui);
|
2020-07-19 21:49:18 +00:00
|
|
|
// Accept Button
|
|
|
|
let accept_key = self
|
|
|
|
.settings
|
|
|
|
.controls
|
|
|
|
.get_binding(GameInput::AcceptGroupInvite)
|
|
|
|
.map_or_else(|| "".into(), |key| key.to_string());
|
2020-07-12 00:39:50 +00:00
|
|
|
if Button::image(self.imgs.button)
|
|
|
|
.w_h(90.0, 22.0)
|
|
|
|
.bottom_left_with_margins_on(state.ids.bg, 15.0, 15.0)
|
2020-07-19 21:49:18 +00:00
|
|
|
.hover_image(self.imgs.button_hover)
|
|
|
|
.press_image(self.imgs.button_press)
|
|
|
|
.label(&format!(
|
|
|
|
"[{}] {}",
|
|
|
|
&accept_key,
|
|
|
|
&self.localized_strings.get("common.accept")
|
|
|
|
))
|
|
|
|
.label_color(TEXT_COLOR)
|
2020-07-12 00:39:50 +00:00
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
2020-08-05 11:29:42 +00:00
|
|
|
.label_font_size(self.fonts.cyri.scale(12))
|
2020-07-19 21:49:18 +00:00
|
|
|
.set(state.ids.btn_accept, ui)
|
2020-07-12 00:39:50 +00:00
|
|
|
.was_clicked()
|
2020-07-19 21:49:18 +00:00
|
|
|
{
|
|
|
|
events.push(Event::Accept);
|
2020-07-25 23:21:15 +00:00
|
|
|
self.show.group_menu = true;
|
2020-07-19 21:49:18 +00:00
|
|
|
};
|
|
|
|
// Decline button
|
|
|
|
let decline_key = self
|
|
|
|
.settings
|
|
|
|
.controls
|
|
|
|
.get_binding(GameInput::DeclineGroupInvite)
|
|
|
|
.map_or_else(|| "".into(), |key| key.to_string());
|
2020-07-12 00:39:50 +00:00
|
|
|
if Button::image(self.imgs.button)
|
|
|
|
.w_h(90.0, 22.0)
|
|
|
|
.bottom_right_with_margins_on(state.ids.bg, 15.0, 15.0)
|
2020-07-19 21:49:18 +00:00
|
|
|
.hover_image(self.imgs.button_hover)
|
|
|
|
.press_image(self.imgs.button_press)
|
|
|
|
.label(&format!(
|
|
|
|
"[{}] {}",
|
|
|
|
&decline_key,
|
|
|
|
&self.localized_strings.get("common.decline")
|
|
|
|
))
|
|
|
|
.label_color(TEXT_COLOR)
|
2020-07-12 00:39:50 +00:00
|
|
|
.label_font_id(self.fonts.cyri.conrod_id)
|
2020-08-05 11:29:42 +00:00
|
|
|
.label_font_size(self.fonts.cyri.scale(12))
|
2020-07-19 21:49:18 +00:00
|
|
|
.set(state.ids.btn_decline, ui)
|
2020-07-12 00:39:50 +00:00
|
|
|
.was_clicked()
|
2020-07-19 21:49:18 +00:00
|
|
|
{
|
|
|
|
events.push(Event::Decline);
|
|
|
|
};
|
2020-07-12 00:39:50 +00:00
|
|
|
}
|
2020-07-25 23:21:15 +00:00
|
|
|
|
2020-07-12 00:39:50 +00:00
|
|
|
events
|
|
|
|
}
|
|
|
|
}
|