292 lines
18 KiB
Rust
292 lines
18 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use wicked_waifus_protocol::{
|
|
CommonTagData, EntityCommonTagNotify, EntityStateReadyNotify, ItemRewardNotify,
|
|
NormalItemUpdateNotify, RewardItemInfo, WR,
|
|
};
|
|
|
|
use wicked_waifus_data::pb_components::action::{
|
|
Action, ChangeSelfEntityState, UnlockTeleportTrigger,
|
|
};
|
|
use wicked_waifus_data::pb_components::entity_state::EntityStateComponent;
|
|
|
|
use crate::logic::ecs::component::ComponentContainer;
|
|
use crate::logic::handler::handle_action;
|
|
use crate::logic::player::{ItemUsage, Player};
|
|
use crate::logic::utils::tag_utils;
|
|
use crate::query_components;
|
|
|
|
macro_rules! unimplemented_action {
|
|
($action:ident) => {{
|
|
tracing::warn!("Action not implemented for: {:?}", $action);
|
|
}};
|
|
}
|
|
|
|
// pub fn perform_action(player: &mut Player,
|
|
// entity_id: i64,
|
|
// level_entity_data: &wicked_waifus_data::LevelEntityConfigData,
|
|
// template_config: &wicked_waifus_data::TemplateConfigData,
|
|
// element: Action) {
|
|
// match element {
|
|
// Action::SetBattleState(action) => unimplemented_action! { action },
|
|
// Action::ExecBattleAction(action) => unimplemented_action! { action },
|
|
// Action::WaitBattleCondition(action) => unimplemented_action! { action },
|
|
// Action::PlayFlow(action) => unimplemented_action! { action },
|
|
// Action::Collect(_) => collect_action(player, level_entity_data, template_config),
|
|
// Action::LeisureInteract(action) => unimplemented_action! { action },
|
|
// Action::UnlockTeleportTrigger(action) => unlock_teleport_trigger(player, action.params),
|
|
// Action::EnableTemporaryTeleport(action) => unimplemented_action! { action },
|
|
// Action::OpenSystemBoard(action) => unimplemented_action! { action },
|
|
// Action::OpenSystemFunction(action) => unimplemented_action! { action },
|
|
// Action::ChangeSelfEntityState(action) => change_self_entity_state(player, entity_id, level_entity_data, template_config, action.params),
|
|
// Action::SetPlayerOperationRestriction(action) => unimplemented_action! { action },
|
|
// Action::Wait(action) => unimplemented_action! { action },
|
|
// Action::ChangeEntityState(action) => unimplemented_action! { action },
|
|
// Action::Log(action) => unimplemented_action! { action },
|
|
// Action::EnableNearbyTracking(action) => unimplemented_action! { action },
|
|
// Action::TeleportDungeon(action) => unimplemented_action! { action },
|
|
// Action::DestroySelf(action) => unimplemented_action! { action },
|
|
// Action::CameraLookAt(action) => unimplemented_action! { action },
|
|
// Action::StopCameraLookAt(action) => unimplemented_action! { action },
|
|
// Action::EnterOrbitalCamera(action) => unimplemented_action! { action },
|
|
// Action::ExitOrbitalCamera(action) => unimplemented_action! { action },
|
|
// Action::SendAiEvent(action) => unimplemented_action! { action },
|
|
// Action::SetInteractionLockState(action) => unimplemented_action! { action },
|
|
// Action::AwakeEntity(action) => unimplemented_action! { action },
|
|
// Action::ChangeLiftTarget(action) => unimplemented_action! { action },
|
|
// Action::CalculateVar(action) => unimplemented_action! { action },
|
|
// Action::AddBuffToPlayer(action) => unimplemented_action! { action },
|
|
// Action::RemoveBuffFromPlayer(action) => unimplemented_action! { action },
|
|
// Action::AddBuffToEntity(action) => unimplemented_action! { action },
|
|
// Action::RemoveBuffFromEntity(action) => unimplemented_action! { action },
|
|
// Action::Prompt(action) => unimplemented_action! { action },
|
|
// Action::SetEntityVisible(action) => unimplemented_action! { action },
|
|
// Action::DestroyEntity(action) => unimplemented_action! { action },
|
|
// Action::GuideTrigger(action) => unimplemented_action! { action },
|
|
// Action::TriggerCameraShake(action) => unimplemented_action! { action },
|
|
// Action::SetVar(action) => unimplemented_action! { action },
|
|
// Action::VehicleEnter(action) => unimplemented_action! { action },
|
|
// Action::VehicleExitPlayer(action) => unimplemented_action! { action },
|
|
// Action::LockEntity(action) => unimplemented_action! { action },
|
|
// Action::UnlockEntity(action) => unimplemented_action! { action },
|
|
// Action::CommonTip(action) => unimplemented_action! { action },
|
|
// Action::CommonTip2(action) => unimplemented_action! { action },
|
|
// Action::PostAkEvent(action) => unimplemented_action! { action },
|
|
// Action::VehicleEnterNpc(action) => unimplemented_action! { action },
|
|
// Action::VehicleExitNpc(action) => unimplemented_action! { action },
|
|
// Action::PlayerLookAt(action) => unimplemented_action! { action },
|
|
// Action::PlayBubble(action) => unimplemented_action! { action },
|
|
// Action::AddPlayBubble(action) => unimplemented_action! { action },
|
|
// Action::ClearPlayBubble(action) => unimplemented_action! { action },
|
|
// Action::ExecRiskHarvestEffect(action) => unimplemented_action! { action },
|
|
// Action::EnableLevelPlay(action) => unimplemented_action! { action },
|
|
// Action::ClaimLevelPlayReward(action) => unimplemented_action! { action },
|
|
// Action::SettlementDungeon(action) => unimplemented_action! { action },
|
|
// Action::ExitDungeon(action) => unimplemented_action! { action },
|
|
// Action::FinishDungeon(action) => unimplemented_action! { action },
|
|
// Action::RecordDungeonEvent(action) => unimplemented_action! { action },
|
|
// Action::RecoverDurability(action) => unimplemented_action! { action },
|
|
// Action::FadeInScreen(action) => unimplemented_action! { action },
|
|
// Action::FadeOutScreen(action) => unimplemented_action! { action },
|
|
// Action::ChangeNpcPerformState(action) => unimplemented_action! { action },
|
|
// Action::EntityTurnTo(action) => unimplemented_action! { action },
|
|
// Action::EntityLookAt(action) => unimplemented_action! { action },
|
|
// Action::ToggleMapMarkState(action) => unimplemented_action! { action },
|
|
// Action::RandomVar(action) => unimplemented_action! { action },
|
|
// Action::ModifySceneItemAttributeTag(action) => unimplemented_action! { action },
|
|
// Action::VehicleWaterfallClimbing(action) => unimplemented_action! { action },
|
|
// Action::VehicleTeleport(action) => unimplemented_action! { action },
|
|
// Action::RogueGotoNextFloor(action) => unimplemented_action! { action },
|
|
// Action::RogueReceiveReward(action) => unimplemented_action! { action },
|
|
// Action::RogueSelectRoom(action) => unimplemented_action! { action },
|
|
// Action::RogueActivatePortal(action) => unimplemented_action! { action },
|
|
// Action::MowingTowerGotoNextFloor(action) => unimplemented_action! { action },
|
|
// Action::SlashAndTowerGotoNextFloor(action) => unimplemented_action! { action },
|
|
// Action::PlayMontage(action) => unimplemented_action! { action },
|
|
// Action::OpenSystemBoardWithReturn(action) => unimplemented_action! { action },
|
|
// Action::UnlockSystemItem(action) => unimplemented_action! { action },
|
|
// Action::SetSportsState(action) => unimplemented_action! { action },
|
|
// Action::OpenSimpleGameplay(action) => unimplemented_action! { action },
|
|
// Action::PlayEffect(action) => unimplemented_action! { action },
|
|
// Action::PlayEffect2(action) => unimplemented_action! { action },
|
|
// Action::RestorePlayerCameraAdjustment(action) => unimplemented_action! { action },
|
|
// Action::AdjustPlayerCamera(action) => unimplemented_action! { action },
|
|
// Action::SetPlayerPos(action) => unimplemented_action! { action },
|
|
// Action::MoveWithSpline(action) => unimplemented_action! { action },
|
|
// Action::EnableSplineMoveModel(action) => unimplemented_action! { action },
|
|
// Action::ToggleScanSplineEffect(action) => unimplemented_action! { action },
|
|
// Action::MoveSceneItem(action) => unimplemented_action! { action },
|
|
// Action::StopSceneItemMove(action) => unimplemented_action! { action },
|
|
// Action::FireBullet(action) => unimplemented_action! { action },
|
|
// Action::ClearFishingCabinInSaleItems(action) => unimplemented_action! { action },
|
|
// Action::AcceptFishingEntrust(action) => unimplemented_action! { action },
|
|
// Action::DestroyFishingBoat(action) => unimplemented_action! { action },
|
|
// Action::SetJigsawItem(action) => unimplemented_action! { action },
|
|
// Action::SetJigsawFoundation(action) => unimplemented_action! { action },
|
|
// Action::SetTeleControl(action) => unimplemented_action! { action },
|
|
// Action::SetEntityClientVisible(action) => unimplemented_action! { action },
|
|
// Action::ToggleHighlightExploreUi(action) => unimplemented_action! { action },
|
|
// Action::ExecAlertSystemAction(action) => unimplemented_action! { action },
|
|
// Action::AddFlowInteractOption(action) => unimplemented_action! { action },
|
|
// Action::RemoveFlowInteractOption(action) => unimplemented_action! { action },
|
|
// Action::EnableHostility(action) => unimplemented_action! { action },
|
|
// Action::ChangePhantomFormation(action) => unimplemented_action! { action },
|
|
// Action::RestorePhantomFormation(action) => unimplemented_action! { action },
|
|
// Action::ChangeTimer(action) => unimplemented_action! { action },
|
|
// Action::ToggleTimerPauseState(action) => unimplemented_action! { action },
|
|
// Action::ChangeFightTeam(action) => unimplemented_action! { action },
|
|
// Action::AddTrialFollowShooter(action) => unimplemented_action! { action },
|
|
// Action::RemoveTrialFollowShooter(action) => unimplemented_action! { action },
|
|
// Action::AddTrialCharacter(action) => unimplemented_action! { action },
|
|
// Action::RemoveTrialCharacter(action) => unimplemented_action! { action },
|
|
// Action::SetAreaState(action) => unimplemented_action! { action },
|
|
// Action::SwitchSubLevels(action) => unimplemented_action! { action },
|
|
// Action::ChangeTeamPosition(action) => unimplemented_action! { action },
|
|
// Action::GetItem(action) => unimplemented_action! { action },
|
|
// Action::CreatePrefab(action) => unimplemented_action! { action },
|
|
// Action::DestroyPrefab(action) => unimplemented_action! { action },
|
|
// Action::CompleteGuide(action) => unimplemented_action! { action },
|
|
// Action::PlayDynamicSettlement(action) => unimplemented_action! { action },
|
|
// Action::UsePhantomSkill(action) => unimplemented_action! { action },
|
|
// Action::HideTargetRange(action) => unimplemented_action! { action },
|
|
// Action::ChangeOtherState(action) => unimplemented_action! { action },
|
|
// Action::SetRegionConfig(action) => unimplemented_action! { action },
|
|
// Action::SetReviveRegion(action) => unimplemented_action! { action },
|
|
// Action::ExecResurrection(action) => unimplemented_action! { action },
|
|
// Action::ShowTargetRange(action) => unimplemented_action! { action },
|
|
// Action::SetTime(action) => unimplemented_action! { action },
|
|
// Action::SetTimeLockState(action) => unimplemented_action! { action },
|
|
// Action::EnableSystem(action) => unimplemented_action! { action },
|
|
// Action::EnableAoiNotify(action) => unimplemented_action! { action },
|
|
// Action::SetForceLock(action) => unimplemented_action! { action },
|
|
// Action::PlayRegisteredMontage(action) => unimplemented_action! { action },
|
|
// Action::SetAudioState(action) => unimplemented_action! { action },
|
|
// Action::HideGroup(action) => unimplemented_action! { action },
|
|
// Action::ShowHidedGroup(action) => unimplemented_action! { action },
|
|
// Action::HideSpecificEntities(action) => unimplemented_action! { action },
|
|
// Action::ShowSpecificEntities(action) => unimplemented_action! { action },
|
|
// Action::RemovePreloadResource(action) => unimplemented_action! { action },
|
|
// Action::Preload(action) => unimplemented_action! { action },
|
|
// Action::EnableAI(action) => unimplemented_action! { action },
|
|
// Action::SwitchDataLayers(action) => unimplemented_action! { action },
|
|
// Action::DestroyQuest(action) => unimplemented_action! { action },
|
|
// Action::DestroyQuestItem(action) => unimplemented_action! { action },
|
|
// Action::PromptQuestChapterUI(action) => unimplemented_action! { action },
|
|
// Action::TakePlotPhoto(action) => unimplemented_action! { action },
|
|
// Action::SetWuYinQuState(action) => unimplemented_action! { action },
|
|
// Action::RunActions(action) => unimplemented_action! { action },
|
|
// Action::ManualOccupations(action) => unimplemented_action! { action },
|
|
// Action::SetWeather(action) => unimplemented_action! { action },
|
|
// Action::SendNpcMail(action) => unimplemented_action! { action },
|
|
// Action::EnableFunction(action) => unimplemented_action! { action },
|
|
// Action::FocusOnMapMark(action) => unimplemented_action! { action },
|
|
// Action::CharacterLookAt(action) => unimplemented_action! { action },
|
|
// Action::AddGuestCharacter(action) => unimplemented_action! { action },
|
|
// Action::RemoveGuestCharacter(action) => unimplemented_action! { action },
|
|
// Action::TeleportToAndEnterVehicle(action) => unimplemented_action! { action },
|
|
// Action::SetAreaTimeState(action) => unimplemented_action! { action },
|
|
// Action::ResetPlayerCameraFocus(action) => unimplemented_action! { action },
|
|
// Action::ResetLevelPlay(action) => unimplemented_action! { action },
|
|
// Action::VehicleSprint(action) => unimplemented_action! { action },
|
|
// Action::VehicleMoveWithPathLine(action) => unimplemented_action! { action },
|
|
// Action::ClientPreEnableSubLevels(action) => unimplemented_action! { action },
|
|
// Action::GuestOperateUiAnimation(action) => unimplemented_action! { action },
|
|
// Action::ChangeEntityCamp(action) => unimplemented_action! { action },
|
|
// Action::NewMoveWithSpline(action) => unimplemented_action! { action },
|
|
// Action::DangoAbyssActivatePortal(action) => unimplemented_action! { action },
|
|
// Action::DangoAbyssCreateRewardTreasureBox(action) => unimplemented_action! { action },
|
|
// Action::DangoAbyssGotoNextFloor(action) => unimplemented_action! { action },
|
|
// Action::DangoAbyssReceiveReward(action) => unimplemented_action! { action },
|
|
// Action::SummonEntity(action) => unimplemented_action! { action },
|
|
// Action::GetRewardByInteract(action) => unimplemented_action! { action },
|
|
// Action::OpenQte(action) => unimplemented_action! { action },
|
|
// Action::ActiveAntiGravitySafePoint(action) => unimplemented_action! { action },
|
|
// Action::BvbPlayDialog(action) => unimplemented_action! { action },
|
|
// Action::BvbSendSystemEvent(action) => unimplemented_action! { action },
|
|
// Action::BvbSendAiEvent(action) => unimplemented_action! { action },
|
|
// Action::BvbPlayerOperationConstraint(action) => unimplemented_action! { action },
|
|
// Action::ExecClientBattleAction(action) => unimplemented_action! { action },
|
|
// Action::TriggerSpecificScanEffect(action) => unimplemented_action! { action },
|
|
// Action::SetActorVar(action) => unimplemented_action! { action },
|
|
// Action::RunActorCustomEvent(action) => unimplemented_action! { action },
|
|
// Action::StopUiScreenEffect(action) => unimplemented_action! { action },
|
|
// Action::StopNewMoveWithSpline(action) => unimplemented_action! { action },
|
|
// Action::RequestSystemFunction(action) => unimplemented_action! { action },
|
|
// }
|
|
// }
|
|
|
|
pub fn change_self_entity_state_action(
|
|
player: &mut Player,
|
|
entity_id: i64,
|
|
level_entity_data: &wicked_waifus_data::LevelEntityConfigData,
|
|
template_config: &wicked_waifus_data::TemplateConfigData,
|
|
action: ChangeSelfEntityState,
|
|
) {
|
|
let state = tag_utils::get_tag_id_by_name(action.entity_state.as_str());
|
|
|
|
// TODO: update Tag::CommonEntityTags too??
|
|
let old_state = {
|
|
let world_ref = player.world.borrow();
|
|
let world = world_ref.get_world_entity();
|
|
let mut state_tag = query_components!(world, entity_id, StateTag).0.unwrap();
|
|
let old_state = state_tag.state_tag_id;
|
|
tracing::debug!("ChangeSelfEntityState: old state {old_state} -> new state: {state}");
|
|
state_tag.state_tag_id = state;
|
|
old_state
|
|
};
|
|
|
|
if let Some(entity_state_component) = level_entity_data
|
|
.components_data
|
|
.entity_state_component
|
|
.as_ref()
|
|
.or(template_config
|
|
.components_data
|
|
.entity_state_component
|
|
.as_ref())
|
|
.cloned()
|
|
{
|
|
let entity_state_component: EntityStateComponent = entity_state_component; // TODO: Remove this line, used for casting only
|
|
|
|
// TODO: implement rest of cases
|
|
if let Some(state_change_behaviors) = entity_state_component.state_change_behaviors {
|
|
for state_change_behavior in state_change_behaviors {
|
|
// TODO: implement rest of cases
|
|
let expected = tag_utils::get_tag_id_by_name(state_change_behavior.state.as_str());
|
|
|
|
if expected == state {
|
|
if let Some(actions) = state_change_behavior.action {
|
|
for sub in actions {
|
|
handle_action(
|
|
player,
|
|
entity_id,
|
|
level_entity_data,
|
|
template_config,
|
|
sub,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
player.notify(EntityCommonTagNotify {
|
|
id: entity_id,
|
|
tags: vec![
|
|
CommonTagData {
|
|
tag_id: old_state,
|
|
remove_tag_ids: false,
|
|
}, // Remove
|
|
CommonTagData {
|
|
tag_id: state,
|
|
remove_tag_ids: true,
|
|
}, // Add
|
|
],
|
|
});
|
|
|
|
player.notify(EntityStateReadyNotify {
|
|
entity_id,
|
|
tag_id: state,
|
|
ready: true, // TODO: Always true? or shall we compare it to something??
|
|
});
|
|
}
|