class ActionManagerServer: ActionManagerBase
{
protected ActionBase m_PendingAction;
ref ActionReciveData m_PendingActionReciveData;
void ActionManagerServer(PlayerBase player)
{
m_PendingAction = null;
m_PendingActionReciveData = null;
}
//------------------------------------------
//EVENTS
//------------------------------------------
override void OnJumpStart()
{
EndOrInterruptCurrentAction();
}
override void EndOrInterruptCurrentAction()
{
if (m_CurrentActionData)
{
if (m_CurrentActionData.m_State == UA_AM_PENDING || m_CurrentActionData.m_State == UA_AM_REJECTED || m_CurrentActionData.m_State == UA_AM_ACCEPTED)
{
OnActionEnd();
m_PendingActionAcknowledgmentID = -1;
}
else
{
m_CurrentActionData.m_Action.Interrupt(m_CurrentActionData);
}
}
}
override bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
{
switch (userDataType)
{
case INPUT_UDT_STANDARD_ACTION_START:
{
bool success = true;
int actionID = 0;
if (!ctx.Read(actionID))
return false;
ActionBase recvAction = GetAction(actionID);
if (!recvAction)
return false;
if (!recvAction.ReadFromContext(ctx, m_PendingActionReciveData))
success = false;
m_PendingAction = recvAction;
if (recvAction.UseAcknowledgment())
{
int ackID;
if (!ctx.Read(ackID))
success = false;
m_PendingActionAcknowledgmentID = ackID;
}
break;
}
case INPUT_UDT_STANDARD_ACTION_END_REQUEST:
{
//Debug.Log("Action want end request, STS = " + m_Player.GetSimulationTimeStamp());
int commandID = -10;
ctx.Read(commandID);
if (commandID == DayZPlayerConstants.CMD_ACTIONINT_INTERRUPT)
{
//Print("INPUT_UDT_STANDARD_ACTION_END_REQUEST | CMD_ACTIONINT_INTERRUPT");
RequestInterruptAction();
}
else
{
//Print("INPUT_UDT_STANDARD_ACTION_END_REQUEST | m_ActionWantEndRequest");
m_ActionWantEndRequest = true;
}
}
case INPUT_UDT_STANDARD_ACTION_INPUT_END:
{
//Debug.Log("Action input ended, STS = " + m_Player.GetSimulationTimeStamp());
m_ActionInputWantEnd = true;
}
default:
return false;
}
if (!success)
{
//Debug.Log("[AM] OnInputUserDataProcess INPUT_UDT_STANDARD_ACTION_START Error");
if (recvAction.UseAcknowledgment())
{
DayZPlayerSyncJunctures.SendActionAcknowledgment(m_Player, m_PendingActionAcknowledgmentID, false);
}
else
{
RequestInterruptAction();
}
return false;
}
return true;
}
override void StartDeliveredAction()
{
if (!m_CurrentActionData)
{
//! error - expected action data
return;
}
m_Interrupted = false;
bool accepted = false;
ActionBase pickedAction = m_CurrentActionData.m_Action;
ActionTarget target = m_CurrentActionData.m_Target;
ItemBase item = m_CurrentActionData.m_MainItem;
if (LogManager.IsActionLogEnable())
{
if (target)
{
Debug.ActionLog("Item = " + item + ", " + target.DumpToString(), pickedAction.ToString() , "n/a", "DeliveredAction", m_Player.ToString());
}
else
{
Debug.ActionLog("Item = " + item + ", NULL", pickedAction.ToString() , "n/a", "DeliveredAction", m_Player.ToString());
}
}
if (!m_Player.GetCommandModifier_Action() && !m_Player.GetCommand_Action() && !m_Player.IsSprinting() && pickedAction && pickedAction.Can(m_Player,target,item))
{
if (pickedAction.AddActionJuncture(m_CurrentActionData))
accepted = true;
}
if (accepted)
{
if (LogManager.IsActionLogEnable())
{
Debug.ActionLog("Action accepted", pickedAction.ToString() , "n/a", "CheckDeliveredAction", m_Player.ToString() );
}
//Debug.Log("[AM] Action acccepted");
if (pickedAction.UseAcknowledgment())
{
//Unlock target
m_CurrentActionData.m_State = UA_AM_PENDING;
DayZPlayerSyncJunctures.SendActionAcknowledgment(m_Player, m_PendingActionAcknowledgmentID, true);
}
else
{
m_CurrentActionData.m_State = UA_AM_ACCEPTED;
}
}
else
{
if (LogManager.IsActionLogEnable())
{
Debug.ActionLog("Action rejected", pickedAction.ToString() , "n/a", "CheckDeliveredAction", m_Player.ToString() );
}
if (pickedAction.UseAcknowledgment())
{
DayZPlayerSyncJunctures.SendActionAcknowledgment(m_Player, m_PendingActionAcknowledgmentID, false);
}
else
{
RequestInterruptAction();
}
}
}
override void OnActionEnd()
{
//Debug.Log("Action ended - hard, STS = " + m_Player.GetSimulationTimeStamp());
if (m_CurrentActionData)
{
m_CurrentActionData.m_Action.ClearActionJuncture(m_CurrentActionData);
super.OnActionEnd();
}
}
//pCurrentCommandID is command ID at time of call command handler, some called methods can change actual true value (need call m_Player.GetCurrentCommandID() for actual command ID)
override void Update(int pCurrentCommandID)
{
super.Update(pCurrentCommandID);
int currentCommandID = m_Player.GetCurrentCommandID();
//Debug.Log("m_ActionWantEnd " + m_ActionInputWantEnd);
if (m_PendingAction)
{
if (m_CurrentActionData)
{
DayZPlayerSyncJunctures.SendActionAcknowledgment(m_Player, m_PendingActionAcknowledgmentID, false);
}
else
{
m_ActionWantEndRequest = false;
m_ActionInputWantEnd = false;
bool success = true;
ActionTarget target = new ActionTarget(null, null, -1, vector.Zero, 0);
if ( LogManager.IsActionLogEnable() )
{
Debug.ActionLog("n/a", m_PendingAction.ToString() , "n/a", "HandlePendingAction", m_Player.ToString() );
}
if (!m_PendingAction.SetupAction(m_Player,target,m_Player.GetItemInHands(),m_CurrentActionData))
{
success = false;
}
//Debug.Log("[AM] Action data synced (" + m_Player + ") success: " + success);
if (success)
{
StartDeliveredAction();
}
else
{
if (m_PendingAction.UseAcknowledgment())
{
DayZPlayerSyncJunctures.SendActionAcknowledgment(m_Player, m_PendingActionAcknowledgmentID, false);
}
else
{
RequestInterruptAction();
}
}
}
m_PendingAction = null;
m_PendingActionReciveData = null;
}
if (m_CurrentActionData)
{
if (m_CurrentActionData.m_State != UA_AM_PENDING && m_CurrentActionData.m_State != UA_AM_REJECTED && m_CurrentActionData.m_State != UA_AM_ACCEPTED)
{
m_CurrentActionData.m_Action.OnUpdateServer(m_CurrentActionData);
}
//Debug.Log("m_CurrentActionData.m_State: " + m_CurrentActionData.m_State +" m_ActionWantEnd: " + m_ActionWantEndRequest );
switch (m_CurrentActionData.m_State)
{
case UA_AM_PENDING:
break;
case UA_AM_ACCEPTED:
// check currentCommandID before start or reject
int condition_mask = ActionBase.ComputeConditionMask(m_Player, m_CurrentActionData.m_Target, m_CurrentActionData.m_MainItem);
bool canActionPerform = ((condition_mask & m_CurrentActionData.m_Action.m_ConditionMask) == condition_mask);
if (canActionPerform && ActionPossibilityCheck(currentCommandID))
{
m_CurrentActionData.m_State = UA_START;
m_CurrentActionData.m_Action.Start(m_CurrentActionData);
if (m_CurrentActionData.m_Action && m_CurrentActionData.m_Action.IsInstant())
OnActionEnd();
}
else
{
RequestInterruptAction();
}
m_PendingActionAcknowledgmentID = -1;
break;
case UA_AM_REJECTED:
OnActionEnd();
m_PendingActionAcknowledgmentID = -1;
break;
default:
if (m_ActionInputWantEnd)
{
m_ActionInputWantEnd = false;
m_CurrentActionData.m_Action.EndInput(m_CurrentActionData);
}
if (m_ActionWantEndRequest)
{
m_ActionWantEndRequest = false;
m_CurrentActionData.m_Action.EndRequest(m_CurrentActionData);
}
break;
}
}
}
//! server requests action interrupt
override void RequestInterruptAction()
{
if (m_CurrentActionData)
DayZPlayerSyncJunctures.SendActionInterrupt(m_Player);
}
override ActionReciveData GetReciveData()
{
return m_PendingActionReciveData;
}
}