8 [
Attribute(
"{56EBF5038622AC95}Assets/Conflict/CanBuild.emat")]
11 [
Attribute(
"{14A9DCEA57D1C381}Assets/Conflict/CannotBuild.emat")]
14 [
Attribute(
"{8FBC3A6E946F056E}Common/Materials/Default_Transparent.emat")]
31 static const string ACTION_CONTEXT_PLACEMENT =
"CharacterPlacementContext";
32 static const string ACTION_NAME_PLACEMENT =
"CharacterPlaceItem";
33 static const string ACTION_NAME_FORCE_PLACEMENT =
"CharacterForcePlaceItem";
34 static const string ACTION_NAME_CHANGE_ITEM =
"ChangePlacedItem";
35 static const string ACTION_NAME_CHANGE_VARIANT =
"ChangedPlacedVariant";
48 RplComponent rplComponent = RplComponent.Cast(
Replication.FindItem(placeableId));
52 IEntity item = rplComponent.GetEntity();
57 if (!characterId.IsValid())
60 RplComponent characterRplComp = RplComponent.Cast(
Replication.FindItem(characterId));
61 if (!characterRplComp)
65 if (!placingCharacter)
68 SCR_PlaceableItemComponent placebaleItemComp = SCR_PlaceableItemComponent.Cast(item.
FindComponent(SCR_PlaceableItemComponent));
69 if (!placebaleItemComp)
73 float maxPlacementDistance = placebaleItemComp.GetMaxPlacementDistance() * 1.1;
74 if (SCR_PlaceableItemComponent.GetDistanceFromCharacter(placingCharacter,
position, placebaleItemComp.GetDistanceMeasurementMethod()) > maxPlacementDistance)
86 RplComponent rplComponent = RplComponent.Cast(
Replication.FindItem(placeableId));
90 IEntity item = rplComponent.GetEntity();
106 RplComponent rplComponent = RplComponent.Cast(
Replication.FindItem(placeableId));
110 IEntity item = rplComponent.GetEntity();
115 if (targetId.IsValid())
128 BaseWeaponManagerComponent weaponManager = character.GetWeaponManager();
136 if (characterController)
140 if (compartmentAccessComponent)
154 BaseWeaponManagerComponent weaponManager = character.GetWeaponManager();
162 if (characterController)
166 if (compartmentAccessComponent)
182 m_PlacedItem = characterTo.GetCharacterController().GetRightHandItem();
196 if (!previousCharacter)
200 if (!characterController)
205 if (!characterController.IsUsingItem())
209 if (!animationComponent)
212 animationComponent.GetCommandHandler().CancelItemUse();
214 SCR_NotificationsComponent.SendLocal(
ENotification.PLACEABLE_ITEM_CANT_PLACE_GENERIC);
258 if (!characterController)
261 characterController.SetDisableWeaponControls(
true);
262 characterController.SetDisableMovementControls(
true);
264 if (characterController.IsUsingItem())
268 int itemActionId = animationComponent.BindCommand(
"CMD_Item_Action");
272 mat[2] = (mat[3] - character.GetOrigin()).Normalized();
274 mat[0] =
Vector(mat[2][2], mat[2][1], -mat[2][0]);
275 ptWS.Set(null,
"", mat);
279 params.SetAllowMovementDuringAction(
false);
280 params.SetKeepInHandAfterSuccess(
false);
281 params.SetCommandID(itemActionId);
282 params.SetCommandIntArg(1);
283 params.SetMaxAnimLength(15.0);
284 params.SetAlignmentPoint(ptWS);
289 if (!characterController.TryUseItemOverrideParams(
params))
294 characterController.GetAnimationComponent().GetCommandHandler().AlignNewTurns();
304 if (!controlledEntity)
308 if (!characterController)
311 RplComponent characterRplComp = controlledEntity.GetRplComponent();
312 if (!characterRplComp)
315 characterController.SetDisableWeaponControls(
true);
316 characterController.SetDisableMovementControls(
true);
329 SCR_InventoryStorageManagerComponent storageManager = SCR_InventoryStorageManagerComponent.Cast(characterController.GetInventoryStorageManager());
337 RplComponent rplComponent = RplComponent.Cast(
m_PlacedItem.FindComponent(RplComponent));
345 cb.m_PlaceableId = rplComponent.Id();
354 SCR_InvEquipAnyItemCB equipmentCallback =
new SCR_InvEquipAnyItemCB();
355 if (storageManager.TryAssigningNextItemToQuickSlot(
m_PlacedItem, equipCallback: equipmentCallback, equipNewItem: autoEquipNext))
356 cb.m_ChainedCallback = equipmentCallback;
360 if (storageManager.TryRemoveItemFromStorage(
m_PlacedItem, placeableItem.GetParentSlot().GetStorage(), cb))
378 else if (targetId.IsValid())
393 IEntity tracedEntity = param.TraceEnt;
399 else if (tracedEntity)
401 RplComponent rplComp = RplComponent.Cast(tracedEntity.
FindComponent(RplComponent));
420 if (!characterController)
423 if (!characterController.IsUsingItem())
430 if (!animationComponent)
434 commandHandler.CancelItemUse();
541 return weaponSlot.GetWeaponEntity();
581 if (characterController)
604 GetGame().GetInputManager().ActivateContext(ACTION_CONTEXT_PLACEMENT);
605 CameraManager cameraManager =
GetGame().GetCameraManager();
609 CameraBase currentCamera = cameraManager.CurrentCamera();
614 currentCamera.GetTransform(cameraMat);
615 float maxPlacementDistance =
m_PlaceableItem.GetMaxPlacementDistance();
619 switch (placementType)
654 param.End = param.Start - 5 *
vector.Up;
656 param.Exclude = character;
661 m_vCurrentMat[3] = param.Start + ((param.End - param.Start) * traceDistance);
662 vector up = param.TraceNorm;
682 if ((physics.IsDynamic() || physics.IsKinematic()) && !
m_PlaceableItem.CanAttachToDynamicObject())
702 param.Start = character.EyePosition();
703 param.End = param.Start + cameraMat[2] * maxPlacementDistance;
710 m_vCurrentMat[3] = param.Start + ((param.End - param.Start) * traceDistance);
711 vector up = param.TraceNorm;
714 IEntity tracedEntity = param.TraceEnt;
716 if (traceDistance == 1)
719 param.Start = param.End +
vector.Up;
720 param.End = param.Start -
vector.Up * 20;
724 float traceGroundDistance = world.TraceMove(param,
FilterCallback);
726 m_vCurrentMat[3] = param.Start + ((param.End - param.Start) * traceGroundDistance) +
vector.Up * 0.01;
728 if (traceGroundDistance < 1)
729 up = param.TraceNorm;
731 tracedEntity = param.TraceEnt;
735 vector right = up * cameraMat[0];
736 vector forward = up * right;
766 if (SCR_PlaceableItemComponent.GetDistanceFromCharacter(character,
m_vCurrentMat[3],
m_PlaceableItem.GetDistanceMeasurementMethod()) > maxPlacementDistance)
787 Physics physics = entity.GetPhysics();
788 if (physics && physics.IsDynamic() && !
m_PlaceableItem.CanAttachToDynamicObject())
793 if (mainEntity && mainEntity != entity)
796 if (physics && physics.IsDynamic() && !
m_PlaceableItem.CanAttachToDynamicObject())
801 array<typename> ignoredComponents = {};
806 if (physics && (physics.GetInteractionLayer() &
m_PlaceableItem.GetIgnoredPhysicsLayers()))
809 if (ignoredComponents.IsEmpty())
815 foreach (
typename comp : ignoredComponents)
836 if (maxAllowedTilt >= 0)
839 if (currentTilt > maxAllowedTilt)
842 cantPlaceReason =
ENotification.PLACEABLE_ITEM_CANT_PLACE_TOO_STEEP;
856 cantPlaceReason =
ENotification.PLACEABLE_ITEM_CANT_PLACE_GENERIC;
861 if (
m_PlaceableItem.GetAttachPlacedItemToTheSurfaceEntity() && entPhys && !(entPhys.GetInteractionLayer() & EPhysicsLayerDefs.Terrain))
865 array<IEntity> excludeArray = {};
867 excludeArray.Insert(character);
874 if (cantPlaceReason != 0)
879 Math3D.MatrixIdentity3(paramOBB.Mat);
885 paramOBB.ExcludeArray = excludeArray;
903 if (paramOBB.TraceEnt)
905 cantPlaceReason =
ENotification.PLACEABLE_ITEM_CANT_PLACE_NOT_ENOUGH_SPACE;
911 RplComponent rplComp = RplComponent.Cast(tracedEntity.
FindComponent(RplComponent));
981 if (!playerController)
983 Print(
"SCR_ItemPlacementComponent is not attached to SCR_PlayerController!",
LogLevel.WARNING);
1003 DiagMenu.RegisterBool(
SCR_DebugMenuID.DEBUGUI_ITEM_PLACEMENT_VISUALIZATION,
"",
"Item placement debugs",
"Character");
ArmaReforgerScripted GetGame()
SCR_CharacterControllerComponent GetCharacterController()
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
SCR_HelicopterControllerComponentClass gameplaySettings
void RPC_AskSetPlacementPosition(vector right, vector up, vector forward, vector position, RplId placeableId, RplId characterId)
int m_iTargetEntityNodeID
vector m_aCamDeploymentPosition[4]
void EnablePlacement(bool enabled)
bool m_bIsBeingAttachedToEntity
SCR_CompartmentAccessComponent m_CompartmnetAccessComponent
void OnPlacingEnded(IEntity item, bool successful, ItemUseParameters animParams)
void UseXYZPlacement(IEntity owner, float maxPlacementDistance, vector cameraMat[4])
void SetPlaceableItemComponent(SCR_PlaceableItemComponent placeableItemComp)
void InitEditorListeners()
void SCR_ItemPlacementComponent(IEntityComponentSource src, IEntity ent, IEntity parent)
ResourceName m_sCannotBuildMaterial
void RegisterEvents(IEntity to)
void OnWeaponChanged(BaseWeaponComponent newWeaponSlot)
SCR_PlaceableItemComponent m_PlaceableItem
void GetOnCompartmentLeft()
bool ValidateEntity(notnull IEntity entity)
void AskPlaceItem(RplId placeableId, RplId targetId, int nodeId, bool isBeingAttachedToEntity)
void StartPlaceItem()
Callback method triggered by button press.
void OnComparmentEntered(IEntity targetEntity, BaseCompartmentManagerComponent manager, int mgrID, int slotID, bool move)
SCR_PlaceableItemComponent GetPlaceableItemComponent()
void RegisterToManagerInvokers(SCR_EditorManagerEntity manager)
void ValidateTargetEntityExistance()
void UseXZFixedPlacement(IEntity owner, float maxPlacementDistance, vector cameraMat[4])
void SetPreviewEntity(IEntity preview, bool deleteOldPreview=true)
void RPC_AskPlaceItem(RplId placeableId)
void ValidatePlacement(vector up, IEntity tracedEntity, BaseWorld world, IEntity character, out ENotification cantPlaceReason)
ENotification m_eCantPlaceReason
void RPC_AskPlaceItemWithParentChange(RplId placeableId, RplId targetId, int nodeId)
void OnCharacterDeath(SCR_CharacterControllerComponent characterController, IEntity killerEntity, notnull Instigator killer)
void SetPlacedItem(IEntity item)
void TogglePreview(IEntity weapon)
bool FilterCallback(IEntity e)
bool TraceEntitiesCallback(notnull IEntity e, vector start="0 0 0", vector dir="0 0 0")
void OnWeaponChangeEnded(BaseWeaponComponent newWeaponSlot)
IEntity GetWeaponFromWeaponComponent(BaseWeaponComponent weaponComponent)
ResourceName m_sTransparentMaterial
void ForcePlaceItem()
Callback method triggered by button press.
proto external int ClearEventMask(notnull IEntity owner, int mask)
proto external int SetEventMask(notnull IEntity owner, int mask)
void Rpc(func method, void p0=NULL, void p1=NULL, void p2=NULL, void p3=NULL, void p4=NULL, void p5=NULL, void p6=NULL, void p7=NULL)
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
proto external Physics GetPhysics()
proto external BaseWorld GetWorld()
proto external IEntity GetParent()
proto external IEntity GetRootParent()
PointInfo - allows to define position.
Replication item identifier.
OnPlayerDeathWithParamInvoker GetOnPlayerDeathWithParam()
ref OnItemUseEndedInvoker m_OnItemUseEndedInvoker
ScriptInvoker GetOnCompartmentEntered(bool createNew=true)
ScriptInvoker GetOnCompartmentLeft(bool createNew=true)
Core component to manage SCR_EditorManagerEntity.
SCR_EditorManagerEntity GetEditorManager()
static void SetMaterial(IEntity entity, ResourceName material, bool recursively=true)
void PlaceItemWithParentChange(RplId newParentRplId, int nodeId=-1)
Same as PlaceItem but with params that allow attaching the object to new parent entity.
void SetPlacementPosition(vector right, vector up, vector forward, vector position, RplId characterRplId)
Authority method used to change the position at which item will placed when removed from the inventor...
ref OnControlledEntityChangedPlayerControllerInvoker m_OnControlledEntityChanged
static IEntity GetLocalControlledEntity()
void EOnFrame(IEntity owner, float timeSlice)
proto external GenericEntity GetOwner()
Get owner entity.
void EOnInit(IEntity owner)
Instance of created debug visualizer.
EPhysicsLayerPresets
Enum is filled by C++ by data in project config PhysicsSettings.LayerPresets.
SCR_EditableEntityComponent GetControlledEntity()
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
proto external PlayerController GetPlayerController()
void OnControlledEntityChanged(IEntity from, IEntity to)
Runs every time the controlled entity has been changed.
void RplRpc(RplChannel channel, RplRcver rcver, RplCondition condition=RplCondition.None, string customConditionName="")
RplChannel
Communication channel. Reliable is guaranteed to be delivered. Unreliable not.
proto native vector Vector(float x, float y, float z)