timeout visuals, various small fixes and two new items

This commit is contained in:
Monty Marz 2020-08-04 09:22:59 +02:00
parent 543d971a19
commit 28a8f847cc
20 changed files with 140 additions and 70 deletions

View File

@ -5,7 +5,7 @@ Item(
(
kind: Back("Short0"),
stats: (
protection: Normal(0.0),
protection: Normal(0.2),
),
)
),

View File

@ -0,0 +1,12 @@
Item(
name: "Green Blanket",
description: "Keeps your shoulders warm.",
kind: Armor(
(
kind: Back("Short1"),
stats: (
protection: Normal(0.1),
),
)
),
)

View File

@ -0,0 +1,12 @@
Item(
name: "Gem of lesser Protection",
description: "Surrounded by a discrete magical glow.",
kind: Armor(
(
kind: Neck("Neck1"),
stats: (
protection: Normal(0.5),
),
)
),
)

View File

@ -1,6 +1,6 @@
Item(
name: "Uneven Bow",
description: "Someone carved his initials into it.",
description: "Someone carved their initials into it.",
kind: Tool(
(
kind: Bow("ShortBow0"),

View File

@ -230,6 +230,8 @@
(0.6, "common.items.armor.ring.ring_0"),
// capes
(0.6, "common.items.armor.back.short_0"),
(0.7, "common.items.armor.back.short_1"),
// necks
(0.6, "common.items.armor.neck.neck_0"),
(0.4, "common.items.armor.neck.neck_1"),
]

BIN
assets/voxygen/element/icons/neck-0.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/voxygen/element/icons/neck-1.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -336,6 +336,7 @@ magically infused items?"#,
"hud.group.add_friend": "Add to Friends",
"hud.group.link_group": "Link Groups",
"hud.group.in_menu": "In Menu",
"hud.group.members": "Group Members",
"hud.spell": "Spells",
@ -471,6 +472,7 @@ Protection
"Veloren is still in Pre-Alpha. We do our best to improve it every day!",
"If you want to join the Dev-Team or just have a chat with us join our Discord-Server.",
"You can toggle showing your amount of health on the healthbar in the settings.",
"In order to see your stats click the 'Stats' button in your inventory.",
],
"npc.speech.villager_under_attack": [
"Help, I'm under attack!",

View File

@ -1016,6 +1016,10 @@
Armor(Back("Short0")): VoxTrans(
"voxel.armor.back.short-0",
(0.0, 0.0, 0.0), (-90.0, 180.0, 0.0), 1.0,
),
Armor(Back("Short1")): VoxTrans(
"voxel.armor.back.short-1",
(0.0, -2.0, 0.0), (-90.0, 180.0, 0.0), 1.0,
),
Armor(Back("Admin")): VoxTrans(
"voxel.armor.back.admin",
@ -1033,6 +1037,9 @@
Armor(Neck("Neck0")): Png(
"element.icons.neck-0",
),
Armor(Neck("Neck1")): Png(
"element.icons.neck-1",
),
// Tabards
Armor(Tabard("Admin")): Png(
"element.icons.tabard_admin",

BIN
assets/voxygen/voxel/armor/back/short-1.vox (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -16,5 +16,9 @@
vox_spec: ("armor.back.dung_purp-0", (-5.0, -1.0, -14.0)),
color: None
),
"Short1": (
vox_spec: ("armor.back.short-1", (-5.0, -1.0, -11.0)),
color: None
),
},
))

View File

@ -145,6 +145,7 @@ impl GroupManager {
// Add someone to a group
// Also used to create new groups
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
pub fn add_group_member(
&mut self,
leader: specs::Entity,
@ -241,6 +242,7 @@ impl GroupManager {
});
}
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
pub fn new_pet(
&mut self,
pet: specs::Entity,
@ -319,6 +321,7 @@ impl GroupManager {
// Remove someone from a group if they are in one
// Don't need to check if they are in a group before calling this
// Also removes pets (ie call this if the pet no longer exists)
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
fn remove_from_group(
&mut self,
member: specs::Entity,

View File

@ -54,7 +54,7 @@ pub fn handle_group(server: &mut Server, entity: specs::Entity, manip: GroupMani
if client.invited_to_group.is_some() {
already_has_invite = true;
} else {
client.notify(ServerMsg::GroupInvite((*inviter_uid).into()));
client.notify(ServerMsg::GroupInvite((*inviter_uid)));
client.invited_to_group = Some(entity);
}
// Would be cool to do this in agent system (e.g. add an invited
@ -71,11 +71,9 @@ pub fn handle_group(server: &mut Server, entity: specs::Entity, manip: GroupMani
.ecs()
.write_storage()
.insert(invitee, comp::Agent::default());
} else {
if let Some(client) = clients.get_mut(entity) {
} else if let Some(client) = clients.get_mut(entity) {
client.notify(ChatType::Meta.server_msg("Invite rejected".to_owned()));
}
}
if already_has_invite {
// Inform inviter that there is already an invite

View File

@ -261,7 +261,7 @@ impl StateExt for State {
| comp::ChatType::Kill
| comp::ChatType::Meta
| comp::ChatType::World(_) => {
self.notify_registered_clients(ServerMsg::ChatMsg(resolved_msg.clone()))
self.notify_registered_clients(ServerMsg::ChatMsg(resolved_msg))
},
comp::ChatType::Tell(u, t) => {
for (client, uid) in (

View File

@ -585,7 +585,7 @@ impl<'a> Widget for Bag<'a> {
"{}\n\n{}\n\n{}\n\n{}%",
self.stats.endurance, self.stats.fitness, self.stats.willpower, damage_reduction
))
.top_right_with_margins_on(state.ids.stats_alignment, 120.0, 150.0)
.top_right_with_margins_on(state.ids.stats_alignment, 120.0, 130.0)
.font_id(self.fonts.cyri.conrod_id)
.font_size(self.fonts.cyri.scale(16))
.color(TEXT_COLOR)

View File

@ -1,15 +1,11 @@
use super::{
img_ids::{Imgs, ImgsRot},
Show, BLACK, GROUP_COLOR, HP_COLOR, KILL_COLOR, LOW_HP_COLOR, MANA_COLOR, TEXT_COLOR,
TEXT_COLOR_GREY, UI_HIGHLIGHT_0,
img_ids::Imgs, Show, BLACK, GROUP_COLOR, HP_COLOR, KILL_COLOR, LOW_HP_COLOR, MANA_COLOR,
TEXT_COLOR, TEXT_COLOR_GREY, UI_HIGHLIGHT_0, UI_MAIN,
};
use crate::{
i18n::VoxygenLocalization,
settings::Settings,
ui::{fonts::ConrodVoxygenFonts, ImageFrame, Tooltip, TooltipManager, Tooltipable},
window::GameInput,
GlobalState,
i18n::VoxygenLocalization, settings::Settings, ui::fonts::ConrodVoxygenFonts,
window::GameInput, GlobalState,
};
use client::{self, Client};
use common::{
@ -51,6 +47,8 @@ widget_ids! {
member_stam[],
dead_txt[],
health_txt[],
timeout_bg,
timeout,
}
}
@ -60,7 +58,6 @@ pub struct State {
selected_member: Option<Uid>,
}
const TOOLTIP_UPSHIFT: f64 = 40.0;
#[derive(WidgetCommon)]
pub struct Group<'a> {
show: &'a mut Show,
@ -69,8 +66,6 @@ pub struct Group<'a> {
imgs: &'a Imgs,
fonts: &'a ConrodVoxygenFonts,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
tooltip_manager: &'a mut TooltipManager,
rot_imgs: &'a ImgsRot,
pulse: f32,
global_state: &'a GlobalState,
@ -79,6 +74,7 @@ pub struct Group<'a> {
}
impl<'a> Group<'a> {
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
pub fn new(
show: &'a mut Show,
client: &'a Client,
@ -86,8 +82,6 @@ impl<'a> Group<'a> {
imgs: &'a Imgs,
fonts: &'a ConrodVoxygenFonts,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
tooltip_manager: &'a mut TooltipManager,
rot_imgs: &'a ImgsRot,
pulse: f32,
global_state: &'a GlobalState,
) -> Self {
@ -96,8 +90,6 @@ impl<'a> Group<'a> {
client,
settings,
imgs,
rot_imgs,
tooltip_manager,
fonts,
localized_strings,
pulse,
@ -127,37 +119,17 @@ impl<'a> Widget for Group<'a> {
}
}
#[allow(clippy::unused_unit)] // TODO: Pending review in #587
#[allow(clippy::blocks_in_if_conditions)] // TODO: Pending review in #587
fn style(&self) -> Self::Style { () }
//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
#[allow(clippy::unused_unit)] // TODO: Pending review in #587
fn update(self, args: widget::UpdateArgs<Self>) -> Self::Event {
let widget::UpdateArgs { state, ui, .. } = args;
let mut events = Vec::new();
let localized_strings = self.localized_strings;
let button_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))
.title_text_color(TEXT_COLOR)
.font_id(self.fonts.cyri.conrod_id)
.desc_text_color(TEXT_COLOR);
// Don't show pets
let group_members = self
@ -217,6 +189,20 @@ impl<'a> Widget for Group<'a> {
.w_h(49.0, 26.0)
.bottom_left_with_margins_on(ui.window, 190.0, 10.0)
.set(state.ids.group_button, ui);
// Show timeout bar
let max_time = 90.0;
let time = 50.0;
let progress_perc = time / max_time;
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)
.w_h(98.0 * progress_perc, 8.0)
.top_left_with_margins_on(state.ids.timeout_bg, 1.0, 1.0)
.color(Some(UI_HIGHLIGHT_0))
.set(state.ids.timeout, ui);
}
// Buttons
if let Some((group_name, leader)) = self.client.group_info().filter(|_| in_group) {
@ -230,13 +216,6 @@ impl<'a> Widget for Group<'a> {
.bottom_left_with_margins_on(ui.window, 190.0, 10.0)
.hover_image(self.imgs.group_icon_hover)
.press_image(self.imgs.group_icon_press)
.with_tooltip(
self.tooltip_manager,
&localized_strings.get("hud.group"),
"",
&button_tooltip,
)
.bottom_offset(TOOLTIP_UPSHIFT)
.set(state.ids.group_button, ui)
.was_clicked()
{
@ -319,7 +298,7 @@ impl<'a> Widget for Group<'a> {
// change panel positions when debug info is shown
let offset = if self.global_state.settings.gameplay.toggle_debug {
210.0
240.0
} else {
110.0
};

View File

@ -1933,8 +1933,9 @@ impl Hud {
&self.imgs,
&self.fonts,
&self.voxygen_i18n,
//&stats,
info.selected_entity,
&self.rot_imgs,
tooltip_manager,
)
.set(self.ids.social_window, ui_widgets)
{
@ -1959,8 +1960,6 @@ impl Hud {
&self.imgs,
&self.fonts,
&self.voxygen_i18n,
tooltip_manager,
&self.rot_imgs,
self.pulse,
&global_state,
)

View File

@ -148,12 +148,15 @@ impl<'a> Widget for Overhead<'a> {
const MANA_BAR_Y: f64 = MANA_BAR_HEIGHT / 2.0;
let hp_percentage =
self.stats.health.current() as f64 / self.stats.health.maximum() as f64 * 100.0;
let name_y = if hp_percentage == 100.0 {
MANA_BAR_Y + 10.0
let level_comp = self.stats.level.level() as i64 - self.own_level as i64;
let name_y = if hp_percentage.abs() > 99.9 {
MANA_BAR_Y + 20.0
} else if level_comp > 9 {
MANA_BAR_Y + 38.0
} else {
MANA_BAR_Y + 32.0
};
let font_size = if hp_percentage == 100.0 { 24 } else { 20 };
let font_size = if hp_percentage.abs() > 99.9 { 24 } else { 20 };
// Name
Text::new(&self.name)
.font_id(self.fonts.cyri.conrod_id)

View File

@ -1,6 +1,12 @@
use super::{img_ids::Imgs, Show, TEXT_COLOR, TEXT_COLOR_3, UI_HIGHLIGHT_0, UI_MAIN};
use super::{
img_ids::{Imgs, ImgsRot},
Show, TEXT_COLOR, TEXT_COLOR_3, UI_HIGHLIGHT_0, UI_MAIN,
};
use crate::{i18n::VoxygenLocalization, ui::fonts::ConrodVoxygenFonts};
use crate::{
i18n::VoxygenLocalization,
ui::{fonts::ConrodVoxygenFonts, ImageFrame, Tooltip, TooltipManager, Tooltipable},
};
use client::{self, Client};
use common::sync::Uid;
use conrod_core::{
@ -63,30 +69,34 @@ pub struct Social<'a> {
imgs: &'a Imgs,
fonts: &'a ConrodVoxygenFonts,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
//stats: &'a Stats,
selected_entity: Option<(specs::Entity, Instant)>,
rot_imgs: &'a ImgsRot,
tooltip_manager: &'a mut TooltipManager,
#[conrod(common_builder)]
common: widget::CommonBuilder,
}
impl<'a> Social<'a> {
#[allow(clippy::too_many_arguments)] // TODO: Pending review in #587
pub fn new(
show: &'a Show,
client: &'a Client,
imgs: &'a Imgs,
fonts: &'a ConrodVoxygenFonts,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
//stats: &'a Stats,
selected_entity: Option<(specs::Entity, Instant)>,
rot_imgs: &'a ImgsRot,
tooltip_manager: &'a mut TooltipManager,
) -> Self {
Self {
show,
client,
imgs,
rot_imgs,
fonts,
localized_strings,
//stats,
tooltip_manager,
selected_entity,
common: widget::CommonBuilder::default(),
}
@ -118,6 +128,24 @@ impl<'a> Widget for Social<'a> {
let widget::UpdateArgs { state, ui, .. } = args;
let mut events = Vec::new();
let button_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))
.title_text_color(TEXT_COLOR)
.font_id(self.fonts.cyri.conrod_id)
.desc_text_color(TEXT_COLOR);
// Window frame and BG
let pos = if self.show.group || self.show.group_menu {
@ -472,7 +500,20 @@ impl<'a> Widget for Social<'a> {
self.selected_entity
.and_then(|s| self.client.state().read_component_copied(s.0))
});
// TODO: Prevent inviting players with the same group uid
// TODO: Show current amount of group members as a tooltip for the invite button
// if the player is the group leader TODO: Grey out the invite
// button if the group has 6/6 members
let current_members = 4;
let tooltip_txt = if selected_ingame.is_some() {
format!(
"{}/6 {}",
&current_members,
&self.localized_strings.get("hud.group.members")
)
} else {
(&self.localized_strings.get("hud.group.members")).to_string()
};
if Button::image(self.imgs.button)
.w_h(106.0, 26.0)
.bottom_right_with_margins_on(state.ids.frame, 9.0, 7.0)
@ -500,6 +541,7 @@ impl<'a> Widget for Social<'a> {
})
.label_font_size(self.fonts.cyri.scale(15))
.label_font_id(self.fonts.cyri.conrod_id)
.with_tooltip(self.tooltip_manager, &tooltip_txt, "", &button_tooltip)
.set(state.ids.invite_button, ui)
.was_clicked()
{

View File

@ -1071,6 +1071,7 @@ impl PlayState for SessionState {
/// Max distance an entity can be "targeted"
const MAX_TARGET_RANGE: f32 = 30.0;
/// Calculate what the cursor is pointing at within the 3d scene
#[allow(clippy::type_complexity)]
fn under_cursor(
client: &Client,
cam_pos: Vec3<f32>,