ActionDeployObject.c
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 ActionUsesHologram()
{
return true;
}
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 (!g_Game.IsDedicatedServer())
{
if (player.IsPlacingLocal())
{
Hologram hologram = player.GetHologramLocal();
if (!hologram.IsColliding())
{
if (item.CanBePlaced(player, hologram.GetProjectionEntity().GetPosition()))
return true;
}
}
return false;
}
//Server
return true;
}
override bool ActionConditionContinue(ActionData action_data)
{
//Server
if (g_Game.IsDedicatedServer())
{
if (action_data.m_Player.IsPlacingServer())
{
if (g_Game.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 = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return false;
poActionData.m_AlreadyPlaced = false;
if (!g_Game.IsDedicatedServer())
{
Hologram hologram = player.GetHologramLocal();
hologram.SetUpdatePosition(false);
if (hologram)
{
poActionData.m_Position = hologram.GetProjectionPosition();
poActionData.m_Orientation = hologram.GetProjectionOrientation();
poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
}
else
{
return false;
}
}
if (!poActionData.m_MainItem)
return false;
SetupAnimation(poActionData.m_MainItem);
return true;
}
return false;
}
override void OnStartClient(ActionData action_data)
{
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return;
if (g_Game.IsMultiplayer())
poActionData.m_Player.PlacingCompleteLocal();
}
override void OnStartServer(ActionData action_data)
{
super.OnStartServer(action_data);
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return;
if (g_Game.IsMultiplayer())
{
poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
}
if (poActionData.m_MainItem)
{
poActionData.m_Player.PlacingStartServer(poActionData.m_MainItem);
poActionData.m_MainItem.SetIsBeingPlaced(true);
}
if (poActionData.m_MainItem.GetPlaceSoundset() != string.Empty)
poActionData.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_PLACE);
if (poActionData.m_MainItem.GetLoopDeploySoundset() != string.Empty)
poActionData.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
}
override void OnFinishProgressClient(ActionData action_data)
{
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return;
EntityAI entity_for_placing = poActionData.m_MainItem;
vector position = poActionData.m_Player.GetLocalProjectionPosition();
vector orientation = poActionData.m_Player.GetLocalProjectionOrientation();
poActionData.m_AlreadyPlaced = true;
entity_for_placing.OnPlacementComplete(poActionData.m_Player, position, orientation);
}
override void OnFinishProgressServer(ActionData action_data)
{
super.OnFinishProgressServer(action_data);
if (action_data.m_MainItem.GetDeploySoundset() != string.Empty)
action_data.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_DEPLOY);
if (action_data.m_MainItem.GetLoopDeploySoundset() != string.Empty)
action_data.m_MainItem.StopItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
if (!g_Game.IsMultiplayer())
action_data.m_Player.PlacingCompleteLocal();
}
override void OnEndClient(ActionData action_data)
{
super.OnEndClient(action_data);
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return;
if (!poActionData.m_AlreadyPlaced)
{
poActionData.m_Player.PlacingCancelLocal();
//action terminated locally, send cancel to server
poActionData.m_Player.GetActionManager().RequestEndAction();
if (poActionData.m_Player.GetHologramLocal())
poActionData.m_Player.GetHologramLocal().SetUpdatePosition(true);
InventoryLocation source = new InventoryLocation;
if (poActionData.m_MainItem.GetInventory().GetCurrentInventoryLocation(source) && source.GetType() == InventoryLocationType.GROUND)
{
poActionData.m_Player.PredictiveTakeEntityToHands(poActionData.m_MainItem);
}
}
}
override void OnEndServer(ActionData action_data)
{
super.OnEndServer(action_data);
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData || !poActionData.m_MainItem)
return;
if (!poActionData.m_AlreadyPlaced)
{
poActionData.m_MainItem.SetIsBeingPlaced(false);
if (g_Game.IsMultiplayer())
{
poActionData.m_Player.PlacingCancelServer();
}
else
{
//local singleplayer
poActionData.m_Player.PlacingCancelLocal();
poActionData.m_Player.PlacingCancelServer();
}
}
else
{
if (poActionData.m_MainItem.IsBasebuildingKit())
{
poActionData.m_MainItem.Delete();
}
}
if (poActionData.m_MainItem.GetLoopDeploySoundset() != string.Empty)
poActionData.m_MainItem.StopItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
}
override void OnStartAnimationLoop(ActionData action_data)
{
// if object has no progress, it is moved directly when action finishes
if (HasProgress())
{
if (!g_Game.IsDedicatedServer())
{
// Clear reservation as we put the main item from hands on ground
ClearInventoryReservationEx(action_data);
}
DropDuringPlacing(action_data.m_Player);
}
}
override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
{
super.WriteToContext(ctx, action_data);
PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
if (!poActionData)
return;
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 recive_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;
recive_data_po.m_Position = entity_position;
recive_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;
#ifdef DEVELOPER
if (IsCLIParam("hologramLogs"))
{
Debug.Log(string.Format("HandleReciveData | received pos: %1", action_data_po.m_Position), "hologramLogs");
}
#endif
}
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");
}
}
}
};