123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- class PlaceObjectActionReciveData : ActionReciveData
- {
- vector m_Position;
- vector m_Orientation;
- }
- class ActionDeployObject : ActionDeployBase
- {
- void ActionDeployObject()
- {
- m_CommandUID = 0;
- m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT;
- }
-
- override bool HasAlternativeInterrupt()
- {
- return true;
- }
-
- override bool IsDeploymentAction()
- {
- return true;
- }
-
- override bool CanBeUsedWithBrokenLegs()
- {
- return false;
- }
-
- override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
- {
- //Client
- if (!GetGame().IsDedicatedServer())
- {
- if (player.IsPlacingLocal())
- {
- if (!player.GetHologramLocal().IsColliding())
- {
- if (item.CanBePlaced(player, player.GetHologramLocal().GetProjectionEntity().GetPosition()))
- {
- return true;
- }
- }
- }
- return false;
- }
- //Server
- return true;
- }
-
- override bool ActionConditionContinue(ActionData action_data)
- {
- //Server
- if (GetGame().IsDedicatedServer())
- {
- if (action_data.m_Player.IsPlacingServer())
- {
- if (GetGame().IsMultiplayer())
- action_data.m_Player.GetHologramServer().EvaluateCollision(action_data.m_MainItem);
-
- if (!action_data.m_Player.GetHologramServer().IsColliding())
- {
- if (action_data.m_MainItem.CanBePlaced(action_data.m_Player, action_data.m_Player.GetHologramServer().GetProjectionEntity().GetPosition()))
- return true;
- }
- return false;
- }
- return false;
- }
- return true;
- }
-
- override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
- {
- if (super.SetupAction(player, target, item, action_data, extra_data))
- {
- PlaceObjectActionData poActionData;
- poActionData = PlaceObjectActionData.Cast(action_data);
- poActionData.m_AlreadyPlaced = false;
- if (!GetGame().IsDedicatedServer())
- {
- player.GetHologramLocal().SetUpdatePosition(false);
-
- Hologram hologram = player.GetHologramLocal();
- if (hologram)
- {
- poActionData.m_Position = player.GetHologramLocal().GetProjectionPosition();
- poActionData.m_Orientation = player.GetHologramLocal().GetProjectionOrientation();
-
- poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
- poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
- }
- else
- {
- return false;
- }
- }
-
- if (!action_data.m_MainItem)
- return false;
-
- SetupAnimation(action_data.m_MainItem);
- return true;
- }
- return false;
- }
-
- override void OnStartClient(ActionData action_data)
- {
- PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
- if (!poActionData)
- return;
-
- if (GetGame().IsMultiplayer())
- action_data.m_Player.PlacingCompleteLocal();
- }
-
- override void OnStartServer(ActionData action_data)
- {
- super.OnStartServer(action_data);
-
- if (GetGame().IsMultiplayer())
- {
- PlaceObjectActionData poActionData;
- poActionData = PlaceObjectActionData.Cast(action_data);
-
- if (!poActionData)
- return;
-
- EntityAI entity_for_placing = action_data.m_MainItem;
- poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
- poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
-
- if (action_data.m_MainItem)
- {
- poActionData.m_Player.PlacingStartServer(action_data.m_MainItem);
-
- GetGame().AddActionJuncture(action_data.m_Player, entity_for_placing, 10000);
- action_data.m_MainItem.SetIsBeingPlaced(true);
- }
- }
- else
- {
- //local singleplayer
- action_data.m_Player.PlacingStartServer(action_data.m_MainItem);
- action_data.m_MainItem.SetIsBeingPlaced(true);
- }
-
- ItemBase item = ItemBase.Cast(action_data.m_MainItem);
- if (item.GetPlaceSoundset() != string.Empty)
- item.StartItemSoundServer(SoundConstants.ITEM_PLACE);
-
- if (item.GetLoopDeploySoundset() != string.Empty)
- item.StartItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
- }
-
- override void OnFinishProgressClient(ActionData action_data)
- {
- PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
- if (!poActionData)
- return;
-
- EntityAI entity_for_placing = action_data.m_MainItem;
- vector position = action_data.m_Player.GetLocalProjectionPosition();
- vector orientation = action_data.m_Player.GetLocalProjectionOrientation();
- poActionData.m_AlreadyPlaced = true;
-
- entity_for_placing.OnPlacementComplete(action_data.m_Player, position, orientation);
- }
-
- override void OnFinishProgressServer(ActionData action_data)
- {
- super.OnFinishProgressServer(action_data);
-
- ItemBase item = ItemBase.Cast(action_data.m_MainItem);
- if (item.GetDeploySoundset() != string.Empty)
- item.StartItemSoundServer(SoundConstants.ITEM_DEPLOY);
- }
- override void OnEndClient(ActionData action_data)
- {
- super.OnEndClient(action_data);
- PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
- if (!poActionData.m_AlreadyPlaced)
- {
- action_data.m_Player.PlacingCancelLocal();
-
- //action terminated locally, send cancel to server
- poActionData.m_Player.GetActionManager().RequestEndAction();
- if (action_data.m_Player.GetHologramLocal())
- action_data.m_Player.GetHologramLocal().SetUpdatePosition(true);
-
- InventoryLocation source = new InventoryLocation;
- if (action_data.m_MainItem.GetInventory().GetCurrentInventoryLocation(source) && source.GetType() == InventoryLocationType.GROUND)
- {
- action_data.m_Player.PredictiveTakeEntityToHands(action_data.m_MainItem);
- }
- }
- }
-
- override void OnEndServer(ActionData action_data)
- {
- super.OnEndServer(action_data);
- if (!action_data || !action_data.m_MainItem)
- return;
-
- PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
- if (!poActionData.m_AlreadyPlaced)
- {
- GetGame().ClearJunctureEx(action_data.m_Player, action_data.m_MainItem);
- action_data.m_MainItem.SetIsBeingPlaced(false);
-
- if (GetGame().IsMultiplayer())
- {
- action_data.m_Player.PlacingCancelServer();
- }
- else
- {
- //local singleplayer
- action_data.m_Player.PlacingCancelLocal();
- action_data.m_Player.PlacingCancelServer();
- }
- }
- else
- {
- if (action_data.m_MainItem.IsBasebuildingKit())
- {
- action_data.m_MainItem.Delete();
- }
- else
- {
- GetGame().ClearJunctureEx(action_data.m_Player, action_data.m_MainItem);
- }
- }
-
- ItemBase item = ItemBase.Cast(action_data.m_MainItem);
- if (item.GetLoopDeploySoundset() != string.Empty)
- item.StopItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
- }
-
- override void OnStartAnimationLoop(ActionData action_data)
- {
- if (!GetGame().IsDedicatedServer())
- {
- if (action_data.m_Player.GetItemInHands())
- ActiondeployObjectCB.Cast(action_data.m_Callback).DropDuringPlacing(); //legacy stuff
-
- if (HasProgress()) // if object has no progress, it is moved directly when action finishes
- {
- ClearInventoryReservationEx(action_data); // Clear reservation as we put the main item from hands on ground
- DropDuringPlacing(action_data.m_Player);
- }
- }
- }
-
- override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
- {
- super.WriteToContext(ctx, action_data);
-
- PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
- ctx.Write(poActionData.m_Position);
- ctx.Write(poActionData.m_Orientation);
- }
-
- override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
- {
- if (!action_recive_data)
- action_recive_data = new PlaceObjectActionReciveData;
- super.ReadFromContext(ctx, action_recive_data);
- PlaceObjectActionReciveData action_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
-
- vector entity_position = "0 0 0";
- vector entity_orientation = "0 0 0";
- if (!ctx.Read(entity_position))
- return false;
- if (!ctx.Read(entity_orientation))
- return false;
-
- action_data_po.m_Position = entity_position;
- action_data_po.m_Orientation = entity_orientation;
-
- return true;
- }
-
- override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
- {
- super.HandleReciveData(action_recive_data, action_data);
-
- PlaceObjectActionReciveData recive_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
- PlaceObjectActionData action_data_po = PlaceObjectActionData.Cast(action_data);
-
- action_data_po.m_Position = recive_data_po.m_Position;
- action_data_po.m_Orientation = recive_data_po.m_Orientation;
- }
-
- void SetupAnimation(ItemBase item)
- {
- if (item.IsDeployable())
- {
- if (item.IsHeavyBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_HEAVY;
- }
- else if (item.IsOneHandedBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_1HD;
- }
- else if (item.IsTwoHandedBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
- }
- else
- {
- Debug.Log("Error: check " + item + " behaviour");
- }
- }
- else
- {
- if (item.IsHeavyBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_HEAVY;
- }
- else if (item.IsOneHandedBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_1HD;
- }
- else if (item.IsTwoHandedBehaviour())
- {
- m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_2HD;
- }
- else
- {
- Debug.Log("Error: check " + item + " behaviour");
- }
- }
- }
- };
|