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?? }); }