mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Fix guards menacing instead of defending villagers
This commit is contained in:
parent
21cad12272
commit
44865d99ff
@ -94,6 +94,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Items in hotbar no longer change when sorting inventory
|
- Items in hotbar no longer change when sorting inventory
|
||||||
- Lantern color changes when swapping lanterns
|
- Lantern color changes when swapping lanterns
|
||||||
- NPCs no longer wander off cliffs
|
- NPCs no longer wander off cliffs
|
||||||
|
- Guards will defend villagers instead of simply threatening the attacker
|
||||||
|
|
||||||
## [0.11.0] - 2021-09-11
|
## [0.11.0] - 2021-09-11
|
||||||
|
|
||||||
|
@ -1425,6 +1425,7 @@ impl<'a> AgentData<'a> {
|
|||||||
event_emitter: &mut Emitter<'_, ServerEvent>,
|
event_emitter: &mut Emitter<'_, ServerEvent>,
|
||||||
) {
|
) {
|
||||||
agent.action_state.timer = 0.0;
|
agent.action_state.timer = 0.0;
|
||||||
|
let mut aggro_on = false;
|
||||||
|
|
||||||
let worth_choosing = |entity| {
|
let worth_choosing = |entity| {
|
||||||
read_data
|
read_data
|
||||||
@ -1508,11 +1509,10 @@ impl<'a> AgentData<'a> {
|
|||||||
.get(*self.entity)
|
.get(*self.entity)
|
||||||
.map_or(false, |stats| stats.name == "Guard");
|
.map_or(false, |stats| stats.name == "Guard");
|
||||||
let other_is_a_villager = matches!(e_alignment, Some(Alignment::Npc));
|
let other_is_a_villager = matches!(e_alignment, Some(Alignment::Npc));
|
||||||
let villager_has_taken_damage = e_health.last_change.time.0 < 5.0;
|
let villager_has_taken_damage = read_data.time.0 - e_health.last_change.time.0 < 5.0;
|
||||||
let attacker_of = |health: &Health| health.last_change.damage_by();
|
let attacker_of = |health: &Health| health.last_change.damage_by();
|
||||||
|
|
||||||
let i_should_defend = i_am_a_guard && other_is_a_villager && villager_has_taken_damage;
|
let i_should_defend = i_am_a_guard && other_is_a_villager && villager_has_taken_damage;
|
||||||
|
|
||||||
i_should_defend
|
i_should_defend
|
||||||
.then(|| {
|
.then(|| {
|
||||||
attacker_of(e_health)
|
attacker_of(e_health)
|
||||||
@ -1604,6 +1604,7 @@ impl<'a> AgentData<'a> {
|
|||||||
} else if is_owner_hostile(e_alignment) {
|
} else if is_owner_hostile(e_alignment) {
|
||||||
Some((entity, *e_pos))
|
Some((entity, *e_pos))
|
||||||
} else if let Some(villain_info) = guard_defending_villager(e_health, e_alignment) {
|
} else if let Some(villain_info) = guard_defending_villager(e_health, e_alignment) {
|
||||||
|
aggro_on = true;
|
||||||
Some(villain_info)
|
Some(villain_info)
|
||||||
} else if rtsim_remember(e_stats, agent, event_emitter)
|
} else if rtsim_remember(e_stats, agent, event_emitter)
|
||||||
|| npc_sees_cultist(e_stats, e_inventory, agent, event_emitter)
|
|| npc_sees_cultist(e_stats, e_inventory, agent, event_emitter)
|
||||||
@ -1627,14 +1628,18 @@ impl<'a> AgentData<'a> {
|
|||||||
.map(|(e, _)| e);
|
.map(|(e, _)| e);
|
||||||
|
|
||||||
if agent.target.is_none() && target.is_some() {
|
if agent.target.is_none() && target.is_some() {
|
||||||
|
if aggro_on {
|
||||||
controller.push_utterance(UtteranceKind::Angry);
|
controller.push_utterance(UtteranceKind::Angry);
|
||||||
|
} else {
|
||||||
|
controller.push_utterance(UtteranceKind::Surprised);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
agent.target = target.map(|target| Target {
|
agent.target = target.map(|target| Target {
|
||||||
target,
|
target,
|
||||||
hostile: true,
|
hostile: true,
|
||||||
selected_at: read_data.time.0,
|
selected_at: read_data.time.0,
|
||||||
aggro_on: false,
|
aggro_on,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user